home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 12
/
CD_ASCQ_12_0294.iso
/
maj
/
421
/
ez_creat.bas
< prev
next >
Wrap
BASIC Source File
|
1993-08-03
|
5KB
|
206 lines
DECLARE FUNCTION EzCreateDXB% (Filename$, NoFields%, FieldInfo$())
DEFINT A-Z
REM $INCLUDE: 'BULLET.BI'
'ez_creat.bas 31-May-92 chh
'--shows an easy method to create BULLET DBF data files using a FUNCTION
'C>bc ez_creat /o;
'C>link ez_creat,,nul,bullet;
DIM DFP AS DOSFilePack
DIM MP AS MemoryPack
DIM IP AS InitPack
DIM EP AS ExitPack
DIM CDP AS CreateDataPack
DIM OP AS OpenPack
DIM DP AS DescriptorPack
DIM NameDAT AS STRING * 80
NameDAT = ".\EZ_TEST.DBF" + CHR$(0)
level = 100
MP.Func = MemoryXB
stat = BULLET(MP)
IF MP.Memory < 140000 THEN
QBheap& = SETMEM(-150000) 'hog wild, 64K would do okay
MP.Func = MemoryXB
stat = BULLET(MP)
IF MP.Memory < 140000 THEN stat = 8: GOTO Abend
END IF
level = 110
IP.Func = InitXB
IP.JFTmode = 0
stat = BULLET(IP)
IF stat THEN GOTO Abend
level = 120
EP.Func = AtExitXB
stat = BULLET(EP)
level = 130
DFP.Func = DeleteFileDOS
DFP.FilenamePtrOff = VARPTR(NameDAT)
DFP.FilenamePtrSeg = VARSEG(NameDAT)
stat = BULLET(DFP)
'-------------------------------------------------------------------------
'this is the simplified method to create BULLET data files
'simple in that you just use a string array with each element of the array
'set to the corresponding field info for the DBF data record
level = 1000
NoFields = 4
REDIM FieldInfo$(1 TO NoFields)
FieldInfo$(1) = "LASTNAME,C,19,0"
FieldInfo$(2) = "FIRSTNAME,C,15,0"
FieldInfo$(3) = "BIRTHDATE,D,8,0"
FieldInfo$(4) = "SALARY,N,10,2"
stat = EzCreateDXB(NameDAT, NoFields, FieldInfo$())
IF stat THEN GOTO Abend
'just open it up and print out the field descriptors to the data file just
'created
level = 1010
OP.Func = OpenDXB
OP.FilenamePtrOff = VARPTR(NameDAT)
OP.FilenamePtrSeg = VARSEG(NameDAT)
OP.ASmode = ReadWrite + DenyNone
stat = BULLET(OP)
IF stat THEN GOTO Abend
HandDAT = OP.Handle
level = 1020
DP.Func = GetDescriptorXB
DP.Handle = HandDAT
PRINT
PRINT "FieldName T L D"
PRINT "--------- - -- --"
FOR i = 1 TO NoFields
DP.FieldNumber = i
stat = BULLET(DP)
IF stat = 0 THEN
PRINT DP.FD.FieldName; DP.FD.FieldType;
PRINT ASC(DP.FD.FieldLength); ASC(DP.FD.FieldDC)
ELSE
EXIT FOR
END IF
NEXT
PRINT
PRINT "Okay."
EndIt:
EP.Func = ExitXB
stat = BULLET(EP)
END
Abend:
PRINT
PRINT "Error:"; stat; "at level"; level; "while performing ";
SELECT CASE level
CASE IS = 999
SELECT CASE level
CASE 100
PRINT "a memory request of 150K."
CASE 110
PRINT "BULLET initialization."
CASE 120
PRINT "registering of ExitXB with _atexit."
CASE ELSE
PRINT "Preliminaries unknown."
END SELECT
CASE IS <= 1099
SELECT CASE level
CASE 1000
PRINT "data file create."
CASE 1010
PRINT "data file open."
CASE 1020
PRINT "data get descriptors."
CASE ELSE
PRINT "data file unknown."
END SELECT
CASE ELSE
PRINT "unknown."
END SELECT
GOTO EndIt
FUNCTION EzCreateDXB (Filename$, NoFields, FieldInfo$())
'example of using modular programming to customize the BULLET API
'FieldInfo$() is a var-len string array with each element made up as:
' FieldInfo$(i) = "FIELDNAME,FIELDTYPE,FIELDLEN,FIELDDC" as in:
' FieldInfo$(1) = "LASTNAME,C,19,0"
' FieldInfo$(2) = "FIRSTNAME,C,15,0"
' FieldInfo$(3) = "BIRTHDATE,D,8,0"
' FieldInfo$(4) = "SALARY,N,10,2"
' and so on
REDIM FieldList(1 TO NoFields) AS FieldDescTYPE
DIM CDP AS CreateDataPack
DIM TmpName AS STRING * 80
DIM TmpStr AS STRING * 32
FOR i = 1 TO NoFields
GOSUB ParseInfo
IF stat THEN EXIT FOR
FieldList(i).FieldName = fldname$
FieldList(i).FieldType = fldtype$
FieldList(i).FieldLength = CHR$(fldlength)
FieldList(i).FieldDC = CHR$(flddc)
NEXT
IF stat = 0 THEN
TmpName = Filename$ + CHR$(0)
CDP.Func = CreateDXB
CDP.FilenamePtrOff = VARPTR(TmpName)
CDP.FilenamePtrSeg = VARSEG(TmpName)
CDP.NoFields = NoFields
CDP.FieldListPtrOff = VARPTR(FieldList(1))
CDP.FieldListPtrSeg = VARSEG(FieldList(1))
CDP.FileID = 3
stat = BULLET(CDP)
END IF
EzCreateDXB = stat
EXIT FUNCTION
'--------
ParseInfo:
stat = 0
cptr = 1
nptr = 0
TmpStr = LTRIM$(RTRIM$(FieldInfo$(i))) + CHR$(0)
nptr = INSTR(cptr, TmpStr, ",")
IF nptr > cptr THEN
fldname$ = LTRIM$(RTRIM$(MID$(TmpStr, cptr, nptr - cptr))) + STRING$(11, 0)
cptr = nptr + 1
nptr = INSTR(cptr, TmpStr, ",")
IF nptr > cptr THEN
fldtype$ = LTRIM$(RTRIM$(MID$(TmpStr, cptr, nptr - cptr)))
cptr = nptr + 1
nptr = INSTR(cptr, TmpStr, ",")
IF nptr > cptr THEN
fldlength = VAL(MID$(TmpStr, cptr, nptr - cptr))
cptr = nptr + 1
nptr = INSTR(cptr, TmpStr, CHR$(0))
IF nptr > cptr THEN
flddc = VAL(MID$(TmpStr, cptr, nptr - cptr))
END IF
END IF
END IF
END IF
IF nptr <= cptr THEN stat = 243 '(for lack of a better error code...)
'may want to verify that fldname$,fldtype$,fldlength,flddc are within limits
RETURN
END FUNCTION