DeclareData.ecl 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. //
  2. // Example code - use without restriction.
  3. //
  4. IMPORT Std;
  5. EXPORT DeclareData := MODULE
  6. EXPORT LZ_IP := '10.173.9.4'; //This MUST be changed to the Landing Zone IP for your configuration
  7. EXPORT LZ_Dir := 'ProgGuide/';
  8. EXPORT Layout_Person := RECORD
  9. UNSIGNED3 PersonID;
  10. QSTRING15 FirstName;
  11. QSTRING25 LastName;
  12. STRING1 MiddleInitial;
  13. STRING1 Gender;
  14. QSTRING42 Street;
  15. QSTRING20 City;
  16. STRING2 State;
  17. QSTRING5 Zip;
  18. END;
  19. EXPORT Layout_Accounts := RECORD
  20. QSTRING20 Account;
  21. QSTRING8 OpenDate;
  22. STRING2 IndustryCode;
  23. STRING1 AcctType;
  24. STRING1 AcctRate;
  25. UNSIGNED1 Code1;
  26. UNSIGNED1 Code2;
  27. UNSIGNED4 HighCredit;
  28. UNSIGNED4 Balance;
  29. END;
  30. EXPORT Layout_Accounts_Link := RECORD
  31. UNSIGNED3 PersonID;
  32. Layout_Accounts;
  33. END;
  34. SHARED Layout_Combined := RECORD
  35. Layout_Person;
  36. DATASET(Layout_Accounts) Accounts;
  37. END;
  38. EXPORT Person := MODULE
  39. EXPORT File := DATASET('~PROGGUIDE::EXAMPLEDATA::People',
  40. Layout_Person, THOR);
  41. EXPORT FilePlus := DATASET('~PROGGUIDE::EXAMPLEDATA::People',
  42. {Layout_Person,UNSIGNED8 RecPos{virtual(fileposition)}}, THOR);
  43. END;
  44. EXPORT Accounts := DATASET('~PROGGUIDE::EXAMPLEDATA::Accounts',
  45. {Layout_Accounts_Link,UNSIGNED8 RecPos{virtual(fileposition)}}, THOR);
  46. EXPORT PersonAccounts := DATASET('~PROGGUIDE::EXAMPLEDATA::PeopleAccts',
  47. {Layout_Combined,UNSIGNED8 RecPos{virtual(fileposition)}},THOR);
  48. EXPORT IDX_Person_PersonID := INDEX(Person.FilePlus,{PersonID,RecPos},'~PROGGUIDE::EXAMPLEDATA::KEYS::People.PersonID');
  49. EXPORT IDX_Accounts_PersonID := INDEX(Accounts,{PersonID,RecPos},'~PROGGUIDE::EXAMPLEDATA::KEYS::Accounts.PersonID');
  50. EXPORT IDX_Accounts_PersonID_Payload := INDEX(Accounts,{PersonID},{Account,OpenDate,IndustryCode,AcctType,AcctRate,Code1,Code2,HighCredit,Balance,RecPos},'~PROGGUIDE::EXAMPLEDATA::KEYS::Accounts.PersonID.Payload');
  51. EXPORT IDX_PersonAccounts_PersonID := INDEX(PersonAccounts,{PersonID,RecPos},'~PROGGUIDE::EXAMPLEDATA::KEYS::PeopleAccts.PersonID');
  52. EXPORT IDX__Person_LastName_FirstName := INDEX(Person.FilePlus,{LastName,FirstName,RecPos},'~PROGGUIDE::EXAMPLEDATA::KEYS::People.LastName.FirstName');
  53. EXPORT IDX__Person_PersonID_Payload := INDEX(Person.FilePlus,{PersonID},{FirstName,LastName,MiddleInitial,Gender,Street,City,State,Zip,RecPos},'~PROGGUIDE::EXAMPLEDATA::KEYS::People.PersonID.Payload');
  54. EXPORT IDX__Person_LastName_FirstName_Payload := INDEX(Person.FilePlus,{LastName,FirstName},{Person.FilePlus},'~PROGGUIDE::EXAMPLEDATA::KEYS::People.LastName.FirstName.Payload');
  55. EXPORT IDX__Person_State_City_Zip_LastName_FirstName_Payload := INDEX(Person.FilePlus,{State,City,Zip,Lastname,Firstname},{Person.FilePlus},'~PROGGUIDE::EXAMPLEDATA::KEYS::People.State.City.Zip.LastName.FirstName.Payload');
  56. EXPORT TimeZonesXML := DATASET('~PROGGUIDE::EXAMPLEDATA::XML_timezones',
  57. {STRING code,
  58. STRING state,
  59. STRING description,
  60. STRING timezone{XPATH('zone')}},
  61. XML('timezones/area') );
  62. EXPORT MAC_CountFieldValues(infile,infield) := MACRO
  63. // Create the count of unique values in the infield
  64. COUNT(DEDUP(TABLE(infile,{infile.infield}),infield,ALL));
  65. // Create the crosstab report
  66. #UNIQUENAME(r_macro)
  67. %r_macro% := RECORD
  68. infile.infield;
  69. INTEGER cnt := COUNT(GROUP);
  70. END;
  71. #UNIQUENAME(y_macro)
  72. %y_macro% := TABLE(infile,%r_macro%,infield,FEW);
  73. OUTPUT(CHOOSEN(%y_macro%,50000));
  74. ENDMACRO;
  75. //These attributes directly support the SuperFiles articles
  76. EXPORT AllPeople := '~PROGGUIDE::SUPERFILE::AllPeople';
  77. EXPORT BaseFile := '~PROGGUIDE::SUPERFILE::Base';
  78. EXPORT WeeklyFile := '~PROGGUIDE::SUPERFILE::Weekly';
  79. EXPORT DailyFile := '~PROGGUIDE::SUPERFILE::Daily';
  80. EXPORT SubFile1 := '~PROGGUIDE::SUPERFILE::People1';
  81. EXPORT SubFile2 := '~PROGGUIDE::SUPERFILE::People2';
  82. EXPORT SubFile3 := '~PROGGUIDE::SUPERFILE::People3';
  83. EXPORT SubFile4 := '~PROGGUIDE::SUPERFILE::People4';
  84. EXPORT SubFile5 := '~PROGGUIDE::SUPERFILE::People5';
  85. EXPORT SubFile6 := '~PROGGUIDE::SUPERFILE::People6';
  86. EXPORT SuperFile1 := DATASET(BaseFile,Layout_Person,FLAT);
  87. EXPORT SuperFile2 := DATASET(AllPeople,Layout_Person,FLAT);
  88. //this macro lists the sub-files in a SuperFile
  89. EXPORT MAC_ListSFsubfiles(SuperFile) := MACRO
  90. #UNIQUENAME(SeedRec)
  91. %SeedRec% := DATASET([{''}], {STRING fn});
  92. #UNIQUENAME(Xform)
  93. TYPEOF(%SeedRec%) %Xform%(%SeedRec% L, INTEGER C) := TRANSFORM
  94. SELF.fn := Std.File.GetSuperFileSubName(SuperFile,C);
  95. END;
  96. OUTPUT(NORMALIZE(%SeedRec%,
  97. Std.File.GetSuperFileSubCount(SuperFile),
  98. %Xform%(LEFT,COUNTER)));
  99. ENDMACRO;
  100. //this macro clears then deletes a SuperFile
  101. EXPORT MAC_DeleteSF(SuperFile) := MACRO
  102. SEQUENTIAL(
  103. Std.File.StartSuperFileTransaction(),
  104. Std.File.ClearSuperFile(SuperFile),
  105. Std.File.FinishSuperFileTransaction(),
  106. Std.File.DeleteSuperFile(SuperFile));
  107. ENDMACRO;
  108. //These attributes directly support the "Indexes Into SuperFiles" article
  109. EXPORT i1name := '~PROGGUIDE::SUPERKEY::IDX1';
  110. EXPORT i2name := '~PROGGUIDE::SUPERKEY::IDX2';
  111. EXPORT i3name := '~PROGGUIDE::SUPERKEY::IDX3';
  112. EXPORT SFname := '~PROGGUIDE::SUPERKEY::SF1';
  113. EXPORT SKname := '~PROGGUIDE::SUPERKEY::SK1';
  114. EXPORT ds1 := DATASET(SubFile1,{Layout_Person,UNSIGNED8 RecPos {VIRTUAL(fileposition)}},THOR);
  115. EXPORT ds2 := DATASET(SubFile2,{Layout_Person,UNSIGNED8 RecPos {VIRTUAL(fileposition)}},THOR);
  116. EXPORT i1 := INDEX(ds1,{personid,RecPos},i1name);
  117. EXPORT i2 := INDEX(ds2,{personid,RecPos},i2name);
  118. EXPORT sf1 := DATASET(SFname,{Layout_Person,UNSIGNED8 RecPos {VIRTUAL(fileposition)}},THOR);
  119. EXPORT sk1 := INDEX(sf1,{personid,RecPos},SKname);
  120. EXPORT sk2 := INDEX(sf1,{personid,RecPos},i3name);
  121. //These attributes directly support the "Using SuperKeys" article
  122. EXPORT SubKey1 := '~PROGGUIDE::SUPERKEY::Accounts1';
  123. EXPORT SubKey2 := '~PROGGUIDE::SUPERKEY::Accounts2';
  124. EXPORT SubKey3 := '~PROGGUIDE::SUPERKEY::Accounts3';
  125. EXPORT SubKey4 := '~PROGGUIDE::SUPERKEY::Accounts4';
  126. EXPORT SubIDX1 := '~PROGGUIDE::SUPERKEY::KEY::AcctsIDX1';
  127. EXPORT SubIDX2 := '~PROGGUIDE::SUPERKEY::KEY::AcctsIDX2';
  128. EXPORT SubIDX3 := '~PROGGUIDE::SUPERKEY::KEY::AcctsIDX3';
  129. EXPORT SubIDX4 := '~PROGGUIDE::SUPERKEY::KEY::AcctsIDX4';
  130. EXPORT AcctSKname := '~PROGGUIDE::SUPERKEY::KEY::AcctsSK';
  131. EXPORT AcctSK := INDEX(Accounts,{PersonID},
  132. {Account,OpenDate,IndustryCode,AcctType,AcctRate,Code1,Code2,HighCredit,Balance,RecPos},
  133. AcctSKname);
  134. //This MACRO directly supports the "Scanning LandingZone Files" article
  135. EXPORT MAC_ScanFile(IP, infile, scansize) := MACRO
  136. ds := DATASET(Std.File.ExternalLogicalFileName(IP, infile),{DATA1 S}, THOR )[1..scansize];
  137. OUTPUT(TABLE(ds,{hex := ds.s,txt := (STRING1)ds.s}),ALL);
  138. Rec := RECORD
  139. UNSIGNED2 C;
  140. DATA S {MAXLENGTH(8*1024)};
  141. END;
  142. Rec XF1(ds L,INTEGER C) := TRANSFORM
  143. SELF.C := C;
  144. SELF.S := L.s;
  145. END;
  146. ds2 := PROJECT(ds,XF1(LEFT,COUNTER));
  147. Rec XF2(Rec L,Rec R) := TRANSFORM
  148. SELF.S := L.S[1 .. R.C-1] + R.S[1];
  149. SELF := L;
  150. END;
  151. Rolled := ROLLUP(ds2,TRUE,XF2(LEFT,RIGHT));
  152. OUTPUT(TRANSFER(Rolled[1].S,STRING));
  153. ENDMACRO;
  154. END;