There is nothing special about the dbf - just used for name, address and pricing details - the database is used to create a quotation and creates one record per price record - here is the code i use to create the dbf:
LOCAL DetsArr := {}
//Header Details
Aadd(DetsArr, {"PROSPECT" ,"C",10,0})
Aadd(DetsArr, {"NAME" ,"C",40,0})
Aadd(DetsArr, {"ADDRESS1" ,"C",40,0})
Aadd(DetsArr, {"ADDRESS2" ,"C",40,0})
Aadd(DetsArr, {"ADDRESS3" ,"C",40,0})
Aadd(DetsArr, {"ADDRESS4" ,"C",40,0})
Aadd(DetsArr, {"POSTCODE" ,"C",20,0})
Aadd(DetsArr, {"TELEPHONE","C",30,0})
Aadd(DetsArr, {"FAX" ,"C",30,0})
Aadd(DetsArr, {"TITLE" ,"C",10,0})
Aadd(DetsArr, {"CONTACT" ,"C",30,0})
Aadd(DetsArr, {"SURNAME" ,"C",30,0})
Aadd(DetsArr, {"QUOTE" ,"C",8,0})
Aadd(DetsArr, {"START" ,"D",8,0})
Aadd(DetsArr, {"END" ,"D",8,0})
Aadd(DetsArr, {"ORIGOP" ,"C",4,0})
Aadd(DetsArr, {"ORIGNAME" ,"C",30,0})
Aadd(DetsArr, {"SALEOP" ,"C",4,0})
Aadd(DetsArr, {"SALENAME" ,"C",30,0})
Aadd(DetsArr, {"REFNO" ,"C",30,0})
Aadd(DetsArr, {"VALID" ,"D",8,0})
Aadd(DetsArr, {"DETAILTYPE","C", 1,0})
//Container Price/Common Fields
Aadd(DetsArr, {"DELIVERY" ,"C",40,0})
Aadd(DetsArr, {"DELADD1" ,"C",40,0})
Aadd(DetsArr, {"DELADD2" ,"C",40,0})
Aadd(DetsArr, {"DELADD3" ,"C",40,0})
Aadd(DetsArr, {"DELADD4" ,"C",40,0})
Aadd(DetsArr, {"DELPCOD" ,"C",20,0})
Aadd(DetsArr, {"CONTAINER" ,"C",10,0})
Aadd(DetsArr, {"CONTDESC" ,"C",30,0})
Aadd(DetsArr, {"PRODUCT" ,"C",10,0})
Aadd(DetsArr, {"PRODDESC" ,"C",80,0})
Aadd(DetsArr, {"AREACODE" ,"C",10,0})
Aadd(DetsArr, {"AREADESC" ,"C",30,0})
Aadd(DetsArr, {"DISPSITE" ,"C",10,0})
Aadd(DetsArr, {"DISPNAME" ,"C",30,0})
Aadd(DetsArr, {"QUANTITY" ,"N",2,0})
Aadd(DetsArr, {"DELCHARGE" ,"N",7,2})
Aadd(DetsArr, {"FREEDAYS" ,"N",3,0})
Aadd(DetsArr, {"RENTCHARGE","N",7,2})
Aadd(DetsArr, {"RENTDAYS" ,"N",3,0})
Aadd(DetsArr, {"COLLCHARGE","N",7,2})
Aadd(DetsArr, {"EXCHCHARGE","N",7,2})
Aadd(DetsArr, {"ADDCHARGE" ,"N",10,2})
Aadd(DetsArr, {"ADDFOR" ,"C",30,0})
Aadd(DetsArr, {"NOTES" ,"C",LEN(QUOTSKIP->NOTES),0})
Aadd(DetsArr, {"NOTES2","C",LEN(QUOTSKIP->NOTES2),0})
Aadd(DetsArr, {"UNIQ_NBR" ,"C",10,1})
Aadd(DetsArr, {"CRED_DISC" ,"N",5,2})
Aadd(DetsArr, {"ENVIR_TON" ,"N",5,2})
Aadd(DetsArr, {"ENVIR_VOL" ,"N",5,2})
Aadd(DetsArr, {"UPLIFT" ,"N",3,0})
Aadd(DetsArr, {"OFWHICH" ,"N",7,2})
Aadd(DetsArr, {"MAXCH" ,"N",7,2})
Aadd(DetsArr, {"MAXDAY" ,"N",3,0})
Aadd(DetsArr, {"MAXOFWH" ,"N",7,2})
Aadd(DetsArr, {"SPECCOL" ,"N",7,2})
Aadd(DetsArr, {"SPECOFW" ,"N",7,2})
//Weighbridge Price Fields
Aadd(DetsArr, {"INTNOTE" ,"C",15,0})
Aadd(DetsArr, {"INTDESC" ,"C",80,0})
Aadd(DetsArr, {"ORIGCODE" ,"C",10,0})
Aadd(DetsArr, {"ORIGDESC" ,"C",30,0})
Aadd(DetsArr, {"HAULIER" ,"C",10,0})
Aadd(DetsArr, {"HAULNAME" ,"C",40,0})
Aadd(DetsArr, {"MINWEIGHT" ,"N",7,2})
Aadd(DetsArr, {"MAXWEIGHT" ,"N",7,2})
Aadd(DetsArr, {"MINVALUE" ,"N",7,2})
Aadd(DetsArr, {"MAXVALUE" ,"N",7,2})
Aadd(DetsArr, {"CHARGEBY" ,"C",1,0})
Aadd(DetsArr, {"HAULRATE" ,"N",7,2})
Aadd(DetsArr, {"HAULCHGBY" ,"C",1,0})
Aadd(DetsArr, {"ADMINCHRG" ,"N",7,2})
Aadd(DetsArr, {"PREMSAT" ,"N",6,2})
Aadd(DetsArr, {"PREMSUN" ,"N",6,2})
Aadd(DetsArr, {"PREMBANK" ,"N",6,2})
Aadd(DetsArr, {"REFERENCE1","C",30,0})
Aadd(DetsArr, {"REFERENCE2","C",30,0})
Aadd(DetsArr, {"RATE1" ,"N",8,2})
Aadd(DetsArr, {"QTY1" ,"N",8,2})
Aadd(DetsArr, {"ROUND1" ,"N",5,2})
Aadd(DetsArr, {"RATE2" ,"N",8,2})
Aadd(DetsArr, {"QTY2" ,"N",8,2})
Aadd(DetsArr, {"ROUND2" ,"N",5,2})
Aadd(DetsArr, {"RATE3" ,"N",8,2})
Aadd(DetsArr, {"QTY3" ,"N",8,2})
Aadd(DetsArr, {"ROUND3" ,"N",5,2})
Aadd(DetsArr, {"RATE4" ,"N",8,2})
Aadd(DetsArr, {"QTY4" ,"N",8,2})
Aadd(DetsArr, {"ROUND4" ,"N",5,2})
Aadd(DetsArr, {"RATE5" ,"N",8,2})
Aadd(DetsArr, {"QTY5" ,"N",8,2})
Aadd(DetsArr, {"ROUND5" ,"N",5,2})
Aadd(DetsArr, {"RATE6" ,"N",8,2})
Aadd(DetsArr, {"QTY6" ,"N",8,2})
Aadd(DetsArr, {"ROUND6" ,"N",5,2})
Aadd(DetsArr, {"RATE7" ,"N",8,2})
Aadd(DetsArr, {"QTY7" ,"N",8,2})
Aadd(DetsArr, {"ROUND7" ,"N",5,2})
Aadd(DetsArr, {"RATE8" ,"N",8,2})
Aadd(DetsArr, {"QTY8" ,"N",8,2})
Aadd(DetsArr, {"ROUND8" ,"N",5,2})
Aadd(DetsArr, {"RATE9" ,"N",8,2})
Aadd(DetsArr, {"QTY9" ,"N",8,2})
Aadd(DetsArr, {"ROUND9" ,"N",5,2})
Aadd(DetsArr, {"RATE10" ,"N",8,2})
Aadd(DetsArr, {"QTY10" ,"N",8,2})
Aadd(DetsArr, {"ROUND10" ,"N",5,2})
Aadd(DetsArr, {"CURRENCY" ,"C",3,0})
Aadd(DetsArr, {"PRIC_PRIOD","C",3,0})
Aadd(DetsArr, {"EXTRA1" ,"C",100,0})
Aadd(DetsArr, {"EXTRA2" ,"C",100,0})
Aadd(DetsArr, {"EXTRA3" ,"C",100,0})
Aadd(DetsArr, {"EXTRA4" ,"C",100,0})
Aadd(DetsArr, {"EXTRA5" ,"C",100,0})
Aadd(DetsArr, {"EXTRA6" ,"C",100,0})
Aadd(DetsArr, {"EXTRA7" ,"C",100,0})
Aadd(DetsArr, {"EXTRA8" ,"C",100,0})
Aadd(DetsArr, {"QUO_NAME" ,"C",40,0})
Aadd(DetsArr, {"QUO_ADDR1" ,"C",40,0})
Aadd(DetsArr, {"QUO_ADDR2" ,"C",40,0})
Aadd(DetsArr, {"QUO_ADDR3" ,"C",40,0})
Aadd(DetsArr, {"QUO_ADDR4" ,"C",40,0})
Aadd(DetsArr, {"QUO_PCODE" ,"C",20,0})
IF Alltrim( Upper( GetIwsSysIni("Quotation Module", "Use Temp Path for printing") ) ) == "YES"
Dbcreate(TempPath()+ If(Right(TempPath(),1) == "\", "","\") +"QUODETS.DBF",DetsArr)
ELSE
Dbcreate("C:\QUODETS.DBF",DetsArr)
END IF
IF SELECT("QUODETS") <> 0
QUODETS->(DBCLOSEAREA())
ENDIF
I then populate the table with the price details.