home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / chint / useful26.hnt < prev    next >
Text File  |  1993-10-29  |  8KB  |  262 lines

  1. This useful hint shows how to modify the standard report skeleton to enable it
  2. to print multiple copies of a report.
  3.  
  4. 2
  5. 1)  The first step is to copy the standard report skeleton to a new file so
  6.     that the original remains intact :--
  7.  
  8.         COPY DBCREP.SKL NCOPIES.SKL
  9.  
  10.     Now we will make the modifications to this skeleton.  When you want a
  11.     report to have acces to this functionallity just change the skeleton
  12.     name on hte report GENERATE screen from DBCREP.SKL to NCOPIES.SKL.
  13.  
  14. 2)  Add a new global variable :--
  15.  
  16.         int numberofcopies;
  17.  
  18. 3)  We need to break the "initialize()" function into two parts, and also
  19.     prototype the new function "sub_initialize".  Then inside the
  20.     "InitializeReport" function we will introduce a new local loop variable,
  21.     then run a "for" loop to repeat the printing of the report :--
  22.  
  23. /*
  24. ****************************************************************************
  25. **  Function   : subinitialize
  26. **
  27. **  Arguments  : None
  28. **  Returns    : None
  29. **
  30. **  This function resets global variable.  It can be called each time around
  31. **  a loop the repeatedly prints the report, ("numberofcopies" times).
  32. **
  33. ****************************************************************************
  34. */
  35.  
  36.  
  37. void subinitialize(void)                                           /*MOD MC*/
  38. {
  39.   int    counter;
  40.  
  41.    skip                = True;
  42.    textadded           = True;
  43.    filtererror         = False;
  44.    mainprted           = False;
  45.    pagetoprint         = False;
  46.    supresspage         = False;
  47.    scrn_active         = True;
  48.    terminate           = False;
  49.    splitmemobegun      = False;
  50.    blanks              = 0;
  51.    gxpos               = 0;
  52.    pageno              = 1;
  53.    lineno              = 1;
  54.    *errorMessage       = '\0';
  55.  
  56. /* initialise the memos, totals and records counters */
  57.  
  58.    for (counter = 0; counter <= MAX_MEMOS;  counter++) (memostatus + counter)->memoref = *(extralines + counter) = 0;
  59.    for (counter = 1; counter <= MAX_TOTALS; counter++) clearTotals(counter);
  60.    for (counter = 1; counter <= MAX_BANDS;  counter++) {
  61.        *(break_ + counter)      = None;
  62.        *(recordsread + counter) = *(recordsprinted + counter) = *(bandstartlno + counter) = 0;
  63.    }
  64.    totalrecordsread    = 0;
  65.    totalrecordsprinted = 0;
  66. }
  67.  
  68. /*
  69. ****************************************************************************
  70. **  Function   : initialize
  71. **
  72. **  Arguments  : None
  73. **  Returns    : (int) - status (0-Unsuccesful, 1-Successful)
  74. **
  75. **  This function attempts initialise the included functions and variables,
  76. **  as well as any runtime variables, followed by opening all the input
  77. **  files.
  78. **
  79. ****************************************************************************
  80. */
  81.  
  82. int initialize(void)
  83. {
  84.   int    counter, okStatus, stringLength;
  85.  
  86. /* initialise the DataBoss header routines and variables */
  87.  
  88.   extfhc_init();
  89.   db_curs_init();
  90.   db_date_init();
  91.   db_funcs_init();
  92.   db_heap_init();
  93.   db_gvar_init();
  94.   db_key_init();
  95.   db_win_init();
  96.   db_util_init();
  97.   db_tree_init();
  98.   db_list_init();
  99.   db_uwin_init();
  100.  
  101. ⁿIFDEF MEMOSⁿ
  102.   db_memo_init();
  103. ⁿENDDEFⁿ
  104.  
  105. ⁿIFDEF MUSERⁿ
  106.   multiuser = True;
  107. ⁿELSEDEFⁿ
  108.   multiuser = False;
  109. ⁿENDDEFⁿ
  110.  
  111. #ifdef F_USED
  112.   _keyexpr  = keyExpression;
  113.   _getarec  = getarec;
  114.   _horizrec = horizrec;
  115. #endif
  116.  
  117. /* reserve an output device handle early */
  118.  
  119.   outputFileHandle = open("CON", O_CREAT | O_BINARY | O_WRONLY, S_IREAD | S_IWRITE);
  120.  
  121. /* initialise runtime variables */
  122.  
  123.   numberofcopies      = 1;                                         /*MOD MC*/
  124.   strcpy(iodev, ⁿIODEVⁿ);
  125.   strcpy(dsk_file, ⁿDISKFILEⁿ);
  126.   strconcat(dbname,datapath,"\\",dbnames[bandlink[1].thisfile][0],NULL);
  127.   strcpy(progname,thisprog.fpath);
  128.   fok                 = True;
  129.   deltas              = 0;                        /* Turn Screen Save Off */
  130.   okStatus            = True;
  131.   pabort              = False;
  132.   pmode               = IBMGraphics;
  133.   subinitialize();                                                 /*MOD MC*/
  134.   tmpbuf              = (BYTE *)db_malloc(4097 * sizeof(BYTE));
  135.   mbuf                = (char *)db_malloc((MEMBUFSIZ + 1) * sizeof(char));
  136.  
  137. /* clear the screen and initialise the edit fields, indexes and storage space */
  138.  
  139.   clrscr();
  140.   initedit();
  141.   initindex();
  142.  
  143. /* check to see if the program is allowed to run from DOS */
  144.  
  145.   if (menudriven && (!dbcaller))  {
  146.     strcpy(errorMessage, LSC_MenuDriven);
  147.     goto initializeError;
  148.   }
  149.  
  150. /* check to see if the directory path passed for the datafiles is valid */
  151.  
  152.   if (!validpath())  {
  153.     strcpy(errorMessage, LSC_AbortBadPath);
  154.     goto initializeError;
  155.   }
  156.  
  157. /* display the opening "Initialising" window and if successful open all the files */
  158.  
  159.   if (displayWindowMessage(LSC_Initializing)) {
  160.     openFiles();
  161.     closewin(&twinp);
  162.     if (!fok) {
  163.       strcpy(errorMessage, LSC_ErrNeededFiles);
  164.       goto initializeError;
  165.     }
  166.   }
  167.   else {
  168.     strconcat(errorMessage, LSC_Window, " : ", DOSErr8, NULL);
  169.     goto initializeError;
  170.   }
  171.  
  172. /* get the values for the report Range */
  173.  
  174.   ⁿGETRANGEⁿ
  175.  
  176. /* check to see if an error occurred during entering of filter data */
  177.  
  178.   if (filtererror)  {
  179.     strconcat(errorMessage, LSC_BadOpenFilter, " : ", rw.wfnam,NULL);
  180.     goto initializeError;
  181.   }
  182.  
  183. /* check for output to screen, if so set the relevant controls */
  184.  
  185.   if (strstr(iodev, "CON"))  {
  186.     pagelength       = 24;
  187.     pause            = True;
  188.     clrscreen        = True;
  189.   }
  190.  
  191. /* allocate heap memory for report storage */
  192.  
  193.   if (!allocateReportData()) {
  194.     strcpy(errorMessage, DBTErr203);
  195.     goto initializeError;
  196.   }
  197.   goto initializeExit;
  198.  
  199. initializeError:
  200.   okStatus = False;
  201.   displayError(errorMessage);
  202.  
  203. initializeExit:
  204.   errorScreenInitialize();
  205.   return(okStatus);
  206. }
  207.  
  208. /*
  209. ****************************************************************************
  210. **  Function   : processReport
  211. **
  212. **  Arguments  : None
  213. **  Returns    : None
  214. **
  215. **  This function performs the actual processing of the report.
  216. **
  217. ****************************************************************************
  218. */
  219.  
  220. void processReport(void)
  221. {
  222.   int loops;                                                       /*MOD MC*/
  223.  
  224.   for (loops = 1; loops <= numberofcopies; loops++) if (!terminate) { /*MOD MC*/
  225.     subinitialize();                                               /*MOD MC*/
  226.     establish_link(1);
  227.     printReportHeaderOrFooter(RPHDR);
  228.     printPageHeader();
  229.     ⁿPRINTⁿ
  230.     if (pagetoprint) {
  231.       printPageFooter();
  232.       outputPage();
  233.     }
  234.     printReportHeaderOrFooter(RPFTR);
  235.   }                                                                /*MOD MC*/
  236.   return;
  237. }
  238.  
  239.  
  240. This completes the work necessary to get the report to print multiple copies.
  241. what you will now need is a way to set the number of copies.  This could be
  242. achieved simplisically by changing the the value to which "numberofcopies" is
  243. initialized in the "Initialize" procedure.
  244.  
  245. A better idea is to give the user the option of to specify the number of
  246. copie at run time.  To do this you would design a filter screen with a prompt
  247. like :--
  248.              How many copies :
  249.  
  250. Now add the folowing filter fields :--
  251.  
  252. Field Name  Seq Typ  Mode  Pic  Validation
  253. ----------  --- ---  ----  ---  ----------
  254. GET_COPIES   1   N    E     2#   !{} > 0
  255.  
  256.  
  257. Field Name  Seq Typ  Mode  Pic  Compute Expression
  258. ----------  --- ---  ----  ---  ----------------------------------
  259. SET_COPIES   2   C    C     X   numberofcopies = ival(GET_COPIES)
  260.  
  261. You can attach this filter to any report that is generated using the
  262. NCOPIES.SKL skeleton file.