150 DIM F$(T), F#(T), CX(T), CY(T), FL(T), TY$(T), K(T), KL(T)
155 DIM FIELDBUFFER$(T)
200 'Field Parameters
382 'Calculate Record / Key Lengths
384 FOR X = 1 TO T
386 IF TY$(X) <> "Z" THEN RL% = RL% + FL(X)
388 IF K(X) = 1 THEN KL(X) = FL(X): 'KEY FIELDS
390 NEXT X
395 '
500 'Open Files
505 '
510 OPEN "R", 1, V1$, RL%: 'Open Master File
520 GOSUB 48105: 'Init BTREE
530 GOSUB 48140: 'Open BTREE
540 '
550 'Field Master File
551 '
555 BBT = 1: BUF = 0
560 FOR X = 1 TO T: IF TY$(X) = "Z" THEN 580 ELSE BUF = BUF + 1
565 IF FL(X) + BT(BBT) > 255 THEN BBT = BBT + 1
570 FIELD #1, BT(1) AS D$(1), BT(2) AS D$(2), BT(3) AS D$(3), BT(4) AS D$(4), BT(5) AS D$(5), BT(6) AS D$(6), BT(7) AS D$(7), FL(X) AS FIELDBUFFER$(BUF)
575 BT(BBT) = BT(BBT) + FL(X)
580 NEXT X
585 FIELD #1, BT(1) AS D$(1), BT(2) AS D$(2), BT(3) AS D$(3), BT(4) AS D$(4), BT(5) AS D$(5), BT(6) AS D$(6), BT(7) AS D$(7), BT(8) AS D$(8)
600 PRINT CL$;
699 '
4000 'Begin Main Program
4001 '
4002 UPDTE$ = "": IF STARTUP = 1 THEN HELP = 600: GOSUB 63000: HELP = 999: STARTUP = 0
4003 FOR X = 1 TO T: F$(X) = "": F#(X) = 0: LSET FIELDBUFFER$(X) = F$(X): NEXT X' Clear Fields
4005 PRINT BB$; "<A>dd Record, <G>et Record, <S>earch or <E>nd Program Copyright 1990, CBase Enterprises Make A Choice ";
4010 TY$ = "A": FL = 1: HELP = 100: BK$ = " "
4015 GOSUB 21000: HELP = 999
4020 IF T$ = "A" OR T$ = "a" THEN 4100
4025 IF T$ = "G" OR T$ = "g" THEN UPDTE$ = "YES": GR = 0: GOTO 15000
4030 IF T$ = "E" OR T$ = "e" THEN 40000
4035 IF T$ = "S" OR T$ = "s" THEN 14000
4040 SOUND 1500, 1
4050 GOTO 4005
4051 '
4100 'Input Routines
4101 '
4103 PRINT BB$; "Press the " + CHR$(27) + " key at the beginning of a field to back up. Press F1 for help."; : BK$ = CHR$(254)
5000 '
11000 'Move F$(n) to FIELDBUFFER$(n)
11001 '
11002 WIK = 0: FOR X = 1 TO T: IF TY$(X) <> "Z" THEN WIK = WIK + 1: LSET FIELDBUFFER$(WIK) = F$(X)
11003 NEXT X: BK$ = " "
11008 'Check Update Flag
11009 IF UPDTE$ = "YES" THEN 13000
12000 '
12005 GOSUB 48210: GOSUB 48570
12010 LSET FR$ = R$: PUT 1, I: GOTO 700
12099 '
13000 'Update Current Record
13001 '
13010 IF PREVKEY$ = K$ THEN PUT 1, I: GOTO 700 'If key not changed, update DAT
13020 OLDREC = I 'Store record number to delete
13030 GOSUB 48210: GOSUB 48570 'Add new key
13040 PUT 1, I 'Add new data
13050 K$ = PREVKEY$: I = OLDREC 'Restore old key
13060 GOSUB 48360: GOSUB 48570 'Delete old key
13070 FOR X = 1 TO 8: LSET D$(X) = STRING$(255, 0): NEXT X
13080 PUT 1, OLDREC 'Overwrite old record
13090 GOTO 700 'Record deleted
13099 '
14000 'String Search
14001 '
14005 MATCH = 0: ST = 0: ZK = 1: UPDTE$ = "S"
14006 PRINT BB$; "Search for data in a <F>ield, <A>nywhere, or <R>etrieve all records? "; : TY$ = "A": FL = 1: HELP = 700: GOSUB 21000: HELP = 999
14007 IF T$ = "F" OR T$ = "f" THEN ST = 1 ELSE IF T$ = "A" OR T$ = "a" THEN ST = 2 ELSE IF T$ = "R" OR T$ = "r" THEN GOTO 14025 ELSE GOTO 14006
14008 IF ST = 2 THEN GOTO 14019 ELSE FC = 0
14009 PRINT BB$; "Press Enter to select the field to search in."; : TY$ = "A": FL = 1: HELP = 800: GOSUB 21000: HELP = 999
14010 PRINT BB$; "When you're at the field you want to search, type the search string."; : HELP = 850
14013 IF T$ = "" THEN 14011 ELSE IF TY$(FC) <> "A" THEN GOSUB 23000
14014 IF TY$(FC) <> "A" AND N = 0 THEN PRINT BB$; "Field"; FC; "requires numeric input."; : FC = FC - 1: GOTO 14011
14015 SSEARCH$ = T$: RE = 0
14016 IF TY$(FC) = "N" THEN GOSUB 49500
14017 GOTO 14040
14019 PRINT BB$; "Search for what ? "; : TY$ = "A": FL = 30: HELP = 200: GOSUB 21000: HELP = 999: RE = 0
14020 IF T$ <> "" THEN SSEARCH$ = T$: GOTO 14040 ELSE GOTO 700
14025 RE = 1: ZK = 2
14030 SSEARCH$ = "": 'If RE is 1, retrieve all records
14040 FOR W = 1 TO LOF(1) / RL%: GET 1, W: FOUND = 0: IF RE THEN MATCH = MATCH + 1: GOTO 14060
14041 IF ST = 2 THEN 14050
14042 WIK = 0: FOR X = 1 TO T: IF TY$(X) <> "Z" THEN WIK = WIK + 1: F$(X) = FIELDBUFFER$(WIK)
14043 NEXT X
14044 IF TY$(FC) = "N" THEN ON SCH GOSUB 49100, 49200, 49300: GOTO 14056
14047 FOUND = INSTR(F$(FC), SSEARCH$): GOTO 14056
14050 FOR Y = 1 TO BBT: FOUND = FOUND + INSTR(D$(Y), SSEARCH$)
14055 NEXT Y
14056 IF FOUND = 0 THEN GOTO 14080 ELSE ZK = 2: MATCH = MATCH + 1
14060 IF D$(1) = STRING$(LEN(D$(1)), 0) THEN BLANK = -1: GOTO 14080 ELSE BLANK = 0: GOSUB 15390
14070 PRINT BB$; "<S> to stop search or any other key for more..."
14073 PRINT "This record is match number"; MATCH; "...";
14074 II$ = INPUT$(1)
14075 IF II$ = "S" OR II$ = "s" THEN GOTO 600
14080 IF BLANK AND RE = 1 THEN MATCH = MATCH - 1
14084 NEXT W
14085 FOUND = 0: LOCATE 1, 1
14090 GOTO 15350
15000 '
15300 ZK = 1: GOSUB 48310
15350 IF FOUND = 0 AND ZK = 1 THEN PRINT BB$; " --- Record Not Found ---"; : GOSUB 60000: GOTO 600
15355 IF FOUND = 0 AND ZK = 2 THEN PRINT BB$; " --- No More Records Found ---"; : GOSUB 60000: GOTO 600
15380 GET 1, I
15390 'Print Record
15395 WIK = 0: FOR X = 1 TO T: IF TY$(X) <> "Z" THEN WIK = WIK + 1: F$(X) = FIELDBUFFER$(WIK)
15396 NEXT X
15400 PREVKEY$ = K$ 'Key indicator in case user wants to <C>hange
18000 '
18200 IF UPDTE$ = "S" THEN RETURN 'Search? If yes, return
18500 GR = GR + 1: LOCATE 24, 1: PRINT "This record is match number"; GR; "...";
18505 LOCATE 23, 1: PRINT BLANK$; : LOCATE 23, 1: PRINT "<C>hange, <D>elete, <S>top or Enter to continue: ";
18510 FL = 1
18520 TY$ = "A": HELP = 300
18530 GOSUB 21000: HELP = 999
18540 IF T$ = "S" OR T$ = "s" THEN 700
18550 IF T$ = "C" OR T$ = "c" THEN 4100
18557 IF T$ = "D" OR T$ = "d" THEN 19000
18560 ZK = 2: I = LR: GOSUB 48320: GOTO 15350
18999 '
19000 'Delete Record
19001 PRINT BB$; "Are You Sure you want to DELETE (Y/N) ";
19002 FL = 1: GOSUB 21000: IF T$ = "N" OR T$ = "n" THEN SOUND 1500, 1: PRINT BB$; "--> Not Deleted <--"; : GOSUB 60000: GOTO 700
19003 IF T$ <> "Y" AND T$ <> "y" THEN 19002
19004 PRINT BB$; "--> Deleted <--";
19005 GOSUB 48360: GOSUB 48570
19020 FOR ZT = 1 TO 8: LSET D$(ZT) = STRING$(255, 0): NEXT ZT
19030 PUT 1, I: GOTO 700
23000 'Number Validation
23005 F1 = 0: F2 = 0: N = 0
23010 FOR X = 1 TO LEN(T$)
23020 A = ASC(MID$(T$, X, 1))
23030 IF (A < 45 OR A > 57) AND A <> 32 THEN SOUND 1500, 1: GOTO 23100
23050 IF A = 46 THEN F1 = F1 + 1: IF F1 > 1 THEN SOUND 1500, 1: GOTO 23100
23060 IF A = 45 THEN F2 = F2 + 1: IF F2 > 1 THEN SOUND 1500, 1: GOTO 23100
23070 NEXT X
23080 IF INSTR(T$, "-") > 1 THEN SOUND 1500, 1: GOTO 23100
23090 N = 1
23100 RETURN
39999 'Exit
40000 PRINT BB$; "Do you really want to end? "; : Z2 = 1: HELP = 999: GOSUB 21000: IF T$ = "N" OR T$ = "n" THEN GOTO 4001 ELSE IF T$ <> "Y" AND T$ <> "y" THEN GOTO 40000
40010 COLOR 7, 0, 0: CLS : PRINT "You have exited your filing program"
40020 PRINT "and are now in MS-DOS at the system"
40030 PRINT "prompt."
40040 SYSTEM ' You may branch to another program from here
48005 GOSUB 48105: GOSUB 48140
48010 INPUT "D,P,I, OR A "; CH$: IF CH$ = "A" THEN 48025
49100 IF VAL(F$(FC)) < VAL(SSEARCH$) THEN FOUND = 1 ELSE FOUND = 0
49110 RETURN
49200 IF VAL(F$(FC)) > VAL(SSEARCH$) THEN FOUND = 1 ELSE FOUND = 0
49210 RETURN
49300 IF VAL(F$(FC)) = VAL(SSEARCH$) THEN FOUND = 1 ELSE FOUND = 0
49310 RETURN
49499 'Choose Greater/Less than/Equal
49500 PRINT BB$; "Show if <G>reater than, <L>ess than or <E>qual to what you typed? -"; : FL = 1: HELP = 888: GOSUB 21000: IF T$ = "" THEN GOTO 700 ELSE T$ = CHR$(ASC(T$) AND 95)
49510 SCH = INSTR("LGE", T$): IF SCH = 0 THEN GOTO 49500 ELSE RETURN
49999 '
53000 'Error Traps
53001 IF ERR = 11 THEN ER = ERR: RESUME NEXT
53002 FOR ZX = 1 TO 3: SOUND 1000, 1: SOUND 25000, 1: NEXT ZX: COLOR 14, 4: PRINT BB$;
53003 IF ERR = 7 OR ERR = 14 THEN LOCATE 25, 1: PRINT " OUT OF MEMORY (BASIC may not have been started with /S:2048)": END
53004 IF ERR <> 27 AND ERR <> 24 AND ERR <> 25 AND ERR <> 57 AND ERR <> 68 THEN 53009