home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource1 / chint / useful23.hnt < prev    next >
Text File  |  1993-09-20  |  6KB  |  162 lines

  1. This useful hint outlines how to add an array to the standard report skeleton
  2. so that it is possible to supress output in band(s) or parts thereof while
  3. still having all the processing done.
  4.  
  5. 1)  As usual the first step is to make a copy of the standard skeleton,
  6.     DBCREP.SKL so that the original code remains intact, though the changes
  7.     are made in such a way that this modified skeleton could be used as the
  8.     standard skeleton.
  9.  
  10. 2)  Add a new global variable, (after the existing declaration at the top of
  11.     the code) :--
  12.  
  13.   bool supressband[MAX_BANDS][5];                                     /*MOD*/
  14.  
  15. 3)  In the "addLine()" function test "supressband" to see if it is necessary
  16.     to bypass putting backbgound characters and printer codes into the page
  17.     buffer :--
  18.  
  19. void addLine(int band, int part, int line)
  20. {
  21.   if (!supressband[band][part]) {                                     /*MOD*/
  22. ...
  23.   }                                                                   /*MOD*/
  24. }
  25.  
  26. 4)  In the "addMemos()" function test "supressband" to see if it is
  27.     possible to bypass processing the memo :--
  28.  
  29. void addMemos(BOOL memofield, ...
  30. {
  31.   if (!supressband[band][part]) {                                     /*MOD*/
  32. ...
  33.   }                                                                   /*MOD*/
  34. }
  35.  
  36. 5)  In the "addFields()" function test "supressband" to see if it is
  37.     necessary to bypass putting the field characters into the page buffer:--
  38.  
  39. void addFields(strptr data, int band, int part, int line, int cond, ...
  40. {
  41.   ...
  42.     if (*(trim(tempString1, strcopy(tempString2, tempString3, 0, TL))))  {
  43.       if (!supressband[band][part]) {                                 /*MOD*/
  44.         textadded = True;
  45.         if (TL > 0) memmove(((*pagebuffer) + lineno)->line + pos - 1, tempString3, TL);
  46.       }                                                               /*MOD*/
  47.     }
  48.   ...
  49. }
  50.  
  51. 6)  In the "fillDataLine" function test "supressband" to see if it is
  52.     necessary to reset "textadded" to False.
  53.  
  54. void fillDataLine(int band, int part, int line)
  55. {
  56.   textadded = (part != _DATA) || (!(*(supressblanks + band)));
  57.   textadded = textadded && !supressband[band][part];                  /*MOD*/
  58.   switch (band) {
  59.     ⁿFILLLINEⁿ
  60.   }
  61.   return;
  62. }
  63.  
  64. 7)  The "PrtBlanks" function needs to by modified so that it can tell if it
  65.     is processing the Header, Data, Control Break or Footer.  Add a "part"
  66.     parameter to the function header and then test "supressband" to see if
  67.     "blank" lines should be added at the end of the area being processed.  If
  68.     supression is True then set the "blanks" variable back to zero.
  69.  
  70.     Don't forget to update the function prototype at teh begining of the
  71.     program to match the change to the function implementation.
  72.  
  73. void printBlankLines(int band, int part)                              /*MOD*/
  74. {
  75.   if (!supressband[band][part]) {                                     /*MOD*/
  76.     textadded = True;
  77.     while(blanks != 0) {
  78.       blanks--;
  79.       incrementLine(band);
  80.     }
  81.   }                                                                   /*MOD*/
  82.   else blanks = 0;                                                    /*MOD*/
  83.   return;
  84. }
  85.  
  86. 8)  In the four functions that place calls to "printBlanksLines()" add a
  87.     second parameter, (either _HDR, _DATA, _BREAK, or _FOOTER depending on
  88.     the part of the report being processed), to the call to
  89.     "printBlanksLines()".
  90.  
  91. void printDataHeader(int band)
  92. {
  93.   ...
  94.   printBlankLines(band,_HDR);                                         /*MOD*/
  95.   ...
  96. }
  97.  
  98. void printDataFooter(int band)
  99. {
  100.   ...
  101.   printBlankLines(band,_FOOTER);                                      /*MOD*/
  102.   ...
  103. }
  104.  
  105. void printDataBand(int band)
  106. {
  107.   ...
  108.   printBlankLines(band,_DATA);                                        /*MOD*/
  109.   ...
  110. }
  111.  
  112. void printControlBreak(int band)
  113. {
  114.   ...
  115.   printBlankLines(band,_BREAK);                                       /*MOD*/
  116.   ...
  117. }
  118.  
  119.  
  120. 9)  In the "Initialize" procedure set all the "supressband" elements to
  121.     false.  This means that, by default all the report will be printed as
  122.     would normally be the case.
  123.  
  124. int initialize(void)
  125. {
  126.   int    counter, okStatus, stringLength;
  127.  
  128.   ...
  129.   for (counter = 1; counter <= MAX_BANDS;  counter++) {
  130.     *(break_ + counter)      = None;
  131.     *(recordsread + counter) = *(recordsprinted + counter) = *(bandstartlno + counter) = 0;
  132.     supressband[counter][_HDR] = False;                               /*MOD*/
  133.     supressband[counter][_DATA] = False;                              /*MOD*/
  134.     supressband[counter][_BREAK] = False;                             /*MOD*/
  135.     supressband[counter][_FOOTER] = False;                            /*MOD*/
  136.   }
  137.   supressband[0][_HDR] = False;                                       /*MOD*/
  138.   supressband[0][_DATA] = False;                                      /*MOD*/
  139.   supressband[0][_BREAK] = False;                                     /*MOD*/
  140.   supressband[0][_FOOTER] = False;                                    /*MOD*/
  141.   ...
  142. }
  143.  
  144.  
  145. With the above modifications in place it is just a matter of re-setting some
  146. or all of the "supressband" elements so that certain parts of the report
  147. are processed but not actually printed to the output device.
  148.  
  149. This could be done by inserting compute fields into a filter associated with
  150. a particular report, or by using the "Fields/Add/Statement" to insert some
  151. code statements early in the report definition of the form :--
  152.  
  153.      supressband[2][_DATA] = True;  /* Stop Band 2 Data being printed */
  154.  
  155.  
  156. Note the following constants are already defined :--
  157.  
  158. #define _HDR           1
  159. #define _DATA          2
  160. #define _BREAK         3
  161. #define _FOOTER        4
  162.