usersHandler.cls 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  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. CLASS admin.usersHandler FINAL:
  17. DEFINE VARIABLE oJsonData AS JsonObject NO-UNDO.
  18. DEFINE VARIABLE oJsonArray AS JsonArray NO-UNDO.
  19. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO.
  20. DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO.
  21. DEFINE VARIABLE ccompany AS CHARACTER NO-UNDO.
  22. DEFINE VARIABLE lcJsonString AS LONGCHAR NO-UNDO.
  23. DEFINE VARIABLE iMaxRecords AS INTEGER NO-UNDO INIT 5.
  24. DEFINE VARIABLE iStartPage AS INTEGER NO-UNDO.
  25. DEFINE VARIABLE iStartRecord AS INTEGER NO-UNDO.
  26. DEFINE VARIABLE iPageCounter AS INTEGER NO-UNDO.
  27. DEFINE VARIABLE httusers AS HANDLE NO-UNDO.
  28. DEFINE VARIABLE ttusers AS HANDLE NO-UNDO.
  29. DEFINE VARIABLE hQuery AS HANDLE NO-UNDO.
  30. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
  31. DEFINE BUFFER busers FOR users.
  32. DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
  33. /*------------------------------------------------------------------------------
  34. Purpose:
  35. Notes:
  36. ------------------------------------------------------------------------------*/
  37. METHOD PUBLIC LOGICAL createData(
  38. INPUT oJsonIdent AS JsonObject,
  39. INPUT oJsonRecord AS jsonObject,
  40. OUTPUT oJsonReturn AS JsonObject
  41. ):
  42. DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO.
  43. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO.
  44. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  45. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  46. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  47. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO.
  48. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO.
  49. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
  50. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  51. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  52. outilitiesHandler = NEW utilitiesHandler().
  53. CREATE TEMP-TABLE ttusers.
  54. ttusers:ADD-FIELDS-FROM ('users', 'wordindex'). /* except Field wordindex */
  55. ttusers:TEMP-TABLE-PREPARE ('record').
  56. httusers = ttusers:DEFAULT-BUFFER-HANDLE.
  57. DO ii = 1 TO httusers:NUM-FIELDS:
  58. httusers:BUFFER-FIELD(ii):SERIALIZE-NAME = 'users_' + httusers:BUFFER-FIELD(ii):NAME NO-ERROR.
  59. END.
  60. httusers:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
  61. httusers:FIND-FIRST('', NO-LOCK).
  62. hBuffer = BUFFER busers:HANDLE.
  63. cuser_name = httusers:BUFFER-FIELD('user_name'):BUFFER-VALUE.
  64. lRetVal = FALSE.
  65. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  66. FIND FIRST users NO-LOCK
  67. WHERE users.user_name = cuser_name NO-ERROR.
  68. IF AVAILABLE users THEN LEAVE.
  69. CREATE busers.
  70. hBuffer = BUFFER busers:HANDLE.
  71. DO ii = 1 TO httusers:NUM-FIELDS:
  72. // IF httusers:BUFFER-FIELD(ii):BUFFER-VALUE = hBuffer:BUFFER-FIELD(ii):BUFFER-VALUE THEN NEXT.
  73. hBuffer:BUFFER-FIELD(ii):BUFFER-VALUE = httusers:BUFFER-FIELD(ii):BUFFER-VALUE.
  74. END.
  75. busers.created_at = NOW.
  76. cWordIndex = outilitiesHandler:createWordindex(
  77. INPUT hBuffer
  78. ).
  79. busers.wordindex = cWordIndex.
  80. oJsonReturn = NEW JsonObject().
  81. oJsonData = NEW JsonObject().
  82. oJsonArray = NEW JsonArray ().
  83. httusers:BUFFER-COPY(hBuffer).
  84. httusers:WRITE-JSON('JsonObject', oJsonData).
  85. oJsonArray = oJsonData:GetJsonArray('record').
  86. oJsonData = oJsonArray:GetJsonObject(1).
  87. oJsonReturn:ADD('record', oJsonData).
  88. RELEASE busers.
  89. FIND userdata
  90. WHERE userdata.user_name = oJsonIdent:GetCharacter('user_name')
  91. AND userdata.company = oJsonIdent:GetCharacter('company')
  92. AND userdata.branch = '0000'
  93. AND userdata.record_type = 'sortField'
  94. AND userdata.section = 'users'
  95. AND userdata.key_type = '' NO-ERROR.
  96. IF AVAILABLE userdata THEN
  97. DO:
  98. ASSIGN
  99. cSortField = userdata.cfield_1
  100. cDirection = userdata.cfield_2.
  101. END.
  102. IF cDirection BEGINS 'asc' THEN cDirection = ''.
  103. hBuffer = BUFFER users:HANDLE.
  104. CREATE QUERY hQuery.
  105. hQuery:SET-BUFFERS (hBuffer).
  106. cWhere = 'FOR EACH users NO-LOCK '.
  107. IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection.
  108. hQuery:QUERY-PREPARE(cWhere).
  109. hQuery:QUERY-OPEN().
  110. hQuery:GET-FIRST().
  111. ii = 0.
  112. i1 = 0.
  113. DO WHILE NOT hQuery:QUERY-OFF-END:
  114. ii = ii + 1.
  115. IF hBuffer:BUFFER-FIELD('user_name'):BUFFER-VALUE = cuser_name THEN i1 = ii.
  116. hQuery:GET-NEXT ().
  117. END.
  118. hQuery:QUERY-CLOSE ().
  119. iPageCounter = i1 / iMaxRecords.
  120. IF (iPageCounter * iMaxRecords) < i1 THEN iPageCounter = iPageCounter + 1.
  121. iIndex = i1 MOD iMaxRecords.
  122. IF iIndex = 0 THEN iIndex = iMaxRecords.
  123. oJsonPosition = NEW JsonObject().
  124. oJsonPosition:ADD('page', iPageCounter).
  125. oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */
  126. oJsonPosition:ADD('totalRecords', ii).
  127. oJsonReturn:ADD('position', oJsonPosition).
  128. lRetVal = TRUE.
  129. LEAVE.
  130. END.
  131. IF NOT lRetVal THEN
  132. DO:
  133. oJsonMessage = NEW JsonObject().
  134. oJsonMessage:ADD('success', FALSE).
  135. oJsonMessage:WRITE(lcJsonString, FALSE).
  136. END.
  137. RETURN lRetVal.
  138. CATCH e AS Progress.Lang.Error:
  139. END CATCH.
  140. FINALLY:
  141. END FINALLY.
  142. END METHOD.
  143. /*------------------------------------------------------------------------------
  144. Purpose:
  145. Notes:
  146. ------------------------------------------------------------------------------*/
  147. METHOD PUBLIC LOGICAL deleteData(
  148. INPUT oJsonIdent AS JsonObject,
  149. INPUT oJsonRecord AS jsonObject,
  150. OUTPUT oJsonReturn AS JsonObject
  151. ):
  152. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  153. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  154. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  155. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO.
  156. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
  157. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  158. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  159. DEFINE VARIABLE rUsers AS RECID NO-UNDO.
  160. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO.
  161. outilitiesHandler = NEW utilitiesHandler().
  162. CREATE TEMP-TABLE ttusers.
  163. ttusers:ADD-FIELDS-FROM ('users', 'wordindex'). /* except Field wordindex */
  164. ttusers:TEMP-TABLE-PREPARE ('record').
  165. httusers = ttusers:DEFAULT-BUFFER-HANDLE.
  166. DO ii = 1 TO httusers:NUM-FIELDS:
  167. httusers:BUFFER-FIELD(ii):SERIALIZE-NAME = 'users_' + httusers:BUFFER-FIELD(ii):NAME NO-ERROR.
  168. END.
  169. httusers:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
  170. httusers:FIND-FIRST('', NO-LOCK).
  171. hBuffer = BUFFER busers:HANDLE.
  172. cuser_name = httusers:BUFFER-FIELD('user_name'):BUFFER-VALUE.
  173. lRetVal = FALSE.
  174. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  175. FIND FIRST users NO-LOCK
  176. WHERE users.user_name = cuser_name NO-ERROR.
  177. IF NOT AVAILABLE users THEN LEAVE.
  178. rUsers = RECID(users).
  179. FIND userdata
  180. WHERE userdata.user_name = oJsonIdent:GetCharacter('user_name')
  181. AND userdata.company = oJsonIdent:GetCharacter('company')
  182. AND userdata.branch = '0000'
  183. AND userdata.record_type = 'sortField'
  184. AND userdata.section = 'users'
  185. AND userdata.key_type = '' NO-ERROR.
  186. IF AVAILABLE userdata THEN
  187. DO:
  188. ASSIGN
  189. cSortField = userdata.cfield_1
  190. cDirection = userdata.cfield_2.
  191. END.
  192. IF cDirection BEGINS 'asc' THEN cDirection = ''.
  193. hBuffer = BUFFER users:HANDLE.
  194. CREATE QUERY hQuery.
  195. hQuery:SET-BUFFERS (hBuffer).
  196. cWhere = 'FOR EACH users NO-LOCK '.
  197. IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection.
  198. hQuery:QUERY-PREPARE(cWhere).
  199. hQuery:QUERY-OPEN().
  200. hQuery:GET-FIRST().
  201. ii = 0.
  202. i1 = 0.
  203. DO WHILE NOT hQuery:QUERY-OFF-END:
  204. ii = ii + 1.
  205. IF hBuffer:BUFFER-FIELD('user_name'):BUFFER-VALUE = cuser_name THEN i1 = ii.
  206. hQuery:GET-NEXT ().
  207. END.
  208. hQuery:QUERY-CLOSE ().
  209. iPageCounter = i1 / iMaxRecords.
  210. IF (iPageCounter * iMaxRecords) < i1 THEN iPageCounter = iPageCounter + 1.
  211. iIndex = i1 MOD iMaxRecords.
  212. IF iIndex = 0 THEN iIndex = iMaxRecords.
  213. FIND users WHERE RECID(users) = rUsers.
  214. DELETE users.
  215. RELEASE users.
  216. lRetVal = TRUE.
  217. oJsonReturn = NEW JsonObject().
  218. oJsonReturn:ADD('success', lRetVal).
  219. oJsonPosition = NEW JsonObject().
  220. oJsonPosition:ADD('page', iPageCounter).
  221. oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */
  222. oJsonPosition:ADD('totalRecords', ii).
  223. oJsonReturn:ADD('position', oJsonPosition).
  224. LEAVE.
  225. END.
  226. RETURN lRetVal.
  227. CATCH e AS Progress.Lang.Error:
  228. END CATCH.
  229. FINALLY:
  230. END FINALLY.
  231. END METHOD.
  232. /*------------------------------------------------------------------------------
  233. Purpose:
  234. Notes:
  235. ------------------------------------------------------------------------------*/
  236. METHOD PUBLIC LOGICAL getChanges(
  237. INPUT oJsonIdent AS JsonObject,
  238. OUTPUT oJsonResult AS JsonObject
  239. ):
  240. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  241. DEFINE VARIABLE cFunction AS CHARACTER NO-UNDO.
  242. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  243. DEFINE VARIABLE cAction AS CHARACTER NO-UNDO.
  244. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  245. DEFINE VARIABLE cKeyFields AS CHARACTER NO-UNDO.
  246. DEFINE VARIABLE cKeyValues AS CHARACTER NO-UNDO.
  247. DEFINE VARIABLE lcJsonString AS LONGCHAR NO-UNDO.
  248. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  249. DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
  250. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  251. DEFINE VARIABLE i2 AS INTEGER NO-UNDO.
  252. DEFINE VARIABLE oJsonfieldUpdates AS JsonObject NO-UNDO.
  253. outilitiesHandler = NEW utilitiesHandler().
  254. cField = oJsonIdent:GetCharacter('field').
  255. cAction = oJsonIdent:GetCharacter('action').
  256. cValue = REPLACE(oJsonIdent:GetCharacter('value'), '+', ' ').
  257. oJsonResult = NEW JsonObject().
  258. oJsonFieldUpdates = NEW JsonObject().
  259. lRetVal = outilitiesHandler:getKeyFields(
  260. INPUT oJsonIdent ,
  261. OUTPUT cKeyFields ,
  262. OUTPUT cKeyValues
  263. ).
  264. cWhere = ''.
  265. lRetVal = FALSE.
  266. DO WHILE TRUE:
  267. DO i1 = 1 TO NUM-ENTRIES(cKeyFields, ';'):
  268. cWhere = cWhere
  269. + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ' )
  270. + SUBSTITUTE('busers.&1 = &2 ',
  271. REPLACE(ENTRY(i1, cKeyFields, ';'), 'users_', ''),
  272. ENTRY(i1, cKeyValues, CHR(01))).
  273. END.
  274. MESSAGE cWhere.
  275. hBuffer = BUFFER busers:HANDLE.
  276. lRetVal = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
  277. IF lRetVal THEN
  278. DO:
  279. CASE cField:
  280. WHEN 'users_firstname' THEN
  281. DO:
  282. IF hBuffer::display_Name = '' THEN
  283. DO:
  284. cString = cValue + ' ' + hBuffer::lastname.
  285. oJsonfieldUpdates:ADD('users_display_name', cString).
  286. END.
  287. IF hBuffer::initials = '' THEN
  288. DO:
  289. cString = TRIM(SUBSTRING(cValue,01,02)) + TRIM(SUBSTRING(hBuffer::lastname,01,02)).
  290. oJsonfieldUpdates:ADD('users_initials', cString).
  291. END.
  292. END.
  293. END CASE.
  294. oJsonResult:ADD('fieldUpdates', oJsonfieldUpdates).
  295. END.
  296. lRetVal = TRUE.
  297. LEAVE.
  298. END.
  299. IF NOT lRetVal THEN
  300. DO:
  301. oJsonResult = NEW JsonObject().
  302. oJsonResult:ADD('success', FALSE).
  303. oJsonResult:ADD('message', 'Fehler beim change').
  304. END.
  305. RETURN lRetVal.
  306. END METHOD.
  307. /*------------------------------------------------------------------------------
  308. Purpose:
  309. Notes:
  310. ------------------------------------------------------------------------------*/
  311. METHOD PUBLIC LOGICAL getData(
  312. INPUT oJsonIdent AS JsonObject,
  313. OUTPUT oJsonReturn AS JsonObject
  314. ):
  315. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  316. DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
  317. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  318. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO INIT ''.
  319. DEFINE VARIABLE cSearchChars AS CHARACTER NO-UNDO INIT ''.
  320. DEFINE VARIABLE lSearch AS LOGICAL NO-UNDO.
  321. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO.
  322. DEFINE VARIABLE lWordIndex AS LOGICAL NO-UNDO INIT FALSE.
  323. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
  324. DEFINE VARIABLE cFilters AS CHARACTER NO-UNDO.
  325. DEFINE VARIABLE cFilter AS CHARACTER NO-UNDO.
  326. DEFINE VARIABLE cFields AS CHARACTER NO-UNDO EXTENT.
  327. DEFINE VARIABLE cField AS CHARACTER NO-UNDO.
  328. DEFINE VARIABLE cDBField AS CHARACTER NO-UNDO.
  329. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO.
  330. DEFINE VARIABLE cType AS CHARACTER NO-UNDO.
  331. DEFINE VARIABLE dDate AS DATE NO-UNDO.
  332. DEFINE VARIABLE oRecords AS JsonArray NO-UNDO.
  333. CREATE BUFFER hBuffer FOR TABLE 'users'.
  334. cuser_name = oJsonIdent:GetCharacter('user_name').
  335. ccompany = oJsonIdent:GetCharacter('company').
  336. cSortField = ''.
  337. cDirection = ''.
  338. iStartPage = 1.
  339. IF oJsonIdent:HAS('page') THEN iStartPage = INTEGER(oJsonIdent:GetCharacter('page')) NO-ERROR.
  340. iStartRecord = ((iStartPage - 1) * iMaxRecords) + 1.
  341. IF oJsonIdent:HAS('search') THEN
  342. DO:
  343. cSearchChars = oJsonIdent:GetCharacter('search').
  344. cSearchChars = REPLACE(cSearchChars, '+', ' ').
  345. lSearch = TRUE.
  346. iMaxRecords = 100.
  347. iStartRecord = 1.
  348. END.
  349. IF lWordIndex THEN
  350. DO:
  351. NEXTFIELD:
  352. DO ii = 1 TO NUM-ENTRIES(cSearchChars, '+'):
  353. cValue = ENTRY(ii, cSearchChars, '+').
  354. DO WHILE TRUE:
  355. i1 = INTEGER(cValue) NO-ERROR.
  356. IF NOT ERROR-STATUS:ERROR AND
  357. i1 > 0 THEN
  358. DO:
  359. cValue = SUBSTITUTE('"&1&2&1","&2"', CHR(01), TRIM(STRING(i1,'>>>>>>>>>9'))).
  360. cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND (')
  361. + '(LOOKUP(' + ENTRY(1, cValue, ',') + ', users.wordindex, " ") > 0 OR '
  362. + 'LOOKUP(' + ENTRY(2, cValue, ',') + ', users.wordindex, " ") > 0) '.
  363. NEXT NEXTFIELD.
  364. END.
  365. dDate = DATE(cValue) NO-ERROR.
  366. IF NOT ERROR-STATUS:ERROR AND
  367. dDate <> ? THEN
  368. DO:
  369. cValue = STRING(dDate,'99.99.9999').
  370. LEAVE.
  371. END.
  372. cValue = QUOTER(cValue).
  373. LEAVE.
  374. END.
  375. cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ')
  376. + 'LOOKUP(' + cValue + ', users.wordindex, " ") > 0 '.
  377. END.
  378. MESSAGE 'search mit Where' cWhere.
  379. END.
  380. ELSE
  381. DO:
  382. IF oJsonIdent:HAS('sortField') THEN
  383. DO:
  384. cSortField = REPLACE(oJsonIdent:GetCharacter('sortField'), 'users_', '').
  385. cDirection = oJsonIdent:GetCharacter('sortDirection').
  386. END.
  387. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  388. FIND userdata
  389. WHERE userdata.user_name = cuser_name
  390. AND userdata.company = ccompany
  391. AND userdata.branch = '0000'
  392. AND userdata.record_type = 'sortField'
  393. AND userdata.section = 'users'
  394. AND userdata.key_type = '' NO-ERROR.
  395. IF NOT AVAILABLE userdata THEN
  396. DO:
  397. CREATE userdata.
  398. ASSIGN
  399. userdata.user_name = cuser_name
  400. userdata.company = ccompany
  401. userdata.branch = '0000'
  402. userdata.record_type = 'sortField'
  403. userdata.section = 'users'
  404. userdata.key_type = '' NO-ERROR.
  405. END.
  406. ASSIGN
  407. userdata.cfield_1 = cSortfield
  408. userdata.cfield_2 = cDirection.
  409. RELEASE userdata.
  410. LEAVE.
  411. END.
  412. cFields = oJsonIdent:GetNames().
  413. cWhere = ''.
  414. DO i1 = 1 TO EXTENT(cFields):
  415. cField = cFields[i1].
  416. IF NOT cField BEGINS 'filter_' THEN NEXT.
  417. cFilter = oJsonIdent:GetCharacter(cField).
  418. cField = REPLACE(cField, 'filter_users_', '').
  419. cType = hBuffer:BUFFER-FIELD(cField):DATA-TYPE.
  420. CASE cType:
  421. WHEN 'character' THEN
  422. cFilter = QUOTER(cFilter).
  423. WHEN 'logical' THEN
  424. cFilter = STRING(cFilter,'yes/no').
  425. WHEN 'date' THEN
  426. cFilter = STRING(DATE(cFilter),'99.99.9999').
  427. END CASE.
  428. cDBField = SUBSTITUTE('users.&1', cField).
  429. cWhere = cWhere
  430. + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ')
  431. + 'INDEX(' + cDBField + ', ' + cFilter + ') > 0 '.
  432. END.
  433. IF NOT cDirection BEGINS 'des' THEN cDirection = ''.
  434. IF cSortField <> '' THEN cWhere = cWhere + 'BY ' + cSortField + ' ' + cDirection.
  435. END.
  436. CREATE TEMP-TABLE ttusers.
  437. ttusers:ADD-FIELDS-FROM ('users', 'wordindex').
  438. IF cSortField <> '' THEN
  439. DO:
  440. ttusers:ADD-NEW-INDEX ('ttuser-k1', FALSE, TRUE). /* UNIQUE, PRIMARY */
  441. IF cDirection BEGINS 'des' THEN ttusers:ADD-INDEX-FIELD ('ttUser-k1', cSortField, 'desc').
  442. ELSE ttusers:ADD-INDEX-FIELD ('ttUser-k1', cSortField).
  443. END.
  444. ttusers:TEMP-TABLE-PREPARE ('records').
  445. httusers = ttusers:DEFAULT-BUFFER-HANDLE.
  446. DO ii = 1 TO httusers:NUM-FIELDS:
  447. httusers:BUFFER-FIELD(ii):SERIALIZE-NAME = 'users_' + httusers:BUFFER-FIELD(ii):NAME NO-ERROR.
  448. END.
  449. MESSAGE '1'.
  450. ii = 0.
  451. i1 = 0.
  452. ttusers:EMPTY-TEMP-TABLE ().
  453. CREATE QUERY hQuery.
  454. hQuery:SET-BUFFERS (hBuffer) NO-ERROR.
  455. hQuery:QUERY-PREPARE (SUBSTITUTE('FOR EACH users NO-LOCK &1 ', cWhere)) NO-ERROR.
  456. MESSAGE ERROR-STATUS:ERROR ERROR-STATUS:GET-MESSAGE(1).
  457. hQuery:QUERY-OPEN ().
  458. MESSAGE hQuery:PREPARE-STRING
  459. hQuery:GET-FIRST ().
  460. MESSAGE '2'.
  461. DO WHILE NOT hQuery:QUERY-OFF-END:
  462. ii = ii + 1.
  463. IF ii < iStartRecord THEN
  464. DO:
  465. hQuery:GET-NEXT ().
  466. NEXT.
  467. END.
  468. i1 = i1 + 1.
  469. IF i1 <= iMaxRecords THEN
  470. DO:
  471. httusers:BUFFER-CREATE().
  472. httusers:BUFFER-COPY(hBuffer).
  473. END.
  474. hQuery:GET-NEXT ().
  475. END.
  476. hQuery:QUERY-CLOSE ().
  477. DELETE OBJECT hBuffer NO-ERROR.
  478. MESSAGE 'Anzahl selektierter Records' ii.
  479. iPageCounter = ii / iMaxRecords.
  480. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1.
  481. oRecords = NEW JsonArray().
  482. httusers:WRITE-JSON('JsonArray', oRecords).
  483. oJsonReturn = NEW JsonObject().
  484. oJsonReturn:ADD('records' , oRecords).
  485. oJsonReturn:ADD('maxRecords', ii).
  486. oJsonReturn:ADD('pageCount' , iPageCounter).
  487. lRetVal = TRUE.
  488. RETURN lRetVal.
  489. END METHOD.
  490. /*------------------------------------------------------------------------------
  491. Purpose:
  492. Notes:
  493. ------------------------------------------------------------------------------*/
  494. METHOD PUBLIC LOGICAL updateData(
  495. INPUT oJsonIdent AS JsonObject,
  496. INPUT oJsonRecord AS jsonObject,
  497. OUTPUT oJsonReturn AS JsonObject
  498. ):
  499. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
  500. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  501. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO.
  502. outilitiesHandler = NEW utilitiesHandler().
  503. CREATE TEMP-TABLE ttusers.
  504. ttusers:ADD-FIELDS-FROM ('users', 'wordindex'). /* except Field wordindex */
  505. ttusers:TEMP-TABLE-PREPARE ('record').
  506. httusers = ttusers:DEFAULT-BUFFER-HANDLE.
  507. DO ii = 1 TO httusers:NUM-FIELDS:
  508. httusers:BUFFER-FIELD(ii):SERIALIZE-NAME = 'users_' + httusers:BUFFER-FIELD(ii):NAME NO-ERROR.
  509. END.
  510. httusers:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
  511. httusers:FIND-FIRST('', NO-LOCK).
  512. hBuffer = BUFFER busers:HANDLE.
  513. cuser_name = httusers:BUFFER-FIELD('user_name'):BUFFER-VALUE.
  514. REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
  515. FIND busers
  516. WHERE busers.user_name = cuser_name NO-ERROR.
  517. DO ii = 1 TO httusers:NUM-FIELDS:
  518. IF httusers:BUFFER-FIELD(ii):BUFFER-VALUE = hBuffer:BUFFER-FIELD(ii):BUFFER-VALUE THEN NEXT.
  519. hBuffer:BUFFER-FIELD(ii):BUFFER-VALUE = httusers:BUFFER-FIELD(ii):BUFFER-VALUE.
  520. END.
  521. busers.updated_at = NOW.
  522. cWordIndex = outilitiesHandler:createWordindex(
  523. INPUT hBuffer
  524. ).
  525. busers.wordindex = cWordIndex.
  526. oJsonReturn = NEW JsonObject().
  527. oJsonData = NEW JsonObject().
  528. oJsonArray = NEW JsonArray ().
  529. httusers:BUFFER-COPY(hBuffer).
  530. httusers:WRITE-JSON('JsonObject', oJsonData).
  531. oJsonArray = oJsonData:GetJsonArray('record').
  532. oJsonData = oJsonArray:GetJsonObject(1).
  533. oJsonReturn:ADD('record', oJsonData).
  534. RELEASE busers.
  535. lRetVal = TRUE.
  536. LEAVE.
  537. END.
  538. RETURN lRetVal.
  539. CATCH e AS Progress.Lang.Error:
  540. END CATCH.
  541. FINALLY:
  542. END FINALLY.
  543. END METHOD.
  544. DESTRUCTOR PUBLIC usersHandler ( ):
  545. END DESTRUCTOR.
  546. END CLASS.