|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 5504 (0x1580) Types: TextFile Names: »DATABAS2.PLI«
└─⟦57f0389e8⟧ Bits:30005761 SW1611 Access Manager v. 1.0 └─ ⟦this⟧ »DATABAS2.PLI«
ENTDAT: PROC (ENTER_MODE,DRN) RETURNS (CHAR(4)) EXTERNAL; /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: DATA ENTRY ROUTINE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ DCL UNIQUE BIT(1), (DRN,FLD,OP_VAL,FLD_NO) FIXED, OP CHAR(2) VAR, OP1 CHAR(1), TEMP_MODE FIXED, ENTER_MODE CHAR(3); %INCLUDE 'DATABASE.DCL'; %INCLUDE 'AM86EXTR.PLI'; DCL CLRSCR ENTRY, LOKTYP ENTRY (FIXED); IF ENTER_MODE = 'NEW' THEN DO FLD = 0 TO MAX_FIELD; OLD_FLD(FLD) = ''; END; IF ENTER_MODE = 'OLD' THEN DO FLD = 0 TO MAX_FIELD; NEW_FLD(FLD) = OLD_FLD(FLD); END; CALL CLRSCR(); IF ENTER_MODE = 'NEW' THEN DO; PUT SKIP EDIT ('Enter New Customer Information') (X(19),A); PUT SKIP EDIT ('******************************') (X(19),A); PUT SKIP(3) LIST ( ' ÆEnter zero for customer # to see main menu.Å'); PUT SKIP(2); DO FLD = 0 TO MAX_FIELD; FLD_NO = FLD + 1; REDO_DATA: PUT EDIT (FLD_NO,' - ',FLD_NAME(FLD), '(',FLD_LEN(FLD),') >>') (F(6),2A,COLUMN(30),A,F(2),A); GET EDIT (NEW_FLD(FLD))(A); IF FLD = KEY_MAP(UNIQ_KEY) & NEW_FLD(FLD) = '0' THEN RETURN('STOP'); IF FLD = KEY_MAP(UNIQ_KEY) THEN DO; NEW_FLD(FLD) = RIGHT('0000' øø NEW_FLD(FLD), FLD_LEN(FLD)); UNIQUE = TEST_UNIQUENESS(); END; ELSE DO; NEW_FLD(FLD) = SUBSTR(NEW_FLD(FLD),1, FLD_LEN(FLD)); UNIQUE = YESBIT; END; IF üUNIQUE THEN GOTO REDO_DATA; END; TEMP_MODE = NEW_MODE; END; ELSE TEMP_MODE = OLD_MODE; DO WHILE (FOR_EVER); PUT SKIP(4) EDIT ('Current customer information') (X(19),A); PUT SKIP; DO FLD = 0 TO MAX_FIELD; FLD_NO = FLD + 1; PUT SKIP EDIT (FLD_NO,' - ',FLD_NAME(FLD),NEW_FLD(FLD)) (F(6),2A,COLUMN(30),A); END; IF TEMP_MODE = OLD_MODE THEN BEGIN; OP_VAL = 0; ON ERROR(1) BEGIN; OP_VAL = 0; GOTO RETRY_OLD; END; RETRY_OLD: DO WHILE (OP_VAL < 1 ø OP_VAL > NO_FIELDS); PUT SKIP(3) EDIT ( 'Enter C to continue scan, Field # to change data, S to save changes,', 'D to delete data, B for back scan, or E to end scan >>') (A,SKIP,A); GET LIST (OP); OP1 = OP; IF OP1 = 'C' ø OP1 = 'c' THEN RETURN('CONT'); IF OP1 = 'S' ø OP1 = 's' THEN RETURN('SAVE'); IF OP1 = 'D' ø OP1 = 'd' THEN RETURN(SET_XLOCK(OP1,DRN)); IF OP1 = 'B' ø OP1 = 'b' THEN RETURN('BACK'); IF OP1 = 'E' ø OP1 = 'e' THEN RETURN('STOP'); OP_VAL = OP; END; CALL UPDATE_FIELD(OP_VAL); END; ELSE BEGIN; OP_VAL = 0; ON ERROR(1) BEGIN; OP_VAL = 0; GOTO RETRY_NEW; END; RETRY_NEW: DO WHILE (OP_VAL < 1 ø OP_VAL > NO_FIELDS); PUT SKIP (3) EDIT ( 'Enter S to save data, Field # to change data,', 'D to delete data, or E to end input >>') (A,SKIP,A); GET LIST (OP); OP1 = OP; IF OP1 = 'S' ø OP1 = 's' THEN RETURN('SAVE'); IF OP1 = 'D' ø OP1 = 'd' THEN RETURN('DELT'); IF OP1 = 'E' ø OP1 = 'e' THEN RETURN('STOP'); OP_VAL = OP; END; CALL UPDATE_FIELD(OP_VAL); END; END; SET_XLOCK: PROC (OP,DRN) RETURNS (CHAR(ACTION_LEN)); DCL DRN FIXED, (DUMMY,OP) CHAR(1); DUMMY = 'W'; DO WHILE (DUMMY = 'W' & SETLOK(FILE_NO,XLOCK,DRN) ü= 0); PUT SKIP (2) EDIT ( 'Customer update on hold due to record lock', 'Enter W if you wish to wait or any other key to cancel update>>') (A,SKIP,A); GET LIST (DUMMY); IF DUMMY = 'w' THEN DUMMY = 'W'; END; IF DUMMY = 'W' THEN DO; IF OP = 'S' THEN RETURN('SAVE'); ELSE RETURN('DELT'); END; ELSE RETURN(OLD_ACTION); END SET_XLOCK; /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: UPDATE DATA FIELD ROUTINE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ UPDATE_FIELD: PROC (FLD_NO); DCL TEST BIT(1), (FLD_NO,FIELD_NO) FIXED; FIELD_NO = FLD_NO-1; TEST = NOBIT; DO WHILE (üTEST); PUT SKIP(2) EDIT ('Input new ',FLD_NAME(FIELD_NO),'>>') (3A); GET EDIT (NEW_FLD(FIELD_NO))(A); IF FIELD_NO = KEY_MAP(UNIQ_KEY) THEN NEW_FLD(FIELD_NO) = RIGHT('0000' øø NEW_FLD(FIELD_NO), FLD_LEN(FIELD_NO)); ELSE NEW_FLD(FIELD_NO) = SUBSTR(NEW_FLD(FIELD_NO),1, FLD_LEN(FIELD_NO)); IF FIELD_NO = KEY_MAP(UNIQ_KEY) & NEW_FLD(FIELD_NO) ü= OLD_FLD(FIELD_NO) THEN TEST = TEST_UNIQUENESS(); ELSE TEST = YESBIT; END; END UPDATE_FIELD; /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: CUST # UNIQUENESS TEST ROUTINE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ TEST_UNIQUENESS: PROC RETURNS (BIT(1)); DCL TEMP FIXED, TEST CHAR(MAX_FLD_LEN) VAR; TEST = NEW_FLD(KEY_MAP(UNIQ_KEY)); TEMP = GETKEY(UNIQ_KEY,0,NLOCK,TEST); IF LOKCOD() ü= 0 THEN CALL LOKTYP(12); IF TEMP = 0 THEN RETURN(YESBIT); ELSE DO; PUT SKIP(2) LIST (' *** Already Assigned ***'); PUT SKIP; RETURN(NOBIT); END; END TEST_UNIQUENESS; /* ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: RIGHT STRING ROUTINE ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */ RIGHT: PROC (FLDSTR,FLDLEN) RETURNS (CHAR(MAX_FLD_LEN) VAR); DCL FLDLEN FIXED, FLDSTR CHAR(MAX_FLD_LEN) VAR; RETURN(SUBSTR(FLDSTR,LENGTH(FLDSTR)-FLDLEN+1)); END RIGHT; END ENTDAT; «eof»