*--------------------------*
* TABLE
* GENERIC TABLE MAINTENANCE PROGRAM TO UPDATE CLOCK TABLES.
*--------------------------*
CS=@(-1) ; CR=@(-3) ; CL=@(-4) ; RV=@(-13) ; ERV=@(-14)
VM=CHAR(253) ; SVM=CHAR(252) ; AM=CHAR(254) ; BEEP=CHAR(7)
PF1='<' ; PF2='P' ; PF3='/'
FF=CHAR(12)
LF=CHAR(10):CHAR(13)
PROMPT ""
MODE=''
HD=''; LN=''; LNCT=0
COL=0; POS=0; MAX=20
LAYOUT=''
GOSUB 10000 ;* SETUP LAYOUT ARRAY
*
FILENAME='STATUS.WORKORDER'
OPEN FILENAME TO OFILE ELSE ABORT
EXECUTE \SSELECT \:FILENAME
BRAY=''
LOOP
READNEXT KEY ELSE KEY='EOF'
UNTIL KEY='EOF' DO
BRAY=INSERT(BRAY,1,-1;KEY)
REPEAT
*
100 *
GOSUB 2100
BCT=DCOUNT(BRAY<1>,VM)
B=0
LOOP
B=B+1
KEY=BRAY<1,B>
UNTIL B > BCT DO
READ IREC FROM OFILE,KEY THEN
IREC=INSERT(IREC,1;KEY)
OREC=IREC
GOSUB 2000; * DISPLAY RECORD
END
REPEAT
CRT @(0,22):CL:"Enter WO # to modify, A(add), B(back), P(page), '/'(esc), 'C'(comments)":
INPUT ANS
BEGIN CASE
CASE ANS='/' OR ANS='?'
* ESCAPE *
STOP
CASE ANS='C' OR ANS='c'
IF MODE THEN
GOSUB 80
MODE=0
B=0; LNCT=0
GO 100
END ELSE
GOSUB 132
MODE=1
B=0; LNCT=0
GO 100
END
CASE ANS='A' OR ANS='a'
*ADD ITEM*
OREC=''
GOSUB 3000
CASE ANS='B' OR ANS='b'
*BACK PAGE*
CASE ANS='P' OR ANS='p'
*NEXT PAGE*
CASE ANS >=1 AND ANS <= BCT
KEY=BRAY<1,ANS>
GOSUB 4000 ;* DISPLAY DATA
GOSUB 5000 ;* UPDATE INFO
CASE 1
END CASE
CRT CS
LNCT=0
GO 100
*
2000 * DISPLAY DATA
FOR A=1 TO 7
IF A=1 THEN
ISTR=B'L#2':IREC'R#8'
END ELSE
ISTR=IREC
END
IF LAYOUT<5,A>#'' THEN
ISTR=OCONV(ISTR,LAYOUT<5,A>)
END
ILEN=LAYOUT<4,A>
IF A=7 THEN
MCT=DCOUNT(ISTR,VM)
IF MCT>1 THEN
GOSUB 2600
LN=LN:OSTR
END ELSE
GOSUB 2700
LN=LN:OSTR
END
END ELSE
GOSUB 2500
LN=LN:OSTR
END
NEXT A
GOSUB 2100
RETURN
*
2100 * PRINT LINE LOGIC
IF LNCT=0 THEN
IF MODE THEN
GOSUB 132
LN=FF:HD
END ELSE
LN=FF:HD[1,80]
END
END ELSE
IF MODE ELSE
LN=LN[1,75]
END
END
IF LNCT > MAX THEN
LNHOLD=LN
LNCT=0
GOSUB 2100
LN=LNHOLD
END
PRINT LN
LN=''
LNCT=LNCT+1
RETURN
*
2500 * CONSTRUCT ELEMENTS FOR OUTPUT LINE
OLEN=INT(ILEN/2)-INT(LEN(ISTR)/2)
OSTR=SPACE(OLEN):ISTR
MASK="L#":ILEN
OSTR=OSTR MASK
RETURN
*
2600 *
FOR M=1 TO MCT
IF M > 1 THEN
OSTR=OSTR:LF:SPACE(75):ISTR<1,M>
END ELSE
OSTR=ISTR<1,M>
END
NEXT M
RETURN
*
2700 *
MASK="L#":ILEN
OSTR=ISTR MASK
RETURN
*
80 *
A=CHAR(27):"`:":CHAR(12)
PRINT A
RETURN
132 *
A=CHAR(27):"`;":CHAR(12)
PRINT A
RETURN
500 * DRAW A BOX CENTER SCREEN
IF MODE THEN
FCOL=39; FPOS=2; BCOL=93; BPOS=11
END ELSE
FCOL=15; FPOS=2; BCOL=69; BPOS=11
END
550 *
FOR W=FPOS TO BPOS
IF W=FPOS OR W=BPOS THEN
STRNG=RV:STR(" ",BCOL-FCOL):ERV
END ELSE
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
END
CRT @(FCOL,W):STRNG
NEXT W
RETURN
*
3000 * ADD LOGIC
GOSUB 500
ACT=DCOUNT(LAYOUT<1>,VM)
FOR A=1 TO ACT
ALEN=LEN(LAYOUT<2,A>)
XLEN=14
CRT @(0,22):CL:LAYOUT<3,A>:
IF A # 7 THEN
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":
INPUT ANS
IF A=1 THEN
LOCATE(ANS,BRAY,1;NDX) THEN
CRT @(0,22):BEEP:CL:"EXISTS ON FILE - TRY AGAIN!":
RQM
GO 3000
END
END
IF LAYOUT<5,A>='D2/' THEN
ANS=ICONV(ANS,'D2/')
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":OCONV(ANS,'D2/')
END
END ELSE
HLD.ANS=''
V=0
CRT @(FCOL+2,FPOS+A):A:SPACE(12):RV:LAYOUT<2,A>:":":ERV
LOOP
V=V+1
IF MODE THEN
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
CRT @(FCOL,FPOS+A+V):STRNG
FCOL=39; BCOL=93; BPOS=10+V; FPOS=BPOS
GOSUB 550
FPOS=2; BPOS=11
END ELSE
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
CRT @(FCOL,FPOS+A+V):STRNG
FCOL=15; BCOL=69; BPOS=10+V; FPOS=BPOS
GOSUB 550
FPOS=2; BPOS=11
END
CRT @(FCOL+2,FPOS+A+V):
INPUT ANS,50
IF ANS # '' THEN
HLD.ANS<1,V>=ANS
END
UNTIL ANS='' OR V >= 11 DO
ANS=''
REPEAT
ANS=HLD.ANS
END
IF ANS # '' THEN
OREC=ANS
END
NEXT A
GOSUB 9000 ;* PROMPT FOR 'E' OR '/'
RETURN
*
4000 * DISPLAY EXISTING DATA
READ IREC FROM OFILE,KEY ELSE OREC=''
IREC=INSERT(IREC,1;KEY)
OREC=IREC
GOSUB 500
ACT=DCOUNT(LAYOUT<1>,VM)
FOR A=1 TO ACT
ALEN=LEN(LAYOUT<2,A>)
XLEN=14
IF A # 7 THEN
IF LAYOUT<5,A>='D2/' THEN
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":OCONV(OREC,'D2/')
END ELSE
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":OREC[1,LAYOUT<4,A>]
END
END ELSE
HLD.ANS=''
V=0
CRT @(FCOL+2,FPOS+A):A:SPACE(12):RV:LAYOUT<2,A>:":":ERV
LOOP
V=V+1
IF MODE THEN
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
CRT @(FCOL,FPOS+A+V):STRNG
FCOL=39; BCOL=93; BPOS=10+V; FPOS=BPOS
GOSUB 550
FPOS=2; BPOS=11
END ELSE
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
CRT @(FCOL,FPOS+A+V):STRNG
FCOL=15; BCOL=69; BPOS=10+V; FPOS=BPOS
GOSUB 550
FPOS=2; BPOS=11
END
CRT @(FCOL+2,FPOS+A+V):OREC<7,V>
UNTIL OREC<7,V>='' OR V >= 11 DO
REPEAT
END
NEXT A
CRT @(0,22):CL:
RETURN
*
5000 * UPDATE LOGIC
CRT @(0,22):CL:"YOU ARE HERE - AND YOU HAVE NO ONE TO BLAME BUT YOURSELF!":
INPUT ANY
ACT=DCOUNT(LAYOUT<1>,VM)
FOR A=1 TO ACT
ALEN=LEN(LAYOUT<2,A>)
XLEN=14
CRT @(0,22):CL:LAYOUT<3,A>:
IF A # 7 THEN
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":
INPUT ANS
IF ANS='/' THEN GO 5999
IF ANS='*' THEN
MASK="L#":LAYOUT<4,A>
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":'' MASK
END ELSE
IF A=1 AND ANS='D' THEN ;* DELETE RECORD
CRT @(0,22):CL:BEEP:"Are you sure you want to DELETE this Work Order? ":
INPUT ANY
IF ANY='Y' OR ANY='y' THEN
OREC<2>='DELETE'
GO 5999
END
END ELSE
IF LAYOUT<5,A>='D2/' THEN
ANS=ICONV(ANS,'D')
CRT @(FCOL+2,FPOS+A):A:" ":LAYOUT<2,A>:STR(" ",XLEN-ALEN):": ":OCONV(ANS,'D2/')
END
END
END
END ELSE
HLD.ANS=''
V=0
CRT @(FCOL+2,FPOS+A):A:SPACE(12):RV:LAYOUT<2,A>:":":ERV
LOOP
V=V+1
IF MODE THEN
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
CRT @(FCOL,FPOS+A+V):STRNG
FCOL=39; BCOL=93; BPOS=10+V; FPOS=BPOS
GOSUB 550
FPOS=2; BPOS=11
END ELSE
STRNG=RV:" ":ERV:STR(" ",BCOL-FCOL-2):RV:" ":ERV
CRT @(FCOL,FPOS+A+V):STRNG
FCOL=15; BCOL=69; BPOS=10+V; FPOS=BPOS
GOSUB 550
FPOS=2; BPOS=11
END
CRT @(FCOL+2,FPOS+A+V):
INPUT ANS,50
IF ANS # '' THEN
HLD.ANS<1,V>=ANS
END
UNTIL ANS='' OR V >= 11 DO
ANS=''
REPEAT
ANS=HLD.ANS
END
IF ANS # '' THEN
IF ANS='*' THEN
OREC=""
END ELSE
OREC=ANS
END
END
NEXT A
5999 *
GOSUB 9000 ;* PROMPT FOR 'E' OR '/'
RETURN
*
9000 * WRITE RECORD
IF OREC<2>='DELETE' THEN
KEY=OREC<1>
DELETE OFILE,KEY
LOCATE(KEY,BRAY,1;NDX) THEN
BRAY=DELETE(BRAY,1,NDX)
END
END ELSE
CRT @(0,22):CL:"Enter 'E'(end) or '/'(escape) :":
INPUT ANS
BEGIN CASE
CASE ANS='E'
KEY=OREC<1>
LOCATE(KEY,BRAY,1;NDX) ELSE
BRAY=INSERT(BRAY,1,NDX;KEY)
END
OREC=DELETE(OREC,1)
WRITE OREC ON OFILE,KEY
CASE ANS='/'
OREC=''
CASE 1
CRT @(0,22):BEEP:CL:"INVALID RESPONSE - TRY AGAIN!":
RQM
GO 9000
END CASE
END
RETURN
*
10000 * SETUP LAYOUT ARRAY
FOR A=1 TO 7
LAYOUT<1,A>=A
NEXT A
LAYOUT<2,1>='WORK ORDER'
LAYOUT<3,1>='Enter the WORK ORDER #'
LAYOUT<4,1>=10
*
LAYOUT<2,2>='WO DATE'
LAYOUT<3,2>='Enter the DATE the Work Order was Submitted'
LAYOUT<4,2>=10
LAYOUT<5,2>='D2/'
*
LAYOUT<2,3>='DUE DATE'
LAYOUT<3,3>='Enter the DATE the Work Order is DUE'
LAYOUT<4,3>=10
LAYOUT<5,3>='D2/'
*
LAYOUT<2,4>='DESCRIPTION'
LAYOUT<3,4>='Enter a brief DESCRIPTION of this Work Order'
LAYOUT<4,4>=30
*
LAYOUT<2,5>='PRGMR'
LAYOUT<3,5>='Enter PROGRAMMER assigned to the task'
LAYOUT<4,5>=5
*
LAYOUT<2,6>='COMPLETED'
LAYOUT<3,6>='Enter the DATE this project was COMPLETED'
LAYOUT<4,6>=10
LAYOUT<5,6>='D2/'
*
LAYOUT<2,7>='POST COMPLETION NOTES'
LAYOUT<3,7>='Enter NOTES (ie, counts, outstanding issues, etc.)'
LAYOUT<4,7>=50
*
ACT=DCOUNT(LAYOUT<1>,VM)
FOR A=1 TO ACT
ISTR=LAYOUT<2,A>
ILEN=LAYOUT<4,A>
GOSUB 2500
HD=HD:OSTR
NEXT A
*
RETURN