adminprogsHandler.cls 50 KB

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