/*------------------------------------------------------------------------ File : usersHandler Purpose : Syntax : Description : Author(s) : walter.riechsteiner Created : Fri Nov 21 11:31:01 CET 2025 Notes : ----------------------------------------------------------------------*/ BLOCK-LEVEL ON ERROR UNDO, THROW. USING Progress.Json.ObjectModel.JsonObject FROM PROPATH. USING Progress.Json.ObjectModel.JsonArray FROM PROPATH. USING utilities.utilitiesHandler FROM PROPATH. USING Progress.Json.ObjectModel.ObjectModelParser FROM PROPATH. USING OpenEdge.DataAdmin.IIndex FROM PROPATH. USING OpenEdge.Web.DataObject.Writer.JsonObjectValueWriter FROM PROPATH. CLASS admin.adminprogsHandler FINAL: DEFINE VARIABLE oJsonData AS JsonObject NO-UNDO. DEFINE VARIABLE oJsonArray AS JsonArray NO-UNDO. DEFINE VARIABLE oParser AS ObjectModelParser NO-UNDO. DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO. DEFINE VARIABLE ccompany AS CHARACTER NO-UNDO. DEFINE VARIABLE lcJsonString AS LONGCHAR NO-UNDO. DEFINE VARIABLE iLanguage_id AS INTEGER NO-UNDO. DEFINE VARIABLE oRecords AS JsonArray NO-UNDO. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO. DEFINE VARIABLE cFileName AS CHARACTER NO-UNDO. DEFINE VARIABLE lCompany AS LOGICAL NO-UNDO. DEFINE VARIABLE lActive AS LOGICAL NO-UNDO. DEFINE VARIABLE lWordindex AS LOGICAL NO-UNDO. DEFINE VARIABLE iMaxRecords AS INTEGER NO-UNDO INIT 20. DEFINE VARIABLE iStartPage AS INTEGER NO-UNDO. DEFINE VARIABLE iStartRecord AS INTEGER NO-UNDO. DEFINE VARIABLE iPageCounter AS INTEGER NO-UNDO. DEFINE VARIABLE iCurrentPosition AS INTEGER NO-UNDO. DEFINE VARIABLE cFieldReplace AS CHARACTER NO-UNDO. DEFINE VARIABLE cKeyFieldReplace AS CHARACTER NO-UNDO. DEFINE VARIABLE cFilterReplace AS CHARACTER NO-UNDO. DEFINE VARIABLE cFileReplace AS CHARACTER NO-UNDO. DEFINE VARIABLE cKeyFields AS CHARACTER NO-UNDO. DEFINE VARIABLE cKeyValues AS CHARACTER NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE cString AS CHARACTER NO-UNDO. DEFINE VARIABLE cMessage AS CHARACTER NO-UNDO. DEFINE VARIABLE lcMessage AS LONGCHAR NO-UNDO. DEFINE VARIABLE iActualPage AS INTEGER NO-UNDO. DEFINE VARIABLE cPrimaryKey AS CHARACTER NO-UNDO. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO. DEFINE VARIABLE iStartIndex AS INTEGER NO-UNDO. DEFINE VARIABLE httTable AS HANDLE NO-UNDO. DEFINE VARIABLE ttTable AS HANDLE NO-UNDO. DEFINE VARIABLE hQuery AS HANDLE NO-UNDO. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL createData( INPUT oJsonIdent AS JsonObject, INPUT oJsonRecord AS jsonObject, OUTPUT oJsonReturn AS JsonObject ): DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO. DEFINE VARIABLE hField AS HANDLE NO-UNDO. DEFINE VARIABLE htField AS HANDLE NO-UNDO. DEFINE VARIABLE cField AS CHARACTER NO-UNDO. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO. DEFINE VARIABLE rBuffer AS RECID NO-UNDO. outilitiesHandler = NEW utilitiesHandler(). outilitiesHandler:evaluateFile( INPUT oJsonIdent , OUTPUT cFileName , OUTPUT lCompany , OUTPUT lActive , OUTPUT lWordindex ). cFieldReplace = SUBSTITUTE('&1_', cFileName). cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName). cFilterReplace = SUBSTITUTE('filter_&1_', cFileName). cFileReplace = SUBSTITUTE('&1_', cFileName). iLanguage_id = oJsonIdent:GetInteger('language_id'). lOK = outilitiesHandler:getKeyFields( INPUT oJsonIdent , OUTPUT cKeyFields , OUTPUT cKeyValues ). CREATE TEMP-TABLE ttTable. ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex'). /* except Field wordindex */ ttTable:TEMP-TABLE-PREPARE ('record'). httTable = ttTable:DEFAULT-BUFFER-HANDLE. DO ii = 1 TO httTable:NUM-FIELDS: httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR. END. httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR. httTable:FIND-FIRST('', NO-LOCK). CREATE BUFFER hBuffer FOR TABLE cFileName. cIndexFields = outilitiesHandler:getPrimaryIndexFields( INPUT cFileName ). cWhere = ''. DO i1 = 1 TO NUM-ENTRIES(cIndexFields, ';'): cField = ENTRY(i1, cIndexFields, ';'). hField = httTable:BUFFER-FIELD(cField):HANDLE. CASE hField:DATA-TYPE: WHEN 'character' THEN cValue = QUOTER(hField:BUFFER-VALUE). WHEN 'logical' THEN cValue = STRING(hField:BUFFER-VALUE,"TRUE/FALSE"). WHEN 'date' THEN cValue = STRING(DATE(hField:BUFFER-VALUE)). OTHERWISE cValue = hField:BUFFER-VALUE. END CASE. cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ') + SUBSTITUTE('&1.&2 = ', cFileName, cField) + cValue. END. lRetVal = FALSE. REPEAT TRANSACTION ON ERROR UNDO, LEAVE: lOK = hBuffer:FIND-UNIQUE(cWhere) NO-ERROR. IF hBuffer:AVAILABLE THEN DO: outilitiesHandler:getErrorMessage( INPUT '1023', INPUT ilanguage_id, INPUT '', OUTPUT lcMessage). LEAVE. END. hBuffer:BUFFER-CREATE (). DO ii = 1 TO httTable:NUM-FIELDS: hField = hBuffer:BUFFER-FIELD(ii):HANDLE NO-ERROR. IF ERROR-STATUS:ERROR OR NOT VALID-HANDLE(hField) THEN NEXT. htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR. IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT. hField:BUFFER-VALUE = htField:BUFFER-VALUE. END. htField = httTable:BUFFER-FIELD('created_at'):HANDLE NO-ERROR. IF NOT ERROR-STATUS:ERROR AND VALID-HANDLE(htField) THEN htField:BUFFER-VALUE = NOW. htField = httTable:BUFFER-FIELD('wordindex'):HANDLE NO-ERROR. IF NOT ERROR-STATUS:ERROR AND VALID-HANDLE(htField) THEN DO: cWordIndex = outilitiesHandler:createWordindex( INPUT hBuffer ). htField:BUFFER-VALUE = cWordIndex. END. rBuffer = hBuffer:RECID. hBuffer:BUFFER-RELEASE (). lRetVal = TRUE. LEAVE. END. DO WHILE TRUE: outilitiesHandler:readLastcWhere( INPUT oJsonIdent, INPUT cFileName , OUTPUT cWhere ). // MESSAGE 'readlastcwhere = ' cWhere. ASSIGN ii = 0 i1 = 0 iActualPage = 0 iCurrentPosition = 0. ttTable:EMPTY-TEMP-TABLE (). CREATE QUERY hQuery. hQuery:SET-BUFFERS (hBuffer) NO-ERROR. hQuery:QUERY-PREPARE (cWhere) NO-ERROR. hQuery:QUERY-OPEN (). hQuery:GET-FIRST (). // MESSAGE 'cPrimaryKey = ' cPrimaryKey '- cWhere = ' cWhere. lOK = FALSE. DO WHILE NOT hQuery:QUERY-OFF-END: ii = ii + 1. IF ii < iStartRecord THEN DO: hQuery:GET-NEXT (). NEXT. END. IF NOT lOK AND ii MOD iMaxRecords = 1 THEN iActualPage = iActualPage + 1. IF NOT lOK THEN DO: IF hBuffer:RECID <> rBuffer THEN DO: hQuery:GET-NEXT(). NEXT. END. iIndex = ii MOD iMaxRecords. iStartIndex = ii - iIndex + 1. DO WHILE ii > iStartIndex: hQuery:GET-PREV (). ii = ii - 1. END. lOK = TRUE. END. IF iCurrentPosition = 0 THEN iCurrentPosition = ii. i1 = i1 + 1. hQuery:GET-NEXT (). END. hQuery:QUERY-CLOSE (). DELETE OBJECT hBuffer NO-ERROR. IF ii = 0 THEN RETURN FALSE. iPageCounter = ii / iMaxRecords. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1. oJsonPosition = NEW JsonObject(). oJsonPosition:ADD('page' , iActualPage). oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */ oRecords = NEW JsonArray(). httTable:WRITE-JSON('JsonArray', oRecords). oJsonReturn = NEW JsonObject(). // oJsonReturn:ADD('records' , oRecords). oJsonReturn:ADD('maxRecords', ii). oJsonReturn:ADD('pageCount' , iPageCounter). oJsonReturn:ADD('position' , oJsonPosition). outilitiesHandler:writePosition( INPUT oJsonIdent , INPUT cFileName , INPUT iCurrentPosition ). lRetVal = TRUE. RETURN lRetVal. END. IF NOT lRetVal THEN DO: oJsonMessage = NEW JsonObject(). oJsonMessage:ADD('success', FALSE). oJsonMessage:ADD('message', lcMessage). oJsonMessage:WRITE(lcJsonString, FALSE). oJsonReturn = oJsonMessage. END. RETURN lRetVal. CATCH e AS Progress.Lang.Error: END CATCH. FINALLY: END FINALLY. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL deleteData( INPUT oJsonIdent AS JsonObject, INPUT oJsonRecord AS jsonObject, OUTPUT oJsonReturn AS JsonObject ): DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO. DEFINE VARIABLE hField AS HANDLE NO-UNDO. DEFINE VARIABLE cField AS CHARACTER NO-UNDO. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO. DEFINE VARIABLE rBuffer AS ROWID NO-UNDO. outilitiesHandler = NEW utilitiesHandler(). outilitiesHandler:evaluateFile( INPUT oJsonIdent , OUTPUT cFileName , OUTPUT lCompany , OUTPUT lActive , OUTPUT lWordindex ). cFieldReplace = SUBSTITUTE('&1_', cFileName). cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName). cFilterReplace = SUBSTITUTE('filter_&1_', cFileName). cFileReplace = SUBSTITUTE('&1_', cFileName). iLanguage_id = oJsonIdent:GetInteger('language_id'). ccompany = oJsonIdent:GetCharacter('company'). lOK = outilitiesHandler:getKeyFields( INPUT oJsonIdent , OUTPUT cKeyFields , OUTPUT cKeyValues ). CREATE TEMP-TABLE ttTable. ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex'). /* except Field wordindex */ ttTable:TEMP-TABLE-PREPARE ('record'). httTable = ttTable:DEFAULT-BUFFER-HANDLE. DO ii = 1 TO httTable:NUM-FIELDS: httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR. END. httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR. httTable:FIND-FIRST('', NO-LOCK). // Primary-Index-Fields fuer WHERE-Statement CREATE BUFFER hBuffer FOR TABLE cFileName. cIndexFields = outilitiesHandler:getPrimaryIndexFields( INPUT cFileName ). // Erzeugen von Where-Statement für UNIQUE-Find cWhere = ''. DO i1 = 1 TO NUM-ENTRIES(cIndexFields, ';'): cField = ENTRY(i1, cIndexFields, ';'). hField = httTable:BUFFER-FIELD(cField):HANDLE. CASE hField:DATA-TYPE: WHEN 'character' THEN cValue = QUOTER(hField:BUFFER-VALUE). WHEN 'logical' THEN cValue = STRING(hField:BUFFER-VALUE,"TRUE/FALSE"). WHEN 'date' THEN cValue = STRING(DATE(hField:BUFFER-VALUE)). OTHERWISE cValue = hField:BUFFER-VALUE. END CASE. cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ') + SUBSTITUTE('&1.&2 = ', cFileName, cField) + cValue. END. lRetVal = FALSE. REPEAT TRANSACTION ON ERROR UNDO, LEAVE: lOK = hBuffer:FIND-UNIQUE (cWhere, NO-LOCK ) NO-ERROR. IF NOT lOK THEN DO: outilitiesHandler:getErrorMessage( INPUT '1014', INPUT ilanguage_id, INPUT '', OUTPUT lcMessage). LEAVE. END. rBuffer = hBuffer:ROWID. FIND userdata WHERE userdata.user_name = oJsonIdent:GetCharacter('user_name') AND userdata.company = oJsonIdent:GetCharacter('company') AND userdata.branch = '0000' AND userdata.record_type = 'sortField' AND userdata.section = cFileName AND userdata.key_type = '' NO-ERROR. IF AVAILABLE userdata THEN DO: ASSIGN cSortField = userdata.cfield_1 cDirection = userdata.cfield_2. END. IF cDirection BEGINS 'asc' THEN cDirection = ''. // Where-Statement f�r FOR EACH Filename f�r die Anzeige cWhere = ''. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)). IF cKeyFields <> '' THEN DO: DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'): cField = ENTRY(ii, cKeyFields, ';'). cField = REPLACE(cField, cKeyFieldReplace, ''). cField = REPLACE(cField, cFilterReplace, ''). cField = REPLACE(cField, cFileReplace, ''). cValue = ENTRY(ii, cKeyValues, CHR(01)). IF lCompany AND cFIeld = 'company' THEN NEXT. cValue = ENTRY(ii, cKeyValues, CHR(01)). cWhere = cWhere + (IF cWhere = '' THEN 'WHERE &1.&2 = &3' ELSE ' AND &1.&2 = &3'). cWhere = SUBSTITUTE(cWhere, cFileName, cField, cValue). END. END. CREATE QUERY hQuery. hQuery:SET-BUFFERS (hBuffer). cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere). IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection. hQuery:QUERY-PREPARE(cWhere). hQuery:QUERY-OPEN(). hQuery:GET-FIRST(). ii = 0. i1 = 0. DO WHILE NOT hQuery:QUERY-OFF-END: ii = ii + 1. IF hBuffer:ROWID = rBuffer THEN i1 = ii. hQuery:GET-NEXT (). END. hQuery:QUERY-CLOSE (). iPageCounter = i1 / iMaxRecords. IF (iPageCounter * iMaxRecords) < i1 THEN iPageCounter = iPageCounter + 1. iIndex = i1 MOD iMaxRecords. IF iIndex = 0 THEN iIndex = iMaxRecords. lOK = hBuffer:FIND-BY-ROWID (rBuffer, EXCLUSIVE-LOCK) NO-ERROR. hField = hBuffer:BUFFER-FIELD('active'):HANDLE NO-ERROR. IF NOT ERROR-STATUS:ERROR AND VALID-HANDLE(hField) THEN DO: hField:BUFFER-VALUE = FALSE. hField = hBuffer:BUFFER-FIELD('updated_at'):HANDLE NO-ERROR. IF NOT ERROR-STATUS:ERROR AND VALID-HANDLE(hField) THEN hField:BUFFER-VALUE = NOW. END. ELSE DO: hBuffer:BUFFER-DELETE (). END. hBuffer:BUFFER-RELEASE (). lRetVal = TRUE. oJsonReturn = NEW JsonObject(). oJsonReturn:ADD('success', lRetVal). oJsonPosition = NEW JsonObject(). oJsonPosition:ADD('page', iPageCounter). oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */ oJsonPosition:ADD('totalRecords', ii). oJsonReturn:ADD('position', oJsonPosition). LEAVE. END. RETURN lRetVal. CATCH e AS Progress.Lang.Error: END CATCH. FINALLY: END FINALLY. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL getChanges( INPUT oJsonIdent AS JsonObject, OUTPUT oJsonResult AS JsonObject ): /* DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE cFunction AS CHARACTER NO-UNDO. DEFINE VARIABLE cField AS CHARACTER NO-UNDO. DEFINE VARIABLE cAction AS CHARACTER NO-UNDO. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. DEFINE VARIABLE lcJsonString AS LONGCHAR NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE i2 AS INTEGER NO-UNDO. DEFINE VARIABLE oJsonfieldUpdates AS JsonObject NO-UNDO. outilitiesHandler = NEW utilitiesHandler(). cField = oJsonIdent:GetCharacter('field'). cAction = oJsonIdent:GetCharacter('action'). cValue = REPLACE(oJsonIdent:GetCharacter('value'), '+', ' '). oJsonResult = NEW JsonObject(). oJsonFieldUpdates = NEW JsonObject(). lRetVal = outilitiesHandler:getKeyFields( INPUT oJsonIdent , OUTPUT cKeyFields , OUTPUT cKeyValues ). cWhere = ''. lRetVal = FALSE. DO WHILE TRUE: DO i1 = 1 TO NUM-ENTRIES(cKeyFields, ';'): cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ' ) + SUBSTITUTE('busers.&1 = &2 ', REPLACE(ENTRY(i1, cKeyFields, ';'), 'users_', ''), QUOTER (ENTRY(i1, cKeyValues, CHR(01)))). END. MESSAGE cWhere. hBuffer = BUFFER busers:HANDLE. lRetVal = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR. IF lRetVal THEN DO: CASE cField: WHEN 'users_firstname' THEN DO: IF hBuffer::display_Name = '' THEN DO: cString = cValue + ' ' + hBuffer::lastname. oJsonfieldUpdates:ADD('users_display_name', cString). END. IF hBuffer::initials = '' THEN DO: cString = TRIM(SUBSTRING(cValue,01,02)) + TRIM(SUBSTRING(hBuffer::lastname,01,02)). oJsonfieldUpdates:ADD('users_initials', cString). END. END. END CASE. oJsonResult:ADD('fieldUpdates', oJsonfieldUpdates). END. lRetVal = TRUE. LEAVE. END. IF NOT lRetVal THEN DO: oJsonResult = NEW JsonObject(). oJsonResult:ADD('success', FALSE). oJsonResult:ADD('message', 'Fehler beim change'). END. RETURN lRetVal. */ END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL getData( INPUT oJsonIdent AS JsonObject, OUTPUT oJsonReturn AS JsonObject ): DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE iNumerisch AS INTEGER NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO INIT ''. DEFINE VARIABLE cSearchChars AS CHARACTER NO-UNDO INIT ''. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. DEFINE VARIABLE lSearch AS LOGICAL NO-UNDO INIT FALSE. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO. DEFINE VARIABLE cFilters AS CHARACTER NO-UNDO. DEFINE VARIABLE cFilter AS CHARACTER NO-UNDO. DEFINE VARIABLE cFields AS CHARACTER NO-UNDO EXTENT. DEFINE VARIABLE cField AS CHARACTER NO-UNDO. DEFINE VARIABLE cDBField AS CHARACTER NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE cType AS CHARACTER NO-UNDO. DEFINE VARIABLE lChange AS LOGICAL NO-UNDO. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE oRecords AS JsonArray NO-UNDO. outilitiesHandler = NEW utilitiesHandler(). // // Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält outilitiesHandler:evaluateFile( INPUT oJsonIdent , OUTPUT cFileName , OUTPUT lCompany , OUTPUT lActive , OUTPUT lWordindex ). cFieldReplace = SUBSTITUTE('&1_', cFileName). cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName). cFilterReplace = SUBSTITUTE('filter_&1_', cFileName). lOK = outilitiesHandler:getKeyFields( INPUT oJsonIdent , OUTPUT cKeyFields , OUTPUT cKeyValues ). CREATE BUFFER hBuffer FOR TABLE cFileName. cuser_name = oJsonIdent:GetCharacter('user_name'). ccompany = oJsonIdent:GetCharacter('company'). lChange = (IF oJsonIdent:HAS('change') THEN TRUE ELSE FALSE). cSortField = ''. cDirection = ''. cWhere = ''. iStartPage = 1. IF oJsonIdent:HAS('page') THEN iStartPage = INTEGER(oJsonIdent:GetCharacter('page')) NO-ERROR. iStartRecord = ((iStartPage - 1) * iMaxRecords) + 1. IF oJsonIdent:HAS('search') THEN DO: cSearchChars = oJsonIdent:GetCharacter('search'). cSearchChars = REPLACE(cSearchChars, '+', ' '). lSearch = TRUE. iMaxRecords = 100. iStartRecord = 1. END. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)). IF cKeyFields <> '' THEN DO: DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'): cString = ENTRY(ii, cKeyFIelds, ';'). cString = REPLACE(cString, cKeyFieldReplace, ''). cString = REPLACE(cString, cFieldReplace, ''). IF cString = 'company' AND lCompany THEN NEXT. cValue = ENTRY(ii, cKeyValues, CHR(01)). cString = SUBSTITUTE('&1.&2 = &3 ', cFileName, cString, cValue). cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ') + cString. END. END. outilitiesHandler:writeStartcWhere( INPUT oJsonIdent, INPUT cFileName , INPUT cWhere ). // MESSAGE 'Start - cWhere ' cWhere. IF lSearch THEN DO: DO ii = 1 TO NUM-ENTRIES(cSearchChars, ' '): cValue = ENTRY(ii, cSearchChars, ' '). iNumerisch = INTEGER(cValue) NO-ERROR. cWhere = cWhere + (IF cWhere = '' THEN ' WHERE ' ELSE 'AND '). IF NOT ERROR-STATUS:ERROR AND iNumerisch > 0 THEN cValue = SUBSTITUTE('&1&2&1', CHR(01), TRIM(STRING(iNumerisch,'>>>>>>>>9-'))). cWhere = cWhere + 'LOOKUP(' + QUOTER(cValue) + ', ' + cFileName + '.wordindex, " ") > 0 '. END. END. ELSE DO: IF oJsonIdent:HAS('sortField') THEN DO: cSortField = REPLACE(oJsonIdent:GetCharacter('sortField'), cFieldReplace, ''). cDirection = oJsonIdent:GetCharacter('sortDirection'). END. outilitiesHandler:writeSortfields( INPUT oJsonIdent, INPUT cFileName , INPUT cSortField , INPUT cDirection ). cFields = oJsonIdent:GetNames(). DO i1 = 1 TO EXTENT(cFields): cField = cFields[i1]. IF NOT cField BEGINS 'filter_' THEN NEXT. cFilter = oJsonIdent:GetCharacter(cField). cField = REPLACE(cField, cFilterReplace, ''). cType = hBuffer:BUFFER-FIELD(cField):DATA-TYPE. CASE cType: WHEN 'character' THEN cFilter = QUOTER(cFilter). WHEN 'logical' THEN cFilter = STRING(cFilter,'yes/no'). WHEN 'date' THEN cFilter = STRING(DATE(cFilter),'99.99.9999'). END CASE. cDBField = SUBSTITUTE('&1.&2', cFileName, cField). cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ') + 'INDEX(' + cDBField + ', ' + cFilter + ') > 0 '. END. END. // MESSAGE 'cWhere = ' cWhere. IF NOT cDirection BEGINS 'des' THEN cDirection = ''. IF cSortField <> '' THEN cWhere = cWhere + 'BY ' + cSortField + ' ' + cDirection. CREATE TEMP-TABLE ttTable. ttTable:ADD-FIELDS-FROM (cFilename, 'wordindex'). IF cSortField <> '' THEN DO: ttTable:ADD-NEW-INDEX ('ttTable-k1', FALSE, TRUE). /* UNIQUE, PRIMARY */ IF cDirection BEGINS 'des' THEN ttTable:ADD-INDEX-FIELD ('ttTable-k1', cSortField, 'desc'). ELSE ttTable:ADD-INDEX-FIELD ('ttTable-k1', cSortField). END. ttTable:TEMP-TABLE-PREPARE ('records'). httTable = ttTable:DEFAULT-BUFFER-HANDLE. DO ii = 1 TO httTable:NUM-FIELDS: httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR. END. // MESSAGE 'cWhere beim Start des lesens ' cWhere. ii = 0. i1 = 0. ttTable:EMPTY-TEMP-TABLE (). CREATE QUERY hQuery. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR. // MESSAGE 'writeLastcWhere fuer Datei' cFileName 'ist' cWhere. outilitiesHandler:writeLastcWhere( INPUT oJsonIdent , INPUT cFileName , INPUT cWhere ). MESSAGE 'cWhere vor replacing ' cWhere. cWhere = REPLACE(cWhere, 'FOR', 'PRESELECT'). MESSAGE 'cWhere nach replacing ' cWhere. hQuery:SET-BUFFERS (hBuffer) NO-ERROR. hQuery:QUERY-PREPARE (cWhere) NO-ERROR. hQuery:QUERY-OPEN (). /* hQuery:GET-LAST ().*/ MESSAGE 'Azzahl Query-Datensaetze = ' hQuery:NUM-RESULTS. hQuery:GET-FIRST (). iCurrentPosition = 0. DO WHILE NOT hQuery:QUERY-OFF-END: ii = ii + 1. IF ii < iStartRecord THEN DO: hQuery:GET-NEXT (). NEXT. END. IF iCurrentPosition = 0 THEN iCurrentPosition = ii. i1 = i1 + 1. IF i1 <= iMaxRecords THEN DO: httTable:BUFFER-CREATE(). httTable:BUFFER-COPY(hBuffer). END. hQuery:GET-NEXT (). END. hQuery:QUERY-CLOSE (). DELETE OBJECT hBuffer NO-ERROR. iPageCounter = ii / iMaxRecords. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1. oRecords = NEW JsonArray(). httTable:WRITE-JSON('JsonArray', oRecords). oJsonReturn = NEW JsonObject(). oJsonReturn:ADD('records' , oRecords). oJsonReturn:ADD('maxRecords', ii). oJsonReturn:ADD('pageCount' , iPageCounter). outilitiesHandler:writePosition( INPUT oJsonIdent , INPUT cFileName , INPUT iCurrentPosition ). oJsonReturn:WriteFile('C:\TEMP\getData_messages.json', TRUE). lRetVal = TRUE. RETURN lRetVal. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL rebuildData( INPUT oJsonIdent AS JsonObject, OUTPUT oJsonReturn AS JsonObject ): DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE iNumerisch AS INTEGER NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO INIT ''. DEFINE VARIABLE cSearchChars AS CHARACTER NO-UNDO INIT ''. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO. DEFINE VARIABLE cFields AS CHARACTER NO-UNDO EXTENT. DEFINE VARIABLE cField AS CHARACTER NO-UNDO. DEFINE VARIABLE cDBField AS CHARACTER NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE cType AS CHARACTER NO-UNDO. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE rBuffer AS RECID NO-UNDO. outilitiesHandler = NEW utilitiesHandler(). outilitiesHandler:evaluateFile( INPUT oJsonIdent , OUTPUT cFileName , OUTPUT lCompany , OUTPUT lActive , OUTPUT lWordindex ). cFieldReplace = SUBSTITUTE('&1_' , cFileName). cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName). cFilterReplace = SUBSTITUTE('filter_&1_' , cFileName). lOK = outilitiesHandler:getKeyFields( INPUT oJsonIdent , OUTPUT cKeyFields , OUTPUT cKeyValues ). CREATE BUFFER hBuffer FOR TABLE cFileName. cuser_name = oJsonIdent:GetCharacter('user_name'). ccompany = oJsonIdent:GetCharacter('company'). cSortField = ''. cDirection = ''. cWhere = ''. cPrimaryKey = ''. iStartPage = 1. iStartRecord = 1. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)). IF cKeyFields <> '' THEN DO: DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'): cString = ENTRY(ii, cKeyFIelds, ';'). cString = REPLACE(cString, cKeyFieldReplace, ''). cString = REPLACE(cString, cFieldReplace, ''). IF cString = 'company' THEN NEXT. cString = SUBSTITUTE('&1.&2 = &3 ', cFileName, cString, ENTRY(ii, cKeyValues, CHR(01))). cPrimaryKey = cPrimaryKey + (IF cPrimaryKey = '' THEN 'WHERE ' ELSE 'AND ') + cString. END. END. outilitiesHandler:readStartcWhere( INPUT oJsonIdent, INPUT cFileName , OUTPUT cWhere ). outilitiesHandler:readSortFields( INPUT oJsonIdent, INPUT cFileName , OUTPUT cSortField, OUTPUT cDirection). IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection. CREATE TEMP-TABLE ttTable. ttTable:ADD-FIELDS-FROM (cFilename, 'wordindex'). IF cSortField <> '' THEN DO: ttTable:ADD-NEW-INDEX ('ttTable-k1', FALSE, TRUE). /* UNIQUE, PRIMARY */ ttTable:ADD-INDEX-FIELD ('ttTable-k1', cSortField, cDirection). END. ttTable:TEMP-TABLE-PREPARE ('records'). httTable = ttTable:DEFAULT-BUFFER-HANDLE. DO ii = 1 TO httTable:NUM-FIELDS: httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR. END. MESSAGE 'cWhere beim Start des lesens ' cWhere. ASSIGN ii = 0 i1 = 0 iActualPage = 0 iCurrentPosition = 0. hBuffer:FIND-UNIQUE(cPrimaryKey, NO-LOCK) NO-ERROR. rBuffer = hBuffer:RECID. ttTable:EMPTY-TEMP-TABLE (). CREATE QUERY hQuery. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR. hQuery:SET-BUFFERS (hBuffer) NO-ERROR. hQuery:QUERY-PREPARE (cWhere) NO-ERROR. hQuery:QUERY-OPEN (). hQuery:GET-FIRST (). MESSAGE 'cPrimaryKey = ' cPrimaryKey '- cWhere = ' cWhere. lOK = FALSE. DO WHILE NOT hQuery:QUERY-OFF-END: ii = ii + 1. IF ii < iStartRecord THEN DO: hQuery:GET-NEXT (). NEXT. END. IF NOT lOK AND ii MOD iMaxRecords = 1 THEN iActualPage = iActualPage + 1. IF NOT lOK THEN DO: IF hBuffer:RECID <> rBuffer THEN DO: hQuery:GET-NEXT(). NEXT. END. iIndex = ii MOD iMaxRecords. iStartIndex = ii - iIndex + 1. DO WHILE ii > iStartIndex: hQuery:GET-PREV (). ii = ii - 1. END. lOK = TRUE. END. IF iCurrentPosition = 0 THEN iCurrentPosition = ii. i1 = i1 + 1. IF i1 <= iMaxRecords THEN DO: httTable:BUFFER-CREATE(). httTable:BUFFER-COPY(hBuffer). END. hQuery:GET-NEXT (). END. hQuery:QUERY-CLOSE (). DELETE OBJECT hBuffer NO-ERROR. IF ii = 0 THEN RETURN FALSE. iPageCounter = ii / iMaxRecords. IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1. oJsonPosition = NEW JsonObject(). oJsonPosition:ADD('page' , iActualPage). oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */ oRecords = NEW JsonArray(). httTable:WRITE-JSON('JsonArray', oRecords). oJsonReturn = NEW JsonObject(). oJsonReturn:ADD('records' , oRecords). oJsonReturn:ADD('maxRecords', ii). oJsonReturn:ADD('pageCount' , iPageCounter). oJsonReturn:ADD('position' , oJsonPosition). outilitiesHandler:writePosition( INPUT oJsonIdent , INPUT cFileName , INPUT iCurrentPosition ). lRetVal = TRUE. RETURN lRetVal. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL updateData( INPUT oJsonIdent AS JsonObject, INPUT oJsonRecord AS jsonObject, OUTPUT oJsonReturn AS JsonObject ): DEFINE VARIABLE oJsonMessage AS JsonObject NO-UNDO. DEFINE VARIABLE oJsonPosition AS JsonObject NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE lOK AS LOGICAL NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE iIndex AS INTEGER NO-UNDO. DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO. DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO. DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO. DEFINE VARIABLE hField AS HANDLE NO-UNDO. DEFINE VARIABLE htField AS HANDLE NO-UNDO. DEFINE VARIABLE cField AS CHARACTER NO-UNDO. DEFINE VARIABLE cValue AS CHARACTER NO-UNDO. DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO. DEFINE VARIABLE rBuffer AS RECID NO-UNDO. outilitiesHandler = NEW utilitiesHandler(). outilitiesHandler:evaluateFile( INPUT oJsonIdent , OUTPUT cFileName , OUTPUT lCompany , OUTPUT lActive , OUTPUT lWordindex ). cFieldReplace = SUBSTITUTE('&1_', cFileName). cKeyFieldReplace = SUBSTITUTE('keyfield_&1_', cFileName). cFilterReplace = SUBSTITUTE('filter_&1_', cFileName). cFileReplace = SUBSTITUTE('&1_', cFileName). iLanguage_id = oJsonIdent:GetInteger('language_id'). ccompany = oJsonIdent:GetCharacter('company'). lOK = outilitiesHandler:getKeyFields( INPUT oJsonIdent , OUTPUT cKeyFields , OUTPUT cKeyValues ). CREATE TEMP-TABLE ttTable. ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex'). /* except Field wordindex */ ttTable:TEMP-TABLE-PREPARE ('record'). httTable = ttTable:DEFAULT-BUFFER-HANDLE. DO ii = 1 TO httTable:NUM-FIELDS: httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME NO-ERROR. END. httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR. httTable:FIND-FIRST('', NO-LOCK). // Primary-Index-Fields für WHERE-Statement CREATE BUFFER hBuffer FOR TABLE cFileName. cIndexFields = outilitiesHandler:getPrimaryIndexFields( INPUT cFileName ). // Erzeugen von Where-Statement für UNIQUE-Find cWhere = ''. DO i1 = 1 TO NUM-ENTRIES(cIndexFields, ';'): cField = ENTRY(i1, cIndexFields, ';'). hField = httTable:BUFFER-FIELD(cField):HANDLE. CASE hField:DATA-TYPE: WHEN 'character' THEN cValue = QUOTER(hField:BUFFER-VALUE). WHEN 'logical' THEN cValue = STRING(hField:BUFFER-VALUE,"TRUE/FALSE"). WHEN 'date' THEN cValue = STRING(DATE(hField:BUFFER-VALUE)). OTHERWISE cValue = hField:BUFFER-VALUE. END CASE. cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE ' AND ') + SUBSTITUTE('&1.&2 = ', cFileName, cField) + cValue. END. lRetVal = FALSE. REPEAT TRANSACTION ON ERROR UNDO, LEAVE: lOK = hBuffer:FIND-UNIQUE(cWhere) NO-ERROR. IF NOT hBuffer:AVAILABLE THEN DO: outilitiesHandler:getErrorMessage( INPUT '1014', INPUT ilanguage_id, INPUT '', OUTPUT lcMessage). LEAVE. END. DO ii = 1 TO httTable:NUM-FIELDS: hField = hBuffer:BUFFER-FIELD(ii):HANDLE NO-ERROR. IF ERROR-STATUS:ERROR OR NOT VALID-HANDLE(hField) THEN NEXT. htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR. IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT. hField:BUFFER-VALUE = htField:BUFFER-VALUE. END. hField = hBuffer:BUFFER-FIELD('updated_at'):HANDLE NO-ERROR. IF NOT ERROR-STATUS:ERROR AND VALID-HANDLE(hField) THEN hField:BUFFER-VALUE = NOW. hField = hBuffer:BUFFER-FIELD('wordindex'):HANDLE NO-ERROR. IF NOT ERROR-STATUS:ERROR AND VALID-HANDLE(hField) THEN DO: cWordIndex = outilitiesHandler:createWordindex( INPUT hBuffer ). hField:BUFFER-VALUE = cWordIndex. END. rBuffer = hBuffer:RECID. oJsonReturn = NEW JsonObject(). oJsonData = NEW JsonObject(). oJsonArray = NEW JsonArray (). httTable:BUFFER-COPY(hBuffer). httTable:WRITE-JSON('JsonObject', oJsonData). oJsonArray = oJsonData:GetJsonArray('record'). oJsonData = oJsonArray:GetJsonObject(1). oJsonReturn:ADD('record', oJsonData). hBuffer:BUFFER-RELEASE (). outilitiesHandler:readSortFields( INPUT oJsonIdent , INPUT cFileName , OUTPUT cSortField , OUTPUT cDirection ). // Where-Statement f�r FOR EACH Filename f�r die Anzeige cWhere = ''. IF lCompany THEN cWhere = SUBSTITUTE('WHERE &1.company = &2', cFileName, QUOTER(ccompany)). IF cKeyFields <> '' THEN DO: DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';'): cField = ENTRY(ii, cKeyFields, ';'). cField = REPLACE(cField, cKeyFieldReplace, ''). cField = REPLACE(cField, cFilterReplace, ''). cField = REPLACE(cField, cFileReplace, ''). IF lCompany AND cField = 'company' THEN NEXT. cValue = ENTRY(ii, cKeyValues, CHR(01)). cWhere = cWhere + (IF cWhere = '' THEN 'WHERE &1.&2 = &3' ELSE ' AND &1.&2 = &3'). cWhere = SUBSTITUTE(cWhere, cFileName, cField, cValue). END. END. CREATE QUERY hQuery. hQuery:SET-BUFFERS (hBuffer). cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere). IF cSortField <> '' THEN cWhere = cWhere + ' BY ' + cSortField + ' ' + cDirection. hQuery:QUERY-PREPARE(cWhere). hQuery:QUERY-OPEN(). hQuery:GET-FIRST(). ii = 0. i1 = 0. DO WHILE NOT hQuery:QUERY-OFF-END: ii = ii + 1. IF hBuffer:RECID = rBuffer THEN i1 = ii. hQuery:GET-NEXT (). END. hQuery:QUERY-CLOSE (). iPageCounter = i1 / iMaxRecords. IF (iPageCounter * iMaxRecords) < i1 THEN iPageCounter = iPageCounter + 1. iIndex = i1 MOD iMaxRecords. IF iIndex = 0 THEN iIndex = iMaxRecords. oJsonPosition = NEW JsonObject(). oJsonPosition:ADD('page', iPageCounter). oJsonPosition:ADD('index', iIndex - 1). /* -1 weil in Java beginnt Index bei 0 */ oJsonPosition:ADD('totalRecords', ii). oJsonReturn:ADD('position', oJsonPosition). lRetVal = TRUE. LEAVE. END. IF NOT lRetVal THEN DO: oJsonMessage = NEW JsonObject(). oJsonMessage:ADD('success', FALSE). oJsonMessage:ADD('message', lcMessage). oJsonMessage:WRITE(lcJsonString, FALSE). oJsonReturn = oJsonMessage. END. RETURN lRetVal. CATCH e AS Progress.Lang.Error: END CATCH. FINALLY: END FINALLY. END METHOD. DESTRUCTOR PUBLIC adminprogsHandler ( ): END DESTRUCTOR. END CLASS.