home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / dbaseii / roffmrge.txt < prev    next >
Text File  |  1994-07-13  |  8KB  |  197 lines

  1. 15 April 1988
  2.  
  3. Some time ago, I uploaded a file showing how to mailmerge letters
  4. using the popular public-domain ROFF4 formatter and a dBASE II
  5. database.  My first attempt was inelegant, to say the least -- it
  6. depended on cleaning things up with FINREP, and cutting the file
  7. vertically and PASTEing it together horizontally.  YECHH.
  8.  
  9. What follows is a MUCH revised and much faster version.  Each section
  10. is described following the code.  Further, all you need on disk,
  11. besides the code given here, is dBASE II, a copy of GSUB20.COM, your
  12. favorite editor (see below) and ROFF4 (naturally).  Hope this is
  13. useful to somebody besides me -- it sure has made MY life easier!
  14.  
  15. ----------------------------------------------------------------
  16. 1.  LIST.CMD -- dBASE's part of the job
  17. ----------------------------------------------------------------
  18. SET TALK OFF
  19. STORE 0 TO RANGE
  20. STORE 1 TO CLASS
  21. SET DEFAULT TO C
  22. USE ZZZ
  23. ERASE
  24. @ 10,5 SAY "B0   Program to Generate Mailing List from DBASE II   C0"
  25. @ 15,5 SAY " "
  26. INPUT "Enter B01C0 for initial mailing, 0 for thankyou letters " TO CLASS
  27.     IF CLASS=1
  28.         ACCEPT "Enter date as MM/DD/YY" TO DATE
  29.             SET DATE TO &DATE
  30.             REPLACE LDATE WITH DATE() FOR &RANGE
  31.     ENDIF
  32. ACCEPT "Specify category of records to output" TO RANGE
  33. SET RAW ON
  34.     SET ALTERNATE TO C:MAIL
  35.         SET ALTERNATE ON
  36.             LIST OFF '*N1*'TRIM(FIRSTNAME)'**N2*'TRIM(LASTNAME)'**A1*'TRIM(ADDRESS)'*';
  37.         '*A2*'TRIM(CITY)'**A3*'STATE'**A4*'ZIPCODE'*' FOR &RANGE
  38.     SET ALTERNATE OFF
  39. ERASE
  40. @ 10,20 SAY "B0DONE!C0"
  41.     IF CLASS=1
  42.         QUIT TO 'S MERGE'
  43.     ENDIF
  44. QUIT TO 'S MERGE2'
  45. ----------------------------------------------------------------
  46. COMMENTS:
  47. This .CMD file sets up a bunch of options for the merging.  In my
  48. particular case, I had to send out letters requesting interviews and
  49. then thank you notes afterwards, hence the 'CLASS' stuff.  It was
  50. important to know the date the interview was set for, but not the date
  51. that the 'thanks' letters were sent out, so I only update DATE() when
  52. sending out the first letters.
  53.  
  54. The program allows you to specify a category of letters to merge.  You
  55. might enter something like 'INTERVIEW,' which would generate letters
  56. for all records where the variable INTERVIEW=true.  Any standard dBASE
  57. II expression or compound expression works here.
  58.  
  59. The data are listed, spaced by '**,' to the file MAIL.TXT, and DATE()
  60. is updated IFF this is an initial mailing, and dBASE quits and calls
  61. GSUB20 (renamed to S.COM) on one of two 'sub' files.  The only
  62. difference is that MERGE sets up the list to call the INITIAL letter,
  63. and MERGE2 calls the 'thanks' letter.  See below for more details...
  64.  
  65.  
  66. ----------------------------------------------------------------
  67. 2.  MERGE.SUB (run by GSUB20.COM)
  68. ----------------------------------------------------------------
  69. ;this GOSUB file calls PW to edit the MAIL.TXT dBASE II file
  70. <^G^[B0TYPE BACKSPACE WHEN EDITOR STARTS^[C0^G||>
  71. A:PW MAIL.TXT
  72. {^[R^M*N1^[^M.SO RLET^M*N1^[^[R**^[*^M.DS *^[^[R^M*^[^M.DS *^[^K^K^K^XIHEADER^M^[>^M.SO RLET^M^X^S^X^C}
  73. <^G^[B0Ready for Merging with ROFF^[C0^G>
  74. ----------------------------------------------------------------
  75. COMMENTS:
  76. I used Perfect Writer's editor to do this job, but I'll run through
  77. the commands in a minute.
  78.  
  79. The first thing to note is that MOST editors (including VDE) will not
  80. accept command input from GSUB until a key is pressed -- hence the
  81. 'warning' line prior to the line that calls the editor.  This warning
  82. is sent to the console -- otherwise, yu'll sit there and watch the
  83. screen doing nothing for quite a while.
  84.  
  85. Then PW.COM goes to work.  It does the following, in the following
  86. order.  this can probably be improved upon, but since I run PW from a
  87. RAMdisk, I'm not going to worry about it.  It's FAST now!
  88.  
  89. A.  REPLACE <CR>*N1 WITH .SO RLET<CR>*N1 [if this were MERGE2, it
  90.     would be TLET.  That's the only difference!]
  91. B.  REPLACE ** WITH *<CR>.DS *
  92. C.  REPLACE <CR>* WITH <CR>.DS *
  93. D.  DELETE 3 lines
  94. E.  INSERT the file HEADER
  95. F.  MOVE to EOF
  96. G.  ADD the text: <CR>.SO RLET<CR>
  97. H.  SAVE the file
  98. I.  EXIT to CP/M (still under GSUB control)
  99.  
  100. And then you get the message:  READY FOR MERGING.  Ta Da!
  101.  
  102. The text of the HEADER file appears below:
  103.  
  104.  
  105. ----------------------------------------------------------------
  106. 3.  HEADER (to make sure ROFF defaults are right)
  107. ----------------------------------------------------------------
  108. .HE ////
  109. .LS 1
  110. .12
  111. ..\DATE\
  112. ..\CALLDATE\
  113. \DATE\ \CALLDATE\
  114. .BJ
  115. .CE 1
  116. ^B*** LETTERS FOLLOW THIS PAGE ***^b
  117. ..Do 'NR RAP.OUT' TO MERGE PROPERLY
  118. ..BP
  119. ----------------------------------------------------------------
  120. COMMENTS:
  121. This text sets the defaults of ROFF to NO HEADER, SINGLE SPACING, and
  122. sends the code to set my Anderson-Jacobson printer into 12 pitch
  123. (that's optional, controlled through the ROFF macro '.12').  Next, the
  124. header asks for two dates -- DATE, which is the date of the letter,
  125. and CALLDATE, which is used in the text of the initial mailing.  These
  126. can be entered however you like -- e.g., '15 April 1988.'  Then a
  127. cover page for the run is printed (in my case, to allow the A-J to get
  128. into 12-pitch properly) and ejected.
  129.  
  130. What happens now is that ROFF reads in the first set of fields from
  131. MAIL.TXT (N1-A4), and then calls the letter text, RLET.  A sample
  132. letter (TLET) appears below:
  133. ----------------------------------------------------------------
  134. 4.  RLET:  the Thanks LETter, and the final step.
  135. ----------------------------------------------------------------
  136. .BP
  137. .TI +40
  138. \DATE\
  139. .SP 2
  140. .NF
  141. Mr. \N1\ \N2\
  142. \A1\
  143. \A2\  \A3\ \A4\
  144. .FI
  145. .SP
  146. Dear Mr. \N2\:
  147. .SP
  148. Thank you for allowing me to interview you as part of my study of the
  149. -------- ----------- --------.  Your cooperation has made my work much
  150. easier, and it is my hope that my completed dissertation will be
  151. useful to --- in return.     
  152.                              
  153. I expect to take about one year to complete the interviews and writing
  154. of my dissertation.  If you should have any questions during that
  155. time, or if you come across anything that you think might be useful in
  156. my study (old newspaper clipping relating to ---, etc), please feel
  157. free to write to me at the address given above.
  158.  
  159. Again, many thanks for being so generous with your time.
  160. .SP 2
  161. .IN +40
  162. .NF
  163. Sincerely,
  164.  
  165.  
  166.  
  167. Andrew Marchant Shapiro
  168. .IN
  169. ----------------------------------------------------------------
  170. COMMENTS:
  171. The .BP makes sure each letter begins on a new page.  Then the
  172. formatter moves over 40 columns (temporarily) to print the value of
  173. the variable DATE.  It spaces down 2 lines, turns filling off (so the
  174. address will appear verbatim) and fills out the address with the
  175. values of N1, N2, A1, A2, A3 and A4, respectively.
  176.  
  177. Then it turns filling back on, spaces, uses N2 again in the
  178. salutation, spaces, and types out the body of the letter.  Note that
  179. the letter ends with .IN -- this is critical! Otherwise, the next
  180. letter will start at column 40, and each letter after that likewise. 
  181. And you wouldn't want that!
  182. ----------------------------------------------------------------
  183.  
  184. That does it.  It looks confusing, I know, but it works.  The major
  185. advantage of this over, for example, WS, is that since ROFF is a
  186. formatter, the text doesn't get handled until AFTER variables are
  187. substituted.  So, if you wanted to insert somebody's name into a
  188. letter, neither very long or very short names would cause problems. 
  189. ROFF would 'fill' the text to fit.  Besides, ROFF is FREE!!  You can't
  190. beat that...
  191.  
  192.                                  Andrew Marchant Shapiiro
  193.                               Chicago
  194.                               Contact via:
  195.                               ADVOCATE/312-939-4411
  196.  
  197.  A1, A2, A3 and