DBFCUSTO.MOD 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. IMPLEMENTATION MODULE DBFCustomer;
  2. FROM ModBase3 IMPORT InitDBF,OpenDBF,CloseDBF,ReadDBRec,GetField,DBFile,
  3. DeleteRecord,DefaultFixUp,NilDBF,PosOfField,DBFieldArray,
  4. DBFieldPtr,BuildDBF,DBFieldDescriptor;
  5. FROM DBCopier IMPORT DBPack;
  6. FROM DBIndxes IMPORT InitIndex,OpenIndex,AddToUpdateList,CloseIndex,
  7. CurrentRec,FindPositionCh,BuildIndex,GoTop,GoBottom,
  8. NextRecord,PrevRecord,CurrentKeyCh,FindPositionN,
  9. CurrentKeyN,InitCompIndex,BuildCompIndex,DBIndex;
  10. FROM StrEdit IMPORT CrunchBlanks;
  11. FROM HandleIO IMPORT FileExists;
  12. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  13. FROM DBStuff IMPORT MakeKey;
  14. FROM Drectory IMPORT DeleteFile;
  15. FROM StrConv IMPORT StrToReal;
  16. FROM NumTypes IMPORT Real8;
  17. FROM M2Strings IMPORT Assign;
  18. FROM DBStuff IMPORT MakeKey,MakeDescriptor;
  19. FROM ScanUtils IMPORT Present,CaseSens;
  20. FROM LowLevel IMPORT Fill;
  21. FROM DBFields IMPORT GetDateField,GetLogicalField,GetNumField,Replace,
  22. ReplaceD,ReplaceN;
  23. CONST
  24. Buffer = 0;
  25. Safty = TRUE;
  26. Exclusive = FALSE;
  27. AutoLock = TRUE;
  28. KeepDeleted = FALSE;
  29. VAR
  30. IndexOpen : BOOLEAN;
  31. PROCEDURE MakeDatabase();
  32. VAR
  33. Error : CARDINAL;
  34. Desc : POINTER TO ARRAY [1..200] OF DBFieldDescriptor;
  35. BEGIN
  36. ALLOCATE(Desc, 31 * SIZE(DBFieldDescriptor));
  37. Fill(Desc, 31 * SIZE(DBFieldDescriptor),0);
  38. MakeDescriptor( Desc^[ 1], 'CIN', 10, 0, 'C');
  39. MakeDescriptor( Desc^[ 2], 'NAMEIDX', 40, 0, 'C');
  40. MakeDescriptor( Desc^[ 3], 'NAME', 40, 0, 'C');
  41. MakeDescriptor( Desc^[ 4], 'NOTES1', 40, 0, 'C');
  42. MakeDescriptor( Desc^[ 5], 'NOTES2', 40, 0, 'C');
  43. MakeDescriptor( Desc^[ 6], 'NOTES3', 40, 0, 'C');
  44. MakeDescriptor( Desc^[ 7], 'AMTOUT', 10, 2, 'N');
  45. MakeDescriptor( Desc^[ 8], 'LASTINV', 8, 0, 'D');
  46. MakeDescriptor( Desc^[ 9], 'YTDPURCH', 10, 2, 'N');
  47. MakeDescriptor( Desc^[ 10], 'SALESREP', 10, 0, 'C');
  48. MakeDescriptor( Desc^[ 11], 'CONTACT', 20, 0, 'C');
  49. MakeDescriptor( Desc^[ 12], 'PHONENBR', 18, 0, 'C');
  50. MakeDescriptor( Desc^[ 13], 'FAXNBR', 15, 0, 'C');
  51. MakeDescriptor( Desc^[ 14], 'DATENTER', 8, 0, 'D');
  52. MakeDescriptor( Desc^[ 15], 'SHIPTOA1', 30, 0, 'C');
  53. MakeDescriptor( Desc^[ 16], 'SHIPTOA2', 30, 0, 'C');
  54. MakeDescriptor( Desc^[ 17], 'SHIPTOA3', 30, 0, 'C');
  55. MakeDescriptor( Desc^[ 18], 'SHIPTOZP', 9, 0, 'C');
  56. MakeDescriptor( Desc^[ 19], 'BILLTOA1', 30, 0, 'C');
  57. MakeDescriptor( Desc^[ 20], 'BILLTOA2', 30, 0, 'C');
  58. MakeDescriptor( Desc^[ 21], 'BILLTOA3', 30, 0, 'C');
  59. MakeDescriptor( Desc^[ 22], 'BILLTOZP', 9, 0, 'C');
  60. MakeDescriptor( Desc^[ 23], 'DISCLEVEL', 1, 0, 'N');
  61. MakeDescriptor( Desc^[ 24], 'DISCAMOUNT', 4, 2, 'N');
  62. MakeDescriptor( Desc^[ 25], 'SHIPVIA', 20, 0, 'C');
  63. MakeDescriptor( Desc^[ 26], 'TERMS', 20, 0, 'C');
  64. MakeDescriptor( Desc^[ 27], 'LIMIT', 10, 2, 'N');
  65. MakeDescriptor( Desc^[ 28], 'RESALENBR', 15, 0, 'C');
  66. MakeDescriptor( Desc^[ 29], 'TAXABLE', 1, 0, 'C');
  67. MakeDescriptor( Desc^[ 30], 'FREEFRGHT', 1, 0, 'C');
  68. MakeDescriptor( Desc^[ 31], 'SALEREPCOM', 4, 2, 'N');
  69. InitDBF('Customer.DBF',CustomerDBF,0,FALSE,TRUE,FALSE,DefaultFixUp);
  70. (* It would be a good to test error.*)
  71. Error:=BuildDBF(Desc^, 31,CustomerDBF);
  72. CloseDBF(CustomerDBF);
  73. DEALLOCATE(Desc, 31 * SIZE(DBFieldDescriptor));
  74. END MakeDatabase;
  75. PROCEDURE MoveCustomerToDBF(Rec : CustomerRec );
  76. (* This code will move the data from the record to *)
  77. (* the data base *)
  78. BEGIN
  79. WITH Rec DO
  80. Replace( CustomerDBF, 1,CIN); (* *)
  81. Replace( CustomerDBF, 2,NAMEIDX); (* *)
  82. Replace( CustomerDBF, 3,NAME); (* *)
  83. Replace( CustomerDBF, 4,NOTES1); (* *)
  84. Replace( CustomerDBF, 5,NOTES2); (* *)
  85. Replace( CustomerDBF, 6,NOTES3); (* *)
  86. ReplaceN( CustomerDBF, 7,AMTOUT); (* *)
  87. ReplaceD( CustomerDBF, 8,LASTINV); (* *)
  88. ReplaceN( CustomerDBF, 9,YTDPURCH); (* *)
  89. Replace( CustomerDBF, 10,SALESREP); (* *)
  90. Replace( CustomerDBF, 11,CONTACT); (* *)
  91. Replace( CustomerDBF, 12,PHONENBR); (* *)
  92. Replace( CustomerDBF, 13,FAXNBR); (* *)
  93. ReplaceD( CustomerDBF, 14,DATENTER); (* *)
  94. Replace( CustomerDBF, 15,SHIPTOA1); (* *)
  95. Replace( CustomerDBF, 16,SHIPTOA2); (* *)
  96. Replace( CustomerDBF, 17,SHIPTOA3); (* *)
  97. Replace( CustomerDBF, 18,SHIPTOZP); (* *)
  98. Replace( CustomerDBF, 19,BILLTOA1); (* *)
  99. Replace( CustomerDBF, 20,BILLTOA2); (* *)
  100. Replace( CustomerDBF, 21,BILLTOA3); (* *)
  101. Replace( CustomerDBF, 22,BILLTOZP); (* *)
  102. ReplaceN( CustomerDBF, 23,FLOAT(DISCLEVEL)); (* *)
  103. ReplaceN( CustomerDBF, 24,DISCAMOUNT); (* *)
  104. Replace( CustomerDBF, 25,SHIPVIA); (* *)
  105. Replace( CustomerDBF, 26,TERMS); (* *)
  106. ReplaceN( CustomerDBF, 27,LIMIT); (* *)
  107. Replace( CustomerDBF, 28,RESALENBR); (* *)
  108. Replace( CustomerDBF, 29,TAXABLE); (* *)
  109. Replace( CustomerDBF, 30,FREEFRGHT); (* *)
  110. ReplaceN( CustomerDBF, 31,SALEREPCOM); (* *)
  111. END; (* end of with REC *)
  112. END MoveCustomerToDBF;
  113. PROCEDURE MoveCustomerFromDBF(VAR Rec : CustomerRec );
  114. (* This code will move the data from the Database to *)
  115. (* the record *)
  116. VAR B : BOOLEAN;
  117. R : Real8;
  118. BEGIN
  119. WITH Rec DO
  120. GetField( CustomerDBF, 1,CIN); (* *)
  121. GetField( CustomerDBF, 2,NAMEIDX); (* *)
  122. GetField( CustomerDBF, 3,NAME); (* *)
  123. GetField( CustomerDBF, 4,NOTES1); (* *)
  124. GetField( CustomerDBF, 5,NOTES2); (* *)
  125. GetField( CustomerDBF, 6,NOTES3); (* *)
  126. GetNumField( CustomerDBF, 7,AMTOUT); (* *)
  127. GetDateField( CustomerDBF, 8,LASTINV); (* *)
  128. GetNumField( CustomerDBF, 9,YTDPURCH); (* *)
  129. GetField( CustomerDBF, 10,SALESREP); (* *)
  130. GetField( CustomerDBF, 11,CONTACT); (* *)
  131. GetField( CustomerDBF, 12,PHONENBR); (* *)
  132. GetField( CustomerDBF, 13,FAXNBR); (* *)
  133. GetDateField( CustomerDBF, 14,DATENTER); (* *)
  134. GetField( CustomerDBF, 15,SHIPTOA1); (* *)
  135. GetField( CustomerDBF, 16,SHIPTOA2); (* *)
  136. GetField( CustomerDBF, 17,SHIPTOA3); (* *)
  137. GetField( CustomerDBF, 18,SHIPTOZP); (* *)
  138. GetField( CustomerDBF, 19,BILLTOA1); (* *)
  139. GetField( CustomerDBF, 20,BILLTOA2); (* *)
  140. GetField( CustomerDBF, 21,BILLTOA3); (* *)
  141. GetField( CustomerDBF, 22,BILLTOZP); (* *)
  142. GetNumField( CustomerDBF, 23,R);
  143. DISCLEVEL:= TRUNC(R); (* *)
  144. GetNumField( CustomerDBF, 24,DISCAMOUNT); (* *)
  145. GetField( CustomerDBF, 25,SHIPVIA); (* *)
  146. GetField( CustomerDBF, 26,TERMS); (* *)
  147. GetNumField( CustomerDBF, 27,LIMIT); (* *)
  148. GetField( CustomerDBF, 28,RESALENBR); (* *)
  149. GetField( CustomerDBF, 29,TAXABLE); (* *)
  150. GetField( CustomerDBF, 30,FREEFRGHT); (* *)
  151. GetNumField( CustomerDBF, 31,SALEREPCOM); (* *)
  152. END; (* end of with REC^ *)
  153. END MoveCustomerFromDBF;
  154. PROCEDURE OpenCustomerDBF(WithIdx : BOOLEAN);
  155. VAR ER : CARDINAL;
  156. BEGIN
  157. IndexOpen := WithIdx;
  158. (* Open the DBF file *)
  159. IF NOT FileExists("Customer.DBF")
  160. THEN MakeDatabase();
  161. END;
  162. InitDBF("Customer.DBF", CustomerDBF,Buffer,Safty,Exclusive,
  163. AutoLock,DefaultFixUp );
  164. IF NOT OpenDBF( CustomerDBF)
  165. THEN END;
  166. (* open all indexes and append to dbfile *)
  167. IF WithIdx THEN
  168. InitIndex( "Name.NDX",NameIdx,CustomerDBF,Buffer, Safty,
  169. KeepDeleted,Exclusive);
  170. IF NOT OpenIndex( NameIdx )
  171. THEN
  172. ER := BuildIndex(NameIdx,'Name'); (* check key lenght *)
  173. END;
  174. AddToUpdateList( CustomerDBF, NameIdx );
  175. ActCustomerIdx := NameIdx; (* make current index *)
  176. GoTop(ActCustomerIdx);
  177. END; (* end with indext *)
  178. END OpenCustomerDBF;
  179. PROCEDURE CloseCustomerDBF (); (* close Data and index files *)
  180. BEGIN
  181. CloseDBF(CustomerDBF); (* close dbf file *)
  182. IF IndexOpen
  183. THEN
  184. CloseIndex(NameIdx ); (* close index file *)
  185. END; (* end index open*)
  186. END CloseCustomerDBF;
  187. PROCEDURE FindCustomerByName( Key : ARRAY OF CHAR) : BOOLEAN;
  188. VAR Found : BOOLEAN;
  189. CKey : ARRAY[0..80] OF CHAR;
  190. BEGIN
  191. ActCustomerIdx := NameIdx ; (* make this index the active idx*)
  192. FindPositionCh( NameIdx, Key, Found);
  193. CurrentKeyCh(NameIdx,CKey);
  194. Found := Present(Key,CKey,CaseSens);
  195. IF Found
  196. THEN ReadDBRec( CustomerDBF, CurrentRec( NameIdx));
  197. END;
  198. RETURN Found;
  199. END FindCustomerByName;
  200. PROCEDURE NextCustomer () : BOOLEAN;
  201. VAR
  202. L : LONGINT; (* record number *)
  203. BEGIN
  204. IF NextRecord( ActCustomerIdx,L)
  205. THEN ReadDBRec( CustomerDBF,L );
  206. RETURN TRUE;
  207. ELSE RETURN FALSE;
  208. END;
  209. END NextCustomer;
  210. PROCEDURE PrevCustomer () : BOOLEAN;
  211. VAR
  212. L : LONGINT; (* record number *)
  213. BEGIN
  214. IF PrevRecord( ActCustomerIdx,L)
  215. THEN ReadDBRec( CustomerDBF,L );
  216. RETURN TRUE;
  217. ELSE RETURN FALSE;
  218. END;
  219. END PrevCustomer;
  220. PROCEDURE FirstCustomer ();
  221. VAR
  222. L : LONGINT; (* record number *)
  223. BEGIN
  224. GoTop(ActCustomerIdx);
  225. ReadDBRec( CustomerDBF,CurrentRec( ActCustomerIdx));
  226. END FirstCustomer;
  227. PROCEDURE LastCustomer ();
  228. VAR
  229. L : LONGINT; (* record number *)
  230. BEGIN
  231. GoBottom(ActCustomerIdx);
  232. ReadDBRec( CustomerDBF,CurrentRec( ActCustomerIdx));
  233. END LastCustomer;
  234. PROCEDURE PackCustomer();
  235. VAR
  236. EM : CARDINAL;
  237. LI : LONGINT;
  238. Tmp : CustomerRec;
  239. BEGIN
  240. CloseCustomerDBF();
  241. OpenCustomerDBF(FALSE); (* open with no index *)
  242. DBPack(CustomerDBF);
  243. CloseCustomerDBF();
  244. EM := DeleteFile('Name');
  245. OpenCustomerDBF(TRUE); (* open to rebuild the indexes*)
  246. CloseCustomerDBF();
  247. END PackCustomer;
  248. (* initialization code *)
  249. BEGIN
  250. NilDBF(CustomerDBF);
  251. IndexOpen := FALSE;
  252. END DBFCustomer.