DBSTUFF.MOD 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. IMPLEMENTATION MODULE DBStuff;
  2. (*
  3. * ModBase
  4. * Release 3.0
  5. * (c) Copyright 1986 - 1991 PMI
  6. Copyright 1988 - 1991 John McMonagle
  7. * P.O. Box 8402
  8. * Green Bay Wi 53308
  9. * All Rights Reserved
  10. * by Ed Ross
  11. *)
  12. FROM DBIndxes IMPORT DBIndex,GoTop,FindPositionCh,
  13. CurrentRec,CurrentKeyCh,NextRecord;
  14. FROM ModBase3 IMPORT DBFile,ReadDBRec,DeleteRecord,DBFieldDescriptor;
  15. FROM StrConv IMPORT CardinalToStr;
  16. FROM ScrnTypes IMPORT DisplayFrame;
  17. FROM ControlUtils IMPORT ReadInput,ChangeField;
  18. FROM DateFunctions IMPORT Date,DateToStr,StrToDate;
  19. FROM GenLists IMPORT GenList,DisposeList,ListInsert,NewList,
  20. GetElmt,ListInsertAdr,ListLength,Initialized;
  21. FROM StrEdit IMPORT CrunchBlanks,SetLength,Append,
  22. CAPstr,DeleteChar;
  23. FROM Str IMPORT Length,Compare,Copy;
  24. FROM PosUtils IMPORT Pos,Present;
  25. FROM LowLevel IMPORT Fill;
  26. FROM SYSTEM IMPORT ADR,SIZE,ADDRESS;
  27. FROM HandleIO IMPORT FileExists,OpenFile,SetFilePtr,CreateFile,BlockWrite,
  28. CloseHandle,BlockRead,FromStart;
  29. FROM StringIO IMPORT ErrorMessage;
  30. VAR
  31. CharSet : SET OF CHAR;
  32. J : CHAR;
  33. PROCEDURE MakeDescriptor(VAR Desc : DBFieldDescriptor;
  34. Name : ARRAY OF CHAR; Size : CARDINAL;
  35. Dec : CARDINAL;Type : CHAR);
  36. BEGIN
  37. Fill(ADR(Desc),SIZE(Desc),0);
  38. Copy(Desc.name , Name);
  39. Desc.size := Size;
  40. Desc.decplaces := Dec;
  41. Copy(Desc.fldtype , Type);
  42. END MakeDescriptor;
  43. PROCEDURE MakeSeqNbr(SeqFile, (* file name where seq kept -no extention *)
  44. Prefix : ARRAY OF CHAR; (*key prefix "91-','C'*)
  45. VAR Key : ARRAY OF CHAR); (* returned key *)
  46. VAR
  47. H : CARDINAL;
  48. Str : ARRAY [0..8] OF CHAR;
  49. Seq : CARDINAL;
  50. FileName : ARRAY[0..15] OF CHAR;
  51. EM : ErrorMessage;
  52. J : CARDINAL;
  53. BEGIN
  54. Copy(FileName , SeqFile);
  55. CrunchBlanks(FileName);
  56. IF Pos(FileName,'.') < HIGH(FileName)+1
  57. THEN SetLength(FileName,Pos(FileName,'.'));
  58. END;
  59. Append(FileName,'Seq');
  60. IF FileExists(FileName)
  61. THEN
  62. EM := OpenFile(H,FileName);
  63. EM := BlockRead(H,ADR(Seq),SIZE(Seq));
  64. SetFilePtr(H,FromStart,0);
  65. ELSE
  66. EM := CreateFile(H,FileName); (* initialize seq number *)
  67. Seq := 999;
  68. END;
  69. INC(Seq);
  70. EM := BlockWrite(H,ADR(Seq),SIZE(Seq)); (* update the file *)
  71. EM := CloseHandle(H);
  72. CardinalToStr(Seq,5,Str);
  73. Copy(Key , Prefix);
  74. FOR J := 0 TO Length(Str) DO
  75. IF Str[J] = ' '
  76. THEN Str[J] := '0';
  77. END;
  78. END;
  79. Append(Key,Str);
  80. MakeKey(Key);
  81. END MakeSeqNbr;
  82. PROCEDURE MakeKey(VAR Key : ARRAY OF CHAR);
  83. VAR J : CARDINAL;
  84. L : CARDINAL;
  85. BEGIN
  86. CAPstr(Key);
  87. L := Length(Key);
  88. IF L > 0
  89. THEN
  90. DEC(L);
  91. END;
  92. FOR J := 0 TO L DO
  93. IF NOT (Key[J] IN CharSet)
  94. THEN Key[J] := ' ';
  95. END;
  96. END;
  97. DeleteChar(' ',Key);
  98. END MakeKey;
  99. PROCEDURE ReadDateField( DF : DisplayFrame; VAR D : Date;
  100. FldName : ARRAY OF CHAR);
  101. VAR
  102. S : ARRAY [0..15] OF CHAR;
  103. Ok : BOOLEAN;
  104. BEGIN
  105. ReadInput(DF,S,FldName);
  106. StrToDate(S,D,Ok);
  107. END ReadDateField;
  108. PROCEDURE ChangeDateField(VAR DF : DisplayFrame; D : Date;
  109. FldName : ARRAY OF CHAR);
  110. VAR
  111. S : ARRAY[0..15] OF CHAR;
  112. B : BOOLEAN;
  113. BEGIN
  114. DateToStr(D,S,B);
  115. ChangeField(DF,S,FldName,TRUE);
  116. END ChangeDateField;
  117. PROCEDURE ReadAllRecs(VAR DBF : DBFile; ReadProc :ReadRec; VAR TheList : GenList);
  118. VAR
  119. TmpList : GenList;
  120. LI : LONGINT;
  121. J : CARDINAL;
  122. Code : CARDINAL;
  123. RecAddr : ADDRESS;
  124. Size : CARDINAL;
  125. BEGIN
  126. NewList(TmpList);
  127. FOR J := 1 TO ListLength(TheList) DO
  128. GetElmt(TheList,J,LI,Code);
  129. ReadDBRec(DBF,LI);
  130. ReadProc(RecAddr,Size);
  131. ListInsertAdr(RecAddr,Size,1,TmpList,J)
  132. END;
  133. DisposeList(TheList);
  134. TheList := TmpList;
  135. END ReadAllRecs;
  136. PROCEDURE DeleteAllRecs(VAR DBF : DBFile; TheList : GenList);
  137. VAR
  138. LI : LONGINT;
  139. J : CARDINAL;
  140. Code : CARDINAL;
  141. BEGIN
  142. FOR J := 1 TO ListLength(TheList) DO
  143. GetElmt(TheList,J,LI,Code);
  144. ReadDBRec(DBF,LI); (* position data file *)
  145. DeleteRecord(DBF);
  146. END;
  147. END DeleteAllRecs;
  148. PROCEDURE FindAll(Idx : DBIndex; KeyExp : ARRAY OF CHAR;
  149. Condition : ConditionType;
  150. VAR TheList : GenList );
  151. VAR
  152. B : BOOLEAN;
  153. Str : ARRAY[0..80] OF CHAR;
  154. Cond : INTEGER;
  155. CRec : LONGINT;
  156. BEGIN
  157. IF Initialized(TheList)
  158. THEN
  159. DisposeList(TheList);
  160. END;
  161. NewList(TheList);
  162. CASE Condition OF
  163. LT,LE : GoTop(Idx);
  164. B := TRUE;
  165. |EQ,BeginsWith,GE : FindPositionCh(Idx,KeyExp,B);
  166. END; (* end case of *)
  167. IF Condition = BeginsWith
  168. THEN
  169. CurrentKeyCh(Idx,Str); (* get the current key *)
  170. B := (Pos(KeyExp,Str) = 0)
  171. END;
  172. IF NOT B
  173. THEN RETURN;
  174. END;
  175. LOOP
  176. CurrentKeyCh(Idx,Str); (* get the current key *)
  177. Cond := Compare(KeyExp,Str); (* do it here so I do it only once*)
  178. CASE Condition OF
  179. LT : IF Cond = 1
  180. THEN
  181. EXIT; (* done with this loop *)
  182. END;
  183. |LE : IF Cond < 1
  184. THEN
  185. ListInsert(CurrentRec(Idx),1,TheList,1); (* put in front of the list*)
  186. END;
  187. |EQ : IF Cond = 0
  188. THEN
  189. ListInsert(CurrentRec(Idx),1,TheList,1); (* put in front of the list*)
  190. ELSE
  191. EXIT;
  192. END;
  193. |GE : IF Cond >= 0
  194. THEN
  195. ListInsert(CurrentRec(Idx),1,TheList,1); (* put in front of the list*)
  196. END;
  197. |BeginsWith :
  198. IF Pos(KeyExp,Str) = 0
  199. THEN
  200. ListInsert(CurrentRec(Idx),1,TheList,1); (* put in front of the list*)
  201. ELSE
  202. EXIT;
  203. END;
  204. |Contains : IF Present(KeyExp,Str)
  205. THEN
  206. ListInsert(CurrentRec(Idx),1,TheList,1);
  207. END;
  208. END; (* end of case condition of *)
  209. CRec := CurrentRec(Idx);
  210. IF NOT NextRecord(Idx, CRec)
  211. THEN
  212. EXIT;
  213. END;
  214. END; (* end of loop *)
  215. END FindAll;
  216. BEGIN
  217. CharSet := CharSet / CharSet;
  218. FOR J := 'A' TO 'Z' DO
  219. INCL ( CharSet,J);
  220. END;
  221. FOR J := '0' TO '9' DO
  222. INCL(CharSet,J);
  223. END;
  224. INCL(CharSet,'-');
  225. INCL(CharSet,'&');
  226. INCL(CharSet,'!');
  227. INCL(CharSet,'?');
  228. END DBStuff.
  229.