home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG028.ARK
/
DBQUERY.BAS
< prev
next >
Wrap
BASIC Source File
|
1984-04-29
|
7KB
|
214 lines
PRINT "QUERY PROGRAM OF 3-23-78"
FIELDS = 20 REM POSSIBLE NUMBER OF FIELDS.
DIM DATA$(FIELDS), FIELD$(FIELDS), TYPE(FIELDS), FIELD.WIDTH(FIELDS)
DIM SKIP(FIELDS),MIN(FIELDS),MAX(FIELDS)
BUFSIZ = 200 REM MAIN STRING BUFFER SIZE.
DIM BUFFER$(BUFSIZ), REC(BUFSIZ)
REM CONSTANTS
ZERO =0: ONE=1: TWO=2
DATA$(ZERO) = "1"
3001 INPUT "DO YOU NEED INSTRUCTIONS";ANS$
IF ANS$="NO" THEN 3000
PRINT
PRINT "THE PURPOSE OF THIS PROGRAM IS TO PROVIDE A WAY TO"
PRINT "EXAMINE AND CHANGE THE DATABASE."
PRINT "THE COMMANDS PROVIDED FOR THIS ARE:"
PRINT
PRINT "LIST - LISTS THE ITEMS REQUESTED. ALL ITEMS ARE"
PRINT " LISTED THAT ARE INCLUDED IN THE SET NAMED."
PRINT
PRINT "SUM - SUMS THE FIELDS OF THE ITEMS REQUESTED."
PRINT
PRINT "BYE - EXITS BACK TO CP/M OPERATING SYSTEM."
PRINT
PRINT "CHANGE - CHANGES THE ITEMS REQUESTED FROM THE KEYBOARD."
PRINT
GOTO 3000
PRINT "ADD - ADD NEW ITEMS TO A FILE."
PRINT " EXAMPLE: ADD LAB SUPPLIES"
PRINT
PRINT "RUN - RUN A PREVIOUSLY SET UP SEQUENCE"
PRINT " EXAMPLE: RUN PACKAGE"
PRINT
3000 PRINT
PRINT
INPUT "COMMAND";CMD$
CMD$ = LEFT$(CMD$,3)
IF CMD$ = "LIS" THEN 3100
IF CMD$ = "SUM" THEN 3200
IF CMD$ = "CHA" THEN 3300
IF CMD$ = "ADD" THEN 3400
IF CMD$ = "RUN" THEN 3500
IF CMD$ = "BYE" THEN STOP
GOTO 3001
3100 REM LIST THE ITEMS REQUESTED
GOSUB 4000 REM FIND FILE NAME(S).
PHEAD = ONE
GOSUB 4500 REM READ AND PRINT HEADINGS.
3110 GOSUB 4100 REM READ FIELD SPECIFICATIONS.
PRINT
3120 GOSUB 4300 REM READ A RECORD INTO DATA ARRAY.
IF ENDFILE = ONE THEN 3130 REM QUIT IF END OF FILE.
GOSUB 4400 REM PRINT DATA ARRAY IN FORMAT.
IF FIELD.WIDTH(ONE) = ZERO THEN PRINT
RECNO = RECNO + ONE
GOTO 3120 REM READ ANOTHER LINE.
3130 CLOSE ONE
GOTO 3000
3200 REM SUM THE FIELDS OF THE ITEMS REQUESTED
TOTAL = ZERO
GOSUB 4000 REM FIND FILE NAME.
PHEAD = ZERO
GOSUB 4500 REM READ HEADINGS, NO PRINT.
GOSUB 4100 REM READ FIELD SPECIFICATIONS.
PRINT "THE FIELDS ARE:"
FOR I = ONE TO NO.OF.FIELDS
PRINT FIELD$(I)
NEXT I
3210 INPUT "SUM ON WHAT FIELD";ANS$
FOR I = ONE TO NO.OF.FIELDS
IF ANS$ = FIELD$(I) THEN AFIELD = I: GOTO 3220
NEXT I
PRINT "NO SUCH FIELD"
GOTO 3210
3220 INPUT "MULTIPLY BY WHAT FIELD (NAME OF FIELD OR NONE)";ANS$
IF ANS$ = "NONE" THEN MFIELD = 0: GOTO 3230
FOR I = ONE TO NO.OF.FIELDS
IF ANS$ = FIELD$(I) THEN MFIELD = I: GOTO 3230
NEXT I
PRINT "NO SUCH FIELD"
GOTO 3220
3230 GOSUB 4300 REM READ DATA FROM FILE.
IF ENDFILE = ONE THEN 3240 REM QUIT IF END OF FILE.
AF = VAL(DATA$(AFIELD))
MF = VAL(DATA$(MFIELD))
TOTAL = TOTAL + MF*AF
RECNO = RECNO + ONE REM INCREMENT RECORD NUMBER.
GOTO 3230
3240 CLOSE ONE
PRINT "THE SUM IS ";TOTAL
GOTO 3000
3300 REM CHANGE THE ITEMS REQUESTED
GOSUB 4000 REM FIND FILE.
PHEAD = ZERO
GOSUB 4500 REM READ HEADINGS.
GOSUB 4100 REM READ FIELD SPECS.
GOSUB 4600 REM READ INDEX.
IF NIND = ZERO THEN 3350 REM QUIT IF NO INDEX.
3310 PRINT "WHAT ";INDFLD$;" DO YOU WANT";
INPUT ANS$
FOR I = ONE TO INDSIZ
IF ANS$ = BUFFER$(I) THEN 3320
NEXT I
PRINT ANS$;" NOT FOUND."
PRINT "INDEX TABLE:"
FOR I = ONE TO INDSIZ REM PRINT INDEX TABLE.
PRINT BUFFER$(I)
NEXT I
GOTO 3310
3320 RECNO = REC(I) REM FOUND RECORD NUMBER.
GOSUB 4300 REM READ DATA RECORD AND SEPERATE.
PRINT HEADINGS$
PRINT
GOSUB 4400 REM PRINT DATA ARRAY IN FORMAT.
3330 INPUT "CHANGE WHICH FIELD ";ANS$
IF ANS$ = INDFLD$ THEN \
PRINT "YOU CAN'T CHANGE INDEX FIELD.": GOTO 3330
FOR I = ONE TO NO.OF.FIELDS REM LOOK FOR FIELD TO CHANGE.
IF ANS$ = FIELD$(I) THEN 3340
NEXT I
PRINT ANS$;" WAS NOT A VALID FIELD."
GOTO 3330
3340 PRINT "NEW ";FIELD$(I);
INPUT DATA$(I)
GOSUB 4200 REM PRINT DATA OUT TO DISK.
INPUT "DO YOU WANT TO CHANGE MORE ITEMS";ANS$
IF ANS$ = "YES" THEN 3310
3350 CLOSE ONE REM CLOSE DATA FILE.
GOTO 3000
3400 REM ADD ITEMS TO THE REQUESTED FILE
3500 REM RUN THE SEQUENCE REQUESTED
PRINT "COMMAND NOT ACTIVATED"
GOTO 3000
4000 REM FIND FILE NAME(S) REQUESTED BY COMMAND COMMAND$.
INPUT "NAME OF FILE";FILE.NAME$
FILE FILE.NAME$ REM OPEN THE FILE.
RECNO = ONE REM READ RECORD #1.
READ #ONE;RECLEN,NO.OF.FIELDS,NHEAD,NIND,FILETYPE,CODE,SPARE
RECNO = RECNO + ONE REM INCREMENT RECORD NUMBER.
IF RECLEN <> ZERO THEN \
CLOSE ONE :\
FILE FILE.NAME$(RECLEN) REM MAKE RANDOM INSTEAD OF SEQ.
PRINT
RETURN
4100 REM READ THE FIELD SPECIFICATIONS.
FOR I = ONE TO NO.OF.FIELDS
IF RECLEN = ZERO THEN \
READ #ONE;FIELD$(I),TYPE(I),FIELD.WIDTH(I),SKIP(I), \
MIN(I),MAX(I),SPARE
IF RECLEN <> ZERO THEN \
READ #ONE,RECNO;FIELD$(I),TYPE(I),FIELD.WIDTH(I),SKIP(I), \
MIN(I),MAX(I),SPARE
RECNO = RECNO + ONE
NEXT I
RETURN
4200 REM ASSEMBLE DATA INTO A RECORD AND WRITE TO DISK.
RECORD$ = ""
FOR I = ONE TO NO.OF.FIELDS
RECORD$ = RECORD$ + DATA$(I) + "!"
NEXT I
PRINT #ONE,RECNO;RECORD$ REM WRITE TO DISK.
RETURN
4300 REM READ A RECORD OF DATA AND SEPERATE INTO FIELDS.
IF RECLEN = ZERO THEN \
READ #ONE;RECORD$
IF RECLEN <> ZERO THEN \
READ #ONE,RECNO;RECORD$
IF END #ONE THEN 4340
START = ONE
FOR I = ONE TO NO.OF.FIELDS
LENGTH = ZERO
FOR P = START TO LEN(RECORD$)
IF MID$(RECORD$,P,ONE) = "!" THEN 4320
LENGTH = LENGTH + ONE
NEXT P
4320 DATA$(I) = MID$(RECORD$,START,LENGTH)
START = START + LENGTH + ONE
NEXT I
ENDFILE = ZERO
4330 RETURN
4340 ENDFILE = ONE
RETURN
4400 REM PRINT DATA IN CORRECT FORMAT.
POSITION = ONE REM STARTING TAB POSITION.
FOR I = ONE TO NO.OF.FIELDS
IF FIELD.WIDTH(I) <> ZERO THEN PRINT TAB(POSITION);
IF SKIP(I) = ONE THEN PRINT
IF DATA$(I) <> "" THEN PRINT DATA$(I);" ";
POSITION = POSITION + FIELD.WIDTH(I) + ONE
NEXT I
PRINT
RETURN
4500 REM READ HEADINGS, ALSO PRINT IF PHEAD = 1
IF NHEAD = ZERO THEN 4510
FOR I = ONE TO NHEAD
IF RECLEN = ZERO THEN READ #1;HEADINGS$
IF RECLEN <> ZERO THEN READ #ONE,RECNO;HEADINGS$
IF PHEAD = 1 THEN PRINT HEADINGS$
RECNO = RECNO + ONE
NEXT I
4510 RETURN
4600 REM READ INDEX INTO MEMORY IF THERE IS ONE.
IF NIND = ZERO THEN PRINT "THERE'S NO INDEX.": RETURN
INDEX.FILE$ = FILE.NAME$ + ".IND"
FILE INDEX.FILE$ REM OPEN INDEX FILE.
READ #TWO;INDFLD$ REM READ INDEX FIELD NAME.
FOR I = ONE TO BUFSIZ
READ #TWO;BUFFER$(I),REC(I)
IF END #TWO THEN 4610
NEXT I
4610 INDSIZ = I REM INDEX SIZE.
CLOSE TWO
RETURN
END