home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / database / commands.zip / GLIST.PRG < prev    next >
Text File  |  1986-05-28  |  10KB  |  438 lines

  1.  
  2. * Program......: GLIST.PRG
  3. * Author.......: Glenn R. Abelson
  4. * Date(s)......: 05/10/86
  5. * Notice.......: Copyright 1986, Glenn Abelson Inc., All Rights Reserved
  6. * Notes........: Dbase/Clipper Report Generator
  7. *
  8. PUBLIC CLIPPER,MTOWHERE,MWHERE,MFIELD,MCMD
  9. *
  10. DO WHIL .T.
  11. SET DEVICE TO SCREEN
  12. SET TALK OFF
  13. SET SAFETY OFF
  14. CLEAR
  15. *
  16. * -- MENU OPTIONS
  17. *
  18. IF CLIPPER
  19. frame = CHR(201)+CHR(205)+CHR(187)+CHR(186)+CHR(188)+CHR(205)+CHR(200) +;
  20. CHR(186)
  21. @ 6,20,16,60 BOX frame
  22. @ 7,22,14,58 BOX frame
  23. ELSE
  24. @ 6,20 TO 16,60 DOUBLE
  25. @ 7,22 TO 14,58 DOUBLE
  26. ENDI
  27. @ 1,1 SAY 'Lists may be indexed and conditional for certain records.'
  28. @ 2,1 SAY 'Totals may be generated after Report is printed.'
  29. @ 3,1 SAY 'Lists may be sent to Screen, Printer or a File for later editing.'
  30. @ 4,1 SAY 'Double line Lists cannot be created here.'
  31. *
  32. *
  33. @ 8,30 SAY 'List Options'
  34. @ 10,30 SAY '1. Run an exisiting list'
  35. @ 11,30 say '2. Create and run a list'
  36. @ 12,30 say '<enter> to exit '
  37. *
  38. *
  39. @ 19,0 SAY 'Using &MBASE'
  40. @ 20,0 SAY 'Index &MINDEX'
  41. WAIT 'Your selection ? ' TO CHOICE
  42.    DO CASE
  43. *
  44. * -- EXIT ON <ENTER>
  45. *
  46.       CASE "" = CHOICE
  47.          RETURN
  48. *
  49. *
  50.       CASE CHOICE = '1'
  51. *
  52. * -- Show existing Lists
  53. *
  54.             DIR *.LST
  55.             ?'Be sure list matches with database in use.'
  56.             ACCEPT 'List to run (do not include extension).... ' to MLST
  57. *
  58. * -- MAKE SURE ONLY 8 LETTERS & NO EXT IS USED
  59. *
  60.                     IF LEN(MLST) > 8 
  61.                        ?'CAN NOT ACCEPT THAT NAME -- TOO LONG '
  62.                        WAIT
  63.                        LOOP
  64.                     ENDI
  65. *
  66. * -- CHECK FOR EXISTENCE
  67. *
  68.                    IF .NOT. FILE ('&MLST' + '.LST')
  69.                     ?'Check your typing '
  70.                     wait
  71.                     loop
  72.                   ELSE
  73.                      STORE '&MLST' + '.LST' TO MLST
  74.                   ENDI
  75. *
  76. * -- .LST files are really memory variable files with database and field
  77. * -- information
  78. *
  79.              RESTORE FROM &MLST  ADDITIVE
  80. *
  81. * -- Use the database and index option from restore
  82. *
  83.              SELECT 1
  84.              USE &MBASE
  85.              SET INDEX TO &MINDEX
  86. *
  87. * -- Open error check file
  88. *
  89.                SELE 2
  90.                USE DATADICT
  91. *         
  92. * -- JUMP TO CONDITIONS SECTION
  93. *
  94. *********************
  95.          CASE CHOICE = '2'
  96. *
  97. * -- Exit on empty entry
  98. *
  99.        IF MBASE < "!"
  100.         RETURN
  101.        ENDI
  102. *
  103. * -- LIST FIELDS
  104. *
  105. CLEAR
  106. MLIST = 'N'
  107. @ 8,1 SAY 'DO YOU WANT A FIELD LIST Y/N ? ' 
  108. @ 8,34 GET MLIST
  109. READ
  110.  IF UPPER(MLIST) = 'Y'
  111. *
  112. * -- Use field list for clipper, because it is fast
  113. *
  114.    IF CLIPPER
  115.      ROW = 2
  116.      CLEAR
  117.   COUNT TO MCOUNT
  118.   SELECT 1
  119.   DO WHIL .T.
  120.      FOR N = 1 TO MCOUNT
  121.        IF ROW > 22
  122.         WAIT
  123.         ROW = 2
  124.         CLEAR
  125.        ENDI
  126.        @ ROW()+1,1 SAY N PICTURE "@B"
  127.        @ ROW(),8 SAY FIELDNAME(N)
  128.         N = N+1
  129.        @ ROW(),22 SAY N PICTURE "@B"
  130.        @ ROW(),28 SAY FIELDNAME(N)
  131.          N = N+1
  132.        @ ROW(),42 SAY N PICTURE "@B"
  133.        @ ROW(),48 SAY FIELDNAME(N)
  134.          N=N+1
  135.        @ ROW(),62 SAY N PICTURE "@B"
  136.        @ ROW(),70 SAY FIELDNAME(N)
  137.          ROW = ROW + 1
  138.         NEXT N
  139.           IF "" = FIELDNAME(N)
  140.            WAIT
  141.            SELECT 2
  142.            EXIT
  143.           ENDI
  144.        LOOP
  145.    ENDD
  146. *
  147. * -- IF NOT CLIPPER DO BELOW, BECAUSE ITS FASTER IN DBASE
  148. *
  149.   ENDI
  150.     IF .NOT. CLIPPER
  151.       SELE 2
  152.       USE DATADICT 
  153.   ?'Please write down field names in your List. '
  154.   ?'Field name, type, length and decimals will be given.'
  155.   WAIT
  156.   CLEAR
  157.  DO WHIL .T.
  158.   DISPLAY NEXT 19 FIELD_NAME, FIELD_TYPE, FIELD_LEN, FIELD_DEC
  159.   WAIT 'More Y/N ? ' TO MMORE
  160.      IF UPPER(MMORE) = 'Y'
  161.         CLEAR
  162.         LOOP
  163.      ELSE
  164.         CLEAR
  165.         EXIT
  166.      ENDI
  167.  ENDD
  168. *
  169. * -- End of Clipper/Not Clipper
  170. *
  171. ENDI
  172. *
  173. * -- End of display fields routine
  174. *
  175. ENDI
  176. *
  177. * -- Put the List fields together
  178. *     
  179. * -- GET THE List WIDTH, CONTROL INPUTS
  180. *
  181. MWIDTH = 80
  182. @ 12,1 SAY 'List width (80 - 233 columns)... '
  183. @ 12,34 GET MWIDTH PICTURE '999' 
  184. READ
  185. *
  186. * -- THESE MEMVARS ARE USED AS BUILDING BLOCKS FOR THE List
  187. *
  188. MBUILD = ' '             && Combines field names with +
  189. MSPACES = 0              && Columns remaining in List
  190. *
  191. * -- GET THE FIELDS
  192. * -- KEEP LOOPING UNTIL DONE
  193. *
  194. *
  195. * -- Screen, Printer, File DETERMINES HOW MEMVARS ARE STORED
  196. * -- Screen and Printer are natural and seperated by ,
  197. * -- To file converts all to Character and seperates by +
  198. * -- Before fields are entered, ultimate direction must be determined
  199. *
  200. WAIT 'Is List to go to <F>ile, <S>creen or <P>rinter ' to MWHERE
  201.   DO CASE
  202.    CASE UPPER(MWHERE) = 'P'
  203.    STORE ' PRINT' TO MTOWHERE
  204.   
  205.    CASE UPPER(MWHERE) = 'S'
  206.    STORE ' SCREEN ' TO MTOWHERE
  207.   
  208.    CASE UPPER(MWHERE) = 'F'
  209.     ACCEPT 'File name to sent List to (.txt extension is automatic) .... ' TO MFILE
  210.                 IF LEN(MFILE) > 8
  211.                  ?'File name is too long - 8 letter max'
  212.                  WAIT
  213.                  LOOP
  214.                 ENDI
  215.  
  216.    OTHERWISE
  217.      WAIT
  218. ENDCASE
  219.  
  220. *
  221. * -- PREPARE FOR List ERROR CHECK ON FIELD NAMES
  222. *
  223.   SELECT 2
  224.   USE DATADICT
  225. *
  226. CLEAR
  227. DO WHILE  .T.
  228. ACCEPT 'Field name for List or <enter> if done... ' TO MFIELD
  229. *
  230. *  -- If done exit
  231. *
  232.   IF "" = MFIELD
  233.     EXIT
  234.   ENDI
  235. *
  236. * -- ERROR CHECK FIELD NAME AND TYPE
  237. *
  238.   STORE UPPER(MFIELD) TO MFIELD
  239.   SET EXACT ON
  240.    LOCATE FOR FIELD_NAME = '&MFIELD'
  241.          IF EOF()
  242.            ?'Not a field name '
  243. *
  244. * -- If an error, get rid of field name
  245. *
  246.            MFIELD = SPACE(10)
  247.            LOOP
  248.          ENDI
  249. *
  250. * -- CHECK COLUMNS LEFT
  251. *
  252. STORE MWIDTH - FIELD_LEN  TO MWIDTH
  253.  IF MWIDTH < 1
  254.   ?' OUT OF SPACE '
  255.   ?' Field not accepted'
  256.   MFIELD = SPACE(10)
  257.   WAIT
  258.   LOOP
  259.  ENDI
  260. *
  261. * -- IN CLIPPER or
  262. * -- To send data to a file, all must be converted to 'C' type fields
  263. * -- First field is top condition, then lower condition
  264. * -- Because List treats all fields as characters, non C fields must
  265. * -- be converted prior to being added to the Build list
  266. * -- My programs do no use L fields (just C fields 1 character long)
  267. *
  268.   IF CLIPPER
  269.       IF FIELD_TYPE = 'N'
  270.          STORE 'STR('+'&MFIELD'+')'+ ' ' TO MFIELD
  271.       ENDI
  272. *
  273.       IF FIELD_TYPE = 'D'
  274.          STORE 'DTOC('+'&MFIELD'+')' TO MFIELD
  275.       ENDI
  276.   ENDI
  277. **********
  278. *
  279. * -- Must be done in DBASE for File directed programs, but will
  280. * -- be restored twice in Clipper without .NOT. CLIPPER
  281. *
  282. IF .NOT. CLIPPER
  283.   IF UPPER(MWHERE) = 'F'
  284.       IF FIELD_TYPE = 'N'
  285.          STORE 'STR('+'&MFIELD'+')' TO MFIELD
  286.       ENDI
  287. *
  288.       IF FIELD_TYPE = 'D'
  289.          STORE DTOC(MFIELD) TO MFIELD
  290.       ENDI
  291.    ENDI
  292. ENDI
  293. * -- Clipper cannot read commas in memvars AND
  294. * -- FILE DIRECTED Lists REQUIRE + INSTEAD OF ,
  295. *
  296.  IF MBUILD = ' '
  297.      STORE MFIELD TO MBUILD
  298.  ELSE
  299.      IF CLIPPER
  300.          STORE MBUILD + "+" + " " + MFIELD TO MBUILD
  301.      ENDI
  302. *
  303.    IF .NOT. CLIPPER
  304.      IF UPPER(MWHERE) = 'F'
  305.          STORE MBUILD + "+"  + " " + MFIELD  TO MBUILD
  306.      ELSE
  307.          STORE MBUILD + ","  + MFIELD  TO MBUILD
  308.      ENDI
  309.    ENDI
  310.  ENDI
  311.  
  312. *
  313. * -- Display space left
  314. *
  315. ?'TOTAL COLUMNS LEFT '
  316. ? MWIDTH
  317. LOOP
  318. *
  319. * -- Option to save format
  320. *
  321. ENDDO
  322.   WAIT 'Save this List format  Y/N ? ' TO MSAVE
  323.        IF UPPER(MSAVE)='Y'
  324.         ?'Indicate in list name which database is in use.'
  325.         ?'If saving a list for database named MASTER.DBF'
  326.         ?'and the list consisted of Company, First, Last...'
  327.         ?'you might name the list MSCONAME  (MS -Master CO -company NAME).'
  328.         ?
  329.         ACCEPT '1-8 letter name (.LST extension is automatic).. 'TO MNAME
  330.         STORE MNAME + '.LST' TO MNAME
  331.         SAVE ALL LIKE M* TO &MNAME
  332.        ENDI
  333. ******************************************************
  334. *
  335. * -- END OF CASE CONDITIONS -- BELOW APPLIES FOR 1 OR 2
  336. *
  337. ENDCASE
  338. *
  339. * -- Set conditions if any
  340. * -- Only single conditions allowed i.e. FIELD > 6  etc
  341. * -- I stay away from supplying clients with complex routines like
  342. * -- multiple conditions, since it quadruples my tech support and
  343. * -- eventually puts me out of business.
  344. *
  345. WAIT 'Is List for <A>ll records, or just <S>ome ' TO MMANY
  346.  IF UPPER(MMANY) = 'S'
  347.    MCMD = "LIST "
  348.    DO ERRORCHK
  349. *
  350. * -- MOVE FIELD LIST TO MFIELD TO DISPLAY AGAINST ERROR CHECKING
  351. *
  352.   STORE '&MCOND' TO MFIELD
  353.   STORE 'LIST ' TO MCMD
  354.  ELSE
  355. *
  356. * -- SET A 'DUMMY' CONDITION  i.e. all records, because the hard coded word
  357. * FOR must be in code for this to run under Clipper
  358. *
  359.   STORE 'RECNO() > 0' TO MCOND
  360.  ENDI
  361.  
  362. *
  363. * -- Send List to a text file for editing
  364. *
  365. IF UPPER(MWHERE) = 'F'
  366.       CLEAR
  367.       @ 12,12 SAY 'Sending data to file and screen '
  368.       SET ALTERNATE TO &MFILE
  369.       SET ALTERNATE ON
  370. ENDI
  371. *
  372. * -- RUN List
  373. *
  374. CLOSE DATABASES
  375. SELE 1
  376. USE &MBASE
  377. SET INDEX TO &MINDEX 
  378. CLEAR
  379. SET FILTER TO &MCOND
  380. GOTO TOP
  381. *
  382. *
  383. * -- SHOW FIELDS
  384. *
  385. IF UPPER(MWHERE) = 'P'
  386. DISPLAY ALL &MBUILD OFF TO PRINT
  387. ENDI
  388. *
  389. IF UPPER(MWHERE) = 'F'
  390. MCOUNTER = 1
  391. DO WHIL .NOT. EOF() 
  392. *
  393. * -- &MBUILD prints the field contents
  394. * -- Send to file
  395. *
  396.    ?&MBUILD
  397. SKIP
  398. LOOP
  399. ENDDO
  400. ENDI
  401. *
  402. IF UPPER(MWHERE) = 'S'
  403.  DO WHIL .NOT. EOF()
  404.    DISPLAY NEXT 17 &MBUILD OFF
  405.    WAIT 'MORE Y/N ' TO MMORE
  406.       IF UPPER(MMORE) = 'N'
  407.         EXIT
  408.       ENDI
  409.   LOOP
  410.  ENDD
  411. ENDI
  412. *
  413. * -- Totals are merely a re summing of field names
  414. *
  415.            WAIT ' DO YOU WANT TOTALS ON ANY FIELDS Y/N? ' TO MTOTAL
  416.                  IF UPPER(MTOTAL) = 'Y'
  417.                   DO WHIL .T.
  418.                     ACCEPT 'Field to total or <enter> to exit ... ' TO MTOTAL
  419.                        IF "" = MTOTAL
  420.                         EXIT
  421.                        ENDI
  422.                     SUM ALL &MTOTAL TO MNUMBER
  423.                     ?'Total for &MTOTAL '
  424.                     ? MNUMBER
  425.                     LOOP
  426.                   ENDD
  427.                  ENDI
  428.                     
  429. *
  430.              IF UPPER(MWHERE) = 'F'
  431.                SET ALTERNATE TO
  432.                SET ALTERNATE OFF
  433.              ENDI
  434.    SET DEVICE TO SCREEN
  435.    CLOSE DATABASE
  436. ENDD
  437.