Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion GroupsFormsForms ProgrammingQueriesModules / DAO / VBAReports / PrintingMacrosDatabase DesignSecurityConversionImporting / LinkingSQL Server / ADPMultiuser / NetworkingReplicationSetup / ConfigurationDeveloper ToolkitsActiveX ControlsNew UsersGeneral 1General 2
Access DirectoryToolsTutorialsUser Groups
Related Topics
SQL ServerOther DB ProductsMS OfficeMore Topics ...

MS Access Forum / Forms / May 2008

Tip: Looking for answers? Try searching our database.

Albert Kallal Mail Merge from a query

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
magicdds- - 25 Apr 2008 05:22 GMT
I am using Albert Kallal's mail merge to merge data from my database to
letters in Word. The problem is that when I click on a button on my form to
open the mail merge form, the mail merge form uses the table that the form is
based on to get mergefields.

If I click on a button on the form which opens a second form, If form #2 is
based on the query that I want to use to merge, I can have a button on form#2
that opens the mail merge form. The the mail merge form uses the query that
form#2 uses as the record source as the source for the merge fields.

I would like to use the query that form #2 has as the record source, as the
source for the merge fields. I was wondering if there was a way to click on a
button on form #1 (which uses a table as it's record source) to open the mail
merge form and use the query as the source for the mergefields, without
opening form #2?

Thanks
Mark
Albert D. Kallal - 25 Apr 2008 06:52 GMT
yes, you can specify any query you want, and NOT use the forms reocrdset.

Just go:

MergeAllWord  "name of query or sql goes here"

Additional features are outlined here:

http://www.members.shaw.ca/AlbertKallal/wordmerge/page2.html

So, just go

MergeAllWord "query2"

Just use the same query that form 2 users (there is no need to open the
form, since above shows you can specify the sql (or query) for the data
source...

Signature

Albert D. Kallal    (Access MVP)
Edmonton, Alberta Canada
pleaseNOOSpamKallal@msn.com

magicdds- - 25 Apr 2008 08:10 GMT
Albert,
I first tried

MergeAllWord "LetterQuery"

and got error message:

No Data was created for this merge
Make sure the sql is correct
sql was
               LetterQuery

When I opened LetterQuery, there was a line of data which was from the
Access form that was open.

I also tried

MergeSingleWord "LetterQuery"

But that just tried to look for and store letters in a new directory called
"LetterQuery".

Any ideas on what else I could try?
Thanks,
Mark

> yes, you can specify any query you want, and NOT use the forms reocrdset.
>
[quoted text clipped - 13 lines]
> form, since above shows you can specify the sql (or query) for the data
> source...
Albert D. Kallal - 25 Apr 2008 11:06 GMT
> Albert,
> I first tried
>
> MergeAllWord "LetterQuery"

When you go the query desinger, can you open up letterQuery...does it work
fine without any other forms open?

Perahps try the sql such as:

MergeAllWord "select * from LetterQuery"

LetterQuery should be free of forms expresisons etc. It should be clean sql.

If you need conditions, then go:

dim strSql     as string
strSql = "select * from LetterQuery where City = 'Edmonton'"
MergeAllWord strSql

Signature

Albert D. Kallal    (Access MVP)
Edmonton, Alberta Canada
pleaseNOOSpamKallal@msn.com

magicdds- - 26 Apr 2008 05:57 GMT
Albert,

I tried both options without any success.

What does seen to work is I modified the module "MergeSingleWord" as shown
below.

The form "LetterMergeButton" does nothing, but it is based on the Query
"LetterQuery" which is the query that has the data I want to use.
I open the form, MakeMergeText, and then close the form.
I can't seem to get anything else to work.

Dim frmF             As Form
  Dim strDirPath       As String      ' full path name to working dir
 
  DoCmd.OpenForm "LetterMergeButton"
     
  Set frmF = Screen.ActiveForm
  frmF.Refresh
 
  strDirPath = DirToPath(strDir, bolFullPath)
 
  ' output our simple merge file
 
  If MakeMergeText(frmF, strMergeDataFile) Then
     DoCmd.OpenForm "GuiWordTemplate", , , , , , strDirPath & "~" &
strOutPutDoc
  End If
 
 DoCmd.Close acForm, "LetterMergeButton"
 
End Function

I would, however, like to thank you for providing us with this wonderful
code. This really makes life easier when trying to merge Access data into
Word documents.

Thanks so much,
Mark

> > Albert,
> > I first tried
[quoted text clipped - 15 lines]
> strSql = "select * from LetterQuery where City = 'Edmonton'"
> MergeAllWord strSql
Albert D. Kallal - 26 Apr 2008 19:06 GMT
> Albert,
>
> I tried both options without any success.

Very strange.

could you post the simple code behind the button that does not work. (it
should be only 2-3 lines of code).

As mentioned, you don't need to open that 2nd form, but just supply the
query name (or sql) to

MergeAllWord  "your sql goes here"

I assume all you code compiles (in code go debug->compile).

Anyway, it looks like you have a workaround, but I am stumped as to what the
bug/problem here is, and would have like to fixed it....

Signature

Albert D. Kallal    (Access MVP)
Edmonton, Alberta Canada
pleaseNOOSpamKallal@msn.com

magicdds- - 26 Apr 2008 20:24 GMT
After a few tweeks, I got it to work!

Here is the trick

1) Like you said, get rid of conditions in the query
2) Use MergeAllWord, Not MergeSingleWord
3) The code behind the button should be:

Dim strSql     As String
strSql = "select * from LetterQuery where PatientID = " & Me!PatientID
MergeAllWord strSql

The trick is, use

strSql = "select * from LetterQuery where PatientID = " & Me!PatientID

and not

strSql = "select * from LetterQuery where PatientID =  Me!PatientID"

Thanks again for your help
Mark

> > Albert,
> >
[quoted text clipped - 14 lines]
> Anyway, it looks like you have a workaround, but I am stumped as to what the
> bug/problem here is, and would have like to fixed it....
Albert D. Kallal - 26 Apr 2008 22:39 GMT
Excellent...thanks for the follow up.....

Signature

Albert D. Kallal    (Access MVP)
Edmonton, Alberta Canada
pleaseNOOSpamKallal@msn.com

magicdds- - 27 Apr 2008 06:58 GMT
Now I have a new challenge!

I have been trying to use the MergeNoPrompts part of your code.
I have a table called DAYFILE which holds records containing data for
letters to be printed at a later time (when convenient for the user).

I was wondering if you had a solution to this next kink in the puzzle.

The first field in the table is called LETTERNAME.
Each record has all the Merge Fields but the first field is LETTERNAME.
When clicking on a button on a form, the following code runs:

Dim strSQL     As String
strSQL = "select * from DayFile"
MergeNoPrompts DLookup("LetterName", "Dayfile"), "C:\Documents and _ &
Settings\Mark\Desktop\NewGen\Word\", True, , strSQL

With that, a letter is created in Word for each record in the table DAYFILE.
However, the letter is the same for each record. That is, the letter that is
merged is the LETTERNAME specified in the first record.

Is there a way to get each letter to be the letter specified in the field
LETTERNAME for each record?

Thanks,
Mark

> Excellent...thanks for the follow up.....
Albert D. Kallal - 30 Apr 2008 07:17 GMT
> Now I have a new challenge!

Actually in this scenario that you are outlining, I would actually come back
and ask how did you set what letter name the users supposed to get? And, at
what point in the program or user interaction did this setting of the letter
occur?

The reason why I'm asking the above is, instead of having one big processing
loop that goes thought the "dayfile", you could simply Call the
mergeNoPrmpts WHEN your code adds a record to the dayfile (or, more
importantly when you actually set what letter going to be sent out) . That
way, you have all the documetns created and no "extra" process to be run at
the end of the day. It also not clear if dayfile is to be the data source
for the word merge, or if datafile ONLY has the "id" + letter name for the
user?

If the data source is different than what you could do, is when you write
out the dayfile, you would call MergeNoPrompts, and the add the actual
document name (with full path name) named that merge no prmopts created to
your day file table. What this would mean is that you could actually merge
document from different forms and even different data sources.

for the time being, let's ignore the above suggestion an approach.

We can simply write some code that would process the day file as you need.

dim    rstDayFile      as dao.RecordSet
dim    strSql          as string
dim    strSqlforWord   as string
dim    strDirPath      as string

strDirPath = "C:\Documents and _ &
      Settings\Mark\Desktop\NewGen\Word\

strSql = "select * from DayFile order by id"
set rstDayFile = currentdb.OpenReocrdSet(strSql)

do while rstDayFile.Eof = false
  strSqlForWord = "select * from dayFile where id = " & rstDayFile!id
  MergeNoPrompts rstDayFile!LetterName, strdirPath, True, , strSQL
  rstDayFile.Movenext
loop
rstDayFile.close

Notice how the above loop has to actually specify the correct SQL, and
select the one record that we need. I'm assuming that you have a primary
key, or auto number field of ID in this list.

I've also never tested this code in a loop, and my spider sense tells me
there's going to be some order of printing problems because of the way word
prints documents out. I know how to fix this problem, but I guess you can
give the above a try and see how well it works. Note that the above code is
what we call air code, and I simply typed it as I wrote this message. So the
above is not tested, but it should give you the general idea as to what you
need to do.

Signature

Albert D. Kallal    (Access MVP)
Edmonton, Alberta Canada
pleaseNOOSpamKallal@msn.com

magicdds- - 30 Apr 2008 17:48 GMT
This is so cool!
It works great.

I just had to change

MergeNoPrompts rstDayFile!LetterName, strdirPath, True, , strSQL

to

MergeNoPrompts rstDayFile!LetterName, strdirPath, True, , strSqlForWord

Thanks so much for your help.
Mark

> > Now I have a new challenge!
>
[quoted text clipped - 51 lines]
> above is not tested, but it should give you the general idea as to what you
> need to do.
magicdds- - 01 May 2008 06:47 GMT
Thanks for your help so far. I am running into one more problem.
I created another folder in the same directory where the WORD folder in
located. While the WORD folder contains the letters and I created ENVELOPE
folder to contain envelopes to go along with each letter. The envelope should
only get printed if a check box on the form MAIN is checked.
I added code in the event procedure behind the Command Button cmdMerge in
the "GuiWordTemplate" form. Here it is:

Private Sub cmdMerge_Click()

  ' merge the doc
  If IsNull(Me.lstFiles) = False Then
     
     Call RidesMergeWord(strDirPath & Me.lstFiles & ".doc", strDirPath,
strOutDocName)
     
     ' added for envelopes
 If forms!Main!envelope = -1 then
   
       If IsNull(Me.OpenArgs) = True Then
     strDirPath = DirToPath("envelope\", False)
     
  Else
     strDirPath = strDField(Me.OpenArgs, "~", 1)
     strOutDocName = strDField(Me.OpenArgs, "~", 2)
  End If
 
   Call RidesMergeWord(strDirPath & Me.lstFiles & ".doc", strDirPath,
strOutDocName)
   
End If

     ' end of code for envelope

DoCmd.Close acForm, Me.Name
     
  Else
 
     MsgBox "You need to select a Word document", vbExclamation, "Word Merge"
 
  End If

End Sub

When I tested for Me.OpenArgs, it is Null
What is happening when I click on the Command Button, I get 2 copies of the
letter from the WORD directory and nothing from the ENVELOPE directory. What
I want is the letter from the WORD directory, and the envelope (with the same
file name as the letter) from the ENVELOPE directory, to open in two separate
instances of Word windows.

I can't understand, since I changed the path to the ENVELOPE directory in
the code above, what I am doing wrong. Could you see if you could figure it
iut?

Thanks again,
Mark

> > Now I have a new challenge!
>
[quoted text clipped - 51 lines]
> above is not tested, but it should give you the general idea as to what you
> need to do.
Albert D. Kallal - 30 Apr 2008 07:19 GMT
>   MergeNoPrompts rstDayFile!LetterName, strdirPath, True, , strSQL

that should read:

MergeNoPrompts rstDayFile!LetterName, strdirPath, True, , strSQlForWord
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.