adminprogsHandler.cls 55 KB

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