* add.sig 08/18/83 ******************************************************************* * THIS MODULE ADDS RECORDS TO THE ORDERS (SIG/M) DATA BASE. * IT IS WELL WORTH PRINTING OUT AND STUDYING BECAUSE IT CON- * TAINS MANY PRACTICAL HINTS FOR WRITING A dBASE PROGRAM. * COMMENTS ARE INSERTED AT APPROPRIATE POINTS IN THE FILE. * COMMENTS ALREADY IN MAIN.SIG ARE NOT REPEATED. ****************************************************************** * WE WANT TO GET RID OF THE INDEX WHEN WE ADD. IF YOU * HAVE A SMALL DATA BASE IT IS OK - BUT OTHERWISE YOU * HAVE TO WAIT FOR EACH RECORD TO BE INDEXED. MOST COMMERCIAL * PROGRAMS INDEX EVERY TIME AND IT COSTS YOU TIME. HERE WE * GIVE YOU THE OPTION OF INDEXING OR NOT WHEN YOU EXIT. IF * YOU DO NOT, THE RECORDS ARE THERE, BUT YOU WILL NOT FIND * THEM EXCEPT BY THE STRING SEARCH IN SEARCH1.SIG (SINCE IT * USES THE 'LOCATE FOR' COMMAND TO FIND NON INDEXED DATA. * THE INDEX IS STILL ON - SO WE TAKE IT OFF SET INDEX TO ERASE STORE t TO first STORE t TO more * because we use three screens in this add - it makes for a neater * screen if we get rid of the colons around the add field SET COLON OFF DO WHILE more IF first * get record number for automatic order number addition GOTO bottom @ 2, 0 SAY "+---------------------------------------" @ 2,39 SAY "---------------------------------------+" @ 3, 5 SAY "ORDER NUMBER:" @ 3,43 SAY "Complete:" @ 4, 8 SAY "Last name:" @ 4,46 SAY "First:" @ 5,10 SAY "Address:" @ 6, 9 SAY "(line 2):" @ 7, 9 SAY "(line 3):" @ 8,13 SAY "City:" @ 8,46 SAY "State:" @ 8,65 SAY "ZIP:" @ 9,11 SAY "Amount:" @ 9,46 SAY "Enter:" @ 9,64 SAY "Ship:" @ 11,00 SAY "Enter Individual Volumes Ordered (999 when done): " @ 12, 2 SAY "Volumes:" @ 14, 2 SAY "Remarks:" @ 15, 2 SAY "Remarks:" @ 16, 0 SAY "Backorder:" @ 17,44 SAY "Catalog:" @ 18, 2 SAY "Shipped:" @ 18,26 SAY "Shipped:" @ 18,62 SAY "Update:" @ 19, 0 SAY "+---------------------------------------" @ 19,39 SAY "---------------------------------------+" ENDIF first STORE f TO first * IN SIG/M.CMD WE HAVE SAVED OUR VARIABLES AS A FILE ADD.MEM. WE NOW * BRING THEM UP (NOTE - IN ADD.INV WHERE ARE VARIABLES ARE ESSENTIALLY * NUMERIC WE DO NOT USE THIS METHOD. IF YOU RUN THE SAME PROGRAM ON * BOTH CP/M 80 AND CP/M 86 FIRST DELETE ALL .MEM FILES AS THEY CANNOT * BE MOVED BETWEEN OPERATING SYSTEMS. RESTORE FROM ADD * WE ASSUME ENTER DATE IS TODAY STORE DATE() TO mentered STORE DATE() TO mshipped * we went to the bottom of the file - i.e. the last record - * we add one to that and get 4 digits of the order number STORE # TO ord:num STORE ord:num + 1 TO ord:num * change to character field from numeric STORE STR(ord:num,4,0) TO ord:num1 * however, we want the order number to give us some date data * so we will use the date as part of the order number * it will be nnnnMMDDY. only way to get a duplicate order number * would be to add records, delete, pack and add more records on same * so please - pack at the end of the day STORE ord:num1 + $(DATE(),1,2) + $(DATE(),4,2) + $(DATE(),8,1) TO morder STORE 'Y' TO mcomp STORE 'N' TO mcatalog STORE 'Add Records Module' TO mode STORE 'Enter as many records as you want.' TO prompt1 STORE "When done, enter 'blank' for last name" TO prompt2 STORE "or Control 'Q' to end session" TO prompt3 IF $(DATE(),1,2) <> '00' .AND. mdayu = ' ' STORE DATE() to mdayu ENDIF STORE DATE() TO mshipped * NOTE THE SHIFTS BETWEEN GET AND SAY. THIS SCREEN IS * REALLY A 3 STAGE SCREEN. THE FIRST PART CONTAINS THE * CUSTOMER DATA. THEN WE INPUT ALL VOLUMES ORDERED AND * THE PROGRAM AUTOMATICALLY WRITES THEM TO THE FILE * UNTIL FINISHED. BECAUSE OF THIS WE WANT TO MAKE SURE * DATA FROM THE LAST RECORD IS ELIMINATED. *FIRST MAKE SURE WE WANT TO ADD A RECORD @ 1,25 SAY mode @ 3,19 SAY morder picture '999999999' @ 3,53 SAY ' ' @ 4,19 GET mlname @ 4,53 SAY mfname @ 5,19 SAY maddr1 @ 6,19 SAY maddr2 @ 7,19 SAY maddr3 @ 8,19 SAY mcity @ 8,53 SAY mstate picture '!!' @ 8,70 SAY mzip picture '99999' @ 9,19 SAY ' ' @ 9,53 SAY ' ' @ 11,62 SAY mstatus @ 12,11 SAY mvol1 @ 14,11 SAY mrem1 @ 15,11 SAY mrem2 @ 16,11 SAY mbo @ 17,53 SAY ' ' @ 18,11 SAY ' ' @ 18,35 SAY ' ' @ 18,70 SAY ' ' @ 20,12 SAY prompt1 @ 21,12 SAY prompt2 @ 22,12 SAY prompt3 READ * IF WE DO WANT TO ADD A RECORD - THEN DO IT IF mlname <> ' ' @ 1,25 SAY mode @ 3,19 SAY morder picture '999999999' @ 3,53 SAY ' ' @ 4,19 SAY mlname @ 4,53 GET mfname @ 5,19 GET maddr1 @ 6,19 GET maddr2 @ 7,19 GET maddr3 @ 8,19 GET mcity @ 8,53 GET mstate picture '!!' @ 8,70 GET mzip picture '99999' @ 9,19 GET mamt @ 9,53 SAY mentered picture '99/99/99' @ 11,62 SAY mstatus @ 12,11 SAY mvol1 @ 14,11 SAY mrem1 @ 15,11 SAY mrem2 @ 16,11 SAY mbo @ 17,53 SAY ' ' @ 18,11 SAY mbo:ship picture '99/99/99' @ 18,35 SAY mbo2:ship picture '99/99/99' @ 18,70 SAY mdayu picture '99/99/99' @ 20,12 SAY prompt1 @ 21,12 SAY prompt2 @ 22,12 SAY prompt3 READ * ALWAYS USE CLEAR GETS AFTER GETS. OTHERWISE YOUR PROGRAM WILL * HAVE A HEART ATTACK. SEE PAGE 71 OF THE dbase manual CLEAR GETS * WE NOW GO TO PART 2 OF THE SCREEN. WE STORE 999 * TO MVOL SO THAT ON OUR LAST RECORD WE CAN EXIT THE ADD EASIER STORE t TO getit STORE ' ' TO mstatus * ADD AS MANY RECORDS AS YOU WANT. MSTATUS SHOWS WHETHER THE * ITEM WAS IN STOCK. MVOL1 SHOWS WHAT WAS IN STOCK, MBO WHAT WAS * BACKORDERED. IF 999 NO MORE VOLUMES DO WHILE getit @ 11,62 SAY mstatus @ 12,11 SAY mvol1 @ 16,11 SAY mbo @ 11,48 GET mvol READ @ 11,62 CLEAR GETS IF mvol = 999 STORE f TO getit STORE ' ' TO mstatus store f TO avoid * IF THE VOLUME WAS NOT 999 GO TO THE OTHER DATA BASE ELSE USE STOCK * FIND THE RECORD FOR THAT VOLUME. WE USE THE +1 BECAUSE OF VOL. 0 * YOU COULD JUST AS EASILY (ALTHOUGH SLIGHTLY SLOWER) FIND * ANY DATA IN AN INDEXED OR NON-INDEXED FILE. * YOU COULD ALSO USE THE SELECT PRIMARY AND SECONDARY COMMAND HERE - * BUT FOR THIS DATA BASE, THIS IS THE SIMPLEST WAY OF DOING IT. LOCATE FOR # = mvol + 1 * IF THE VOLUME WAS IN THE FILE IF .NOT. EOF GOTO mvol + 1 * WE NEED ANOTHER CONTROL VARIABLE - WITHOUT IT VOLUMES NOT * IN THE FILE WOUND UP BEING WRITTEN TO THE BACKORDERED LIST STORE t TO avoid * WE NOW WRITE TO THE OTHER FILE AND ADJUST THE INVENTORY IF open:inv - back:ord - wait:ship + recvd + pend > 0 REPLACE change1 WITH t REPLACE open:inv WITH open:inv -1 STORE 'IN STOCK ' to mstatus REPLACE ship WITH ship + 1 REPLACE daych1 WITH mentered ELSE REPLACE change2 WITH t REPLACE back:ord WITH back:ord+1 STORE 'BACKORDER' TO mstatus REPLACE backship WITH backship + 1 REPLACE daych2 WITH mentered ENDIF open:inv ELSE * if no such volume STORE 'TRY AGAIN ' TO mstatus STORE f TO avoid ENDIF .not. eof * BACK TO OUR MAIN DATA BASE * TELL THEM WHAT YOU FOUND AT STATUS AND LIST IT ON THE ORDER OR BACKORDER LINE * NOTE HOW WE BUILD UP THE STRING THAT IS THE LIST OF VOLUMES USE SIG/M IF avoid = t IF mstatus = 'IN STOCK' STORE TRIM(mvol1) + STR(mvol,3,0) + ',' TO mvol1 ELSE STORE TRIM(mbo) + STR(mvol,3,0) + ',' TO mbo ENDIF mstatus = 'IN STOCK" ENDIF avoid ENDIF mvol ENDDO while getit * BLANK THE STATUS LINE AND GO TO PART 3 OF THE SCREEN AFTER 999 * NOTE THAT YOU NEED NOT ENTER DATA IN THE ORDER IT APPEARS ON * THE SCREEN - WE DON'T KNOW IF THE ORDER IS COMPLETE OR BACKORDERED * UNTIL THE END. YOU SET THE ORDER - BUT DON'T DRIVE THE USER CRAZY. STORE ' ' TO mstatus @ 11,62 SAY mstatus @ 14,11 GET mrem1 @ 15,11 GET mrem2 @ 17,53 GET mcatalog picture '!' @ 18,11 GET mbo:ship picture '99/99/99' @ 18,35 GET mbo2:ship picture '99/99/99' @ 9,70 GET mshipped picture '99/99/99' @ 3,53 GET mcomp picture '!' READ CLEAR GETS * DETERMINE IF THERE IS INCOMPLETE OR INCORRECT DATA. THIS PART OF THE * PROGRAM CAN HANDLE A SUBSTANTIAL EDITING MODULE - DO CASE CASE .NOT. (mcomp = 'Y' .OR. mcomp = 'N') STORE t TO error CASE .NOT. (mcatalog = 'Y' .OR. mcatalog = 'N' .OR. mcatalog = 'B') STORE t TO error OTHERWISE STORE f TO error ENDCASE IF error @ 01,00 @ 20,00 @ 21,00 @ 22,00 @ 1,18 SAY 'Please Correct the Indicated Data' STORE t to an:error DO WHILE an:error DO CASE CASE .NOT. (mcomp = 'Y' .OR. mcomp = 'N') @ 21,15 SAY 'Must answer "Y" or "N" if shipping completed ' @ 3,53 GET mcomp picture '!' READ @ 1,00 CASE .NOT. (mcatalog = 'Y' .OR. mcatalog = 'N' .OR. mcatalog = 'B') @ 21,15 SAY 'Catalog is either "Y", "N" or "B" (backordered)' @ 17,53 GET mcatalog picture '!' READ @ 1,00 OTHERWISE STORE f TO an:error ENDCASE ENDDO while an:error ENDIF error * GIVE THEM A SECOND TRY AT THE DATA. IN MOST CASES IT WILL BE CORRECT, BUT * WHY NOT GIVE THEM ANOTHER CRACK. IT IS SIMPLER TO REPEAT THE WHOLE ROUTINE * ALTHOUGH YOU COULD LOOP BACK TO THE BEGINNING. WE ALSO WANT A WAY TO * READJUST THE INVENTORY INCASE YOU PUT IN A WRONG VOLUME. STORE 'Y' TO command @ 20,00 @ 21,00 @ 22,00 @ 21,15 SAY 'IS THE ABOVE CORRECT ? ' @ 21,48 GET command picture '!' READ @ 21,00 IF command = 'N' ERASE @ 04,00 SAY "DO YOU WANT TO ELIMINATE ANY VOLUMES ON THE ORDERED OR BACKORDER LIST ? " @ 04,70 GET command picture '!' READ IF command = 'Y' @ 06,00 SAY "Items you enter here will automatically be adjusted in the Inventory." @ 07,00 SAY "After you have made the changes you will then be able to edit" @ 08,00 SAY "the list of disks shipped and/or backordered." @ 09,00 SAY "Enter 999 when done" STORE t TO getit STORE 999 TO mvol DO WHILE getit @ 11,10 SAY "INVENTORY TO BE ADJUSTED FOR VOLUME " @ 14,02 SAY "Volumes" @ 14,11 SAY mvol1 @ 16,00 SAY "Backorder" @ 16,11 SAY mbo @ 11,48 GET mvol READ CLEAR GETS IF mvol = 999 STORE f TO getit ELSE USE STOCK LOCATE FOR # = mvol + 1 IF .NOT. EOF GOTO mvol + 1 DO CASE CASE open:inv - back:ord - wait:ship + recvd + pend > 0 REPLACE open:inv WITH open:inv +1 REPLACE ship WITH ship -1 CASE (open:inv - back:ord - wait:ship + recvd + pend = 0 .AND. back:ord = 0) REPLACE open:inv WITH open:inv + 1 REPLACE ship WITH ship -1 CASE back:ord >0 REPLACE back:ord WITH back:ord-1 REPLACE backship WITH backship -1 ENDCASE ENDIF .not. eof USE SIG/M ENDIF mvol ENDDO while getit * AT THIS POINT WE ARE DOING SOME TIGHT EDITING - SO PROTECT AGAINST * A SLIP OF THE FINGERS SET CONFIRM ON @ 11,10 SAY "Please adjust data 'Volumes' and/or 'Backorders' " @ 14,02 SAY "Volumes" @ 14,11 GET mvol1 @ 16,00 SAY "Backorder" @ 16,11 GET mbo READ CLEAR GETS SET CONFIRM OFF * BACK TO NORMAL EDITING ENDIF command = Y * NOW THAT VOLUME NUMBERS TAKEN CARE OF WE CAN ADJUST THE REST OF * THE DATA ERASE STORE 'Add Records Module' TO mode STORE 'Enter as many records as you want.' TO prompt1 STORE "When done, enter blank for last name " TO prompt2 STORE "or Control 'Q' to end session" TO prompt3 @ 1,25 SAY mode @ 2, 0 SAY "+---------------------------------------" @ 2,39 SAY "---------------------------------------+" @ 3, 5 SAY "ORDER NUMBER:" @ 3,43 SAY "Complete:" @ 4, 8 SAY "Last name:" @ 4,46 SAY "First:" @ 5,10 SAY "Address:" @ 6, 9 SAY "(line 2):" @ 7, 9 SAY "(line 3):" @ 8,13 SAY "City:" @ 8,46 SAY "State:" @ 8,65 SAY "ZIP:" @ 9,11 SAY "Amount:" @ 9,46 SAY "Enter:" @ 9,64 SAY "Ship " @ 11,00 SAY "Enter Individual Volumes Ordered (999 when done): " @ 12, 2 SAY "Volumes:" @ 14, 2 SAY "Remarks:" @ 16, 0 SAY "Backorder:" @ 17,44 SAY "Catalog:" @ 18, 2 SAY "Shipped:" @ 18,26 SAY "Shipped:" @ 18,62 SAY "Update:" @ 19, 0 SAY "+---------------------------------------" @ 19,39 SAY "---------------------------------------+" @ 20,12 SAY prompt1 @ 21,12 SAY prompt2 @ 22,12 SAY prompt3 @ 3,19 GET morder picture '999999999' @ 3,53 SAY mcomp picture '!' @ 4,19 GET mlname @ 4,53 GET mfname @ 5,19 GET maddr1 @ 6,19 GET maddr2 @ 7,19 GET maddr3 @ 8,19 GET mcity @ 8,53 GET mstate picture '!!' @ 8,70 GET mzip picture '99999' @ 9,19 GET mamt @ 9,53 SAY mentered picture '99/99/99' @ 9,70 SAY mshipped picture '99/99/99' @ 11,60 SAY mstatus @ 12,11 SAY mvol1 @ 14,11 SAY mrem1 @ 15,11 SAY mrem2 @ 16,11 SAY mbo @ 17,53 SAY mcatalog @ 18,11 SAY mbo:ship picture '99/99/99' @ 18,35 SAY mbo2:ship picture '99/99/99' @ 18,70 SAY mdayu picture '99/99/99' READ CLEAR GETS STORE t TO getit STORE 999 TO mvol STORE ' ' TO mstatus DO WHILE getit @ 11,60 SAY mstatus @ 12,11 SAY mvol1 @ 16,11 SAY mbo @ 11,48 GET mvol READ @ 11,60 CLEAR GETS IF mvol = 999 STORE f TO getit STORE ' ' TO mstatus STORE f TO avoid ELSE USE STOCK LOCATE FOR # = mvol + 1 IF .NOT. EOF GOTO mvol + 1 STORE t TO avoid IF open:inv - back:ord - wait:ship + recvd + pend > 0 REPLACE change1 WITH t REPLACE open:inv WITH open:inv -1 STORE 'IN STOCK ' to mstatus REPLACE ship WITH ship + 1 REPLACE daych1 WITH mentered ELSE REPLACE change2 WITH t REPLACE back:ord WITH back:ord+1 STORE 'BACKORDER' TO mstatus REPLACE backship WITH backship +1 REPLACE daych2 WITH mentered ENDIF open:inv ELSE STORE 'TRY AGAIN ' TO mstatus STORE f TO avoid ENDIF .not. eof ENDIF mvol USE SIG/M IF avoid = t IF mstatus = 'IN STOCK' STORE TRIM(mvol1) + STR(mvol,3,0) + ',' TO mvol1 ELSE STORE TRIM(mbo) + STR(mvol,3,0) + ',' TO mbo ENDIF mstatus ENDIF avoid ENDDO while getit STORE ' ' TO mstatus @ 11,60 SAY mstatus @ 14,11 GET mrem1 @ 15,11 GET mrem2 @ 17,53 GET mcatalog picture '!' @ 18,11 GET mbo:ship picture '99/99/99' @ 18,35 GET mbo2:ship picture '99/99/99' @ 9,70 GET mshipped picture '99/99/99' @ 3,53 GET mcomp picture '!' READ CLEAR GETS ENDIF command = N * OUR ADDING AND EDITING IS DONE - LET US ADD THE RECORD TO THE FILE APPEND BLANK REPLACE order WITH morder, comp WITH mcomp REPLACE lname WITH mlname, fname WITH mfname REPLACE addr1 WITH maddr1, addr2 WITH maddr2, addr3 WITH maddr3 REPLACE city WITH mcity, state WITH mstate, zip WITH mzip REPLACE vol1 WITH mvol1 REPLACE amt WITH mamt REPLACE entered WITH mentered, shipped WITH mshipped REPLACE rem1 WITH mrem1, rem2 WITH mrem2 REPLACE bo WITH mbo, catalog WITH mcatalog, bo:ship WITH mbo:ship REPLACE bo2:ship WITH mbo2:ship, dayu WITH mdayu REPLACE new WITH t STORE t TO more ELSE STORE f TO more ENDIF mlname = ' ' ENDDO while more * IF NO MORE RECORDS TO BE ADDED - ASK IF THEY WANT TO INDEX STORE 'Y' TO command ERASE @ 02,10 SAY 'The newly added ORDERS will NOT appear' @ 03,10 SAY 'to be in the File until they are RE-INDEXED' @ 04,10 SAY 'and this will take some time....' @ 06,10 SAY 'You may re-index now or by using the' @ 07,10 SAY 'Maintenance Function number 6' @ 10,10 SAY 'Do you wish to RE-INDEX records NOW (Y/N)' @ 10,52 GET command PICTURE '!' READ IF command = 'Y' @ 14,10 SAY 'Records are now being re-indexed. ' @ 16,10 SAY 'Please be patient as this takes a little time....' STORE CHR(PEEK(063)) TO dr INDEX ON !(lname) TO &dr.:orders ENDIF command = y * get our drive letter STORE CHR(PEEK(063)) TO dr SET INDEX TO &dr.:orders RELEASE ALL * set the colons back on SET COLON ON STORE t TO first