Important Notice
The pages on this site contain documentation for very old MS-DOS software,
purely for historical purposes.
If you're looking for up-to-date documentation, particularly for programming,
you should not rely on the information found here, as it will be woefully
out of date.
ISAM Transaction Processing Example
◄Example► ◄Contents► ◄Index► ◄Back►
──────────────────────────────────────────────────────────────────────────────
'This example uses the DELETE statement to remove records from an ISAM file.
'It creates a transaction with the BEGINTRANS and COMMITTRANS statements,
'and uses the SAVEPOINT function and ROLLBACK statement within the
'transaction to provide rollback of any or all of the deletions.
'Note: To run this program, you must load the ISAM TSR program PROISAM.EXE.
'Also, this program assumes a file called BOOKS.MDB exists in the current
'directory. BOOKS.MDB is a sample ISAM file that SETUP copies to your disk.
DEFINT A-Z
TYPE Borrower
Cardnum AS LONG 'Card number.
TheName AS STRING * 36 'Name.
Street AS STRING * 50 'Street.
City AS STRING * 26 'City.
State AS STRING * 2 'State.
Zip AS LONG 'Zip code.
END TYPE
DIM People AS Borrower 'Record structure variable.
CONST Database = "BOOKS.MDB" 'Name of the disk file.
CONST Tablename = "Cardholders" 'Name of the table.
CONST viewbottom = 17, viewtop = 3, msgtxt = " *** Deleted: Savepoint "
DIM SavePts(viewbottom - viewtop + 1)
TableNum = FREEFILE
OPEN Database FOR ISAM Borrower Tablename AS TableNum
'Loop until user chooses to quit.
DO
VIEW PRINT
CLS : COLOR 15, 0
PRINT SPC(34); "Card Holders"
PRINT "Card#"; SPC(2); "Name"; SPC(13); "Street";
PRINT SPC(20); "City"; SPC(6); "State"; SPC(2); "Zip"
LOCATE 24, 1: PRINT "Choose a key: ";
PRINT "D - Delete this record N - Next record Q - Quit";
MOVEFIRST TableNum
VIEW PRINT viewtop TO viewbottom: COLOR 7, 0: CLS
vPos = viewtop
'Loop through a screenful of records.
DO
'For each record, display and ask user what to do with it.
RETRIEVE TableNum, People
LOCATE vPos, 1
PRINT USING ("#####"); People.Cardnum;
PRINT " "; LEFT$(People.TheName, 15); " ";
PRINT LEFT$(People.Street, 25); " ";
PRINT LEFT$(People.City, 10); " "; People.State; " ";
PRINT USING ("#####"); People.Zip
'Get keystroke from user.
validkeys$ = "DNQ"
DO
keychoice$ = UCASE$(INKEY$)
LOOP WHILE INSTR(validkeys$, keychoice$) = 0 OR keychoice$ = ""
'Process keystroke.
SELECT CASE keychoice$
CASE "D"
IF NOT inTransaction THEN
inTransaction = -1
BEGINTRANS
END IF
NumSavePts = NumSavePts + 1
SavePts(NumSavePts) = SAVEPOINT
DELETE TableNum
LOCATE vPos, 7: PRINT msgtxt; NumSavePts; SPC(79 - POS(0));
CASE "Q"
EXIT DO
CASE "N"
MOVENEXT TableNum
END SELECT
vPos = vPos + 1
LOOP UNTIL EOF(TableNum) OR vPos = viewbottom
'If user didn't delete any records, simply quit.
IF NumSavePts = 0 THEN EXIT DO
'Allow user to commit deletions, or roll back some or all of them.
VIEW PRINT: LOCATE 24, 1: PRINT "Choose a key: ";
PRINT "R - Rollback to a savepoint A - Rollback all deletions"
PRINT SPC(17); "Q - commit deletions and Quit";
validkeys$ = "RAQ"
DO
keychoice$ = UCASE$(INKEY$)
LOOP WHILE INSTR(validkeys$, keychoice$) = 0 OR keychoice$ = ""
SELECT CASE keychoice$
CASE "R"
VIEW PRINT 24 TO 25: PRINT : PRINT
DO
PRINT "Roll back to which savepoint ( 1 -"; NumSavePts; ")";
INPUT RollbackPt
LOOP UNTIL RollbackPt > 0 AND RollbackPt <= NumSavePts
ROLLBACK SavePts(RollbackPt)
NumSavePts = RollbackPt - 1
CASE "A"
NumSavePts = 0
ROLLBACK ALL
CASE "Q"
EXIT DO
END SELECT
LOOP
IF inTransaction THEN COMMITTRANS
CLOSE
END