views:

134

answers:

1

Hi all,

I'm fairly new to Visual Studio (specifically Visual Basic .NET) but have been programming for quite a long time.

Here at my company we have an Access application that allows users to create documents based on invoices that are in Great Plains, an accounting program. Documents such as invoices, packing lists, export documentation, etc., etc.

This application is very old and very hard to maintain so we're doing a rewrite and I've chosen this project to be my first Visual Basic .NET project.

Basically what the application is going to do is allow users to do the following:

  1. Pull up invoice information and then add some secondary information such as comments and the like
  2. Choose which documents they want to print out
  3. Open the documents and then allow the user to edit the documents

That last part is the tricky part. The users right now create these documents out of Access and print to a PDF and then edit the PDF with comments that can be specific to the document and customer. If they didn't have to do that, then I could just used canned reports or something.

What I am thinking of doing is creating Word templates with text boxes and inside those text boxes adding addressable bookmarks. When the user goes to print the documents, open Word, populate the bookmarks from the database (SQL Server) and then that will let them draw text boxes and fill them with whatever they want before they print the documents and then they can save them.

Here's the code I worked out to do this (of course the final result will be much more complex):

Public Const wdPageBreak = 7

Dim oWord As Word.Application
Dim oDoc As Word.Document

'Open recordset for rsInvoice

oWord = CreateObject("Word.Application")

oDoc = oWord.Documents.Add()
oDoc.Application.Selection.Range.InsertFile("C:\document-c.dotx")
oDoc.Application.Selection.Range.InsertBreak(wdPageBreak)

oDoc.Application.Selection.Range.InsertFile("C:\document-b.dotx")
oDoc.Application.Selection.Range.InsertBreak(wdPageBreak)

oDoc.Application.Selection.Range.InsertFile("C:\document-a.dotx")

oDoc.Bookmarks("document_a_invoice_number").Range.Text = rsInvoice("invoice_number")
oDoc.Bookmarks("document_a_customer_number").Range.Text = rsInvoice("customer_number")
...
etc.
etc.
...
oWord.Visible = True

So I guess the question I have is this the most appropriate way to approach this project or is there either a way programmatically or via a third party tool that I'm not aware of that would be easier and more efficient?

Thanks in advance.

+1  A: 

I've recently been involved in a project that did something very similar to this and we ended up automating Word from VB.Net to insert data to the bookmarks. The actual code was easy enough to write, just be careful so that you close everything properly afterwards, it's easy to forget some reference somewhere so that Word won't close down properly.

Other than that there have been no problems and they've been using the system for quite a few months now.

One thing to be aware of though is if you put two bookmarks right after each other it seems like sometimes one bookmark can overwrite another, so it's worth adding some space between them (just a few spaces worked fine).

ho1
Did you use code similar to what I have above? What our users are going to do is out of x documents select x, y, z, etc. Then I will create one big document with what they have selected and insert the appropriate data. My only concern is that there doesn't seem to be a way to have Word show the bookmark names on the document for documentation purposes. Did you construct the document using text boxes with bookmarks in the text boxes?
Tom
@Tom: It was a little while since I looked at it so I'm not sure, but it looks similar. Regarding the bookmarks, I didn't actually create the templates, I just wrote the code, but when I looked at them it just seemed to be bookmarks, no textboxes, but I don't know Word that well so I can't say for sure.
ho1