adminprogsHandler.cls 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219
  1. /*------------------------------------------------------------------------
  2. File : usersHandler
  3. Purpose :
  4. Syntax :
  5. Description :
  6. Author(s) : walter.riechsteiner
  7. Created : Fri Nov 21 11:31:01 CET 2025
  8. Notes :
  9. ----------------------------------------------------------------------*/
  10. BLOCK-LEVEL ON ERROR UNDO, THROW.
  11. USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
  12. USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
  13. USING utilities.utilitiesHandler FROM PROPATH.
  14. USING Progress.Json.ObjectModel.ObjectModelParser FROM PROPATH.
  15. USING OpenEdge.DataAdmin.IIndex FROM PROPATH.
  16. USING OpenEdge.Web.DataObject.Writer.JsonObjectValueWriter FROM PROPATH.
  17. CLASS admin.adminprogsHandler FINAL:
  18. DEFINE VARIABLE oJsonData AS JsonObject NO-UNDO.
  19. DEFINE VARIABLE oJsonArray AS JsonArray NO-UNDO.
  20. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO.
  21. DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO.
  22. DEFINE VARIABLE ccompany AS CHARACTER NO-UNDO.
  23. DEFINE VARIABLE lcJsonString AS LONGCHAR NO-UNDO.
  24. DEFINE VARIABLE iLanguage_id AS INTEGER NO-UNDO.
  25. DEFINE VARIABLE oRecords AS JsonArray NO-UNDO.
  26. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO.
  27. DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO.
  28. DEFINE VARIABLE lCompany AS LOGICAL NO-UNDO.
  29. DEFINE VARIABLE lActive AS LOGICAL NO-UNDO.
  30. DEFINE VARIABLE lWordindex AS LOGICAL NO-UNDO.
  31. DEFINE VARIABLE iMaxRecords AS INTEGER NO-UNDO INIT 20.
  32. DEFINE VARIABLE iStartPage AS INTEGER NO-UNDO.
  33. DEFINE VARIABLE iStartRecord AS INTEGER NO-UNDO.
  34. DEFINE VARIABLE iPageCounter AS INTEGER NO-UNDO.
  35. DEFINE VARIABLE iCurrentPosition AS INTEGER NO-UNDO.
  36. DEFINE VARIABLE cFieldReplace AS CHARACTER NO-UNDO.
  37. DEFINE VARIABLE cKeyFieldReplace AS CHARACTER NO-UNDO.
  38. DEFINE VARIABLE cFilterReplace AS CHARACTER NO-UNDO.
  39. DEFINE VARIABLE cFileReplace AS CHARACTER NO-UNDO.
  40. DEFINE VARIABLE cKeyFields AS CHARACTER NO-UNDO.
  41. DEFINE VARIABLE cKeyValues AS CHARACTER NO-UNDO.
  42. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  43. DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
  44. DEFINE VARIABLE cMessage AS CHARACTER NO-UNDO.
  45. DEFINE VARIABLE lcMessage AS LONGCHAR NO-UNDO.
  46. DEFINE VARIABLE iActualPage AS INTEGER NO-UNDO.
  47. DEFINE VARIABLE cPrimaryKey AS CHARACTER NO-UNDO.
  48. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO.
  49. DEFINE VARIABLE iStartIndex AS INTEGER NO-UNDO.
  50. DEFINE VARIABLE httTable AS HANDLE NO-UNDO.
  51. DEFINE VARIABLE ttTable AS HANDLE NO-UNDO.
  52. DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
  53. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
  54. DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
  55. /*------------------------------------------------------------------------------
  56. Purpose:
  57. Notes:
  58. ------------------------------------------------------------------------------*/
  59. METHOD PUBLIC LOGICAL createData(
  60. INPUT oJsonIdent AS JsonObject,
  61. INPUT oJsonRecord AS jsonObject,
  62. OUTPUT oJsonReturn AS JsonObject
  63. ):
  64. DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO.
  65. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO.
  66. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  67. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO.
  68. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  69. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  70. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO.
  71. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO.
  72. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
  73. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  74. DEFINE VARIABLE hField AS HANDLE NO-UNDO.
  75. DEFINE VARIABLE htField AS HANDLE NO-UNDO.
  76. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  77. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  78. DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO.
  79. DEFINE VARIABLE rBuffer AS RECID NO-UNDO.
  80. outilitiesHandler = NEW utilitiesHandler().
  81. outilitiesHandler:evaluateFile(
  82. INPUT oJsonIdent ,
  83. OUTPUT cFileName ,
  84. OUTPUT lCompany ,
  85. OUTPUT lActive ,
  86. OUTPUT lWordindex
  87. ).
  88. cFieldReplace = SUBSTITUTE('&1_', cFileName).
  89. cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName).
  90. cFilterReplace = SUBSTITUTE('filter_&1_', cFileName).
  91. cFileReplace = SUBSTITUTE('&1_', cFileName).
  92. iLanguage_id = oJsonIdent:GetInteger('language_id').
  93. lOK = outilitiesHandler:getKeyFields(
  94. INPUT oJsonIdent ,
  95. OUTPUT cKeyFields ,
  96. OUTPUT cKeyValues
  97. ).
  98. CREATE TEMP-TABLE ttTable.
  99. ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex'). /* except Field wordindex */
  100. ttTable:TEMP-TABLE-PREPARE ('record').
  101. httTable = ttTable:DEFAULT-BUFFER-HANDLE.
  102. DO ii = 1 TO httTable:NUM-FIELDS:
  103. httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR.
  104. END.
  105. httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
  106. httTable:FIND-FIRST('', NO-LOCK).
  107. CREATE BUFFER hBuffer FOR TABLE cFileName.
  108. cIndexFields = outilitiesHandler:getPrimaryIndexFields(
  109. INPUT cFileName
  110. ).
  111. cWhere = ''.
  112. DO i1 = 1 TO NUM-ENTRIES(cIndexFields, ';'):
  113. cField = ENTRY(i1, cIndexFields, ';').
  114. hField = httTable:BUFFER-FIELD(cField):HANDLE.
  115. CASE hField:DATA-TYPE:
  116. WHEN 'character' THEN
  117. cValue = QUOTER(hField:BUFFER-VALUE).
  118. WHEN 'logical' THEN
  119. cValue = STRING(hField:BUFFER-VALUE,"TRUE/FALSE").
  120. WHEN 'date' THEN
  121. cValue = STRING(DATE(hField:BUFFER-VALUE)).
  122. OTHERWISE
  123. cValue = hField:BUFFER-VALUE.
  124. END CASE.
  125. cWhere = cWhere
  126. + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ')
  127. + SUBSTITUTE('&1.&2 = ', cFileName, cField)
  128. + cValue.
  129. END.
  130. lRetVal = FALSE.
  131. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  132. lOK = hBuffer:FIND-UNIQUE(cWhere) NO-ERROR.
  133. IF hBuffer:AVAILABLE THEN
  134. DO:
  135. outilitiesHandler:getErrorMessage(
  136. INPUT '1023',
  137. INPUT ilanguage_id,
  138. INPUT '',
  139. OUTPUT lcMessage).
  140. LEAVE.
  141. END.
  142. hBuffer:BUFFER-CREATE ().
  143. DO ii = 1 TO httTable:NUM-FIELDS:
  144. hField = hBuffer:BUFFER-FIELD(ii):HANDLE NO-ERROR.
  145. IF ERROR-STATUS:ERROR OR
  146. NOT VALID-HANDLE(hField) THEN NEXT.
  147. htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR.
  148. IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT.
  149. hField:BUFFER-VALUE = htField:BUFFER-VALUE.
  150. END.
  151. htField = httTable:BUFFER-FIELD('created_at'):HANDLE NO-ERROR.
  152. IF NOT ERROR-STATUS:ERROR AND
  153. VALID-HANDLE(htField) THEN htField:BUFFER-VALUE = NOW.
  154. htField = httTable:BUFFER-FIELD('wordindex'):HANDLE NO-ERROR.
  155. IF NOT ERROR-STATUS:ERROR AND
  156. VALID-HANDLE(htField) THEN
  157. DO:
  158. cWordIndex = outilitiesHandler:createWordindex(
  159. INPUT hBuffer
  160. ).
  161. htField:BUFFER-VALUE = cWordIndex.
  162. END.
  163. rBuffer = hBuffer:RECID.
  164. hBuffer:BUFFER-RELEASE ().
  165. lRetVal = TRUE.
  166. LEAVE.
  167. END.
  168. DO WHILE TRUE:
  169. outilitiesHandler:readLastcWhere(
  170. INPUT oJsonIdent,
  171. INPUT cFileName ,
  172. OUTPUT cWhere
  173. ).
  174. // MESSAGE 'readlastcwhere = ' cWhere.
  175. ASSIGN
  176. ii = 0
  177. i1 = 0
  178. iActualPage = 0
  179. iCurrentPosition = 0.
  180. ttTable:EMPTY-TEMP-TABLE ().
  181. CREATE QUERY hQuery.
  182. hQuery:SET-BUFFERS (hBuffer) NO-ERROR.
  183. hQuery:QUERY-PREPARE (cWhere) NO-ERROR.
  184. hQuery:QUERY-OPEN ().
  185. hQuery:GET-FIRST ().
  186. // MESSAGE 'cPrimaryKey = ' cPrimaryKey '- cWhere = ' cWhere.
  187. lOK = FALSE.
  188. DO WHILE NOT hQuery:QUERY-OFF-END:
  189. ii = ii + 1.
  190. IF ii < iStartRecord THEN
  191. DO:
  192. hQuery:GET-NEXT ().
  193. NEXT.
  194. END.
  195. IF NOT lOK AND
  196. ii MOD iMaxRecords = 1 THEN iActualPage = iActualPage + 1.
  197. IF NOT lOK THEN
  198. DO:
  199. IF hBuffer:RECID <> rBuffer THEN
  200. DO:
  201. hQuery:GET-NEXT().
  202. NEXT.
  203. END.
  204. iIndex = ii MOD iMaxRecords.
  205. iStartIndex = ii - iIndex + 1.
  206. DO WHILE ii > iStartIndex:
  207. hQuery:GET-PREV ().
  208. ii = ii - 1.
  209. END.
  210. lOK = TRUE.
  211. END.
  212. IF iCurrentPosition = 0 THEN iCurrentPosition = ii.
  213. i1 = i1 + 1.
  214. hQuery:GET-NEXT ().
  215. END.
  216. hQuery:QUERY-CLOSE ().
  217. DELETE OBJECT hBuffer NO-ERROR.
  218. IF ii = 0 THEN RETURN FALSE.
  219. iPageCounter = ii / iMaxRecords.
  220. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1.
  221. oJsonPosition = NEW JsonObject().
  222. oJsonPosition:ADD('page' , iActualPage).
  223. oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */
  224. oRecords = NEW JsonArray().
  225. httTable:WRITE-JSON('JsonArray', oRecords).
  226. oJsonReturn = NEW JsonObject().
  227. // oJsonReturn:ADD('records' , oRecords).
  228. oJsonReturn:ADD('maxRecords', ii).
  229. oJsonReturn:ADD('pageCount' , iPageCounter).
  230. oJsonReturn:ADD('position' , oJsonPosition).
  231. outilitiesHandler:writePosition(
  232. INPUT oJsonIdent ,
  233. INPUT cFileName ,
  234. INPUT iCurrentPosition
  235. ).
  236. lRetVal = TRUE.
  237. RETURN lRetVal.
  238. END.
  239. IF NOT lRetVal THEN
  240. DO:
  241. oJsonMessage = NEW JsonObject().
  242. oJsonMessage:ADD('success', FALSE).
  243. oJsonMessage:ADD('message', lcMessage).
  244. oJsonMessage:WRITE(lcJsonString, FALSE).
  245. oJsonReturn = oJsonMessage.
  246. END.
  247. RETURN lRetVal.
  248. CATCH e AS Progress.Lang.Error:
  249. END CATCH.
  250. FINALLY:
  251. END FINALLY.
  252. END METHOD.
  253. /*------------------------------------------------------------------------------
  254. Purpose:
  255. Notes:
  256. ------------------------------------------------------------------------------*/
  257. METHOD PUBLIC LOGICAL deleteData(
  258. INPUT oJsonIdent AS JsonObject,
  259. INPUT oJsonRecord AS jsonObject,
  260. OUTPUT oJsonReturn AS JsonObject
  261. ):
  262. DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO.
  263. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO.
  264. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  265. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO.
  266. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  267. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  268. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO.
  269. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO.
  270. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
  271. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  272. DEFINE VARIABLE hField AS HANDLE NO-UNDO.
  273. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  274. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  275. DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO.
  276. DEFINE VARIABLE rBuffer AS ROWID NO-UNDO.
  277. outilitiesHandler = NEW utilitiesHandler().
  278. outilitiesHandler:evaluateFile(
  279. INPUT oJsonIdent ,
  280. OUTPUT cFileName ,
  281. OUTPUT lCompany ,
  282. OUTPUT lActive ,
  283. OUTPUT lWordindex
  284. ).
  285. cFieldReplace = SUBSTITUTE('&1_', cFileName).
  286. cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName).
  287. cFilterReplace = SUBSTITUTE('filter_&1_', cFileName).
  288. cFileReplace = SUBSTITUTE('&1_', cFileName).
  289. iLanguage_id = oJsonIdent:GetInteger('language_id').
  290. ccompany = oJsonIdent:GetCharacter('company').
  291. lOK = outilitiesHandler:getKeyFields(
  292. INPUT oJsonIdent ,
  293. OUTPUT cKeyFields ,
  294. OUTPUT cKeyValues
  295. ).
  296. CREATE TEMP-TABLE ttTable.
  297. ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex'). /* except Field wordindex */
  298. ttTable:TEMP-TABLE-PREPARE ('record').
  299. httTable = ttTable:DEFAULT-BUFFER-HANDLE.
  300. DO ii = 1 TO httTable:NUM-FIELDS:
  301. httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR.
  302. END.
  303. httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
  304. httTable:FIND-FIRST('', NO-LOCK).
  305. // Primary-Index-Fields fuer WHERE-Statement
  306. CREATE BUFFER hBuffer FOR TABLE cFileName.
  307. cIndexFields = outilitiesHandler:getPrimaryIndexFields(
  308. INPUT cFileName
  309. ).
  310. // Erzeugen von Where-Statement für UNIQUE-Find
  311. cWhere = ''.
  312. DO i1 = 1 TO NUM-ENTRIES(cIndexFields, ';'):
  313. cField = ENTRY(i1, cIndexFields, ';').
  314. hField = httTable:BUFFER-FIELD(cField):HANDLE.
  315. CASE hField:DATA-TYPE:
  316. WHEN 'character' THEN
  317. cValue = QUOTER(hField:BUFFER-VALUE).
  318. WHEN 'logical' THEN
  319. cValue = STRING(hField:BUFFER-VALUE,"TRUE/FALSE").
  320. WHEN 'date' THEN
  321. cValue = STRING(DATE(hField:BUFFER-VALUE)).
  322. OTHERWISE
  323. cValue = hField:BUFFER-VALUE.
  324. END CASE.
  325. cWhere = cWhere
  326. + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ')
  327. + SUBSTITUTE('&1.&2 = ', cFileName, cField)
  328. + cValue.
  329. END.
  330. lRetVal = FALSE.
  331. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  332. lOK = hBuffer:FIND-UNIQUE (cWhere, NO-LOCK ) NO-ERROR.
  333. IF NOT lOK THEN
  334. DO:
  335. outilitiesHandler:getErrorMessage(
  336. INPUT '1014',
  337. INPUT ilanguage_id,
  338. INPUT '',
  339. OUTPUT lcMessage).
  340. LEAVE.
  341. END.
  342. rBuffer = hBuffer:ROWID.
  343. FIND userdata
  344. WHERE userdata.user_name = oJsonIdent:GetCharacter('user_name')
  345. AND userdata.company = oJsonIdent:GetCharacter('company')
  346. AND userdata.branch = '0000'
  347. AND userdata.record_type = 'sortField'
  348. AND userdata.section = cFileName
  349. AND userdata.key_type = '' NO-ERROR.
  350. IF AVAILABLE userdata THEN
  351. DO:
  352. ASSIGN
  353. cSortField = userdata.cfield_1
  354. cDirection = userdata.cfield_2.
  355. END.
  356. IF cDirection BEGINS 'asc' THEN cDirection = ''.
  357. // Where-Statement f�r FOR EACH Filename f�r die Anzeige
  358. cWhere = ''.
  359. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)).
  360. IF cKeyFields <> '' THEN
  361. DO:
  362. DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'):
  363. cField = ENTRY(ii, cKeyFields, ';').
  364. cField = REPLACE(cField, cKeyFieldReplace, '').
  365. cField = REPLACE(cField, cFilterReplace, '').
  366. cField = REPLACE(cField, cFileReplace, '').
  367. cValue = ENTRY(ii, cKeyValues, CHR(01)).
  368. IF lCompany AND
  369. cFIeld = 'company' THEN NEXT.
  370. cValue = ENTRY(ii, cKeyValues, CHR(01)).
  371. cWhere = cWhere
  372. + (IF cWhere = '' THEN 'WHERE &1.&2 = &3' ELSE ' AND &1.&2 = &3').
  373. cWhere = SUBSTITUTE(cWhere, cFileName, cField, cValue).
  374. END.
  375. END.
  376. CREATE QUERY hQuery.
  377. hQuery:SET-BUFFERS (hBuffer).
  378. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere).
  379. IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection.
  380. hQuery:QUERY-PREPARE(cWhere).
  381. hQuery:QUERY-OPEN().
  382. hQuery:GET-FIRST().
  383. ii = 0.
  384. i1 = 0.
  385. DO WHILE NOT hQuery:QUERY-OFF-END:
  386. ii = ii + 1.
  387. IF hBuffer:ROWID = rBuffer THEN i1 = ii.
  388. hQuery:GET-NEXT ().
  389. END.
  390. hQuery:QUERY-CLOSE ().
  391. iPageCounter = i1 / iMaxRecords.
  392. IF (iPageCounter * iMaxRecords) < i1 THEN iPageCounter = iPageCounter + 1.
  393. iIndex = i1 MOD iMaxRecords.
  394. IF iIndex = 0 THEN iIndex = iMaxRecords.
  395. lOK = hBuffer:FIND-BY-ROWID (rBuffer, EXCLUSIVE-LOCK) NO-ERROR.
  396. hField = hBuffer:BUFFER-FIELD('active'):HANDLE NO-ERROR.
  397. IF NOT ERROR-STATUS:ERROR AND
  398. VALID-HANDLE(hField) THEN
  399. DO:
  400. hField:BUFFER-VALUE = FALSE.
  401. hField = hBuffer:BUFFER-FIELD('updated_at'):HANDLE NO-ERROR.
  402. IF NOT ERROR-STATUS:ERROR AND
  403. VALID-HANDLE(hField) THEN hField:BUFFER-VALUE = NOW.
  404. END.
  405. ELSE
  406. DO:
  407. hBuffer:BUFFER-DELETE ().
  408. END.
  409. hBuffer:BUFFER-RELEASE ().
  410. lRetVal = TRUE.
  411. oJsonReturn = NEW JsonObject().
  412. oJsonReturn:ADD('success', lRetVal).
  413. oJsonPosition = NEW JsonObject().
  414. oJsonPosition:ADD('page', iPageCounter).
  415. oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */
  416. oJsonPosition:ADD('totalRecords', ii).
  417. oJsonReturn:ADD('position', oJsonPosition).
  418. LEAVE.
  419. END.
  420. RETURN lRetVal.
  421. CATCH e AS Progress.Lang.Error:
  422. END CATCH.
  423. FINALLY:
  424. END FINALLY.
  425. END METHOD.
  426. /*------------------------------------------------------------------------------
  427. Purpose:
  428. Notes:
  429. ------------------------------------------------------------------------------*/
  430. METHOD PUBLIC LOGICAL getChanges(
  431. INPUT oJsonIdent AS JsonObject,
  432. OUTPUT oJsonResult AS JsonObject
  433. ):
  434. /*
  435. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  436. DEFINE VARIABLE cFunction AS CHARACTER NO-UNDO.
  437. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  438. DEFINE VARIABLE cAction AS CHARACTER NO-UNDO.
  439. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  440. DEFINE VARIABLE lcJsonString AS LONGCHAR NO-UNDO.
  441. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  442. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  443. DEFINE VARIABLE i2 AS INTEGER NO-UNDO.
  444. DEFINE VARIABLE oJsonfieldUpdates AS JsonObject NO-UNDO.
  445. outilitiesHandler = NEW utilitiesHandler().
  446. cField = oJsonIdent:GetCharacter('field').
  447. cAction = oJsonIdent:GetCharacter('action').
  448. cValue = REPLACE(oJsonIdent:GetCharacter('value'), '+', ' ').
  449. oJsonResult = NEW JsonObject().
  450. oJsonFieldUpdates = NEW JsonObject().
  451. lRetVal = outilitiesHandler:getKeyFields(
  452. INPUT oJsonIdent ,
  453. OUTPUT cKeyFields ,
  454. OUTPUT cKeyValues
  455. ).
  456. cWhere = ''.
  457. lRetVal = FALSE.
  458. DO WHILE TRUE:
  459. DO i1 = 1 TO NUM-ENTRIES(cKeyFields, ';'):
  460. cWhere = cWhere
  461. + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ' )
  462. + SUBSTITUTE('busers.&1 = &2 ',
  463. REPLACE(ENTRY(i1, cKeyFields, ';'), 'users_', ''),
  464. QUOTER (ENTRY(i1, cKeyValues, CHR(01)))).
  465. END.
  466. MESSAGE cWhere.
  467. hBuffer = BUFFER busers:HANDLE.
  468. lRetVal = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
  469. IF lRetVal THEN
  470. DO:
  471. CASE cField:
  472. WHEN 'users_firstname' THEN
  473. DO:
  474. IF hBuffer::display_Name = '' THEN
  475. DO:
  476. cString = cValue + ' ' + hBuffer::lastname.
  477. oJsonfieldUpdates:ADD('users_display_name', cString).
  478. END.
  479. IF hBuffer::initials = '' THEN
  480. DO:
  481. cString = TRIM(SUBSTRING(cValue,01,02)) + TRIM(SUBSTRING(hBuffer::lastname,01,02)).
  482. oJsonfieldUpdates:ADD('users_initials', cString).
  483. END.
  484. END.
  485. END CASE.
  486. oJsonResult:ADD('fieldUpdates', oJsonfieldUpdates).
  487. END.
  488. lRetVal = TRUE.
  489. LEAVE.
  490. END.
  491. IF NOT lRetVal THEN
  492. DO:
  493. oJsonResult = NEW JsonObject().
  494. oJsonResult:ADD('success', FALSE).
  495. oJsonResult:ADD('message', 'Fehler beim change').
  496. END.
  497. RETURN lRetVal.
  498. */
  499. END METHOD.
  500. /*------------------------------------------------------------------------------
  501. Purpose:
  502. Notes:
  503. ------------------------------------------------------------------------------*/
  504. METHOD PUBLIC LOGICAL getData(
  505. INPUT oJsonIdent AS JsonObject,
  506. OUTPUT oJsonReturn AS JsonObject
  507. ):
  508. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  509. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  510. DEFINE VARIABLE iNumerisch AS INTEGER NO-UNDO.
  511. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  512. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO INIT ''.
  513. DEFINE VARIABLE cSearchChars AS CHARACTER NO-UNDO INIT ''.
  514. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  515. DEFINE VARIABLE lSearch AS LOGICAL NO-UNDO INIT FALSE.
  516. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  517. DEFINE VARIABLE cFilters AS CHARACTER NO-UNDO.
  518. DEFINE VARIABLE cFilter AS CHARACTER NO-UNDO.
  519. DEFINE VARIABLE cFields AS CHARACTER NO-UNDO EXTENT.
  520. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  521. DEFINE VARIABLE cDBField AS CHARACTER NO-UNDO.
  522. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  523. DEFINE VARIABLE cType AS CHARACTER NO-UNDO.
  524. DEFINE VARIABLE lChange AS LOGICAL NO-UNDO.
  525. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO.
  526. DEFINE VARIABLE oRecords AS JsonArray NO-UNDO.
  527. outilitiesHandler = NEW utilitiesHandler().
  528. //
  529. // Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
  530. outilitiesHandler:evaluateFile(
  531. INPUT oJsonIdent ,
  532. OUTPUT cFileName ,
  533. OUTPUT lCompany ,
  534. OUTPUT lActive ,
  535. OUTPUT lWordindex
  536. ).
  537. cFieldReplace = SUBSTITUTE('&1_', cFileName).
  538. cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName).
  539. cFilterReplace = SUBSTITUTE('filter_&1_', cFileName).
  540. lOK = outilitiesHandler:getKeyFields(
  541. INPUT oJsonIdent ,
  542. OUTPUT cKeyFields ,
  543. OUTPUT cKeyValues
  544. ).
  545. CREATE BUFFER hBuffer FOR TABLE cFileName.
  546. cuser_name = oJsonIdent:GetCharacter('user_name').
  547. ccompany = oJsonIdent:GetCharacter('company').
  548. lChange = (IF oJsonIdent:HAS('change') THEN TRUE ELSE FALSE).
  549. cSortField = ''.
  550. cDirection = ''.
  551. cWhere = ''.
  552. iStartPage = 1.
  553. IF oJsonIdent:HAS('page') THEN iStartPage = INTEGER(oJsonIdent:GetCharacter('page')) NO-ERROR.
  554. iStartRecord = ((iStartPage - 1) * iMaxRecords) + 1.
  555. IF oJsonIdent:HAS('search') THEN
  556. DO:
  557. cSearchChars = oJsonIdent:GetCharacter('search').
  558. cSearchChars = REPLACE(cSearchChars, '+', ' ').
  559. lSearch = TRUE.
  560. iMaxRecords = 100.
  561. iStartRecord = 1.
  562. END.
  563. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)).
  564. IF cKeyFields <> '' THEN
  565. DO:
  566. DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'):
  567. cString = ENTRY(ii, cKeyFIelds, ';').
  568. cString = REPLACE(cString, cKeyFieldReplace, '').
  569. cString = REPLACE(cString, cFieldReplace, '').
  570. IF cString = 'company' AND lCompany THEN NEXT.
  571. cValue = ENTRY(ii, cKeyValues, CHR(01)).
  572. cString = SUBSTITUTE('&1.&2 = &3 ', cFileName, cString, cValue).
  573. cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ') + cString.
  574. END.
  575. END.
  576. outilitiesHandler:writeStartcWhere(
  577. INPUT oJsonIdent,
  578. INPUT cFileName ,
  579. INPUT cWhere
  580. ).
  581. // MESSAGE 'Start - cWhere ' cWhere.
  582. IF lSearch THEN
  583. DO:
  584. DO ii = 1 TO NUM-ENTRIES(cSearchChars, ' '):
  585. cValue = ENTRY(ii, cSearchChars, ' ').
  586. iNumerisch = INTEGER(cValue) NO-ERROR.
  587. cWhere = cWhere + (IF cWhere = '' THEN ' WHERE ' ELSE 'AND ').
  588. IF NOT ERROR-STATUS:ERROR AND
  589. iNumerisch > 0 THEN cValue = SUBSTITUTE('&1&2&1', CHR(01), TRIM(STRING(iNumerisch,'>>>>>>>>9-'))).
  590. cWhere = cWhere + 'LOOKUP(' + QUOTER(cValue) + ', ' + cFileName + '.wordindex, " ") > 0 '.
  591. END.
  592. END.
  593. ELSE
  594. DO:
  595. IF oJsonIdent:HAS('sortField') THEN
  596. DO:
  597. cSortField = REPLACE(oJsonIdent:GetCharacter('sortField'), cFieldReplace, '').
  598. cDirection = oJsonIdent:GetCharacter('sortDirection').
  599. END.
  600. outilitiesHandler:writeSortfields(
  601. INPUT oJsonIdent,
  602. INPUT cFileName ,
  603. INPUT cSortField ,
  604. INPUT cDirection
  605. ).
  606. cFields = oJsonIdent:GetNames().
  607. DO i1 = 1 TO EXTENT(cFields):
  608. cField = cFields[i1].
  609. IF NOT cField BEGINS 'filter_' THEN NEXT.
  610. cFilter = oJsonIdent:GetCharacter(cField).
  611. cField = REPLACE(cField, cFilterReplace, '').
  612. cType = hBuffer:BUFFER-FIELD(cField):DATA-TYPE.
  613. CASE cType:
  614. WHEN 'character' THEN
  615. cFilter = QUOTER(cFilter).
  616. WHEN 'logical' THEN
  617. cFilter = STRING(cFilter,'yes/no').
  618. WHEN 'date' THEN
  619. cFilter = STRING(DATE(cFilter),'99.99.9999').
  620. END CASE.
  621. cDBField = SUBSTITUTE('&1.&2', cFileName, cField).
  622. cWhere = cWhere
  623. + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ')
  624. + 'INDEX(' + cDBField + ', ' + cFilter + ') > 0 '.
  625. END.
  626. END.
  627. // MESSAGE 'cWhere = ' cWhere.
  628. IF NOT cDirection BEGINS 'des' THEN cDirection = ''.
  629. IF cSortField <> '' THEN cWhere = cWhere + 'BY ' + cSortField + ' ' + cDirection.
  630. CREATE TEMP-TABLE ttTable.
  631. ttTable:ADD-FIELDS-FROM (cFilename, 'wordindex').
  632. IF cSortField <> '' THEN
  633. DO:
  634. ttTable:ADD-NEW-INDEX ('ttTable-k1', FALSE, TRUE). /* UNIQUE, PRIMARY */
  635. IF cDirection BEGINS 'des' THEN ttTable:ADD-INDEX-FIELD ('ttTable-k1', cSortField, 'desc').
  636. ELSE ttTable:ADD-INDEX-FIELD ('ttTable-k1', cSortField).
  637. END.
  638. ttTable:TEMP-TABLE-PREPARE ('records').
  639. httTable = ttTable:DEFAULT-BUFFER-HANDLE.
  640. DO ii = 1 TO httTable:NUM-FIELDS:
  641. httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR.
  642. END.
  643. // MESSAGE 'cWhere beim Start des lesens ' cWhere.
  644. ii = 0.
  645. i1 = 0.
  646. ttTable:EMPTY-TEMP-TABLE ().
  647. CREATE QUERY hQuery.
  648. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR.
  649. // MESSAGE 'writeLastcWhere fuer Datei' cFileName 'ist' cWhere.
  650. outilitiesHandler:writeLastcWhere(
  651. INPUT oJsonIdent ,
  652. INPUT cFileName ,
  653. INPUT cWhere
  654. ).
  655. MESSAGE 'cWhere vor replacing ' cWhere.
  656. cWhere = REPLACE(cWhere, 'FOR', 'PRESELECT').
  657. MESSAGE 'cWhere nach replacing ' cWhere.
  658. hQuery:SET-BUFFERS (hBuffer) NO-ERROR.
  659. hQuery:QUERY-PREPARE (cWhere) NO-ERROR.
  660. hQuery:QUERY-OPEN ().
  661. /* hQuery:GET-LAST ().*/
  662. MESSAGE 'Azzahl Query-Datensaetze = ' hQuery:NUM-RESULTS.
  663. hQuery:GET-FIRST ().
  664. iCurrentPosition = 0.
  665. DO WHILE NOT hQuery:QUERY-OFF-END:
  666. ii = ii + 1.
  667. IF ii < iStartRecord THEN
  668. DO:
  669. hQuery:GET-NEXT ().
  670. NEXT.
  671. END.
  672. IF iCurrentPosition = 0 THEN iCurrentPosition = ii.
  673. i1 = i1 + 1.
  674. IF i1 <= iMaxRecords THEN
  675. DO:
  676. httTable:BUFFER-CREATE().
  677. httTable:BUFFER-COPY(hBuffer).
  678. END.
  679. hQuery:GET-NEXT ().
  680. END.
  681. hQuery:QUERY-CLOSE ().
  682. DELETE OBJECT hBuffer NO-ERROR.
  683. iPageCounter = ii / iMaxRecords.
  684. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1.
  685. oRecords = NEW JsonArray().
  686. httTable:WRITE-JSON('JsonArray', oRecords).
  687. oJsonReturn = NEW JsonObject().
  688. oJsonReturn:ADD('records' , oRecords).
  689. oJsonReturn:ADD('maxRecords', ii).
  690. oJsonReturn:ADD('pageCount' , iPageCounter).
  691. outilitiesHandler:writePosition(
  692. INPUT oJsonIdent ,
  693. INPUT cFileName ,
  694. INPUT iCurrentPosition
  695. ).
  696. oJsonReturn:WriteFile('C:\TEMP\getData_messages.json', TRUE).
  697. lRetVal = TRUE.
  698. RETURN lRetVal.
  699. END METHOD.
  700. /*------------------------------------------------------------------------------
  701. Purpose:
  702. Notes:
  703. ------------------------------------------------------------------------------*/
  704. METHOD PUBLIC LOGICAL rebuildData(
  705. INPUT oJsonIdent AS JsonObject,
  706. OUTPUT oJsonReturn AS JsonObject
  707. ):
  708. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  709. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  710. DEFINE VARIABLE iNumerisch AS INTEGER NO-UNDO.
  711. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  712. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO INIT ''.
  713. DEFINE VARIABLE cSearchChars AS CHARACTER NO-UNDO INIT ''.
  714. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  715. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  716. DEFINE VARIABLE cFields AS CHARACTER NO-UNDO EXTENT.
  717. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  718. DEFINE VARIABLE cDBField AS CHARACTER NO-UNDO.
  719. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  720. DEFINE VARIABLE cType AS CHARACTER NO-UNDO.
  721. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO.
  722. DEFINE VARIABLE rBuffer AS RECID NO-UNDO.
  723. outilitiesHandler = NEW utilitiesHandler().
  724. outilitiesHandler:evaluateFile(
  725. INPUT oJsonIdent ,
  726. OUTPUT cFileName ,
  727. OUTPUT lCompany ,
  728. OUTPUT lActive ,
  729. OUTPUT lWordindex
  730. ).
  731. cFieldReplace = SUBSTITUTE('&1_' , cFileName).
  732. cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName).
  733. cFilterReplace = SUBSTITUTE('filter_&1_' , cFileName).
  734. lOK = outilitiesHandler:getKeyFields(
  735. INPUT oJsonIdent ,
  736. OUTPUT cKeyFields ,
  737. OUTPUT cKeyValues
  738. ).
  739. CREATE BUFFER hBuffer FOR TABLE cFileName.
  740. cuser_name = oJsonIdent:GetCharacter('user_name').
  741. ccompany = oJsonIdent:GetCharacter('company').
  742. cSortField = ''.
  743. cDirection = ''.
  744. cWhere = ''.
  745. cPrimaryKey = ''.
  746. iStartPage = 1.
  747. iStartRecord = 1.
  748. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)).
  749. IF cKeyFields <> '' THEN
  750. DO:
  751. DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'):
  752. cString = ENTRY(ii, cKeyFIelds, ';').
  753. cString = REPLACE(cString, cKeyFieldReplace, '').
  754. cString = REPLACE(cString, cFieldReplace, '').
  755. IF cString = 'company' THEN NEXT.
  756. cString = SUBSTITUTE('&1.&2 = &3 ', cFileName, cString, ENTRY(ii, cKeyValues, CHR(01))).
  757. cPrimaryKey = cPrimaryKey + (IF cPrimaryKey = '' THEN 'WHERE ' ELSE 'AND ') + cString.
  758. END.
  759. END.
  760. outilitiesHandler:readStartcWhere(
  761. INPUT oJsonIdent,
  762. INPUT cFileName ,
  763. OUTPUT cWhere
  764. ).
  765. outilitiesHandler:readSortFields(
  766. INPUT oJsonIdent,
  767. INPUT cFileName ,
  768. OUTPUT cSortField,
  769. OUTPUT cDirection).
  770. IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection.
  771. CREATE TEMP-TABLE ttTable.
  772. ttTable:ADD-FIELDS-FROM (cFilename, 'wordindex').
  773. IF cSortField <> '' THEN
  774. DO:
  775. ttTable:ADD-NEW-INDEX ('ttTable-k1', FALSE, TRUE). /* UNIQUE, PRIMARY */
  776. ttTable:ADD-INDEX-FIELD ('ttTable-k1', cSortField, cDirection).
  777. END.
  778. ttTable:TEMP-TABLE-PREPARE ('records').
  779. httTable = ttTable:DEFAULT-BUFFER-HANDLE.
  780. DO ii = 1 TO httTable:NUM-FIELDS:
  781. httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR.
  782. END.
  783. MESSAGE 'cWhere beim Start des lesens ' cWhere.
  784. ASSIGN
  785. ii = 0
  786. i1 = 0
  787. iActualPage = 0
  788. iCurrentPosition = 0.
  789. hBuffer:FIND-UNIQUE(cPrimaryKey, NO-LOCK) NO-ERROR.
  790. rBuffer = hBuffer:RECID.
  791. ttTable:EMPTY-TEMP-TABLE ().
  792. CREATE QUERY hQuery.
  793. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR.
  794. hQuery:SET-BUFFERS (hBuffer) NO-ERROR.
  795. hQuery:QUERY-PREPARE (cWhere) NO-ERROR.
  796. hQuery:QUERY-OPEN ().
  797. hQuery:GET-FIRST ().
  798. MESSAGE 'cPrimaryKey = ' cPrimaryKey '- cWhere = ' cWhere.
  799. lOK = FALSE.
  800. DO WHILE NOT hQuery:QUERY-OFF-END:
  801. ii = ii + 1.
  802. IF ii < iStartRecord THEN
  803. DO:
  804. hQuery:GET-NEXT ().
  805. NEXT.
  806. END.
  807. IF NOT lOK AND
  808. ii MOD iMaxRecords = 1 THEN iActualPage = iActualPage + 1.
  809. IF NOT lOK THEN
  810. DO:
  811. IF hBuffer:RECID <> rBuffer THEN
  812. DO:
  813. hQuery:GET-NEXT().
  814. NEXT.
  815. END.
  816. iIndex = ii MOD iMaxRecords.
  817. iStartIndex = ii - iIndex + 1.
  818. DO WHILE ii > iStartIndex:
  819. hQuery:GET-PREV ().
  820. ii = ii - 1.
  821. END.
  822. lOK = TRUE.
  823. END.
  824. IF iCurrentPosition = 0 THEN iCurrentPosition = ii.
  825. i1 = i1 + 1.
  826. IF i1 <= iMaxRecords THEN
  827. DO:
  828. httTable:BUFFER-CREATE().
  829. httTable:BUFFER-COPY(hBuffer).
  830. END.
  831. hQuery:GET-NEXT ().
  832. END.
  833. hQuery:QUERY-CLOSE ().
  834. DELETE OBJECT hBuffer NO-ERROR.
  835. IF ii = 0 THEN RETURN FALSE.
  836. iPageCounter = ii / iMaxRecords.
  837. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1.
  838. oJsonPosition = NEW JsonObject().
  839. oJsonPosition:ADD('page' , iActualPage).
  840. oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */
  841. oRecords = NEW JsonArray().
  842. httTable:WRITE-JSON('JsonArray', oRecords).
  843. oJsonReturn = NEW JsonObject().
  844. oJsonReturn:ADD('records' , oRecords).
  845. oJsonReturn:ADD('maxRecords', ii).
  846. oJsonReturn:ADD('pageCount' , iPageCounter).
  847. oJsonReturn:ADD('position' , oJsonPosition).
  848. outilitiesHandler:writePosition(
  849. INPUT oJsonIdent ,
  850. INPUT cFileName ,
  851. INPUT iCurrentPosition
  852. ).
  853. lRetVal = TRUE.
  854. RETURN lRetVal.
  855. END METHOD.
  856. /*------------------------------------------------------------------------------
  857. Purpose:
  858. Notes:
  859. ------------------------------------------------------------------------------*/
  860. METHOD PUBLIC LOGICAL updateData(
  861. INPUT oJsonIdent AS JsonObject,
  862. INPUT oJsonRecord AS jsonObject,
  863. OUTPUT oJsonReturn AS JsonObject
  864. ):
  865. DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO.
  866. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO.
  867. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  868. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO.
  869. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  870. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  871. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO.
  872. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO.
  873. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
  874. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  875. DEFINE VARIABLE hField AS HANDLE NO-UNDO.
  876. DEFINE VARIABLE htField AS HANDLE NO-UNDO.
  877. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  878. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  879. DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO.
  880. DEFINE VARIABLE rBuffer AS RECID NO-UNDO.
  881. outilitiesHandler = NEW utilitiesHandler().
  882. outilitiesHandler:evaluateFile(
  883. INPUT oJsonIdent ,
  884. OUTPUT cFileName ,
  885. OUTPUT lCompany ,
  886. OUTPUT lActive ,
  887. OUTPUT lWordindex
  888. ).
  889. cFieldReplace = SUBSTITUTE('&1_', cFileName).
  890. cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName).
  891. cFilterReplace = SUBSTITUTE('filter_&1_', cFileName).
  892. cFileReplace = SUBSTITUTE('&1_', cFileName).
  893. iLanguage_id = oJsonIdent:GetInteger('language_id').
  894. ccompany = oJsonIdent:GetCharacter('company').
  895. lOK = outilitiesHandler:getKeyFields(
  896. INPUT oJsonIdent ,
  897. OUTPUT cKeyFields ,
  898. OUTPUT cKeyValues
  899. ).
  900. CREATE TEMP-TABLE ttTable.
  901. ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex'). /* except Field wordindex */
  902. ttTable:TEMP-TABLE-PREPARE ('record').
  903. httTable = ttTable:DEFAULT-BUFFER-HANDLE.
  904. DO ii = 1 TO httTable:NUM-FIELDS:
  905. httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR.
  906. END.
  907. httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
  908. httTable:FIND-FIRST('', NO-LOCK).
  909. // Primary-Index-Fields für WHERE-Statement
  910. CREATE BUFFER hBuffer FOR TABLE cFileName.
  911. cIndexFields = outilitiesHandler:getPrimaryIndexFields(
  912. INPUT cFileName
  913. ).
  914. // Erzeugen von Where-Statement für UNIQUE-Find
  915. cWhere = ''.
  916. DO i1 = 1 TO NUM-ENTRIES(cIndexFields, ';'):
  917. cField = ENTRY(i1, cIndexFields, ';').
  918. hField = httTable:BUFFER-FIELD(cField):HANDLE.
  919. CASE hField:DATA-TYPE:
  920. WHEN 'character' THEN
  921. cValue = QUOTER(hField:BUFFER-VALUE).
  922. WHEN 'logical' THEN
  923. cValue = STRING(hField:BUFFER-VALUE,"TRUE/FALSE").
  924. WHEN 'date' THEN
  925. cValue = STRING(DATE(hField:BUFFER-VALUE)).
  926. OTHERWISE
  927. cValue = hField:BUFFER-VALUE.
  928. END CASE.
  929. cWhere = cWhere
  930. + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ')
  931. + SUBSTITUTE('&1.&2 = ', cFileName, cField)
  932. + cValue.
  933. END.
  934. lRetVal = FALSE.
  935. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  936. lOK = hBuffer:FIND-UNIQUE(cWhere) NO-ERROR.
  937. IF NOT hBuffer:AVAILABLE THEN
  938. DO:
  939. outilitiesHandler:getErrorMessage(
  940. INPUT '1014',
  941. INPUT ilanguage_id,
  942. INPUT '',
  943. OUTPUT lcMessage).
  944. LEAVE.
  945. END.
  946. DO ii = 1 TO httTable:NUM-FIELDS:
  947. hField = hBuffer:BUFFER-FIELD(ii):HANDLE NO-ERROR.
  948. IF ERROR-STATUS:ERROR OR
  949. NOT VALID-HANDLE(hField) THEN NEXT.
  950. htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR.
  951. IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT.
  952. hField:BUFFER-VALUE = htField:BUFFER-VALUE.
  953. END.
  954. hField = hBuffer:BUFFER-FIELD('updated_at'):HANDLE NO-ERROR.
  955. IF NOT ERROR-STATUS:ERROR AND
  956. VALID-HANDLE(hField) THEN hField:BUFFER-VALUE = NOW.
  957. hField = hBuffer:BUFFER-FIELD('wordindex'):HANDLE NO-ERROR.
  958. IF NOT ERROR-STATUS:ERROR AND
  959. VALID-HANDLE(hField) THEN
  960. DO:
  961. cWordIndex = outilitiesHandler:createWordindex(
  962. INPUT hBuffer
  963. ).
  964. hField:BUFFER-VALUE = cWordIndex.
  965. END.
  966. rBuffer = hBuffer:RECID.
  967. oJsonReturn = NEW JsonObject().
  968. oJsonData = NEW JsonObject().
  969. oJsonArray = NEW JsonArray ().
  970. httTable:BUFFER-COPY(hBuffer).
  971. httTable:WRITE-JSON('JsonObject', oJsonData).
  972. oJsonArray = oJsonData:GetJsonArray('record').
  973. oJsonData = oJsonArray:GetJsonObject(1).
  974. oJsonReturn:ADD('record', oJsonData).
  975. hBuffer:BUFFER-RELEASE ().
  976. outilitiesHandler:readSortFields(
  977. INPUT oJsonIdent ,
  978. INPUT cFileName ,
  979. OUTPUT cSortField ,
  980. OUTPUT cDirection ).
  981. // Where-Statement f�r FOR EACH Filename f�r die Anzeige
  982. cWhere = ''.
  983. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)).
  984. IF cKeyFields <> '' THEN
  985. DO:
  986. DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'):
  987. cField = ENTRY(ii, cKeyFields, ';').
  988. cField = REPLACE(cField, cKeyFieldReplace, '').
  989. cField = REPLACE(cField, cFilterReplace, '').
  990. cField = REPLACE(cField, cFileReplace, '').
  991. IF lCompany AND
  992. cField = 'company' THEN NEXT.
  993. cValue = ENTRY(ii, cKeyValues, CHR(01)).
  994. cWhere = cWhere
  995. + (IF cWhere = '' THEN 'WHERE &1.&2 = &3' ELSE ' AND &1.&2 = &3').
  996. cWhere = SUBSTITUTE(cWhere, cFileName, cField, cValue).
  997. END.
  998. END.
  999. CREATE QUERY hQuery.
  1000. hQuery:SET-BUFFERS (hBuffer).
  1001. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere).
  1002. IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection.
  1003. hQuery:QUERY-PREPARE(cWhere).
  1004. hQuery:QUERY-OPEN().
  1005. hQuery:GET-FIRST().
  1006. ii = 0.
  1007. i1 = 0.
  1008. DO WHILE NOT hQuery:QUERY-OFF-END:
  1009. ii = ii + 1.
  1010. IF hBuffer:RECID = rBuffer THEN i1 = ii.
  1011. hQuery:GET-NEXT ().
  1012. END.
  1013. hQuery:QUERY-CLOSE ().
  1014. iPageCounter = i1 / iMaxRecords.
  1015. IF (iPageCounter * iMaxRecords) < i1 THEN iPageCounter = iPageCounter + 1.
  1016. iIndex = i1 MOD iMaxRecords.
  1017. IF iIndex = 0 THEN iIndex = iMaxRecords.
  1018. oJsonPosition = NEW JsonObject().
  1019. oJsonPosition:ADD('page', iPageCounter).
  1020. oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */
  1021. oJsonPosition:ADD('totalRecords', ii).
  1022. oJsonReturn:ADD('position', oJsonPosition).
  1023. lRetVal = TRUE.
  1024. LEAVE.
  1025. END.
  1026. IF NOT lRetVal THEN
  1027. DO:
  1028. oJsonMessage = NEW JsonObject().
  1029. oJsonMessage:ADD('success', FALSE).
  1030. oJsonMessage:ADD('message', lcMessage).
  1031. oJsonMessage:WRITE(lcJsonString, FALSE).
  1032. oJsonReturn = oJsonMessage.
  1033. END.
  1034. RETURN lRetVal.
  1035. CATCH e AS Progress.Lang.Error:
  1036. END CATCH.
  1037. FINALLY:
  1038. END FINALLY.
  1039. END METHOD.
  1040. DESTRUCTOR PUBLIC adminprogsHandler ( ):
  1041. END DESTRUCTOR.
  1042. END CLASS.