REMARK *********************************************\ * P/R110.BAS DEDUCTION FILE MAINTENANCE *\ * 5/16/79 3:15 PM *\ ********************************************* %INCLUDE CURSOR %INCLUDE PRNMASK DEF FNEXACT(X0,X1,X2)=X0*100+X1*10+X2 REMARK BINARY SEARCH KEY FUNCTION GOTO 6000 %INCLUDE SUBS1.BAS 1000 READ #Y3%,X0;D1,D2,D3,D4,D1$,D5,D6:RETURN REMARK READ DEDUCTION RECORD SUBROUTINE 1010 PRINT #Y3%,X0;D1,D2,D3,D4,D1$,D5,D6:RETURN REMARK WRITE DEDUCTION RECORD SUBRUTINE 1060 H%=0 REMARK BINARY SEARCH ROUTINE FOR DEDUCTION FILE IF RECORD.COUNT%<1 THEN L%=1:H%=-1:RETURN READ #Y3%,1;VAR1,VAR2,VAR3 REMARK READ FIRST RECORD IN FILE VAR1=FNEXACT(VAR1,VAR2,VAR3) IF K1 < VAR1 THEN H%=-1:L%=1:RETURN REMARK IF KEY IS LOW, RECORD DOES NOT EXIST IF K1=VAR1 THEN L%=1:RETURN REMARK RETURN IF A MATCH WAS FOUND ON FIRST RECORD READ #Y3%,RECORD.COUNT%;VAR1,VAR2,VAR3 REMARK READ LAST RECORD IN FILE VAR1=FNEXACT(VAR1,VAR2,VAR3) IF K1 > VAR1 THEN H%=-1:L%=RECORD.COUNT%+1:RETURN REMARK IF KEY IS HIGH, RECORD DOES NOT EXIST IF K1=VAR1 THEN L%=RECORD.COUNT%:RETURN H%=RECORD.COUNT% REMARK SET SEARCH POINTERS L%=0 1070 M%=(L%+H%)/2 REMARK DIVIDE DATA SEARCH INTERVAL IN HALF READ #Y3%,M%;VAR1,VAR2,VAR3 VAR1=FNEXACT(VAR1,VAR2,VAR3) IF VAR1=K1 THEN L%=M%:RETURN REMARK IF RECORD WAS FOUND, RETURN IF VAR1>K1 THEN H%=M% IF VAR1=10 THEN D4=X0:RETURN\ ELSE\ X2$="OUT OF RANGE":GOSUB 615:GOTO 5300 REMARK FLASH ERROR MESSAGE IF FREQUENCY ENTERED WAS INVALID 5350 X1=522:X2=10:X3=0:X4=0:GOSUB 345 REMARK CHANGE DEDUCTION DESCRIPTION D1$=X0$ RETURN 5400 IF D2 > 1\ REMARK ENTER/CHANGE RATE ON DEDUCTION RECORDS THEN\ X1=591:X2=5:X3=0:X4=99.99:GOSUB 345\ REMARK ENTER RATE FOR DEDUCTION-TYPE RECORDS ONLY ELSE\ X2$="INVALID":GOSUB 615:RETURN REMARK PROHIBIT RATE ENTRY ON MISCELLANEOUS INCOME D5=X0 D6=0 REMARK IF RATE WAS ENTERED, ZERO OUT DEDUCTION AMOUNT 5410 X1=576:GOSUB 210 GOSUB 7045 RETURN 5450 X1=653:X2=7:X3=0:X4=9999.99:GOSUB 345 REMARK CHANGE DEDUCTION OR MISC. INCOME AMOUNT D6=X0 D5=0 REMARK IF AMOUNT WAS ENTERED, ZERO OUT RATE GOTO 5410 6000 MASK2$="##" Y3%=1 OPEN "CRT" RECL 1100 AS 19 REMARK OPEN CRT MASK FILE RECORD.COUNT%=0 OPEN "P/R0F030.DAT" RECL 38 AS Y3% IF END #Y3% THEN 6013 REMARK SET EOF BRANCH DESTINATION 6010 READ #Y3%;DUMMY REMARK LOCATE END OF DEDUCTION FILE IF DUMMY =9000000000 THEN 6013 RECORD.COUNT%=RECORD.COUNT% + 1 GOTO 6010 6013 IF RECORD.COUNT%=0 THEN D1=9000000000:X0=1:GOSUB 1010 X0=7:GOSUB 260 REMARK DISPLAY CRT MASK FOR FILE MAINTENANCE 6014 X2$="ENTER OPERATION(0=EXIT;1=ADD;2=INQUIRE, CHANGE OR DELETE)" X2=1:X3=0:X4=2:GOSUB 665 REMARK REQUEST OPERATON CODE IF X0=0\ REMARK LOAD MENU IF ZERO OPERATION CODE WAS ENTERED THEN\ PRINT CLEAR.SCREEN$;"P/R DEDUCTION F/M LOADING MENU":\ CHAIN "P/R000" IF X0=1 THEN 6200 REMARK BRANCH TO NEW RECORD ROUTINE IF CODE = 1 6015 X1=273:X2=3:X3=0:X4=999:GOSUB 345 REMARK ENTER EMPLOYEE NUMBER FOR DEDUCTION RECORD IF X0=0 THEN GOSUB 265:GOTO 6014 REMARK IF EMPLOYEE NUMBER =0, PROMPT FOR OPERATION D1=X0 K1=FNEXACT(X0,0,0) REMARK USE BINARY SEARCH TO FIND DEDUCTION RECORD GOSUB 1060 READ #Y3%,L%;VAR1 REMARK READ DEDUCTION RECORD LOCATED BY SEARCH IF VAR1 <> D1 THEN \ X2$="NOT ON FILE":GOSUB 615:GOTO 6015 REMARK IF RECORD NOT FOUND, FLASH ERROR MESSAGE REC%=L% X0=REC% GOSUB 1000 REMARK READ DEDUCTION RECORD FROM DISK 6045 X1=256 GOSUB 7020 REMARK DISPLAY RECORD ON CRT 6055 X2$="ENTER FIELD TO CHANGE (0=NONE; 99=DELETE)" X2=2:X3=0:X4=99 GOSUB 665 REMARK ENTER FIELD TO CHANGE; 0=NONE, 99=DELETE IF X0>4 AND X0<99 THEN 6055 REMARK IF FIELD ENTERED IS INVALID, RE-PROMPT OPERATOR IF X0=0 THEN GOTO 6075 IF X0=99 THEN GOTO 6080 ON X0 GOSUB 5300,5350,5400,5450:GOTO 6055 REMARK IF A FIELD WAS SELECTED, CHANGE IT 6075 X0=REC%:GOSUB 1010 REMARK SAVE DEDUCTION RECORD D1.0=D1 REC%=REC%+1:X0=REC%:GOSUB 1000 REMARK READ SEQUENTIALLY FOR NEXT DEDUCTION RECORD IF D1 > D1.0 THEN GOTO 6015 ELSE GOTO 6045 REMARK IF NO FURTHER RECORD FOR EMPLOYEE, PROMPT\ FOR NEW EMPLOYEE; ELSE, DISPLAY NEXT RECORD 6080 X2$="ENTER DELETE CODE" X2=3:X3=0:X4=0 GOSUB 665 REMARK ENTER 3-CHARACTER DELETE CODE IF X0$<>"DEL" THEN 6055 REMARK IF INVALID CODE ENTERED, ABORT OPERATION FOR I%= REC% TO RECORD.COUNT% REMARK WRITE OVER DELETED RECORD READ #Y3%,I%+1;LINE DATA$ PRINT USING "&";#Y3%,I%;DATA$ NEXT I% RECORD.COUNT%=RECORD.COUNT%-1 REMARK DECREMENT ACTIVE RECORD COUNT X2$="RECORD DELETED":GOSUB 615 REMARK FLASH RECORD DELETION MESSAGE GOTO 6015 6200 GOSUB 265 D1=0:D2=0:D3=0:D4=0:D5=0:D6=0 REMARK ENTER NEW DEDUCTION RECORD D1$="" X1=273:X2=3:X3=0:X4=999:GOSUB 345 REMARK ENTER EMPLOYEE NUMBER IF X0=0 THEN GOSUB 265:GOTO 6014 REMARK IF EMPLOYEE NUMBER=0, PROMPT FOR OPERATION D1=X0 6210 X1=339:X2=1:X3=1:X4=4:GOSUB 345 REMARK ENTER RECORD TYPE D2=X0 X1=403:X2=1:X3=0:X4=9:GOSUB 345 REMARK ENTER TAX/DEDUCTION PRIORITY CODE D3=X0 GOSUB 5300 REMARK ENTER FREQUENCY CODE GOSUB 5350 REMARK ENTER DESCRIPTION IF D2 > 1 THEN GOSUB 5400 REMARK ENTER RATE IF THIS IS A DEDUCTION-TYPE RECORD IF D5=0 THEN GOSUB 5450 REMARK IF RATE WAS NOT ENTERED, ENTER AMOUNT 6235 X2$="ENTER FIELD TO CHANGE (0=NONE; 99=CANCEL)" REMARK PROMPT FOR FIELD TO CHANGE X2=2:X3=0:X4=99:GOSUB 665 IF X0=99 THEN X2$="CANCELLED":GOSUB 615:GOTO 6200 REMARK IF CANCEL CODE WAS ENTERED, RESTART OPERATION IF X0=0 THEN GOTO 6255 ON X0 GOSUB 5300,5350,5400,5450 GOTO 6235 6255 K1=FNEXACT(D1,D2,D3) GOSUB 1060 REMARK SEARCH FILE FOR INSERTION POINT FOR I%=RECORD.COUNT%+1 TO L% STEP -1 READ #Y3%,I%;LINE DATA$ REMARK MOVE FILE DOWN TO ALLOW FOR NEW RECORD INSERTION PRINT USING "&";#Y3%,I%+1;DATA$ NEXT I% 6258 RECORD.COUNT% = RECORD.COUNT% + 1 REMARK INCREMENT ACTIVE RECORD COUNT X0=L% GOSUB 1010 REMARK WRITE THE NEW RECORD AT POSITION L CLOSE 1 OPEN "P/R0F030.DAT" RECL 38 AS 1 REMARK SAVE ALTERED FCB IN CASE OF A FILE CRASH GOTO 6200 REMARK GO BACK FOR ANOTHER NEW RECORD 7020 X1=270 REMARK DISPLAY DEDUCTION RECORD ON CRT GOSUB 210 PRINT USING MASK6$;D1 REMARK DISPLAY EMPLOYEE NUMBER X1=19:GOSUB 215 PRINT D2 REMARK DISPLAY RECORD TYPE X1=19:GOSUB 215 PRINT D3 REMARK DISPLAY TAX CODE/DEDUCTION PRIORITY X1=19:GOSUB 215 PRINT USING MASK2$;D4 REMARK DISPLAY FREQUENCY CODE X1=11:GOSUB 215 PRINT " " X1=522:GOSUB 210:PRINT D1$ REMARK DISPLAY DEDUCTION DESCRIPTION 7045 X1=16:GOSUB 215 PRINT USING MASK2.2$;D5 REMARK DISPLAY RATE X1=14:GOSUB 215 PRINT USING MASK4.2$;D6 REMARK DISPLAY AMOUNT RETURN