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
/
CPMUG009.ARK
/
SORTGL.ASC
< prev
next >
Wrap
Text File
|
1984-04-29
|
6KB
|
201 lines
10 ' PROGRAM TITLE "SORTGL"
230 INPUT "ENTER 'Y' TO MOUNT THE FILES";WY$
240 IF WY$<>"Y" THEN 270
250 UNLOAD 0,1
260 MOUNT 0,1
270 CLEAR 1000
280 Z=1
290 DIM DM$(3)
300 DIM R$(3)
310 DIM DV$(3)
320 DIM B#(1750)
330 DIM BB(1750)
340 DIM Q(16)
350 CNT=10000
360 PRINT "GENERAL LEDGER SORT"
370 OPEN "R",3,"LEDGER",1 ' OPEN ALL FILES
380 OPEN "R",1,"LEDGER",1
390 OPEN "R",2,"LEDGER",0
400 PRINT "ENTER -A- TO SORT ON ACCT#/CK#/VCH#" ' WHAT KIND OF SORT?
410 INPUT "ENTER -C- TO SORT ON CK/VCH #";CA$
420 IF CA$="A" THEN LPRINT "GEN LEDGER SORT ON ACT#/CK-VCH#":GOTO 440
430 LPRINT "GEN. LEDGER SORT ON CK/VCH #"
440 INPUT "ENTER DATE TO BE SORTED AS MOYR";A$ ' FILE MONTH AND YEAR
450 LPRINT "DATE ";A$
460 GET #3,2037
470 FOR Q=1 TO 16
480 FIELD #3, (Q-1)*8 AS DB$, 8 AS D1$(Q)
490 IF A$=MID$(D1$(Q),1,4) THEN 530
500 NEXT Q
510 PRINT "DATE NOT IN TABLE"
520 GOTO 520
530 REC$=MID$(D1$(Q),5,4)
540 REC=VAL(REC$)
550 K=1
560 SREC=REC ' SAVE THE STARTING ADDRESS
570 CLOSE 3 ' CLOSE THE TABLE FILE
580 GET #1,REC
590 FOR I=1 TO 3 ' LEDGER FILE BLOCKED 3 PER SECTOR
600 FIELD #1, (I-1)*42 AS D$,42 AS DREC$(I)
610 IF MID$(DREC$(I),1,3)="EOF" AND LSW=1 THEN 1060 ' IS IT END OF FILE
620 C$=MID$(DREC$(I),1,2)
630 C$=(C$)+(MID$(DREC$(I),5,2)) ' EXTRACT DATE FROM LEDGER FILE
640 IF A$=C$ THEN LSW=1:GOTO 690 ' IS IT THE BEGINNING OF THE FILE
650 NEXT I ' NEXT RECORD
660 REC=REC+1 ' INCREMENT THE RECORD COUNTER
670 IF REC=2037 THEN 1030 ' IS IT THE END OF THE FILE AREA
680 GOTO 580 ' GO GET ANOTHER RECORD
690 N=N+1
700 IF N>1750 THEN 1050
710 IF ISW=1 THEN 740
720 ISW=1
730 SI=I
740 IF CA$="C" THEN 910 ' CHECK NUMBER SORT
750 DAC$=MID$(DREC$(I),7,4)
760 IF MID$(DREC$(I),42,1)="1" THEN 990 ' IS IT A BAL FORWARD RECORD
770 PC$=MID$(DREC$(I),11,5) ' LOAD CK# VCH# WORK AREA
780 IF MID$(PC$,1,1)="C" THEN MID$(PC$,1,1)="2":GOTO 800 ' IS IT A CHECK
790 MID$(PC$,1,1)="3" ' THEN ITS A VOUCHER
800 DAC$=DAC$+PC$ ' ADD PC TO DAC
810 I$=STR$(I):RAC=REC
820 RAC=RAC+1000 ' ADD 1000 TO RECORD NUMBER
830 REC$=STR$(RAC)
840 TAG$=MID$(REC$,2,4)+MID$(I$,2,1) ' SAVE REC NUMBER IN TAG
850 DAC#=VAL(DAC$)
860 TAG=VAL(TAG$)
870 B#(K)=DAC# ' LOAD THE MATRIX FOR SORTING B# = CONTROL NUMBER
880 BB(K)=TAG ' BB = TAG OR RECORD NUMBER
890 K=K+1 ' INCRECMENT MATRIX SUBSCRIPT
900 GOTO 650
910 IF MID$(DREC$(I),42,1)="1" THEN 950 ' IS IT A BAL FWD RECORD
920 DAC$=MID$(DREC$(I),11,5) ' LOAD THE WORK AREA
930 IF MID$(DAC$,1,1)="C" THEN MID$(DAC$,1,1)="2":GOTO 810 ' IS IT A CHE
940 MID$(DAC$,1,1)="3":GOTO 810 ' THEN IT IS A VOUCHER
950 CNT=CNT+1 ' BLOCK LOCATION IN THE DISK RECORD
960 CNT$=STR$(CNT)
970 DAC$=MID$(CNT$,2,5)
980 GOTO 810
990 CNT=CNT+1 ' BLOCK LOCATION IN THE DISK RECORD
1000 CNT$=STR$(CNT)
1010 PC$=MID$(CNT$,2,5)
1020 GOTO 800
1030 PRINT "DATA OVERLAPS DISK-ILLEGAL"
1040 GOTO 1040
1050 PRINT "TOO MANY RECORDS TO SORT":STOP
1060 IF N>1750 THEN 1050
1070 LPRINT "TOTAL RECORDS ";N;" FREE MEMORY ";FRE(X)
1080 '
1090 M=N' START OF SORT ROUTINE
1100 M=INT(M/2)
1110 EXH=0
1120 IF M=0 THEN 1270' END OF SORT-GOTO OUTPUT ROUTINE
1130 K=N-M
1140 J=1
1150 I=J
1160 L=I+M
1170 IF B#(I)<=B#(L) THEN 1230
1180 SWAP B#(I),B#(L)
1190 SWAP BB(I),BB(L)
1200 EXH=EXH+1
1210 I=I-M
1220 IF I>=1 THEN 1160
1230 J=J+1
1240 IF J>K THEN PRINT "M = ";M;" SWAPS MADE = ";EXH:GOTO 1100
1250 GOTO 1150
1260 '
1270 LPRINT
1280 LPRINT "ENTERING OUTPUT ROUTINE TO DR O"
1290 K=1
1300 A=1
1310 J=0
1320 J=J+1
1330 ZAP=BB(K) ' THE ACTUAL DISK RECORD ADDRESS IN OLD FILE + 1000
1340 REC$=STR$(ZAP)
1350 I$=MID$(REC$,6,1)
1360 REC$=MID$(REC$,2,4)
1370 REC=VAL(REC$)
1380 REC=REC-1000
1390 XI=VAL(I$)
1400 I=XI:G=XI:Y=XI ' I = THE BLOCKING FACTOR
1410 GET #1,REC
1420 FOR I=G TO Y
1430 FIELD #1, (I-1)*42 AS VREC$,42 AS VA$(I)
1440 DV$(J)=VA$(I) ' BUILD THE OUTPUT RECORD FOR THE SORTED FILE
1450 NEXT I
1460 K=K+1
1470 IF K>N THEN 1580 ' N = THE NUMBER OF RECORDS IN THE MATRIX
1480 IF J=3 THEN 1490 ELSE 1320
1490 FOR L=1 TO 3
1500 FIELD #2, (L-1)*42 AS DF$,42 AS DP$(L)
1510 LSET DP$(L)=DV$(L) ' TRANSFER DATA TO NEW FILES BUFFER
1520 NEXT L
1530 PUT #2,A ' WRITE OUT THE NEW FILES RECORD
1540 A=A+1 ' INCREMENT THE RECORD COUNTER FOR NEW FILE
1550 IF EFSW=2 THEN 1710 ' END OF FILE SWITCH FOR DRIVE 1
1560 IF EFSW=1 THEN 1680 ' END OF FILE SWITCH FOR DRIVE 0
1570 GOTO 1310
1580 EFSW=1
1590 IF J=3 THEN 1490
1600 EFSW=2
1610 J=J+1
1620 DV$(J)="EOF" ' INSERT EOF FOR NEW FILE
1630 JS=J
1640 IF J=3 THEN 1490
1650 J=J+1
1660 DV$(J)=BLK$
1670 GOTO 1640
1680 J=1
1690 EFSW=2
1700 GOTO 1620
1710 A=A-1
1720 LPRINT "** EOF ** DR 0 IN OUTPUT SECTOR ";A;" RECORD # ";JS
1730 CLOSE 1,2
1740 '
1750 LPRINT
1760 LPRINT "ENTERING COPY-BACK ROUTINE" ' COPY SORTED FILE TO ORIGINAL
1770 OPEN "R",1,"LEDGER",0
1780 OPEN "R",2,"LEDGER",1
1790 REC=SREC
1800 EF$="EOF"
1810 J=SI
1820 A=1
1830 GET #1,A ' GET NEW FILE ON DR 0
1840 FOR I=1 TO 3
1850 FIELD #1, (I-1)*42 AS D$,42 AS DREC$(I)
1860 DM$(I)=DREC$(I)
1870 IF MID$(DREC$(I),1,3)="EOF" THEN 1990
1880 NEXT I
1890 A=A+1
1900 IF GSW=1 THEN 1990
1910 GET #2,REC ' GET OLD FILE ON DR 1 AND CHECK FOR FIRST BLOCK FOR ST
1920 FOR I=1 TO 3
1930 FIELD #2, (I-1)*42 AS O$,42 AS ODEC$(I)
1940 R$(I)=ODEC$(I)
1950 NEXT I
1960 IF GSW=1 AND K<4 THEN 2040
1970 IF GSW=1 AND K>3 THEN 1990
1980 GSW=1
1990 FOR K=1 TO 3
2000 R$(J)=DM$(K) ' TRANSFER FILE DRIVE 0 TO FILE DRIVE 1
2010 IF MID$(DM$(K),1,3)="EOF" THEN 2190 ' IS IT END OF FILE DR 0
2020 J=J+1
2030 IF J=4 THEN 2060
2040 NEXT K
2050 GOTO 1830
2060 J=1
2070 FOR I=1 TO 3
2080 LSET ODEC$(I)=R$(I) ' LOAD OUTPUT FILE DRIVE 1 BUFFER AREA
2090 NEXT I
2100 PUT #2,REC ' WRITE OUT FILE TO DRIVE 1
2110 IF EFSW=1 THEN 2140 ' HAS EOF BEEN SENSED
2120 REC=REC+1 ' INCREMENT DRIVE 1 RECORD CONTER
2130 GOTO 1910
2140 LPRINT "DR 1 FIRST OUTPUT SECTOR ";SREC;" RECORD # ";SI
2150 LPRINT "** EOF ** DR 1 IN OUTPUT SECTOR ";REC;" RECORD # ";J
2160 LPRINT "EOJ"
2170 PRINT "EOJ"
2180 STOP ' END OF JOB
2190 EFSW=1
2200 GOTO 2070
2210 END