testjsondataset.pp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. program devds;
  2. {$DEFINE TESTCALCFIELDS}
  3. {$DEFINE TESTLOOKUPFIELDS}
  4. uses variants, varutils, sysutils, db, fpjson , fpjsondataset, ExtJSDataset, types;
  5. Type
  6. { TApp }
  7. TApp = Class(TObject)
  8. private
  9. DS : TExtJSJSONObjectDataSet;
  10. DC : TExtJSJSONObjectDataSet;
  11. Procedure DumpRecord(aDS : TDataset);
  12. Procedure DumpRecords(aDS : TDataset);
  13. procedure CreateDataset;
  14. procedure DoCalcFields(DataSet: TDataSet);
  15. procedure TestAppend;
  16. procedure TestBookMark;
  17. procedure TestDataLinkActiveRecord;
  18. procedure TestDataLinkEdit;
  19. procedure TestEdit;
  20. procedure TestInsert;
  21. procedure TestLocate;
  22. procedure TestLookup;
  23. procedure TestNavigation;
  24. Public
  25. Procedure Run;
  26. end;
  27. Procedure TApp.DumpRecord(aDS : TDataset);
  28. begin
  29. Writeln(
  30. {$IFDEF TESTCALCFIELDS}
  31. 'Full name: ',aDS.FieldByName('fullname').AsString,
  32. {$ENDIF}
  33. 'First name: ',aDS.FieldByName('firstname').AsString,
  34. ', Last name:', aDS.FieldByName('lastname').AsString,
  35. ', Children:', aDS.FieldByName('children').AsInteger,
  36. ', Birthday:', aDS.FieldByName('birthday').AsString,
  37. ', Weight:', aDS.FieldByName('weight').AsFloat,
  38. ', Business:', aDS.FieldByName('business').AsBoolean,
  39. ', Country:', aDS.FieldByName('Country').AsString
  40. {$IFDEF TESTLOOKUPFIELDS}
  41. ,', CountryName:', aDS.FieldByName('CountryName').AsString
  42. {$ENDIF}
  43. );
  44. end;
  45. Procedure TApp.DumpRecords(aDS : TDataset);
  46. begin
  47. While not aDS.EOF do
  48. begin
  49. DumpRecord(aDS);
  50. aDS.Next;
  51. end;
  52. end;
  53. Procedure TApp.CreateDataset;
  54. {$IFDEF TESTCALCFIELDS}
  55. Var
  56. F : TField;
  57. {$ENDIF}
  58. begin
  59. Writeln('Creating dataset');
  60. DS:=TExtJSJSONObjectDataSet.Create(Nil);
  61. DS.MetaData:=GetJSON('{ "fields" : [ '+
  62. ' { "name": "firstname"}, '+
  63. ' { "name": "lastname"}, '+
  64. ' { "name" : "children", "type": "int" }, '+
  65. ' { "name" : "birthday", "type": "date", "dateFormat": "yyyy\"-\"mm\"-\"dd" }, '+
  66. ' { "name" : "country", "type": "string", "maxLen" : 2 }, '+
  67. ' { "name" : "business", "type": "boolean" }, '+
  68. ' { "name" : "weight", "type": "float" } '+
  69. ']}') as TJSONObject;
  70. DS.Rows:=GetJSON('[{"firstname" : "Michael", "lastname" : "Van Canneyt", "children" : 2, "birthday": "1970-07-07", "business" : false, "weight": 75.5, "country": "BE" },'+
  71. ' {"firstname" : "Mattias", "lastname" : "Gaertner", "children" : 0, "birthday" : "1970-07-08", "business" : false, "weight": 76.2, "country": "DE" }, '+
  72. ' {"firstname" : "Bruno", "lastname" : "Fierens", "children" : 3, "birthday" : "1970-07-09", "business" : true, "weight": 77.3, "country": "BE" },'+
  73. ' {"firstname" : "Detlef", "lastname" : "Overbeek", "children" : 2, "birthday" : "1950-07-08", "business" : true, "weight": 78.8, "country": "NL" }'+
  74. ' ]') as TJSONArray;
  75. DC:=TExtJSJSONObjectDataSet.Create(Nil);
  76. DC.MetaData:=GetJSON('{ "fields" : [ '+
  77. ' { "name": "code"}, '+
  78. ' { "name": "name"} '+
  79. ']} ') as TJSONObject;
  80. DC.Rows:=GetJSON('[{"code" : "BE", "name" : "Belgium" }, '+
  81. ' {"code" : "DE", "name" : "Germany" }, '+
  82. ' {"code" : "NL", "name" : "Netherlands" }, '+
  83. ' {"code" : "FR", "name" : "France" }, '+
  84. ' {"code" : "UK", "name" : "United Kingdom" } '+
  85. ' ]') as TJSONArray;
  86. {$IFDEF TESTCALCFIELDS}
  87. F:=TStringField.Create(DS);
  88. F.FieldKind:=fkCalculated;
  89. F.Size:=200;
  90. F.FieldName:='FullName';
  91. F.Dataset:=DS;
  92. F:=TStringField.Create(DS);
  93. F.FieldKind:=fkData;
  94. F.Size:=200;
  95. F.FieldName:='firstname';
  96. F.Dataset:=DS;
  97. F:=TStringField.Create(DS);
  98. F.FieldKind:=fkData;
  99. F.Size:=200;
  100. F.FieldName:='lastname';
  101. F.Dataset:=DS;
  102. F:=TIntegerField.Create(DS);
  103. F.FieldKind:=fkData;
  104. F.FieldName:='children';
  105. F.Dataset:=DS;
  106. F:=TDateField.Create(DS);
  107. F.FieldKind:=fkData;
  108. F.FieldName:='birthday';
  109. F.Dataset:=DS;
  110. F:=TBooleanField.Create(DS);
  111. F.FieldKind:=fkData;
  112. F.FieldName:='business';
  113. F.Dataset:=DS;
  114. F:=TFloatField.Create(DS);
  115. F.FieldKind:=fkData;
  116. F.FieldName:='weight';
  117. F.Dataset:=DS;
  118. F:=TStringField.Create(DS);
  119. F.FieldKind:=fkData;
  120. F.Size:=2;
  121. F.FieldName:='country';
  122. F.Dataset:=DS;
  123. {$IFDEF TESTLOOKUPFIELDS}
  124. F:=TStringField.Create(DS);
  125. F.FieldKind:=fkLookup;
  126. F.LookupDataSet:=DC;
  127. F.KeyFields:='country';
  128. F.LookupKeyFields:='code';
  129. F.LookupResultField:='name';
  130. F.FieldName:='CountryName';
  131. F.Dataset:=DS;
  132. {$ENDIF}
  133. DS.OnCalcFields:=@DoCalcFields;
  134. {$ENDIF}
  135. end;
  136. Procedure TApp.TestNavigation;
  137. begin
  138. Writeln('All records');
  139. DumpRecords(DS);
  140. Writeln('First record (expect Michael.)');
  141. DS.First;
  142. DumpRecord(DS);
  143. Writeln('Jump to last (expect detlef)');
  144. DS.Last;
  145. DumpRecord(DS);
  146. Writeln('Reverse order:');
  147. While not DS.BOF do
  148. begin
  149. DumpRecord(DS);
  150. DS.Prior;
  151. end;
  152. end;
  153. Procedure TApp.TestAppend;
  154. begin
  155. DS.Append;
  156. Writeln('Dumping record after APPEND (expect empty)');
  157. Writeln('Modified before (expect False): ',DS.Modified);
  158. DumpRecord(DS);
  159. DS.FieldByName('firstname').AsString:='Florian';
  160. Writeln('Old value of field first name (expect null): ', DS.FieldByName('firstname').OldValue);
  161. DS.FieldByName('lastname').AsString:='Klaempfl';
  162. DS.FieldByName('children').AsInteger:=1;
  163. DS.FieldByName('birthday').AsDateTime:=EncodeDate(1980,5,4);
  164. Writeln('Modified after (expect true): ',DS.Modified);
  165. Writeln('Dumping record before POST (Expect Florian)');
  166. DumpRecord(DS);
  167. DS.Post;
  168. Writeln('Dumping record after POST (Expect Florian)');
  169. DumpRecord(DS);
  170. Writeln('Jump to first (expect Michael)');
  171. DS.First;
  172. DumpRecord(DS);
  173. end;
  174. Procedure TApp.TestEdit;
  175. begin
  176. DS.Edit;
  177. Writeln('Dumping record after EDIT');
  178. Writeln('Modified before (expect False): ',DS.Modified);
  179. DumpRecord(DS);
  180. DS.FieldByName('firstname').AsString:='Dolores';
  181. DS.FieldByName('lastname').AsString:='Nabokov';
  182. DS.FieldByName('children').AsInteger:=0;
  183. DS.FieldByName('birthday').AsDateTime:=EncodeDate(1943,2,14);
  184. Writeln('Modified after (expect true): ',DS.Modified);
  185. Writeln('Dumping record before POST (expect Dolores)');
  186. DumpRecord(DS);
  187. DS.Post;
  188. Writeln('Dumping record after POST (expect Dolores)');
  189. DumpRecord(DS);
  190. DS.Edit;
  191. Writeln('Dumping record after second EDIT (Expect Dolores)');
  192. DumpRecord(DS);
  193. Writeln('Modified before (expect False): ',DS.Modified);
  194. DS.FieldByName('firstname').AsString:='Felicity';
  195. Writeln('Old value of field first name (expect Dolores): ', DS.FieldByName('firstname').OldValue);
  196. DS.FieldByName('lastname').AsString:='Brown';
  197. DS.FieldByName('children').AsInteger:=0;
  198. DS.FieldByName('birthday').AsDateTime:=EncodeDate(1943,2,14);
  199. Writeln('Modified after (expect true): ',DS.Modified);
  200. Writeln('Dumping record before Cancel (expect Filicity brown)');
  201. DumpRecord(DS);
  202. DS.Cancel;
  203. Writeln('Dumping record after Cancel (expect Dolores)');
  204. DumpRecord(DS);
  205. Writeln('Jump to first and dumping all records (expect Dolores first)');
  206. DS.First;
  207. DumpRecords(DS);
  208. end;
  209. Procedure TApp.TestBookMark;
  210. var
  211. B : TBookmark;
  212. begin
  213. Writeln('Jump to first (expect Dolores)');
  214. DS.First;
  215. DumpRecord(DS);
  216. DS.Next;
  217. DS.Next;
  218. DS.Next;
  219. Writeln('Getting Bookmark (expect Detlef)');
  220. DumpRecord(DS);
  221. B:=DS.BookMark;
  222. DS.First;
  223. Writeln('Delete (expect Mattias)');
  224. DS.Delete;
  225. DumpRecord(DS);
  226. Writeln('Setting Bookmark (expect Detlef)');
  227. DS.BookMark:=B;
  228. DumpRecord(DS);
  229. end;
  230. Procedure TApp.TestInsert;
  231. begin
  232. Writeln('Jump to second (expect Bruno)');
  233. DS.First;
  234. DS.Next;
  235. DumpRecord(DS);
  236. DS.Insert;
  237. Writeln('Dumping record after second Insert (Expect empty)');
  238. Writeln('Modified (expect False): ',DS.Modified);
  239. DumpRecord(DS);
  240. DS.FieldByName('firstname').AsString:='Felicity';
  241. DS.FieldByName('lastname').AsString:='Brown';
  242. DS.FieldByName('children').AsInteger:=0;
  243. DS.FieldByName('birthday').AsDateTime:=EncodeDate(1963,4,6);
  244. Writeln('Modified (expect true): ',DS.Modified);
  245. Writeln('Dumping record before POST (expect Filicity)');
  246. DumpRecord(DS);
  247. DS.Post;
  248. Writeln('Dumping record after POST (expect Felicity)');
  249. DumpRecord(DS);
  250. Writeln('Jump to first and dumping all records (expect Mattias first, then Felicity)');
  251. DS.First;
  252. DumpRecords(DS);
  253. end;
  254. Procedure TApp.TestDataLinkEdit;
  255. var
  256. t: TDataLink;
  257. DSS : TDatasource;
  258. begin
  259. Writeln('Jump to first before edit');
  260. DS.First;
  261. DSS:=Nil;
  262. t:=TDataLink.Create;
  263. try
  264. DSS:=TDatasource.Create(Nil);
  265. DSS.DataSet:=DS;
  266. Writeln('Buffercount');
  267. t.BufferCount := 10;
  268. t.DataSource := DSS;
  269. Writeln('Doing edit');
  270. t.Edit;
  271. Writeln('Modified (expect false): ',DS.Modified);
  272. Writeln('Done edit');
  273. t.ActiveRecord := 0;
  274. Writeln('Edit, expect Mattias');
  275. DumpRecord(DS);
  276. Writeln('Activerecord 1: expect Felicity');
  277. t.ActiveRecord := 1;
  278. DumpRecord(DS);
  279. Writeln('Activerecord 2: expect Bruno');
  280. t.ActiveRecord := 2;
  281. DumpRecord(DS);
  282. t.ActiveRecord := 0;
  283. Finally
  284. t.Free;
  285. dss.free;
  286. end;
  287. end;
  288. Procedure TApp.TestDataLinkActiveRecord;
  289. var
  290. t: TDataLink;
  291. DSS : TDatasource;
  292. begin
  293. DSS:=Nil;
  294. t:=TDataLink.Create;
  295. try
  296. DSS.DataSet:=DS;
  297. DSS.DataSet:=DS;
  298. t.DataSource := DSS;
  299. DS.Last;
  300. Writeln('Last record :',DS.RecNo);
  301. Writeln('Activerecord :',T.ActiveRecord);
  302. DumpRecord(DS);
  303. DS.First;
  304. t.BufferCount := 3;
  305. DS.Last;
  306. Writeln('Last record after buffercount lessened:',DS.RecNo);
  307. Writeln('Activerecord :',T.ActiveRecord);
  308. DumpRecord(DS);
  309. t.ActiveRecord := 0;
  310. Finally
  311. t.Free;
  312. dss.Free;
  313. end;
  314. end;
  315. Procedure TApp.TestLocate;
  316. Var
  317. V : Variant;
  318. begin
  319. DS.First;
  320. Writeln('Locating 3 children (expect true, Bruno): ',DS.Locate('Children',3,[]));
  321. DumpRecord(DS);
  322. DS.First;
  323. v:=VarArrayCreate([0,0],varVariant);
  324. V[0]:=3;
  325. Writeln('Locating 3 children using array (expect true, Bruno): ',DS.Locate('Children',V,[]));
  326. DumpRecord(DS);
  327. DS.First;
  328. Writeln('Locating 4 children (expect false): ',DS.Locate('Children',4,[]));
  329. DS.First;
  330. Writeln('Locating first name Detlef (expect true): ',DS.Locate('Firstname','Detlef',[]));
  331. DumpRecord(DS);
  332. DS.First;
  333. Writeln('Locating first name detlef (expect false): ',DS.Locate('Firstname','detlef',[]));
  334. DS.First;
  335. Writeln('Locating first name detlef (loCaseInsensitive, expect true): ',DS.Locate('Firstname','detlef',[loCaseInsensitive]));
  336. DumpRecord(DS);
  337. DS.First;
  338. Writeln('Locating first name Det (expect false): ',DS.Locate('Firstname','Det',[]));
  339. DS.First;
  340. Writeln('Locating first name Det (loPartialKey,expect true): ',DS.Locate('Firstname','Det',[loPartialKey]));
  341. DumpRecord(DS);
  342. DS.First;
  343. Writeln('Locating first name det (loPartialKey, expect false): ',DS.Locate('Firstname','det',[loPartialKey]));
  344. DS.First;
  345. Writeln('Locating first name det (loCaseInsensitive,loPartialKey, expect true): ',DS.Locate('Firstname','det',[loCaseInsensitive,loPartialKey]));
  346. DumpRecord(DS);
  347. v:=VarArrayCreate([0,1],varVariant);
  348. V[0]:=3;
  349. V[1]:='Detlef';
  350. DS.First;
  351. Writeln('Locating first name Detlef & children 3 ( expect false): ',DS.Locate('Children;Firstname',v,[]));
  352. V[0]:=2;
  353. V[1]:='Detlef';
  354. DS.First;
  355. Writeln('Locating first name Detlef & children 2 ( expect true): ',DS.Locate('Children;Firstname',v,[]));
  356. DS.First;
  357. Writeln('Locating birthday (expect true, Bruno): ',DS.Locate('BirthDay',EncodeDate(1970,07,09),[]));
  358. DS.First;
  359. Writeln('Locating business (expect true, Bruno): ',DS.Locate('business',true,[]));
  360. DumpRecord(DS);
  361. DS.First;
  362. Writeln('Deleting first');
  363. DS.Delete;
  364. Writeln('Locating weight (expect true, bruno): ',DS.Locate('weight',77.3,[]));
  365. DumpRecord(DS);
  366. end;
  367. procedure TApp.TestLookup;
  368. begin
  369. DS.First;
  370. Writeln('Locating weight (expect true, detlef overbeek): ',DS.Lookup('weight',78.8,'fullname'));
  371. Writeln('Still on Michael:');
  372. DumpRecord(DS);
  373. DS.First;
  374. Writeln('Locating birthday (expect true, Bruno): ',DS.Lookup('BirthDay',EncodeDate(1970,07,09),'firstname'));
  375. Writeln('Still on Michael:');
  376. DumpRecord(DS);
  377. end;
  378. Procedure TApp.Run;
  379. begin
  380. try
  381. CreateDataset;
  382. Writeln('Opening dataset');
  383. DC.Open;
  384. DS.Open;
  385. // TestLocate;
  386. TestLookup;
  387. exit;
  388. TestNavigation;
  389. TestAppend;
  390. TestEdit;
  391. TestBookmark;
  392. TestInsert;
  393. TestDataLinkEdit;
  394. TestDataLinkActiveRecord;
  395. except
  396. On E : Exception do
  397. Writeln('!! Caught Exception ',E.ClassName,' : ',E.Message);
  398. end;
  399. end;
  400. procedure TApp.DoCalcFields(DataSet: TDataSet);
  401. begin
  402. // Writeln('In callback');
  403. Dataset.FieldByName('FullName').AsString:= Dataset.FieldByName('firstName').AsString+' '+Dataset.FieldByName('lastname').AsString;
  404. end;
  405. begin
  406. With Tapp.Create do
  407. Run;
  408. end.