walter.riechsteiner 1 неделя назад
Родитель
Сommit
191faf8bf7

+ 1849 - 0
addresses/addressprogsHandler.cls

@@ -0,0 +1,1849 @@
+/*------------------------------------------------------------------------
+   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 Progress.Json.ObjectModel.ObjectModelParser   FROM PROPATH.
+
+USING OpenEdge.DataAdmin.IIndex     FROM PROPATH.
+USING utilities.selectboxHandler    FROM PROPATH.
+USING utilities.utilitiesHandler    FROM PROPATH.
+USING OpenEdge.Web.DataObject.Writer.JsonObjectValueWriter FROM PROPATH.
+USING System.ComponentModel.Design.SelectionTypes FROM ASSEMBLY.
+
+CLASS addresses.addressprogsHandler 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 cFunction        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 cActiveSelection AS CHARACTER         NO-UNDO.
+    DEFINE VARIABLE cSortField       AS CHARACTER         NO-UNDO INIT ''.
+    DEFINE VARIABLE cDirection       AS CHARACTER         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 lcString         AS LONGCHAR          NO-UNDO.
+    
+    DEFINE VARIABLE iAnzahlRecords   AS INTEGER           NO-UNDO.
+    DEFINE VARIABLE iActualPage      AS INTEGER           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 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 TEMP-TABLE ttKeyFields
+        FIELD iIndex     AS INTEGER 
+        FIELD cLongName  AS CHARACTER 
+        FIELD cFieldName AS CHARACTER 
+        FIELD cFileName  AS CHARACTER 
+        FIELD cValue     AS CHARACTER 
+        FIELD cDataType  AS CHARACTER
+        FIELD lKeyfield  AS LOGICAL
+        
+        INDEX ttKeyFields-k1 IS PRIMARY 
+        iIndex
+        cFieldName
+        .
+    DEFINE VARIABLE httKeyFields AS HANDLE NO-UNDO.
+    
+    DEFINE TEMP-TABLE ttPrimaryIndex
+        FIELD iIndex     AS INTEGER 
+        FIELD cFieldName AS CHARACTER 
+        FIELD cFileName  AS CHARACTER 
+        FIELD cValue     AS CHARACTER 
+        FIELD cDataType  AS CHARACTER
+        
+        INDEX ttPrimaryIndex-k1 IS PRIMARY 
+        iIndex
+        cFieldName
+        .
+    DEFINE VARIABLE httPrimaryIndex   AS HANDLE           NO-UNDO.
+
+    
+    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
+    DEFINE VARIABLE oselectboxHandler AS selectboxHandler NO-UNDO.
+    
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC VOID buildWhere(
+        INPUT oJsonIdent    AS JsonObject
+        ):
+
+        DEFINE VARIABLE ii           AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE i1           AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE lOK          AS LOGICAL   NO-UNDO.
+        DEFINE VARIABLE cValue       AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cString      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE iNumerisch   AS INTEGER   NO-UNDO.
+        
+        DEFINE VARIABLE cSearchChars AS CHARACTER NO-UNDO INIT ''.
+        DEFINE VARIABLE lSearch      AS LOGICAL   NO-UNDO.
+        DEFINE VARIABLE cFields      AS CHARACTER NO-UNDO EXTENT.
+        DEFINE VARIABLE cField       AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFieldValue  AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFilter      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cDBField     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cType        AS CHARACTER NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        
+        cuser_name  = oJsonIdent:GetCharacter('user_name').
+        ccompany    = oJsonIdent:GetCharacter('company').
+        cSortField  = ''.
+        cDirection  = ''.
+        cWhere      = ''.
+        iStartPage  = 1.    
+        iMaxRecords = 25.
+        IF oJsonIdent:HAS('page')  THEN iStartPage  = INTEGER(oJsonIdent:GetCharacter('page'))  NO-ERROR.
+        IF oJsonIdent:HAS('limit') THEN iMaxRecords = INTEGER(oJsonIdent:GetCharacter('limit')) NO-ERROR.
+
+        IF oJsonIdent:HAS('search') THEN 
+        DO:
+            cSearchChars = oJsonIdent:GetCharacter('search').
+            cSearchChars = REPLACE(cSearchChars, '+', ' ').
+            lSearch      = TRUE.
+            iMaxRecords  = 100.
+        END.
+        iStartRecord = ((iStartPage - 1) * iMaxRecords) + 1.
+
+        cString = 'WHERE'.
+        FOR EACH ttKeyFields NO-LOCK:
+            IF lSearch THEN 
+            DO:
+                IF  ttKeyFields.iIndex >  1 AND
+                    ttKeyFields.iIndex < 99 THEN NEXT.
+            END.
+            IF ttKeyFields.cDataType = 'logical' AND ttKeyFields.cValue = '' THEN NEXT.
+            CASE ttKeyFields.cDataType:
+                WHEN 'integer' THEN 
+                    cValue = ttKeyFields.cValue.
+                WHEN 'decimal' THEN 
+                    cValue = ttKeyFields.cValue.
+                WHEN 'date' THEN 
+                    cValue = STRING(DATE(ttKeyFields.cValue),'99.99.9999').
+                WHEN 'logical' THEN 
+                    cValue = STRING(LOGICAL(ttKeyFields.cValue),'true/false').
+                WHEN 'character' THEN 
+                    cValue = QUOTER(ttKeyFields.cValue).
+            END CASE.
+            IF ttKeyFields.lKeyfield OR ttKeyFields.cDataType = 'logical' THEN 
+                cWhere = cWhere + SUBSTITUTE('&1 &2 = &3 ', cString, ttKeyFields.cFieldName, cValue).
+            ELSE 
+            DO:
+                cWhere = cWhere + SUBSTITUTE('&1 INDEX(STRING(&2), &3) > 0 ', cString, ttKeyFields.cFieldName, QUOTER(STRING(cValue))).
+            END.
+            cString = 'AND'.
+        END.
+        //
+        //  Suche aus dem Suchfeld -->  geht dann über Wordindex
+        //
+        IF lSearch THEN
+        DO:
+            DO ii = 1 TO NUM-ENTRIES(cSearchChars, ' '):
+                cValue     = ENTRY(ii, cSearchChars, ' ').
+                iNumerisch = INTEGER(cValue) NO-ERROR.
+                IF NOT ERROR-STATUS:ERROR THEN cValue = SUBSTITUTE('&1&2&1', CHR(01), TRIM(STRING(iNumerisch,'>>>>>>>>9-'))).
+                cWhere = cWhere + (IF cWhere = '' THEN ' WHERE ' ELSE 'AND ').
+                cWhere = cWhere + 'LOOKUP(' + QUOTER(cValue) + ', ' + cFileName + '.wordindex, " ") > 0 '. 
+            END.
+        END.
+        //
+        //  hat es Sortierfelder ?
+        //
+        outilitiesHandler:readSortFields(
+            INPUT  oJsonIdent   ,
+            INPUT  cFileName    ,
+            OUTPUT cSortField   ,
+            OUTPUT cDirection
+            ).
+// MESSAGE 'Sortfeld' cSortField 'richtung' cDirection.            
+        IF cSortField <> '' THEN 
+        DO:
+            IF cDirection BEGINS 'asc' THEN cDirection = ''.
+            cWhere = cWhere + SUBSTITUTE(' BY &1 &2', cSortField, cDirection).
+        END.
+// MESSAGE 'cWhere am Ende von BuildWhere ' cWhere.
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+// MESSAGE 'WHERE-Statement nach buildcWhere =' cWhere.
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL changeAnschrift(
+        INPUT  oJsonIdent   AS JsonObject   ,
+        INPUT  oJsonData    AS JsonObject   ,
+        OUTPUT oJsonReturn  AS JsonObject
+        ):
+            
+        DEFINE VARIABLE cReplace         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFieldName       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cField           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cBufferField     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cValue           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE ii               AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE lOK              AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE cCompany         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormId          AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormUser        AS CHARACTER  NO-UNDO.
+            
+        DEFINE VARIABLE hField           AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE cAdresse         AS CHARACTER  NO-UNDO EXTENT 12.
+        DEFINE VARIABLE cBriefanrede     AS CHARACTER  NO-UNDO.
+        
+        DEFINE VARIABLE oJsonRecord      AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonArray       AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+            
+        cFunction = oJsonIdent:GetCharacter('function').
+        cCompany  = oJsonIdent:GetCharacter('company').
+        cFormId   = oJsonIdent:GetCharacter('formId').
+        cFormUser = oJsonIdent:GetCharacter('formUser').
+        
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+
+        oJsonRecord = NEW JsonObject().
+        oJsonRecord = oJsonData:GetJsonObject('record').
+// oJsonRecord:WriteFile('C:\Temp\changeanschrift_oJsonRecord.json', TRUE).
+
+        httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        
+// httTable:WRITE-JSON ('FILE', 'C:\TEMP\ttTable_changeAnschrift_Inhalt.json', TRUE).
+        //
+        //  den ersten Datensatz in der TEMP-TABLE lesen
+        //
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+
+        IF  cFileName = 'addresses'     AND
+            NOT httTable::address_fix THEN 
+        DO:
+            oJsonIdent:SET('language_id', httTable::language_id).
+            createAnschrift(
+                INPUT-OUTPUT httTable
+                ).
+        END.
+
+        lOK = httTable:WRITE-JSON ('JsonObject', oJsonRecord).
+        lOk = TRUE.
+        
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('success', lOK).
+        
+        oJsonArray  = NEW JsonArray().
+        oJsonArray  = oJsonRecord:GetJsonArray('record').
+        oJsonRecord = oJsonArray:GetJsonObject(1). 
+        oJsonReturn:ADD('record', oJsonRecord).
+        
+        oselectboxHandler:getVariableSelectBoxes(
+            INPUT  oJsonIdent,
+            OUTPUT oJsonSelectBoxes
+            ).
+        IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+        
+//oJsonReturn:WriteFile('C:\Temp\changeAnschrift_return.json', TRUE).
+        
+        RETURN lOK.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL changeFixedAddress(
+        INPUT  oJsonIdent    AS JsonObject   ,
+        INPUT  oJsonData     AS JsonObject   ,
+        OUTPUT oJsonReturn   AS JsonObject
+        ):
+        
+        DEFINE VARIABLE lRetVal          AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE lAddressFix      AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE lOk              AS LOGICAL    NO-UNDO.
+        
+        DEFINE VARIABLE oJsonAction      AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonRecord      AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonArray       AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+        
+        lAddressFix = LOGICAL(oJsonData:GetCharacter('changedValue')).
+        oJsonAction = NEW JsonArray().
+        oJsonAction:ADD('addresses_address').
+        oJsonReturn = NEW JsonObject().
+        IF lAddressFix THEN oJsonReturn:ADD('editableFields', oJsonAction).
+        ELSE                oJsonReturn:ADD('disabledFields', oJsonAction).
+
+        lRetVal = TRUE.
+        
+        IF lAddressFix THEN RETURN lRetVal.
+        
+        cFunction = oJsonIdent:GetCharacter('function').
+        cFileName = oJsonIdent:GetCharacter('file_name').
+
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+
+        oJsonRecord = NEW JsonObject().
+        oJsonRecord = oJsonData:GetJsonObject('record').
+// oJsonRecord:WriteFile('C:\Temp\changefixedAddressoJsonRecord.json', TRUE).
+
+        httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        
+// httTable:WRITE-JSON ('FILE', 'C:\TEMP\ttTable_changeFixedAddresses_Inhalt.json', TRUE).
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        createAnschrift(
+            INPUT-OUTPUT httTable
+            ).
+
+        lOK = httTable:WRITE-JSON ('JsonObject', oJsonRecord).
+        lOk = TRUE.
+        
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('success', lOK).
+        
+        oJsonArray  = NEW JsonArray().
+        oJsonArray  = oJsonRecord:GetJsonArray('record').
+        oJsonRecord = oJsonArray:GetJsonObject(1). 
+        oJsonReturn:ADD('record', oJsonRecord).
+        
+        httTable:FIND-FIRST('', NO-LOCK).
+        oJsonIdent:SET('language_id', httTable::language_id).
+        oselectboxHandler:getVariableSelectBoxes(
+            INPUT  oJsonIdent,
+            OUTPUT oJsonSelectBoxes
+            ).
+        IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+        
+        RETURN lRetVal.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC VOID createAnschrift(
+        INPUT-OUTPUT hRecord AS HANDLE
+        ):
+            
+        DEFINE VARIABLE cAdresse        AS CHARACTER NO-UNDO EXTENT 12.
+        DEFINE VARIABLE cBriefAnrede    AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE ii              AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE iSalutationCode AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE cCountryCode    AS CHARACTER NO-UNDO.
+        
+        IF hRecord::address_fix THEN RETURN.
+        
+        iLanguage_id    = hRecord::language_id.
+        iSalutationCode = hRecord::salutation_code.
+        cCountryCode    = hRecord::country_code.
+
+        cAdresse = ''.
+        FIND salutations NO-LOCK 
+            WHERE salutations.language_id     = iLanguage_id
+            AND   salutations.salutation_code = iSalutationCode NO-ERROR.
+        IF  NOT AVAILABLE salutations AND 
+            iLanguage_id <> 1         THEN 
+        DO:
+            FIND salutations NO-LOCK 
+                WHERE salutations.language_id     = 1
+                AND   salutations.salutation_code = iSalutationCode NO-ERROR.
+        END.
+// MESSAGE 'available salutation =' AVAILABLE(salutation) '-' iLanguage_id '-' hRecord::salutation_code salutations.salutation.
+        FIND countries NO-LOCK 
+            WHERE countries.language_id  = iLanguage_id
+            AND   countries.country_code = cCountryCode NO-ERROR.
+        IF  NOT AVAILABLE countries AND
+            iLanguage_id <> 1       THEN 
+        DO:
+            FIND countries NO-LOCK 
+                WHERE countries.language_id = 1
+                AND   countries.country_code = cCountryCode NO-ERROR.
+        END.
+        IF AVAILABLE countries THEN 
+        DO:
+            DO ii = 1 TO 3:
+                IF countries.country_code_pos = ii THEN 
+                DO:
+                    cAdresse[11] = cAdresse[11] + hRecord::country_code.
+                    IF ii = 1 THEN cAdresse[11] = cAdresse[11] + '-'.
+                    ELSE           cAdresse[11] = cAdresse[11] + ' '.
+                END.
+                IF countries.postal_code_pos = ii THEN 
+                DO:
+                    cAdresse[11] = cAdresse[11] + hRecord::postal_code + ' '.
+                END.
+                IF countries.city_pos = ii THEN 
+                DO:
+                    cAdresse[11] = cAdresse[11] + hRecord::city + ' '.
+                END.
+            END.
+            cAdresse[11] = TRIM(cAdresse[11]).
+            IF countries.country_code_pos = 9 THEN cAdresse[12] = TRIM(countries.country_name).
+        END.
+        ii = 10.
+        IF ttTable::po_box <> '' THEN cAdresse[ii] = ttTable::po_box.
+        ELSE cAdresse[ii] = TRIM(hRecord::street + ' ' + hRecord::street_no).
+        IF cAdresse[ii] <> '' THEN ii = ii - 1.
+        cAdresse[ii] = TRIM(hRecord::additional_2).
+        IF cAdresse[ii] <> '' THEN ii = ii - 1.
+        cAdresse[ii] = TRIM(hRecord::additional_1).
+        IF cAdresse[ii] <> '' THEN ii = ii - 1.
+        cAdresse[ii] = TRIM(hRecord::address_title + ' ' + hRecord::first_name + ' ' + hRecord::last_name).
+        IF cAdresse[ii] <> '' THEN 
+        DO:
+            IF AVAILABLE salutations THEN 
+            DO:
+                IF hRecord::company_name_1 <> '' THEN
+                    ASSIGN
+                        cAdresse[ii] = salutations.to_attention_of + ' ' + cAdresse[ii]
+                        cAdresse[ii] = TRIM(cAdresse[ii]).
+            END.
+            ii  = ii - 1.
+        END.
+        cAdresse[ii] = TRIM(hRecord::company_name_2).
+        IF cAdresse[ii] <> '' THEN ii = ii - 1.
+        cAdresse[ii] = TRIM(hRecord::company_name_1).
+        IF cAdresse[ii] <> '' THEN ii = ii - 1.
+        IF hRecord::company_name_1 = '' AND AVAILABLE salutations THEN cAdresse[ii] = salutations.salutation.
+        
+        hRecord::Address = ''.
+        DO ii = 1 TO 12:
+            hRecord::address = hRecord::address + cAdresse[ii].
+            IF ii < 12 THEN hRecord::address = hRecord::address + CHR(10).
+        END.
+             
+        cBriefanrede = (IF AVAILABLE salutations THEN salutations.letterhead_business ELSE '').
+        IF hRecord::last_name <> '' THEN cBriefanrede = TRIM(cBriefanrede + ' ' + hRecord::address_title + ' ' + hRecord::last_name).
+        hRecord::letter_salutation = cBriefanrede.
+        
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     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 oJsonMessageBox  AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonFieldErrors 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 i2               AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE iIndex           AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cWordIndex       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cField           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hField           AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE htField          AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE cValue           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFieldValue      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE rBuffer          AS RECID      NO-UNDO.
+        DEFINE VARIABLE cUniqueWhere     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hUniqueBuffer    AS HANDLE     NO-UNDO.
+
+        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+        
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+
+        cFunction = oJsonIdent:GetCharacter('function').
+        CREATE BUFFER hBuffer       FOR TABLE cFileName.
+        CREATE BUFFER hUniqueBuffer FOR TABLE cFileName.
+        
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+            
+        httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        
+        CASE cFileName:
+            WHEN 'addresses' THEN 
+                httTable::address_id = NEXT-VALUE(masterdata_id).
+        END CASE.
+        
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cWhere
+            ).
+        cUniqueWhere = cWhere.
+
+        lRetVal = FALSE.
+        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+// MESSAGE 'Start Create'.            
+            lOK = hBuffer:FIND-UNIQUE(cWhere) NO-ERROR. 
+            IF lOK THEN 
+            DO:
+                outilitiesHandler:createErrorBox(
+                    INPUT  oJsonIdent       ,
+                    INPUT  '2007'           ,
+                    INPUT  ''               ,
+                    OUTPUT oJsonMessageBox
+                    ).
+                oJsonReturn = NEW JsonObject().
+                oJsonReturn:ADD('success'     , FALSE          ).
+                oJsonReturn:ADD('message', oJsonMessageBox:GetLongchar('text')).
+                
+                oJsonFieldErrors = NEW JsonObject().
+                FOR EACH ttPrimaryIndex NO-LOCK:
+                    cField = SUBSTITUTE('&1_&2', ttPrimaryIndex.cFileName, ttPrimaryIndex.cFieldName).
+                    oJsonFieldErrors:ADD(cField, 'Doppelt').
+                END.
+                oJsonReturn:ADD('fieldErrors', oJsonFieldErrors).
+                oJsonReturn:ADD('showMessage', oJsonMessageBox ).
+                RETURN TRUE.
+            END.
+            //
+            //  Datensatz erstellen / active setzen / wordindex erstellen
+            //
+            hBuffer:BUFFER-CREATE ().
+            DO ii = 1 TO httTable:NUM-FIELDS:
+                htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR.
+                cField  = htField:NAME.
+                hField  = hBuffer:BUFFER-FIELD(cField):HANDLE NO-ERROR.
+                IF  ERROR-STATUS:ERROR       OR
+                    NOT VALID-HANDLE(hField) THEN NEXT.
+                IF hField:EXTENT > 0 THEN 
+                DO:
+                    cFieldValue = htField:BUFFER-VALUE.
+                    IF cField = 'address' THEN 
+                    DO:
+                        FIND countries NO-LOCK 
+                            WHERE countries.language_id  = httTable::language_id
+                            AND   countries.country_code = httTable::country_code NO-ERROR.
+                        IF NOT AVAILABLE countries THEN 
+                        DO:
+                            FIND countries NO-LOCK 
+                                WHERE countries.language_id  = 1
+                                AND   countries.country_code = httTable::country_code NO-ERROR.
+                        END.
+                        i2 = (IF countries.country_code_pos = 9 THEN 12 ELSE 11).
+
+                        DO i1 = 1 TO 12: 
+                            hField:BUFFER-VALUE(i1) = ''. 
+                        END.
+                        DO i1 = NUM-ENTRIES(cFieldValue, CHR(10)) TO 1 BY -1:
+                            cValue = ENTRY(i1, cFieldValue, CHR(10)).
+                            IF cValue = '' THEN NEXT.
+                            hField:BUFFER-VALUE(i2) = cValue.
+                            i2 = i2 - 1. 
+                        END.
+                    END.
+                    ELSE 
+                    DO:
+                        DO i1 = 1 TO hField:EXTENT:
+                            hField:BUFFER-VALUE(i1) = ENTRY(i1, cFieldValue, CHR(10)) NO-ERROR.
+                        END.
+                    END.
+                END.
+                ELSE 
+                DO:
+                    IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT.
+                    hField:BUFFER-VALUE = htField:BUFFER-VALUE.
+                END. 
+            END.
+
+            htField = hBuffer:BUFFER-FIELD('active'):HANDLE NO-ERROR.
+            IF  NOT ERROR-STATUS:ERROR AND 
+                VALID-HANDLE(htField)  THEN htField:BUFFER-VALUE = TRUE.
+                
+            htField = hBuffer:BUFFER-FIELD('created_at'):HANDLE NO-ERROR.
+            IF  NOT ERROR-STATUS:ERROR AND 
+                VALID-HANDLE(htField)  THEN htField:BUFFER-VALUE = NOW.
+            
+            htField = hBuffer: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.
+// MESSAGE 'Neue address_id =' hBuffer::address_id 'mit RECID' rBuffer 'und uniqueWHere' cUniqueWhere.
+            hBuffer:BUFFER-RELEASE ().
+
+            outilitiesHandler:writeLastRecord(
+                INPUT oJsonIdent  ,
+                INPUT cUniqueWhere
+                ).
+
+            lRetVal = TRUE.
+            LEAVE.
+        END.
+        //
+        //  Datensatz anhand der RECID und den letzten Kriterien in der Tabelle finden und Pagination ermitteln
+        //
+        DO WHILE lRetVal:
+            outilitiesHandler:readLastcWhere(
+                INPUT  oJsonIdent,
+                INPUT  cFileName ,
+                OUTPUT cWhere
+                ).
+// MESSAGE 'Last cWhere ' cWhere.
+            outilitiesHandler:evaluatePageNumber(
+                INPUT-OUTPUT oJsonIdent   ,
+                INPUT        cWhere       ,
+                INPUT        rBuffer
+                ).            
+            createTempTable(
+                INPUT oJsonIdent
+                ).
+            
+            fillTemptableFromTable(
+                INPUT  oJsonIdent   ,
+                INPUT  cWhere       ,
+                OUTPUT oJsonReturn
+                ).
+            
+            hUniqueBuffer:FIND-UNIQUE (cUniqueWhere, NO-LOCK) NO-ERROR.
+            outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+            oJsonIdent:SET('language_id', hUniqueBuffer::language_id).
+
+            oselectboxHandler:getVariableSelectBoxes(
+                INPUT  oJsonIdent      ,
+                OUTPUT oJsonSelectBoxes
+                ).
+            IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+            
+            lRetVal = TRUE.
+            LEAVE.
+        END.
+        DELETE OBJECT hBuffer       NO-ERROR.
+        DELETE OBJECT hUniqueBuffer NO-ERROR.
+        
+        IF lRetVal THEN 
+        DO:
+            outilitiesHandler:createInfoBox(
+                INPUT  oJsonIdent       ,
+                INPUT  '2008'           ,
+                INPUT  ''               ,
+                OUTPUT oJsonMessageBox
+                ) NO-ERROR.
+            oJsonReturn:ADD('showMessage', oJsonMessageBox).
+            oJsonReturn:ADD('success',     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 VOID createTempTable(
+        INPUT oJsonIdent AS JsonObject
+        ):
+
+        DEFINE VARIABLE ii             AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE cFunction      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cSerializeName AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cttName        AS CHARACTER NO-UNDO.        
+        
+        CREATE TEMP-TABLE ttTable.
+        ttTable:ADD-FIELDS-FROM (cFilename, 'wordindex,address').   /*  Alle Felder aus dem Buffer, ausser wordindex    */
+        ttTable:ADD-NEW-FIELD ('address', 'character', 0, 'x(500)').
+        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.
+        
+        cFunction = oJsonIdent:GetCharacter('function').
+
+        CASE cFunction:
+            WHEN 'delete' THEN 
+                cttName = 'record'.
+            WHEN 'update' THEN 
+                cttName = 'record'.
+            WHEN 'change' THEN 
+                cttName = 'record'.
+            WHEN 'create' THEN 
+                cttName = 'record'.
+            OTHERWISE 
+            cttName = 'records'.
+        END CASE.
+        ttTable:TEMP-TABLE-PREPARE (cttName).
+        httTable = ttTable:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Den Feldnamen wird für das Front-End der Tabellenname vorangestellt (Serialize-Name)
+        //
+        DO ii = 1 TO httTable:NUM-FIELDS:
+            CASE httTable:BUFFER-FIELD(ii):NAME:
+                WHEN 'active' THEN 
+                    cSerializeName = 'active'.
+                OTHERWISE 
+                cSerializeName = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME.
+            END CASE.
+            httTable:BUFFER-FIELD(ii):SERIALIZE-NAME = cSerializeName NO-ERROR.
+        END.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC VOID createUniqueWhere(
+        INPUT  hBuffer      AS HANDLE,
+        OUTPUT cUniqueWhere AS CHARACTER 
+        ):
+            
+        DEFINE VARIABLE hField AS HANDLE NO-UNDO.
+        
+        cUniqueWhere  = ''.
+        cString       = 'WHERE'.
+        FOR EACH ttPrimaryIndex NO-LOCK:
+            hField = httTable:BUFFER-FIELD(ttPrimaryIndex.cFieldName):HANDLE.    
+            CASE ttPrimaryIndex.cDataType:
+                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.
+            cUniqueWhere = cUniqueWhere + cString
+                + SUBSTITUTE(' &1.&2 = &3 ', ttPrimaryIndex.cFileName, ttPrimaryIndex.cFieldName, cValue).
+            cString = 'AND'.
+        END.
+        
+        RETURN.
+
+    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 oJsonMessageBox 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 hField          AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE htField         AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE cValue          AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE rBuffer         AS RECID      NO-UNDO.
+        DEFINE VARIABLE cQueryWhere     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE iAnzRecords     AS INTEGER    NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+            
+        cFunction = oJsonIdent:GetCharacter('function').
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+            
+        httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        //
+        //  Erzeugen von Where-Statement für UNIQUE-Find
+        //
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cWhere
+            ).
+
+        lRetVal = FALSE.
+        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+            lOK = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
+            IF NOT lOK THEN 
+            DO:
+                outilitiesHandler:createErrorBox(
+                    INPUT  oJsonIdent       ,
+                    INPUT  '2000'           ,
+                    INPUT  ''               ,
+                    OUTPUT oJsonMessageBox
+                    ).
+                oJsonReturn = NEW JsonObject().
+                oJsonReturn:ADD('success'     , FALSE          ).
+                oJsonReturn:ADD('showMessage' , oJsonMessageBox).
+                RETURN TRUE.
+            END.
+            rBuffer = hBuffer:RECID.
+            hBuffer:BUFFER-RELEASE ().
+
+            iStartPage = INTEGER(oJsonIdent:GetCharacter('page'))  NO-ERROR.
+            iIndex     = INTEGER(oJsonIdent:GetCharacter('index')) NO-ERROR.
+
+            lOK = hBuffer:FIND-UNIQUE(cWhere, EXCLUSIVE-LOCK, NO-WAIT) NO-ERROR.
+            IF hBuffer:LOCKED THEN 
+            DO:
+                outilitiesHandler:createLockMessage(
+                    INPUT  oJsonIdent,
+                    INPUT  rBuffer  ,
+                    OUTPUT oJsonMessageBox
+                    ).
+                lcMessage = oJsonMessageBox:GetLongchar('message').
+                LEAVE.
+            END.
+                
+            DO WHILE lActive :
+                hField = hBuffer:BUFFER-FIELD('active'):HANDLE NO-ERROR.
+                IF  ERROR-STATUS:ERROR        OR
+                    NOT VALID-HANDLE(hField) THEN LEAVE.
+                hField:BUFFER-VALUE = FALSE NO-ERROR.
+
+                hField = hBuffer:BUFFER-FIELD('updated_at'):HANDLE NO-ERROR.
+                IF  NOT ERROR-STATUS:ERROR AND
+                    VALID-HANDLE(hField)   THEN hField:BUFFER-VALUE = NOW.
+
+                httTable:BUFFER-COPY(hBuffer).
+                
+                hBuffer:BUFFER-RELEASE ().
+
+                lRetVal = TRUE.
+                LEAVE.                
+            END.
+            
+            DO WHILE NOT lRetVal:
+                lRetVal = hBuffer:BUFFER-DELETE ().
+                hBuffer:BUFFER-RELEASE ().
+                
+                IF iIndex > 0 THEN iIndex = iIndex - 1. 
+
+                LEAVE.
+            END.
+            //
+            //  Anzahl Records in der Tabellenanzeige ermitteln
+            //
+            outilitiesHandler:readLastcWhere(
+                INPUT  oJsonIdent,
+                INPUT  cFileName,
+                OUTPUT cQueryWhere) NO-ERROR.
+            outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+            cQueryWhere = REPLACE(cQueryWhere, 'FOR', 'PRESELECT').
+ 
+            CREATE QUERY hQuery.
+            hQuery:SET-BUFFERS(hBuffer).
+            hQuery:QUERY-PREPARE (cQueryWhere).
+            hQuery:QUERY-OPEN ().
+            iAnzRecords = hQuery:NUM-RESULTS.
+            hQuery:QUERY-CLOSE ().
+            
+            LEAVE.
+        END.
+                
+        IF lRetVal THEN 
+        DO:             
+            oJsonReturn = NEW JsonObject().
+            oJsonReturn:ADD('success', TRUE).
+            
+            oJsonPosition = NEW JsonObject().
+            oJsonPosition:ADD('page'        , iStartPage ).
+            oJsonPosition:ADD('index'       , iIndex     ).
+            oJsonPosition:ADD('totalRecords', iAnzRecords).
+            
+            oJsonReturn:ADD('position', oJsonPosition).
+// oJsonReturn:WriteFile('C:\TEMP\adminprog_DELETE_Respons.json', 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:
+            DELETE OBJECT oJsonArray    NO-ERROR.
+            DELETE OBJECT oJsonData     NO-ERROR.
+        END FINALLY.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL fillTemptableFromTable(
+        INPUT  oJsonIdent   AS JsonObject,
+        INPUT  cWhere       AS CHARACTER,
+        OUTPUT oJsonReturn  AS JsonObject 
+        ):
+        
+        DEFINE VARIABLE lRetVal       AS LOGICAL   NO-UNDO INIT FALSE.
+        DEFINE VARIABLE i1            AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE hQuery        AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hBuffer       AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE iTotalRecords AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE cAddress      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE hFeld         AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE cUniqueWHere  AS CHARACTER NO-UNDO.
+        
+        DEFINE VARIABLE oRecords      AS JsonArray NO-UNDO.
+        
+        iStartPage  = 1.
+        iMaxRecords = 25.
+        iIndex      = 0.
+        cFileName   = oJsonIdent:GetCharacter('file_name').
+        //
+        //  Manchmal kommen die Werte als Integer, manchmal als character
+        //
+        IF oJsonIdent:HAS('limit') THEN 
+        DO:
+            iMaxRecords = (IF oJsonIdent:getType('limit') = 1 THEN INTEGER(oJsonIdent:GetCharacter('limit')) ELSE oJsonIdent:GetInteger('limit')).
+        END. 
+        IF oJsonIdent:HAS('page')  THEN 
+        DO:
+            iStartPage = (IF oJsonIdent:getType('page')   = 1 THEN INTEGER(oJsonIdent:GetCharacter('page')) ELSE oJsonIdent:GetInteger('page')).
+        END. 
+        IF oJsonIdent:HAS('index') THEN 
+        DO:
+            iIndex     = (IF oJsonIdent:getType('index')  = 1 THEN INTEGER(oJsonIdent:GetCharacter('index')) ELSE oJsonIdent:GetInteger('index')).
+        END.
+        iStartRecord = ((iStartPage - 1) * iMaxRecords) + 1.
+        //
+        //  Für das Dynamische Query wird PRESELECT verwendet für die Pagination
+        //
+// MESSAGE '-> MaxRecords =' iMaxRecords SKIP 'Startpage =' iStartPage SKIP 'Index =' iIndex SKIP 'Startrecord =' iStartRecord.
+        cWhere = REPLACE(cWhere, 'FOR', 'PRESELECT').
+        CREATE QUERY  hQuery.
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        hQuery:SET-BUFFERS (hBuffer) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        hQuery:QUERY-PREPARE (cWhere) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        hQuery:QUERY-OPEN ().
+
+        iTotalRecords = hQuery:NUM-RESULTS.
+// MESSAGE 'Total Query Result =' iTotalRecords.
+        hQuery:REPOSITION-FORWARD(iStartRecord - 1) NO-ERROR.
+        hQuery:GET-NEXT ().
+        iCurrentPosition = 0.
+        iAnzahlRecords   = 0.
+// MESSAGE 'Start query mit StartRecord ' iStartRecord 'und cWhere ' cWhere.
+        DO WHILE NOT hQuery:QUERY-OFF-END:
+            IF iCurrentPosition = 0 THEN iCurrentPosition = iStartRecord.
+            iAnzahlRecords = iAnzahlRecords + 1.
+            httTable:BUFFER-CREATE().
+            httTable:BUFFER-COPY(hBuffer, 'address').
+            
+            hFeld    = hBuffer:BUFFER-FIELD('address'):HANDLE.
+            cAddress = ''.
+            DO i1 = 1 TO hFeld:EXTENT:
+                cAddress = cAddress + (IF i1 > 1 THEN CHR(10)  ELSE '') + hFeld:BUFFER-VALUE(i1). 
+            END.
+            httTable:BUFFER-FIELD('address'):BUFFER-VALUE = cAddress. 
+            IF iAnzahlRecords >= iMaxRecords THEN LEAVE.
+            hQuery:GET-NEXT ().
+        END.
+        hQuery:QUERY-CLOSE ().
+        DELETE OBJECT hQuery  NO-ERROR.
+        DELETE OBJECT hBuffer NO-ERROR.
+
+        oRecords = NEW JsonArray().
+        httTable:WRITE-JSON('JsonArray', oRecords).
+        
+        iPageCounter = iTotalRecords / iMaxRecords.
+        IF (iPageCounter * iMaxRecords) < iTotalRecords THEN iPageCounter = iPageCounter + 1.  
+
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('records'     , oRecords      ).
+        oJsonReturn:ADD('currentPage' , iStartPage    ).
+        oJsonReturn:ADD('maxRecords'  , iTotalRecords ).
+        oJsonReturn:ADD('pageCount'   , iPageCounter  ).
+        oJsonReturn:ADD('recordCount' , iAnzahlRecords).
+        oJsonReturn:ADD('currentIndex', iIndex        ).
+        
+        IF iAnzahlRecords > 0 THEN 
+        DO:
+            httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+            createUniqueWhere(
+                INPUT  httTable    ,
+                OUTPUT cUniqueWhere
+                ).
+            outilitiesHandler:writeLastRecord(
+                INPUT oJsonIdent,
+                INPUT cUniqueWhere
+                ). 
+        END.
+        
+// oJsonReturn:WriteFile('C:\TEMP\addresses_getData_messages.json', TRUE).
+        
+        lRetVal = (IF iAnzahlRecords = 0 THEN FALSE ELSE TRUE).        
+        RETURN lRetVal.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL getChanges(
+        INPUT  oJsonIdent  AS JsonObject,
+        OUTPUT oJsonResult AS JsonObject
+        ):
+            
+        DEFINE VARIABLE oJsonMessage    AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonMessageBox 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 hField          AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE htField         AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE cField          AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cBufferField    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cValue          AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cWordIndex      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE rBuffer         AS RECID      NO-UNDO.
+        DEFINE VARIABLE cFieldNames     AS CHARACTER  NO-UNDO EXTENT.
+        DEFINE VARIABLE cReplace        AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE lNew            AS LOGICAL    NO-UNDO.
+        
+        DEFINE VARIABLE cFunction       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cChangeAction   AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE lAddressFix     AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE cUniqueWhere    AS CHARACTER  NO-UNDO.
+
+        DEFINE VARIABLE oJsonReturn     AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonRecord     AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonArray      AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonAction     AS JsonArray  NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+            
+        cFunction = oJsonIdent:GetCharacter('function').
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+
+        httTable:BUFFER-CREATE().
+        cReplace    = SUBSTITUTE('&1_', cFileName).            
+        cFieldNames = oJsonIdent:GetNames().
+        DO ii = 1 TO EXTENT(cFieldNames):
+            cField       = cFieldNames[ii].
+            IF NOT cField BEGINS cFileName THEN NEXT.
+            cBufferField = REPLACE(cField, cReplace, '').
+            cValue       = oJsonIdent:GetCharacter(cField).
+            hField       = httTable:BUFFER-FIELD(cBufferField):HANDLE NO-ERROR.
+            IF ERROR-STATUS:ERROR        THEN NEXT.
+            IF NOT VALID-HANDLE (hField) THEN NEXT.
+            IF hField:DATA-TYPE = 'date' THEN cValue = outilitiesHandler:iso2date(INPUT cValue). 
+            hField:BUFFER-VALUE = cValue. 
+        END.
+// httTable:WRITE-JSON ('FILE', 'C:\TEMP\ttTable_Inhalt.json', TRUE).
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        //
+        //  Erzeugen von Where-Statement für UNIQUE-Find
+        //
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cWhere
+            ).
+        cUniqueWhere = cWhere.
+        
+        lOK = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
+        IF NOT lOK THEN lNew = TRUE.
+        
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('success', TRUE).
+        
+        cChangeAction = oJsonIdent:GetCharacter('changeAction').
+// MESSAGE 'ChangeAction =' cChangeAction.
+        CASE cChangeAction:
+            WHEN 'changeFixedAddress' THEN 
+                DO:
+                    lAddressFix = LOGICAL(oJsonIdent:GetCharacter('changedValue')).
+// MESSAGE httTable::ADDress_fix '-' oJsonIdent:GetCharacter('changedValue').
+                    oJsonAction = NEW JsonArray().
+                    oJsonAction:ADD('addresses_address').
+                    IF lAddressFix THEN oJsonReturn:ADD('editableFields', oJsonAction).
+                    ELSE                oJsonReturn:ADD('disabledFields', oJsonAction).
+                    httTable::ADDress_fix = oJsonIdent:GetCharacter('changedValue').
+                END.
+        END CASE. 
+        
+        oJsonRecord = NEW JsonObject().
+        oJsonArray  = NEW JsonArray ().
+
+        httTable:WRITE-JSON('JsonObject', oJsonRecord).
+// oJsonRecord:WriteFile('C:\Temp\address_changed_record.json', TRUE).
+        oJsonArray  = oJsonRecord:GetJsonArray('record').
+        oJsonRecord = oJsonArray:GetJsonObject(1). 
+        oJsonReturn:ADD('record', oJsonRecord).
+        
+        oJsonResult = oJsonReturn.
+        
+        lRetVal = TRUE.
+        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 iAnzRec          AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE lRetVal          AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE lOK              AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE cAddress         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hFeld            AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE cFormId          AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormUser        AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFieldName       AS CHARACTER  NO-UNDO.
+        
+        DEFINE VARIABLE oRecords         AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonEditable    AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonBox         AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonMessageBox  AS JsonObject NO-UNDO.
+
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+        
+        cFunction = oJsonIdent:GetCharacter('function').
+        cCompany  = oJsonIdent:GetCharacter('company').
+
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        oJsonIdent:WriteFile('C:\Temp\address_getdata_jsoniden.json', TRUE).
+        iIndex = 0.        
+        buildWhere(
+            INPUT  oJsonIdent 
+            ).
+
+        ii      = 0.
+        iAnzRec = 0.
+        ttTable:EMPTY-TEMP-TABLE ().
+        CREATE QUERY hQuery.
+        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR.
+        MESSAGE 'cWhere loaddate for addresses ' cWhere.
+        IF NOT oJsonIdent:HAS('search') THEN 
+        DO:
+            outilitiesHandler:writeLastcWhere(
+                INPUT  oJsonIdent ,
+                INPUT  cFileName  ,
+                INPUT  cWhere
+                ).
+        END.
+        //
+        //  Für das Dynamische Query wird PRESELECT verwendet für die Pagination
+        //
+        lRetVal = fillTemptableFromTable(
+            INPUT  oJsonIdent   ,
+            INPUT  cWhere       ,
+            OUTPUT oJsonReturn
+            ).
+        IF NOT lRetVal THEN 
+        DO:
+            outilitiesHandler:createInfoBox(
+                INPUT  oJsonIdent   ,
+                INPUT  '2009'       ,
+                INPUT  ''           ,
+                OUTPUT oJsonMessageBox
+                ).
+            oJsonReturn:ADD('success', FALSE).
+            oJsonReturn:ADD('showMessage', oJsonMessageBox).
+            RETURN lRetVal.
+        END.
+             
+        lRetVal = httTable:FIND-FIRST('', NO-LOCK).
+        oJsonIdent:SET('language_id', httTable::language_id).
+        oselectboxHandler:getVariableSelectBoxes(
+            INPUT  oJsonIdent      ,
+            OUTPUT oJsonSelectBoxes
+            ).
+        IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+
+        outilitiesHandler:writePosition(
+            INPUT  oJsonIdent       ,
+            INPUT  cFileName        ,
+            INPUT  iCurrentPosition ,
+            INPUT  iStartPage       ,
+            INPUT  iMaxRecords
+            ).
+// oJsonReturn:WriteFile('C:\TEMP\addresses_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 lRetVal          AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE cValue           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE lOK              AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE rBuffer          AS RECID      NO-UNDO.
+        DEFINE VARIABLE iTotalRecords    AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE hFeld            AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE cAddress         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cUniqueWhere     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hUniqueBuffer    AS HANDLE     NO-UNDO.
+        
+        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+        
+        cFileName = oJsonIdent:GetCharacter('file_name').
+        outilitiesHandler:readLastRecord(
+            INPUT  oJsonIdent ,
+            OUTPUT cUniqueWhere
+            ).
+// MESSAGE 'cUniqueWhere fuer UNIQE-FIND' cUniqueWhere.
+        CREATE BUFFER hUniqueBuffer FOR TABLE cFileName.
+        hUniqueBuffer:FIND-UNIQUE (cUniqueWhere, NO-LOCK).
+        rBuffer = hUniqueBuffer:RECID.
+// MESSAGE hUniqueBuffer::address_id '-' rBuffer.
+        outilitiesHandler:readLastcWhere(
+            INPUT  oJsonIdent,
+            INPUT  cFileName ,
+            OUTPUT cWhere
+            ).
+        outilitiesHandler:evaluatePageNumber(
+            INPUT-OUTPUT oJsonIdent   ,
+            INPUT        cWhere       ,
+            INPUT        rBuffer
+            ).            
+// oJsonIdent:WriteFile('C:\TEMP\address_rebuildData_JsonIdent.json', TRUE).        
+// MESSAGE 'LAST-WHERE' cWhere.            
+       
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+            
+        fillTemptableFromTable(
+            INPUT  oJsonIdent   ,
+            INPUT  cWhere       ,
+            OUTPUT oJsonReturn
+            ).
+            
+        hUniqueBuffer:FIND-UNIQUE (cUniqueWhere, NO-LOCK) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        oJsonIdent:SET('language_id', hUniqueBuffer::language_id).
+
+        oselectboxHandler:getVariableSelectBoxes(
+            INPUT  oJsonIdent      ,
+            OUTPUT oJsonSelectBoxes
+            ).
+        IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+
+        lRetVal = TRUE.
+        RETURN lRetVal.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL recordChange(
+        INPUT  oJsonIdent   AS JsonObject   ,
+        INPUT  oJsonData    AS JsonObject   ,
+        OUTPUT oJsonReturn  AS JsonObject
+        ):
+            
+        DEFINE VARIABLE cReplace         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFieldName       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cField           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cBufferField     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cValue           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE ii               AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE lOK              AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE cCompany         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormId          AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormUser        AS CHARACTER  NO-UNDO.
+            
+        DEFINE VARIABLE hField           AS HANDLE     NO-UNDO.
+        
+        DEFINE VARIABLE oJsonRecord      AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonBox         AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+            
+        cFunction = oJsonIdent:GetCharacter('function').
+        cCompany  = oJsonIdent:GetCharacter('company').
+        cFormId   = oJsonIdent:GetCharacter('formId').
+        cFormUser = oJsonIdent:GetCharacter('formUser').
+        
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+
+        oJsonRecord = NEW JsonObject().
+        oJsonRecord = oJsonData:GetJsonObject('record').
+// oJsonRecord:WriteFile('C:\Temp\oJsonRecord.json', TRUE).
+
+        httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        
+// httTable:WRITE-JSON ('FILE', 'C:\TEMP\ttTable_RecordChange_Inhalt.json', TRUE).
+        //
+        //  den ersten Datensatz in der TEMP-TABLE lesen
+        //
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        oJsonIdent:SET('language_id', httTable::language_id).
+        //
+        //  Erzeugen von Where-Statement für UNIQUE-Find
+        //
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cWhere
+            ).
+// MESSAGE 'Where-Statement von Primary-Index =' cWhere.
+        outilitiesHandler:writeLastRecord(
+            INPUT  oJsonIdent   ,
+            INPUT  cWhere       
+            ).            
+
+        outilitiesHandler:readLastcWhere(
+            INPUT  oJsonIdent,
+            INPUT  cFileName ,
+            OUTPUT cWhere   ).
+// MESSAGE 'Filename =' cFileName 'Aktuelle Adress_Id =' httTable::address_id 'Last Where =' cWhere.
+        oJsonIdent:WRITE(lcString, TRUE).
+// MESSAGE 'oJsonIdent = ' STRING(lcString).
+        oselectboxHandler:getVariableSelectBoxes(
+            INPUT  oJsonIdent      ,
+            OUTPUT oJsonSelectBoxes
+            ).
+        lOk = TRUE.    
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('success', lOK        ).
+        oJsonReturn:ADD('record' , oJsonRecord).
+        IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+        
+// oJsonReturn:WriteFile('C:\Temp\RecordChange_return.json', TRUE).
+        
+        RETURN lOK.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL updateBegin(
+        INPUT  oJsonIdent    AS JsonObject   ,
+        INPUT  oJsonData     AS JsonObject   ,
+        OUTPUT oJsonReturn   AS JsonObject
+        ):
+// MESSAGE "update begin".
+        DEFINE VARIABLE lRetVal     AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE lAddressFix AS LOGICAL    NO-UNDO.
+        
+        DEFINE VARIABLE oJsonAction AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonRecord AS JsonObject NO-UNDO.
+        
+        oJsonRecord = NEW JsonObject().
+        oJsonRecord = oJsonData:GetJsonObject('record').
+         
+        lAddressFix = LOGICAL(oJsonRecord:GetLogical('addresses_address_fix')).
+        oJsonAction = NEW JsonArray().
+        oJsonAction:ADD('addresses_address').
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('success', TRUE).
+        IF lAddressFix THEN oJsonReturn:ADD('editableFields', oJsonAction).
+        ELSE                oJsonReturn:ADD('disabledFields', oJsonAction).
+
+        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 oJsonMessageBox 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 i2              AS INTEGER    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 cWordIndex      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE rBuffer         AS RECID      NO-UNDO.
+        DEFINE VARIABLE cFieldValue     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE oJsonAnschrift  AS JsonObject NO-UNDO.
+        
+        DEFINE VARIABLE cFunction       AS CHARACTER  NO-UNDO.
+
+        outilitiesHandler = NEW utilitiesHandler().
+        
+        httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
+        httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
+        //
+        outilitiesHandler:evaluateFile(
+            INPUT-OUTPUT oJsonIdent     ,
+            OUTPUT       cFileName      ,
+            OUTPUT       lCompany       ,
+            OUTPUT       lActive        ,
+            OUTPUT       lWordindex     ,
+            INPUT-OUTPUT httKeyFields   ,
+            INPUT-OUTPUT httPrimaryIndex
+            ).
+            
+        cFunction = oJsonIdent:GetCharacter('function').
+        CREATE BUFFER hBuffer FOR TABLE cFileName.
+
+        createTempTable(
+            INPUT oJsonIdent
+            ).
+        
+// oJsonRecord:WriteFile('C:\Temp\Address_Update.json', TRUE).
+        httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
+        //
+        //  Anschrift und Briefanrede erstellen
+        //
+        IF cFileName = 'addresses'    AND 
+            NOT httTable::address_fix THEN
+        DO:
+            createAnschrift(
+                INPUT-OUTPUT httTable
+                ).
+        END.
+        //
+        //  Erzeugen von Where-Statement für UNIQUE-Find
+        //
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cWhere
+            ).
+
+        lRetVal = FALSE.
+        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+            lOK = hBuffer:FIND-UNIQUE(cWhere, EXCLUSIVE-LOCK, NO-WAIT) NO-ERROR. 
+            IF hBuffer:LOCKED THEN 
+            DO:
+                hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
+                rBuffer = hBuffer:RECID. 
+                outilitiesHandler:createLockMessage(
+                    INPUT  oJsonIdent,
+                    INPUT  rBuffer  ,
+                    OUTPUT oJsonMessageBox
+                    ).
+                oJsonReturn = NEW JsonObject().
+                oJsonReturn:ADD('success'     , FALSE          ).
+                oJsonReturn:ADD('showMessage', oJsonMessageBox).
+                RETURN TRUE.
+            END.
+            IF NOT hBuffer:AVAILABLE THEN 
+            DO:
+                outilitiesHandler:createErrorBox(
+                    INPUT  oJsonIdent       ,
+                    INPUT  '2000'           ,
+                    INPUT  ''               ,
+                    OUTPUT oJsonMessageBox
+                    ).
+                oJsonReturn = NEW JsonObject().
+                oJsonReturn:ADD('success'     , FALSE          ).
+                oJsonReturn:ADD('showMessage' , oJsonMessageBox).
+                RETURN TRUE.
+            END.
+
+            DO WHILE lActive :
+                hField = hBuffer:BUFFER-FIELD('active') NO-ERROR.
+                IF NOT VALID-HANDLE(hField) THEN LEAVE.
+                IF hField:BUFFER-VALUE = TRUE THEN LEAVE.
+                
+                htField = httTable:BUFFER-FIELD('active') NO-ERROR.
+                IF NOT VALID-HANDLE(htField) THEN LEAVE.
+
+                IF hField:BUFFER-VALUE = FALSE AND htField:BUFFER-VALUE = TRUE THEN LEAVE.
+
+                outilitiesHandler:createQuestionBox(
+                    INPUT  oJsonIdent       ,
+                    INPUT  '2000'           ,
+                    INPUT  ''               ,
+                    INPUT  'active'         ,
+                    INPUT  'true'           ,
+                    INPUT  hBuffer          ,
+                    OUTPUT oJsonMessageBox
+                    ) NO-ERROR.
+                
+                oJsonReturn = NEW JsonObject().
+                oJsonReturn:ADD('success'     , TRUE                                ).
+                oJsonReturn:ADD('record'      , oJsonRecord:GetJsonObject('record') ).
+                oJsonReturn:ADD('askQuestion' , oJsonMessageBox                     ).
+                RETURN TRUE.
+            END.
+
+            DO ii = 1 TO httTable:NUM-FIELDS:
+                htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR.
+                cField  = htField:NAME.
+                hField  = hBuffer:BUFFER-FIELD(cField):HANDLE NO-ERROR.
+                IF  ERROR-STATUS:ERROR       OR
+                    NOT VALID-HANDLE(hField) THEN NEXT.
+                IF hField:EXTENT > 0 THEN 
+                DO:
+                    cFieldValue = htField:BUFFER-VALUE.
+                    IF cField = 'address' THEN 
+                    DO:
+                        FIND countries NO-LOCK 
+                            WHERE countries.language_id  = httTable::language_id
+                            AND   countries.country_code = httTable::country_code NO-ERROR.
+                        IF NOT AVAILABLE countries THEN 
+                        DO:
+                            FIND countries NO-LOCK 
+                                WHERE countries.language_id  = 1
+                                AND   countries.country_code = httTable::country_code NO-ERROR.
+                        END.
+                        i2 = (IF countries.country_code_pos = 9 THEN 12 ELSE 11).
+
+                        DO i1 = 1 TO 12: 
+                            hField:BUFFER-VALUE(i1) = ''. 
+                        END.
+
+                        DO i1 = NUM-ENTRIES(cFieldValue, CHR(10)) TO 1 BY -1:
+                            cValue = ENTRY(i1, cFieldValue, CHR(10)).
+                            IF cValue = '' THEN NEXT.
+                            hField:BUFFER-VALUE(i2) = cValue.
+                            i2 = i2 - 1. 
+                        END.
+                    END.
+                    ELSE 
+                    DO:
+                        DO i1 = 1 TO hField:EXTENT:
+                            hField:BUFFER-VALUE(i1) = ENTRY(i1, cFieldValue, CHR(10)) NO-ERROR.
+                        END.
+                    END.
+                END.
+                ELSE 
+                DO:
+                    IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT.
+                    hField:BUFFER-VALUE = htField:BUFFER-VALUE.
+                END. 
+            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('updated_by'):HANDLE NO-ERROR.
+            IF  NOT ERROR-STATUS:ERROR AND
+                VALID-HANDLE(hField)   THEN hField:BUFFER-VALUE = oJsonIdent:GetCharacter('user_name').
+            
+            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.
+            
+            oJsonData   = NEW JsonObject().
+            oJsonArray  = NEW JsonArray ().
+            httTable:BUFFER-COPY(hBuffer).
+            httTable:WRITE-JSON('JsonObject', oJsonData).
+    
+            oJsonArray = oJsonData:GetJsonArray('record').
+            oJsonData  = oJsonArray:GetJsonObject(1).
+            
+            hBuffer:BUFFER-RELEASE ().
+            
+            lRetVal = TRUE.
+            LEAVE.
+        END.
+
+        IF lRetVal THEN 
+        DO:             
+            oJsonReturn = NEW JsonObject().
+            oJsonReturn:ADD('success', TRUE     ).
+            oJsonReturn:ADD('record' , oJsonData).
+        
+            outilitiesHandler:createInfoBox(
+                INPUT  oJsonIdent       ,
+                INPUT  '2003'           ,
+                INPUT  ''               ,
+                OUTPUT oJsonMessageBox
+                ) NO-ERROR.
+            oJsonReturn:ADD('showMessage' , oJsonMessageBox).
+        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 addressprogsHandler ( ):
+
+    END DESTRUCTOR.
+
+END CLASS.

+ 0 - 0
adressen/sendsmtpmail.p → addresses/sendsmtpmail.p


+ 0 - 0
adressen/webhookImpl.cls → addresses/webhookImpl.cls


Разница между файлами не показана из-за своего большого размера
+ 552 - 415
admin/adminprogsHandler.cls


+ 329 - 279
admin/dynamicformImpl.cls

@@ -11,35 +11,34 @@
 
 BLOCK-LEVEL ON ERROR UNDO, THROW.
 
-USING OpenEdge.Core.String                          FROM PROPATH.
-USING OpenEdge.Net.HTTP.IHttpResponse               FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum              FROM PROPATH.
-USING OpenEdge.Web.IWebRequest                      FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter                FROM PROPATH.
-USING OpenEdge.Web.WebHandler                       FROM PROPATH.
-
-USING Progress.Json.ObjectModel.ObjectModelParser   FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject          FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonArray           FROM PROPATH.
-USING PROGRESS.lang.*                               FROM PROPATH.
-
-USING src.ch.adprime.gemis.WebHandlerUtilities      FROM PROPATH.
-USING utilities.selectboxHandler                    FROM PROPATH.
-USING utilities.utilitiesHandler                    FROM PROPATH.
-USING admin.adminprogsHandler                       FROM PROPATH.
+USING OpenEdge.Core.String FROM PROPATH.
+USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
+USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
+USING OpenEdge.Web.IWebRequest FROM PROPATH.
+USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
+USING OpenEdge.Web.WebHandler FROM PROPATH.
+USING Progress.Json.ObjectModel.ObjectModelParser FROM PROPATH.
+USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
+USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
+USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
+USING utilities.selectboxHandler FROM PROPATH.
+USING utilities.utilitiesHandler FROM PROPATH.
 
 
 CLASS admin.dynamicformImpl INHERITS WebHandler: 
 
     DEFINE VARIABLE oResponse            AS IHttpResponse        NO-UNDO.         
     DEFINE VARIABLE oWriter              AS WebResponseWriter    NO-UNDO.
-    DEFINE VARIABLE oBody                AS String               NO-UNDO.
+    DEFINE VARIABLE oBody                AS STRING               NO-UNDO.
     DEFINE VARIABLE cDefautlCharSet      AS CHARACTER            NO-UNDO INIT 'UTF-8'.
     DEFINE VARIABLE oParser              AS ObjectModelParser    NO-UNDO.           
     DEFINE VARIABLE cCorralationID       AS CHARACTER            NO-UNDO.
     DEFINE VARIABLE cContent-Type        AS CHARACTER            NO-UNDO.
     DEFINE VARIABLE lcJsonString         AS LONGCHAR             NO-UNDO.
-    DEFINE VARIABLE oJsonActiveSelectBox AS JsonObject           NO-UNDO.    
+    DEFINE VARIABLE oJsonActiveSelectBox AS JsonObject           NO-UNDO.
+    DEFINE VARIABLE oJsonMessageBox      AS JsonObject           NO-UNDO.
+    DEFINE VARIABLE cString              AS CHARACTER            NO-UNDO.
+    DEFINE VARIABLE lcString             AS LONGCHAR             NO-UNDO.    
     
     DEFINE VARIABLE hError               AS HANDLE               NO-UNDO.
     DEFINE VARIABLE ccompany             AS CHARACTER            NO-UNDO.
@@ -50,7 +49,8 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
     DEFINE VARIABLE cFunction            AS CHARACTER            NO-UNDO.
     DEFINE VARIABLE cForm_Id             AS CHARACTER            NO-UNDO.
     DEFINE VARIABLE cProgram             AS CHARACTER            NO-UNDO.
-    DEFINE VARIABLE cProgramUser         AS CHARACTER            NO-UNDO.
+    DEFINE VARIABLE cFormUser            AS CHARACTER            NO-UNDO.
+    DEFINE VARIABLE cFormColumns         AS CHARACTER            NO-UNDO.
     DEFINE VARIABLE cUsers               AS CHARACTER            NO-UNDO INIT 'user,admin'.
     DEFINE VARIABLE lcMessage            AS LONGCHAR             NO-UNDO.
     DEFINE VARIABLE cErrorNo             AS CHARACTER            NO-UNDO.
@@ -90,20 +90,19 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
         DEFINE VARIABLE i1            AS INTEGER    NO-UNDO.
         DEFINE VARIABLE cQueryString  AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cFileName     AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFieldName    AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cClassName    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cUser         AS CHARACTER  NO-UNDO.
         
         DEFINE VARIABLE oJsonResult   AS JsonObject NO-UNDO.
         DEFINE VARIABLE oJsonMessage  AS JsonObject NO-UNDO.
-        DEFINE VARIABLE httBuffer     AS HANDLE     NO-UNDO.
-
+        
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        cLogFile = SUBSTITUTE('C:\TEMP\handleDELETE_&1.json', REPLACE(STRING(TIME,'HH:MM:SS'), ':', '')).
-        oJsonData:WriteFile(cLogFile, TRUE).
 
-        hError            = ERROR-STATUS:HANDLE.
+        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
+        cQueryString      = OpenEdge.Net.URI:Decode(cQueryString).
+        
         outilitiesHandler = NEW utilitiesHandler().
-        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
+        hError            = ERROR-STATUS:HANDLE.        
         
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
@@ -116,37 +115,45 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             OUTPUT cFunction    ,
             OUTPUT oJsonIdent   
             ).
-
-        // oJsonIdent:WriteFile('C:\TEMP\dynamicform_DELETE_ident.json', TRUE).
-                
-        cForm_Id   = oJsonIdent:GetCharacter('formId').
-        cClassName = ENTRY(1, cForm_Id, '_').
-        cFileName  = ENTRY(1, cForm_Id, '_').
+MESSAGE 'DELETE mit function ' oJsonIdent:GetCharacter('function').
         //
-        //  mögliche Benutzer für das durchsuchen von HTML-DOkumenten und Labeltexten ...
+        //  mögliche Benutzer für das durchsuchen von HTML-Dokumenten und Labeltexten ...
+        //
+        cUser = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+        cUser = oJsonIdent:GetCharacter('user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+        //
+        //  Programmname aus den möglichen Benutzern ermitteln
         //
-        cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        
         lRetVal    = FALSE.
-      
+        iItemsPage = 50.
+        cMaxHeight = '250px'.
         cProgram = outilitiesHandler:getProgramName (
-            INPUT  oJsonIdent,
-            INPUT  cUsers
+            INPUT        oJsonIdent  ,
+            INPUT        cUsers      ,
+            OUTPUT       cFormUser   ,
+            OUTPUT       cFormColumns,
+            INPUT-OUTPUT iItemsPage  ,
+            INPUT-OUTPUT cMaxHeight
             ).
-            
-        REPEAT TRANSACTION WHILE cFunction = 'delete' ON ERROR UNDO, LEAVE:
-            CASE cClassName:
-                WHEN 'users' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-                WHEN 'messages' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-                WHEN 'labeltexte' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-            END CASE.
+        oJsonIdent:ADD('program', cProgram) NO-ERROR.
+        IF oJsonIdent:HAS('limit') THEN oJsonIdent:SET('limit', iItemsPage).
+        ELSE                            oJsonIdent:ADD('limit', iItemsPage).
+
+// cLogFile = SUBSTITUTE('C:\TEMP\oJsonIdentDELETE_&1.json', REPLACE(STRING(TIME,'HH:MM:SS'), ':', '')).
+// oJsonIdent:WriteFile(cLogFile, TRUE).
+        
+        cForm_Id   = oJsonIdent:GetCharacter('formId'    ).
+        cClassName = oJsonIdent:GetCharacter('class_name').
+        cFileName  = oJsonIdent:GetCharacter('file_name' ).
+        
+        FIND programs NO-LOCK 
+            WHERE programs.program_name = cProgram NO-ERROR.
+        IF NOT AVAILABLE programs THEN LEAVE.
+        cClass = programs.program_class.
 
+        REPEAT TRANSACTION WHILE cFunction = 'delete' ON ERROR UNDO, LEAVE:
             rClass   = Progress.Lang.Class:GetClass(cClass) NO-ERROR.
             cMethode = 'deleteData'.
             oHandler = rClass:NEW().
@@ -158,8 +165,8 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             outilitiesHandler:evaluateErrorStatus(hError).
             IF NOT lRetVal THEN LEAVE.
             
-            oJsonResult:WRITE(lcJsonString, FALSE).
-            oJsonResult:WriteFile('C:\TEMP\DYNAMIC_DELETE_Respons.json', TRUE).
+            oJsonResult:WRITE(LcJsonString, FALSE).
+// oJsonResult:WriteFile('C:\TEMP\DYNAMIC_DELETE_Respons.json', TRUE).
             LEAVE.
         END.
                     
@@ -216,14 +223,18 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
         DEFINE VARIABLE cFieldName       AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cClassName       AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cActiveSelection AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFormUser        AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cUser            AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE lcQueryString    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE lSendChange      AS LOGICAL    NO-UNDO.
         
         DEFINE VARIABLE oJsonResult      AS JsonObject NO-UNDO.
         DEFINE VARIABLE httBuffer        AS HANDLE     NO-UNDO.
+
+        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
+        cQueryString      = OpenEdge.Net.URI:Decode(cQueryString).
         
-        hError            = ERROR-STATUS:HANDLE.
         outilitiesHandler = NEW utilitiesHandler().
-        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
+        hError            = ERROR-STATUS:HANDLE.        
         
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
@@ -236,18 +247,17 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             OUTPUT cFunction    ,
             OUTPUT oJsonIdent   
             ).
+        oJsonIdent:WRITE(lcString, TRUE).
+        cString = lcString.
+MESSAGE 'GET mit function ' oJsonIdent:GetCharacter('function').        
         //
-        //  mögliche Benutzer für das durchsuchen von HTML-DOkumenten und Labeltexten ...
+        //  mögliche Benutzer für das durchsuchen von HTML-Dokumenten und Labeltexten ...
         //
-        cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        
-        cLogFile = SUBSTITUTE('C:\TEMP\handleGET_&1.json', REPLACE(STRING(TIME,'HH:MM:SS'), ':', '')).
-        oJsonIdent:WriteFile(cLogFile, TRUE) NO-ERROR.
-        outilitiesHandler:evaluateErrorStatus(INPUT hError).
-        
+        cUser = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+        cUser = oJsonIdent:GetCharacter('user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+
         lRetVal = FALSE.
 
         MASTERLOOP:
@@ -255,56 +265,59 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             //
             //  Programmname aus den möglichen Benutzern ermitteln
             //
-            cMaxHeight = '250px'.
             iItemsPage = 50.
+            cMaxHeight = '250px'.
             cProgram = outilitiesHandler:getProgramName (
-                INPUT        oJsonIdent,
-                INPUT        cUsers    ,
-                OUTPUT       cFormUser ,
-                INPUT-OUTPUT iItemsPage,
+                INPUT        oJsonIdent  ,
+                INPUT        cUsers      ,
+                OUTPUT       cFormUser   ,
+                OUTPUT       cformColumns,
+                INPUT-OUTPUT iItemsPage  ,
                 INPUT-OUTPUT cMaxHeight
                 ).
+
             IF cProgram = '' THEN 
             DO:
-                outilitiesHandler:getErrorMessage(
-                    INPUT  '2001',
-                    INPUT  iLanguage_id,
-                    INPUT  oJsonIdent:GetCharacter('frameId'),  /* Parameters */
-                    OUTPUT lcMessage
+                cString = oJsonIdent:GetCharacter('formId').
+                outilitiesHandler:createErrorBox(
+                    INPUT  oJsonIdent   ,
+                    INPUT  '2001'       ,
+                    INPUT  cString,  /* Parameters */
+                    OUTPUT oJsonMessageBox
                     ).
                 LEAVE.
-            END.            
+            END.
+
             oJsonIdent:ADD('program'       , cProgram  ).
             oJsonIdent:ADD('itemsPerPage'  , iItemsPage).
             oJsonIdent:ADD('tableMaxHeight', cMaxHeight).
             oJsonIdent:ADD('formUser'      , cFormUser ).
-
+            
             cErrorNo   = ''.
             cForm_Id   = oJsonIdent:GetCharacter("formId"    ) NO-ERROR.
             cFileName  = oJsonIdent:GetCharacter("file_name" ) NO-ERROR.
             cClassName = oJsonIdent:GetCharacter("class_name") NO-ERROR.
-            
+// MESSAGE 'cProgram =' cProgram.
+            FIND programs NO-LOCK 
+                WHERE programs.program_name = cProgram NO-ERROR.
+            IF NOT AVAILABLE programs THEN LEAVE.
+            cClass      = programs.program_class.
+            lSendChange = programs.sendChangeRecord.
             //            
             //  active-Feld-Filter ermitten
             //
-            outilitiesHandler:getActiveSelection(
-                INPUT  oJsonIdent      ,
-                INPUT  cFileName       ,
-                OUTPUT cActiveSelection
-                ).
-            IF cActiveSelection <> '' THEN 
+            IF cFunction <> 'saveActiveFilter' THEN 
             DO:
-                IF NOT oJsonIdent:HAS('activeFilter') THEN oJsonIdent:ADD('activeFilter', cActiveSelection ).
-            END.
-
-            DO WHILE cFunction = 'saveActiveFilter' AND cProgram <> '':
-                outilitiesHandler:setActiveSelection(
-                    INPUT  oJsonIdent,
-                    INPUT  cFileName,
-                    INPUT  oJsonIdent:GetCharacter('activeFilter')
+                outilitiesHandler:getActiveSelection(
+                    INPUT  oJsonIdent      ,
+                    INPUT  cFileName       ,
+                    OUTPUT cActiveSelection
                     ).
-                lRetVal = TRUE.
-                LEAVE.
+                IF cActiveSelection <> '' THEN 
+                DO:
+                    IF NOT oJsonIdent:HAS('activeFilter') THEN oJsonIdent:ADD('activeFilter', cActiveSelection ).
+                    ELSE                                       oJsonIdent:SET('activeFilter', cActiveSelection ).
+                END.
             END.
 
             DO WHILE cFunction = 'init' AND cProgram <> '':
@@ -315,6 +328,9 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                 hField = hBuffer:BUFFER-FIELD('active') NO-ERROR.
                 IF  NOT ERROR-STATUS:ERROR AND 
                     VALID-HANDLE(hField)   THEN lActive = TRUE.
+                hField = hBuffer:BUFFER-FIELD('wordindex') NO-ERROR.
+                IF  NOT ERROR-STATUS:ERROR AND 
+                    VALID-HANDLE(hField)   THEN lWordIndex = TRUE.
                 DELETE OBJECT hBuffer.
                 //
                 //  Alle Felder, welche als Selectboxen definiert sind, füllen
@@ -322,12 +338,13 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                 oselectboxHandler = NEW selectboxHandler().
                 oJsonSelectBoxes  = NEW JsonObject().
                 FOR EACH selectboxfields NO-LOCK
-                    WHERE selectboxfields.company   = ccompany
-                    AND   selectboxfields.program   = cform_id
-                    AND   selectboxfields.user_name = cFormUser:
+                    WHERE selectboxfields.company       = ccompany
+                    AND   selectboxfields.program       = cform_id
+                    AND   selectboxfields.user_name     = cFormUser
+                    AND   selectboxfields.boxfieldsFix <> '':
 
-                    DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfields, ';'):
-                        cFieldName = ENTRY(ii, selectboxfields.boxfields, ';').
+                    DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfieldsFix, ';'):
+                        cFieldName = ENTRY(ii, selectboxfields.boxfieldsFix, ';').
                         cFileName  = ENTRY(1, cFieldName, '_').
 
                         IF cFieldName MATCHES('*company*') THEN 
@@ -365,14 +382,26 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                             oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
                             NEXT.
                         END.
+                        
+                        oselectboxHandler:getSelectBoxData(
+                            INPUT  oJsonIdent,
+                            INPUT  cFieldName,
+                            OUTPUT oJsonBox
+                            ).
+// oJsonBox:WriteFile('C:\TEMP\JsonBox.json', TRUE).
+                        oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
+// oJsonSelectBoxes:WriteFile(SUBSTITUTE('C:\TEMP\&1_JsonSelectBoxes.json', cFilename), TRUE).
                     
                     END.
                 END.
-                
+
                 oJsonResponse = NEW JsonObject().
                 oJsonResponse:ADD('selectOptionsFix', oJsonSelectBoxes).
-                oJsonResponse:ADD("tableMaxHeight"  , cMaxHeight      ).
-                oJsonResponse:ADD("itemsPerPage"    , iItemsPage      ).
+                oJsonResponse:ADD('tableMaxHeight'  , cMaxHeight      ).
+                oJsonResponse:ADD('itemsPerPage'    , iItemsPage      ).
+                oJsonResponse:ADD('formColumns'     , cFormColumns    ).
+                oJsonResponse:ADD('lSearch'         , lWordIndex      ).
+                oJsonResponse:ADD('hasRecordChange' , lSendChange     ).
                 //
                 //  Wenn die Tabelle das Feld active hat, wird die SelectBox für den activ-Filter gefüllt
                 //
@@ -384,106 +413,80 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                     oJsonActiveSelectBox = NEW JsonObject().
                     FOR EACH labeltexte NO-LOCK 
                         WHERE labeltexte.company     = ccompany
-                        AND   labeltexte.user_name   = cuser_name
+                        AND   labeltexte.user_name   = cFormUser
                         AND   labeltexte.program     = 'Labels'
                         AND   labeltexte.table_name  = 'table'
                         AND   labeltexte.field_name BEGINS 'LBL_FILTER'
                         AND   labeltexte.language_id = ilanguage_id :
                         oJsonActiveSelectBox:ADD(CAPS(labeltexte.field_name), labeltexte.headlabel).
                     END.
+                    oJsonResponse:ADD('activeFilterLabels', oJsonActiveSelectBox).
                 END.
-                oJsonResponse:ADD('activeFilterLabels', oJsonActiveSelectBox).
+                //
+                //  Sortfelder auf start (keine Felder) stellen.
+                //
+                outilitiesHandler:writeSortfields(
+                    INPUT  oJsonIdent   ,
+                    INPUT  cFileName    ,
+                    INPUT  ''           ,   //  cSortField
+                    INPUT  ''               //  cDirection
+                    ) NO-ERROR.
                 
                 lRetVal = TRUE.                
+// oJsonResponse:WriteFile('C:\Temp\dynamicform_init_response.json', TRUE).
                 LEAVE. 
             END.
             
             DO WHILE cFunction = 'loaddata' AND cProgram <> '':
-                CASE cClassName:
-                    WHEN 'users' THEN 
-                        cClass = 'admin.adminprogsHandler'.
-                    WHEN 'messages' THEN 
-                        cClass = 'admin.adminprogsHandler'.
-                    WHEN 'labeltexte' THEN 
-                        cClass = 'admin.adminprogsHandler'.
-                END CASE.
+MESSAGE 'loaddata start'.
+oJsonIdent:WriteFile('C:\Temp\loaddat_jsonident.json', TRUE).
+                IF oJsonIdent:HAS('sortField') THEN 
+                DO:
+                    DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
+                    DEFINE VARIABLE cDirection AS CHARACTER NO-UNDO.
+                    
+                    cSortField = oJsonIdent:GetCharacter('sortField').
+                    cDirection = oJsonIdent:GetCharacter('sortDirection').
+
+                    outilitiesHandler:writeSortfields(
+                        INPUT  oJsonIdent   ,
+                        INPUT  cFileName    ,
+                        INPUT  cSortField   ,
+                        INPUT  cDirection
+                        ).
+                END.
 
                 rClass   = Progress.Lang.Class:GetClass(cClass) NO-ERROR.
                 cMethode = 'getData'.
                 oHandler = rClass:NEW().
                 lRetVal  = DYNAMIC-INVOKE ( oHandler, cMethode,
                     INPUT  oJsonIdent  ,
-                    OUTPUT oJsonResult
+                    OUTPUT oJsonResponse
                     ) NO-ERROR.
-                outilitiesHandler:evaluateErrorStatus(hError).
-                IF NOT lRetVal THEN LEAVE.
+                outilitiesHandler:evaluateErrorStatus(INPUT hError).
  
-                oJsonResponse = NEW JsonObject().
-                oJsonResponse:ADD('selectOptionsFix', oJsonSelectBoxes).
-            
-                oJsonResponse = oJsonResult.
+// oJsonResponse:WriteFile(SUBSTITUTE('C:\TEMP\Loaddata_response_&1.json', oJsonIdent:GetCharacter('page')), TRUE).
+// oJsonResponse:ADD('selectOptionsFix', oJsonSelectBoxes).
 
                 lRetVal = TRUE.
                 LEAVE.
             END.
-        
-            DO WHILE cFunction = 'change' AND cProgram <> '':
-                CASE cClassName:
-                    WHEN 'users' THEN 
-                        cClass = 'adminprogsHandler'.
-                    WHEN 'messages' THEN 
-                        cClass = 'adminprogsHandler'.
-                    WHEN 'labeltexte' THEN 
-                        cClass = 'adminprogsHandler'.
-                END CASE.
-            
-                ASSIGN
-                    rClass = Progress.Lang.Class:GetClass(cClass).
-                
-                cMethode = 'change'.
 
-                oHandler = rClass:NEW().
-                lRetVal = DYNAMIC-INVOKE ( oHandler, cMethode,
-                    INPUT  oJsonIdent  ,
-                    INPUT  oJsonData   ,
-                    OUTPUT oJsonResult
-                    ).
-                IF NOT lRetVal THEN LEAVE.
-                
-                oJsonResponse = NEW JsonObject().
-                oJsonResponse:ADD('selectOptionsFix', oJsonSelectBoxes).
-            
-                oJsonResponse = oJsonResult.
-
-                lRetVal = TRUE.
-                LEAVE.
-            END.
-        
             DO WHILE cFunction = 'rebuild':
-                CASE cClassName:
-                    WHEN 'users' THEN 
-                        cClass = 'adminprogsHandler'.
-                    WHEN 'messages' THEN 
-                        cClass = 'adminprogsHandler'.
-                    WHEN 'labeltexte' THEN 
-                        cClass = 'adminprogsHandler'.
-                END CASE.
-            
-                ASSIGN
-                    rClass = Progress.Lang.Class:GetClass(cClass).
-                
+                rClass   = Progress.Lang.Class:GetClass(cClass).
                 cMethode = 'rebuildData'.
-
                 oHandler = rClass:NEW().
-                lRetVal = DYNAMIC-INVOKE ( oHandler, cMethode,
+                
+                lRetVal  = DYNAMIC-INVOKE ( oHandler, cMethode,
                     INPUT  oJsonIdent  ,
-                    INPUT  oJsonData   ,
                     OUTPUT oJsonResult
-                    ).
+                    ) NO-ERROR.
+                IF outilitiesHandler:evaluateErrorStatus(hError) THEN lRetVal = FALSE.
+
                 IF NOT lRetVal THEN 
                 DO:
                     outilitiesHandler:getErrorMessage(
-                        INPUT  '900'        ,
+                        INPUT  '2009'        ,
                         INPUT  ilanguage_id ,
                         INPUT   '',
                         OUTPUT lcMessage).                    
@@ -493,10 +496,11 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                     oJsonResponse:WRITE(lcJsonString, FALSE).
                 END.
             
-                oJsonResponse = NEW JsonObject().
-                oJsonResponse:ADD('selectOptionsFix', oJsonSelectBoxes).
+// oJsonResponse = NEW JsonObject().
+// oJsonResponse:ADD('selectOptionsFix', oJsonSelectBoxes).
             
                 oJsonResponse = oJsonResult.
+                oJsonResponse:WriteFile(SUBSTITUTE('C:\TEMP\rebuild_&1.json', cFileName), TRUE).
 
                 lRetVal = TRUE.
                 LEAVE.
@@ -504,6 +508,7 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
         
             DO WHILE cFunction = 'saveActiveFilter':
                 cActiveSelection = oJsonIdent:GetCharacter('activeFilter').
+MESSAGE cFunction '-' cActiveSelection.
                 outilitiesHandler:setActiveSelection(
                     INPUT  oJsonIdent      ,
                     INPUT  cFileName       ,
@@ -512,35 +517,58 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             
                 oJsonResponse = NEW JsonObject().
                 oJsonResponse:ADD('success', TRUE).
-                oJsonResponse:WRITE(lcJsonString, FALSE).
+//                oJsonResponse:WRITE(lcJsonString, FALSE).
             
                 lRetVal = TRUE.
                 LEAVE.
             END.
         
-        // oJsonResponse:WriteFile('C:\Temp\dynamicform_response.json').
-            oJsonResponse:WRITE(lcJsonString, FALSE).
-        
+            DO WHILE cFunction = 'lookup' AND cProgram <> '':
+                cMethode = oJsonIdent:GetCharacter('lookupField') NO-ERROR.
+                cMethode = REPLACE(cMethode, cFileName + '_', '').
+                cClass   = 'utilities.lookupHandler'.
+            
+                ASSIGN
+                    rClass = Progress.Lang.Class:GetClass(cClass) NO-ERROR.
+
+                oHandler = rClass:NEW() NO-ERROR.
+
+                lRetVal = DYNAMIC-INVOKE ( oHandler, cMethode,
+                    INPUT  oJsonIdent  ,
+                    OUTPUT oJsonResult
+                    ) NO-ERROR.
+                outilitiesHandler:evaluateErrorStatus(hError).
+                oJsonResponse = oJsonResult.
+                LEAVE.
+            END.
+                
             LEAVE.
         END.
 
         IF NOT lRetVal THEN 
         DO:
+            lcString = oJsonMessageBox:GetLongchar('text').
             oJsonResponse = NEW JsonObject().
             oJsonResponse:ADD('success', FALSE).
-            oJsonResponse:WRITE(lcJsonString, FALSE).
+            oJsonResponse:ADD('message', lcString).
+            oJsonResponse:ADD('showMessage', oJsonMessageBox).
         END.
-                
+
+        oJsonResponse:WRITE(lcJsonString, FALSE).
         cContent-Type   = "application/json".
         cDefautlCharSet = 'utf-8'.
-// MESSAGE 'Get-Respond ' STRING(lcJsonString).
-        oBody = NEW STRING(lcJsonString).
-        WebHandlerUtilities:createHttpResponse(INPUT INTEGER(StatusCodeEnum:OK), INPUT oBody, INPUT cContent-Type, INPUT cDefautlCharSet, INPUT cCorralationID, OUTPUT oResponse).
-//        oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
+
+        oBody = NEW STRING(lcJsonString) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(hError).
+        WebHandlerUtilities:createHttpResponse(INPUT INTEGER(StatusCodeEnum:OK), INPUT oBody, INPUT cContent-Type, INPUT cDefautlCharSet, INPUT cCorralationID, OUTPUT oResponse) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(hError).
+// oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
 
         
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open(). 
+        oWriter = NEW WebResponseWriter(oResponse) NO-ERROR.
+        outilitiesHandler:evaluateErrorStatus(hError).
+        oWriter:Open() NO-ERROR. 
+        outilitiesHandler:evaluateErrorStatus(hError).
         oWriter:Close(). 
 
         RETURN 0.
@@ -579,25 +607,22 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
         DEFINE VARIABLE ii            AS INTEGER    NO-UNDO.
         DEFINE VARIABLE i1            AS INTEGER    NO-UNDO.
         DEFINE VARIABLE cQueryString  AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cQueryPairs   AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cQueryKey     AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cQueryValue   AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cFileName     AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFieldName    AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cClassName    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cUser         AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cString       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE lSendChange   AS LOGICAL    NO-UNDO.
         
         DEFINE VARIABLE oJsonResult   AS JsonObject NO-UNDO.
         DEFINE VARIABLE oJsonMessage  AS JsonObject NO-UNDO.
-        DEFINE VARIABLE httBuffer     AS HANDLE     NO-UNDO.
-        
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-
-        cLogFile = SUBSTITUTE('C:\TEMP\handlePOST_&1.json', REPLACE(STRING(TIME,'HH:MM:SS'), ':', '')).
-        oJsonData:WriteFile(cLogFile, TRUE).
 
+        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
+// oJsonData:WriteFile('C:\Temp\oJsonData_Post_Data.json', TRUE).
+        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
+        cQueryString      = OpenEdge.Net.URI:Decode(cQueryString).
+       
         outilitiesHandler = NEW utilitiesHandler().
         hError            = ERROR-STATUS:HANDLE.        
-        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
         
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
@@ -610,48 +635,76 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             OUTPUT cFunction    ,
             OUTPUT oJsonIdent   
             ).
-
-        oJsonIdent:WriteFile('C:\TEMP\dynamicform_POST.json', TRUE).
+MESSAGE 'POST mit function ' oJsonIdent:GetCharacter('function').
+        oJsonIdent:WRITE(lcJsonString, TRUE).
         //
         //  mögliche Benutzer für das durchsuchen von HTML-DOkumenten und Labeltexten ...
         //
-        cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        
-        cForm_Id   = poRequest:URI:GetQueryValue("formId") NO-ERROR.
-        cClassName = ENTRY(1, cForm_Id, '_').
-        cFileName  = ENTRY(1, cForm_Id, '_').
+        cUser = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+        cUser = oJsonIdent:GetCharacter('user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
         //
-        //  mögliche Benutzer für das durchsuchen von HTML-DOkumenten und Labeltexten ...
+        //  Programmname aus den möglichen Benutzern ermitteln
         //
-        cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        
-        lRetVal  = FALSE.
-        
+        lRetVal    = FALSE.
+        iItemsPage = 50.
+        cMaxHeight = '250px'.
         cProgram = outilitiesHandler:getProgramName (
-            INPUT  oJsonIdent,
-            INPUT  cUsers
+            INPUT        oJsonIdent  ,
+            INPUT        cUsers      ,
+            OUTPUT       cFormUser   ,
+            OUTPUT       cformColumns,
+            INPUT-OUTPUT iItemsPage  ,
+            INPUT-OUTPUT cMaxHeight
             ).
-            
-        cForm_Id   = oJsonIdent:GetCharacter('formId').
-        cClassName = ENTRY(1, cForm_Id, '_').
-        cFileName  = ENTRY(1, cForm_Id, '_').
 
-        REPEAT TRANSACTION WHILE cFunction = 'create' ON ERROR UNDO, LEAVE:
-            CASE cClassName:
-                WHEN 'users' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-                WHEN 'messages' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-                WHEN 'labeltexte' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-            END CASE.
+        IF cProgram = '' THEN 
+        DO:
+            cString = oJsonIdent:GetCharacter('formId').
+            outilitiesHandler:createErrorBox(
+                INPUT  oJsonIdent   ,
+                INPUT  '2001'       ,
+                INPUT  cString,  /* Parameters */
+                OUTPUT oJsonMessageBox
+                ).
+            LEAVE.
+        END.
+
+        oJsonIdent:ADD('program'       , cProgram  ).
+        oJsonIdent:ADD('itemsPerPage'  , iItemsPage).
+        oJsonIdent:ADD('tableMaxHeight', cMaxHeight).
+        oJsonIdent:ADD('formUser'      , cFormUser ).
+        IF oJsonIdent:HAS('limit') THEN oJsonIdent:SET('limit', iItemsPage).
+        ELSE                            oJsonIdent:ADD('limit', iItemsPage).
+        
+        cForm_Id   = oJsonIdent:GetCharacter('formId'    ).
+        cClassName = oJsonIdent:GetCharacter('class_name').
+        cFileName  = oJsonIdent:GetCharacter('file_name' ).
+        
+        FIND programs NO-LOCK 
+            WHERE programs.program_name = cProgram NO-ERROR.
+        IF NOT AVAILABLE programs THEN LEAVE.
+        cClass      = programs.program_class.
+        lSendChange = programs.sendChangeRecord.
+        
+        DO WHILE cFunction = 'change':
+            cMethode = oJsonData:GetCharacter('changeAction').
+            oJsonIdent:ADD('changeAction', cMethode). 
+MESSAGE 'cFunction =' cFunction ' - Methode =' cMethode.
+            rClass   = Progress.Lang.Class:GetClass(cClass) NO-ERROR.
+            oHandler = rClass:NEW().
+            lRetVal  = DYNAMIC-INVOKE (oHandler, cMethode,
+                INPUT  oJsonIdent ,
+                INPUT  oJsonData  ,
+                OUTPUT oJsonResult
+                ) NO-ERROR.
+            lRetVal = (IF outilitiesHandler:evaluateErrorStatus(hError) THEN FALSE ELSE TRUE).
+// oJsonResult:WriteFile('C:\TEMP\DYNAMIC_CHANGE_Respons.json', TRUE).
+            LEAVE.
+        END.
 
+        REPEAT TRANSACTION WHILE cFunction = 'create' ON ERROR UNDO, LEAVE:
             rClass   = Progress.Lang.Class:GetClass(cClass) NO-ERROR.
             cMethode = 'createData'.
             oHandler = rClass:NEW().
@@ -660,19 +713,15 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                 INPUT  oJsonData  ,
                 OUTPUT oJsonResult
                 ) NO-ERROR.
-            outilitiesHandler:evaluateErrorStatus(hError).
-            IF NOT lRetVal THEN LEAVE.
-            
-            oJsonResult:WRITE(lcJsonString, FALSE).
-            oJsonResult:WriteFile('C:\TEMP\DYNAMIC_CREATE_Respons.json', TRUE).
+            lRetVal = (IF outilitiesHandler:evaluateErrorStatus(hError) THEN FALSE ELSE TRUE).
+// oJsonResult:WriteFile('C:\TEMP\DYNAMIC_CREATE_Respons.json', TRUE).
             LEAVE.
         END.
                     
         oResponse             = NEW OpenEdge.Web.WebResponse().
         oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
         oResponse:ContentType = "application/json;charset=utf-8".
-        oWriter               = NEW WebResponseWriter(oResponse).
-                        
+        
         IF NOT lRetVal THEN 
         DO:
             oJsonMessage = NEW JsonObject().
@@ -680,8 +729,14 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             oJsonMessage:ADD('message', oJsonResult:GetLongchar('message')).
             oJsonMessage:WRITE(lcJsonString, FALSE).
         END.
-        MESSAGE 'Rueckmeldung beim POST (CREATE) ' STRING(lcJsonString).
+        ELSE 
+        DO:
+            oJsonResult:WRITE(lcJsonString, FALSE).
+// oJsonResult:WriteFile(SUBSTITUTE('C:\TEMP\DYNAMIC_&1_Respons.json', cFunction), TRUE).
+        END.
+// MESSAGE 'Rueckmeldung beim POST ' cFunction  STRING(lcJsonString).
                             
+        oWriter = NEW WebResponseWriter(oResponse).
         oWriter:Open().
         oWriter:Write(lcJsonString).
         oWriter:Close().
@@ -718,21 +773,19 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
         DEFINE VARIABLE i1            AS INTEGER    NO-UNDO.
         DEFINE VARIABLE cQueryString  AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cFileName     AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFieldName    AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cClassName    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cUser         AS CHARACTER  NO-UNDO.
         
         DEFINE VARIABLE oJsonResult   AS JsonObject NO-UNDO.
         DEFINE VARIABLE oJsonMessage  AS JsonObject NO-UNDO.
-        DEFINE VARIABLE httBuffer     AS HANDLE     NO-UNDO.
         
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        
-        cLogFile = SUBSTITUTE('C:\TEMP\handlePATCH_&1.json', REPLACE(STRING(TIME,'HH:MM:SS'), ':', '')).
-        oJsonData:WriteFile(cLogFile, TRUE).
+
+        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
+        cQueryString      = OpenEdge.Net.URI:Decode(cQueryString).
         
         outilitiesHandler = NEW utilitiesHandler().
         hError            = ERROR-STATUS:HANDLE.        
-        cQueryString      = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
         
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
@@ -745,35 +798,40 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
             OUTPUT cFunction    ,
             OUTPUT oJsonIdent   
             ).
-
-        cForm_Id   = poRequest:URI:GetQueryValue("formId") NO-ERROR.
-        cClassName = ENTRY(1, cForm_Id, '_').
-        cFileName  = ENTRY(1, cForm_Id, '_').
+MESSAGE 'PATCH mit function ' oJsonIdent:GetCharacter('function').
         //
-        //  mögliche Benutzer für das durchsuchen von HTML-DOkumenten und Labeltexten ...
+        //  mögliche Benutzer für das durchsuchen von HTML-Dokumenten und Labeltexten ...
         //
-        cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
-        
-        lRetVal  = FALSE.
-        
+        cUser = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+        cUser = oJsonIdent:GetCharacter('user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
+        //
+        //  Programmname aus den möglichen Benutzern ermitteln
+        //
+        lRetVal    = FALSE.
+        iItemsPage = 50.
+        cMaxHeight = '250px'.
         cProgram = outilitiesHandler:getProgramName (
-            INPUT  oJsonIdent,
-            INPUT  cUsers
+            INPUT        oJsonIdent  ,
+            INPUT        cUsers      ,
+            OUTPUT       cFormUser   ,
+            OUTPUT       cFormColumns,
+            INPUT-OUTPUT iItemsPage  ,
+            INPUT-OUTPUT cMaxHeight
             ).
-            
-        REPEAT TRANSACTION WHILE cFunction = 'update' ON ERROR UNDO, LEAVE:
-            CASE cClassName:
-                WHEN 'users' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-                WHEN 'messages' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-                WHEN 'labeltexte' THEN 
-                    cClass = 'admin.adminprogsHandler'.
-            END CASE.
+        oJsonIdent:ADD('program', cProgram) NO-ERROR.
 
+        cForm_Id   = oJsonIdent:GetCharacter('formId'    ).
+        cClassName = oJsonIdent:GetCharacter('class_name').
+        cFileName  = oJsonIdent:GetCharacter('file_name' ).
+        
+        FIND programs NO-LOCK 
+            WHERE programs.program_name = cProgram NO-ERROR.
+        IF NOT AVAILABLE programs THEN LEAVE.
+        cClass = programs.program_class.
+
+        REPEAT TRANSACTION WHILE cFunction = 'update' ON ERROR UNDO, LEAVE:
             rClass   = Progress.Lang.Class:GetClass(cClass) NO-ERROR.
             cMethode = 'updateData'.
             oHandler = rClass:NEW().
@@ -782,28 +840,20 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
                 INPUT  oJsonData  ,
                 OUTPUT oJsonResult
                 ) NO-ERROR.
-            outilitiesHandler:evaluateErrorStatus(hError).
-            IF NOT lRetVal THEN LEAVE.
+            IF lRetVal THEN LEAVE.
             
-            oJsonResult:WRITE(LcJsonString, FALSE).
-            // oJsonResult:WriteFile('C:\TEMP\DYNAMIC_UPDATE_Respons.json', TRUE).
+            outilitiesHandler:evaluateErrorStatus(hError).
             LEAVE.
         END.
                     
         oResponse             = NEW OpenEdge.Web.WebResponse().
         oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
         oResponse:ContentType = "application/json;charset=utf-8".
-        oWriter               = NEW WebResponseWriter(oResponse).
                         
-        IF NOT lRetVal THEN 
-        DO:
-            oJsonMessage = NEW JsonObject().
-            oJsonMessage:ADD('success', FALSE).
-            oJsonMessage:ADD('message', 'Fehler beim Update/PATCH des Users').
-            oJsonMessage:WRITE(lcJsonString, FALSE).
-        END.
-        // MESSAGE 'Rueckmeldung ' STRING(lcJsonString).
-                            
+        oJsonResult:WRITE(lcJsonString, FALSE).
+// oJsonResult:WriteFile(SUBSTITUTE('C:\TEMP\DYNAMIC_&1_Respons.json', cFunction), TRUE).
+        
+        oWriter = NEW WebResponseWriter(oResponse).
         oWriter:Open().
         oWriter:Write(lcJsonString).
         oWriter:Close().

+ 262 - 97
admin/formdesignerImpl.cls

@@ -96,67 +96,115 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
     ------------------------------------------------------------------------------*/
 
     METHOD PUBLIC LOGICAL createTemptable(
-        INPUT ipoJsonFields AS JsonArray,
-        OUTPUT ophtTable    AS HANDLE   ,
-        OUTPUT ophBuffer    AS HANDLE 
+        INPUT  ipoJsonFields AS JsonArray,
+        OUTPUT ophtTable     AS HANDLE   ,
+        OUTPUT ophBuffer     AS HANDLE 
         ):
         
-        DEFINE VARIABLE lRetVal     AS LOGICAL    NO-UNDO.
-        DEFINE VARIABLE iType       AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE cType       AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cField      AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE ii          AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE i1          AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE cFieldNames AS CHARACTER  NO-UNDO EXTENT.
-        DEFINE VARIABLE oJsonField  AS JsonObject NO-UNDO.
+        DEFINE VARIABLE lRetVal          AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE iType            AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cType            AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cField           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hField           AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE ii               AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE i1               AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE iExtent          AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE iNumber          AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cFieldAttributes AS CHARACTER  NO-UNDO EXTENT.
+        DEFINE VARIABLE cFieldAttribute  AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE oJsonField       AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonAttr        AS JsonObject NO-UNDO.
+        DEFINE VARIABLE cValue           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cAddFields       AS CHARACTER  NO-UNDO
+            INIT 'id,fieldName,label,type,maxLength,format,decimalPlaces,widthInChars,source,align,selectOptionsType'.
+        DEFINE VARIABLE cAddedFields     AS CHARACTER  NO-UNDO.
 
         CREATE TEMP-TABLE ophtTable.
+
+        cAddedFields = ''.
+        DO i1 = 1 TO ipoJsonFields:LENGTH:
+            oJsonField       = NEW JsonObject().
+            oJsonField       = ipoJsonFields:GetJsonObject(i1).
+
+            EXTENT(cFieldAttributes) = ?.
+            cFieldAttributes = oJsonField:getNames() NO-ERROR.
+            iExtent = EXTENT(cFieldAttributes).
+
+            DO ii = 1 TO iExtent:
+                cField = cFieldAttributes[ii].
+                IF cField = ''                           THEN NEXT.
+                IF LOOKUP(cField, cAddFields  , ',') = 0 THEN NEXT.
+                IF LOOKUP(cField, cAddedFields, ',') > 0 THEN NEXT. 
+                iType  = oJsonField:getType(cField).
+
+                CASE iType:
+                    WHEN 1 THEN 
+                        cType = 'character'.
+                    WHEN 2 THEN 
+                        cType = 'integer'.
+                    WHEN 3 THEN 
+                        cType = 'logical'.
+                // 4    JsonDataType:OBJECT JSON Object
+                // 5    JsonDataType:ARRAY  JSON Array
+                // 6    JsonDataType:NULL   Null
+                    OTHERWISE 
+                    DO:
+                        MESSAGE cField 'otherwise' iType.   
+                        cType = 'character'.
+                    END.
+                END CASE.
+                
+                cAddedFields = cAddedFields
+                    + (IF cAddedFields = '' THEN '' ELSE ',')
+                    + cField.
+                ophtTable:ADD-NEW-FIELD(cField, cType) NO-ERROR.
+                IF outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE) THEN NEXT.
+            END.
+        END.
+
+        ophtTable:TEMP-TABLE-PREPARE('ttTemp').
+        ophBuffer = ophtTable:DEFAULT-BUFFER-HANDLE.
+
         DO i1 = 1 TO ipoJsonFields:LENGTH:
             oJsonField  = NEW JsonObject().
-            oJsonField  = ipoJsonFields:GetJsonObject(i1).
-            IF i1 = 1 THEN 
-            DO:
-                cFieldNames = oJsonField:getNames() NO-ERROR.
-                DO ii = 1 TO EXTENT(cFieldNames):
-                    cField = cFieldNames[ii].
-                    iType  = oJsonField:GetType(cField).
-                    cType  = ''.
-                    CASE iType:
-                        WHEN JsonDataType:STRING THEN 
-                            cType = 'character'.
-                        WHEN JsonDataType:NUMBER THEN 
-                            cType = 'integer'.
-                        WHEN JsonDataType:BOOLEAN THEN 
-                            cType = 'logical'.
-                        WHEN JsonDataType:OBJECT THEN 
-                            MESSAGE 'Json-Feldtype  OBJECT' cField.
-                        WHEN JsonDataType:ARRAY THEN 
-                            MESSAGE 'Json-Feldtype  ARRAY' cField.
-                        WHEN JsonDataType:NULL THEN 
-                            cType = 'character'.
+            oJsonField  = ipoJsonFields:GetJsonObject(i1) NO-ERROR.
+            IF outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE) THEN NEXT.
+            
+            cValue = oJsonField:GetCharacter('id') NO-ERROR.
+
+            REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+                ophBuffer:BUFFER-CREATE().
+                iExtent = NUM-ENTRIES(cAddedFields, ',').
+                
+                DO ii = 1 TO iExtent:
+                    cField = ENTRY(ii, cAddedFields, ',').
+                    IF NOT oJsonField:Has(cField) THEN NEXT.
+                    
+                    hField = ophBuffer:BUFFER-FIELD(cField) NO-ERROR.
+                    IF outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE) THEN NEXT.
+
+                    IF oJsonField:IsNull(cField) THEN
+                    DO:
+                        MESSAGE 'NULLWERT'.
+                        hField:BUFFER-VALUE = ?.
+                        NEXT.
+                    END.
+                    // cValue = oJsonField:GetCharacter(cField).
+                    CASE hField:DATA-TYPE:
+                        WHEN 'character' THEN 
+                            hField:BUFFER-VALUE = oJsonField:GetCharacter(cField) NO-ERROR. 
+                        WHEN 'integer' THEN 
+                            hField:BUFFER-VALUE = oJsonField:GetInteger(cField) NO-ERROR. 
+                        WHEN 'logical' THEN 
+                            hField:BUFFER-VALUE = STRING(oJsonField:GetLogical(cField)) NO-ERROR.
                     END CASE.
-                    IF cType = '' THEN cType = 'character'.
-                    ophtTable:ADD-NEW-FIELD(cField, cType) NO-ERROR.
+                    IF hField:BUFFER-VALUE = ? THEN hField:BUFFER-VALUE = ''.
                 END.
-                ophtTable:TEMP-TABLE-PREPARE('ttTemp').
-                ophBuffer = ophtTable:DEFAULT-BUFFER-HANDLE.
-            END.
-            ophBuffer:BUFFER-CREATE().
-            
-            DO ii = 1 TO EXTENT(cFieldNames):
-                cField = cFieldNames[ii].
-                CASE ophBuffer:BUFFER-FIELD(cField):DATA-TYPE:
-                    WHEN 'character' THEN 
-                        ophBuffer:BUFFER-FIELD(cField):BUFFER-VALUE = oJsonField:GetCharacter(cField) NO-ERROR. 
-                    WHEN 'integer' THEN 
-                        ophBuffer:BUFFER-FIELD(cField):BUFFER-VALUE = oJsonField:GetInteger(cField) NO-ERROR. 
-                    WHEN 'logical' THEN 
-                        ophBuffer:BUFFER-FIELD(cField):BUFFER-VALUE = STRING(oJsonField:GetLogical(cField)) NO-ERROR.
-                END CASE.
-                IF ophBuffer:BUFFER-FIELD(cField):BUFFER-VALUE = ? THEN ophBuffer:BUFFER-FIELD(cField):BUFFER-VALUE = ''.
+                LEAVE.
             END.
-            DELETE OBJECT oJsonField NO-ERROR.
         END.
+        
+        // DELETE OBJECT oJsonField NO-ERROR.
 
         lRetVal = TRUE.
         RETURN lRetVal.
@@ -203,7 +251,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         
         ccompany     = oJsonIdent:GetCharacter('company').
         cuser_name   = oJsonIdent:GetCharacter('user_name').
-        iLanguage_id = oJsonIdent:GetInteger('language_id').
+        iLanguage_id = oJsonIdent:GetInteger  ('language_id').
 
         EMPTY TEMP-TABLE tFileDict.
         lRetVal = FALSE.
@@ -218,12 +266,13 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 hField     = hBuffer:BUFFER-FIELD(i1).
                 cFieldName = hField:NAME.
                 IF cFieldName  = 'wordindex' THEN NEXT.
+
                 CREATE  tFileDict.
                 ASSIGN
                     tFileDict.cId          = cFileName + '_' + cFieldName
                     tFileDict.cName        = cFilename + '_' + cFieldName
-                    tFileDict.cFormat      = hBuffer:BUFFER-FIELD(ii):FORMAT
-                    tFileDict.cType        = hBuffer:BUFFER-FIELD(ii):DATA-TYPE
+                    tFileDict.cFormat      = hBuffer:BUFFER-FIELD(cFieldName):FORMAT
+                    tFileDict.cType        = hBuffer:BUFFER-FIELD(cFieldName):DATA-TYPE
                     tFileDict.iDecimals    = 0
                     tFileDict.lhidden      = FALSE
                     tFileDict.leditable    = TRUE
@@ -329,6 +378,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                     j2 = INDEX(hField:FORMAT, ')').
                     tFileDict.iMaxLength = INTEGER(SUBSTRING(hField:FORMAT, j1, j2 - j1)).
                 END.
+                IF hField:EXTENT > 0 THEN tFileDict.iMaxLength = tFileDict.iMaxLength * hField:EXTENT. 
                 
                 CASE tFileDict.cType:
                     WHEN 'character' THEN 
@@ -442,7 +492,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE cQueryValue     AS CHARACTER  NO-UNDO.
         
         outilitiesHandler = NEW utilitiesHandler().
-        
+        MESSAGE 'GetHandler '.
         cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
@@ -456,8 +506,8 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
             OUTPUT oJsonIdent   
             ).
             
-        // oJsonIdent:WriteFile('C:\TEMP\formdesigner_GET.json', TRUE).
-        
+        oJsonIdent:WriteFile('C:\TEMP\formdesigner_GET.json', TRUE).
+        MESSAGE 'getHandler Function =' cFunction.        
         DO WHILE cFunction = 'init':
             EMPTY TEMP-TABLE tcompanies.
             FOR EACH companies NO-LOCK WHERE companies.active:
@@ -508,7 +558,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 ).
 
             cFileNames = oJsonIdent:GetCharacter('tables').
-
+            MESSAGE 'File-Namen ' cFileNames.
             EMPTY TEMP-TABLE tConfig.
             FOR EACH htmldokumente NO-LOCK 
                 WHERE htmldokumente.company     = ccompany
@@ -663,19 +713,26 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE ilanguage_id    AS INTEGER           NO-UNDO.
         DEFINE VARIABLE cformtitle      AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cformid         AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cFormColumns    AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE lcJsonConfig    AS LONGCHAR          NO-UNDO.
         DEFINE VARIABLE iItemsPerPage   AS INTEGER           NO-UNDO.
         DEFINE VARIABLE ctableMaxHeight AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE htTable         AS HANDLE            NO-UNDO.
         DEFINE VARIABLE hBuffer         AS HANDLE            NO-UNDO.
         DEFINE VARIABLE hQuery          AS HANDLE            NO-UNDO.
+        DEFINE VARIABLE hField          AS HANDLE            NO-UNDO.
         DEFINE VARIABLE cFieldNames     AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cFieldName      AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cFileName       AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cField          AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cBoxfields      AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cBoxfieldsFix   AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE lBoxField       AS LOGICAL           NO-UNDO.
-        
+        DEFINE VARIABLE cLabel          AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cAlign          AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cadminLabel     AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cadminAlign     AS CHARACTER         NO-UNDO.
+
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
         // MESSAGE 'getJsonFromRequest    = ' lRetVal.
         
@@ -683,32 +740,37 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         // MESSAGE 'Funktion = ' cFunction.
         
         oJsonData:WRITE(lcJsonString, FALSE).
-        // MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
+        MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
+        
+        outilitiesHandler = NEW utilitiesHandler().
         
         ccompany     =         oJsonData:GetCharacter('company' ).
         cuser_name   =         oJsonData:GetCharacter('user_name' ).
         ilanguage_id = INTEGER(oJsonData:GetCharacter('language_id')).
         ctables      =         oJsonData:GetCharacter('tables').
-        // MESSAGE ccompany '-' cuser_name '-' ilanguage_id '-' ctables.
+        MESSAGE ccompany '-' cuser_name '-' ilanguage_id '-' ctables.
         
         oJsonConfig     = NEW JsonObject().
-        oJsonConfig     = oJsonData:GetJsonObject ('config').
-        cformtitle      = oJsonConfig:GetCharacter('formTitle').
-        cformid         = oJsonConfig:GetCharacter('formId').
-        iItemsPerPage   = oJsonConfig:Getinteger  ('itemsPerPage').
+        oJsonConfig     = oJsonData:GetJsonObject ('config'        ).
+        cformtitle      = oJsonConfig:GetCharacter('formTitle'     ).
+        cformid         = oJsonConfig:GetCharacter('formId'        ).
+        iItemsPerPage   = oJsonConfig:Getinteger  ('itemsPerPage'  ).
         ctableMaxHeight = oJsonConfig:GetCharacter('tableMaxHeight').
+        cFormColumns    = oJsonConfig:GetCharacter('formColumns'   ).
+
         oJsonFields     = NEW JsonArray().
         oJsonFields     = oJsonConfig:GetJsonArray('selectedFields').
         oJsonConfig:WRITE(lcJsonConfig, FALSE).
         
-        // oJsonConfig:WriteFile('C:\TEMP\FormDesignerConfig.json', TRUE).
+        oJsonConfig:WriteFile('C:\TEMP\FormDesignerConfig.json', TRUE).
+        oJsonFields:WriteFile('C:\TEMP\FormDesignerFields.json', TRUE).
         
         createTemptable (
             INPUT  oJsonFields,
             OUTPUT htTable    ,
             OUTPUT hBuffer    ).
         
-        // hBuffer:WRITE-JSON ('file', 'C:\TEMP\FeldAttributeAusFormdesigner.csv', TRUE).
+        hBuffer:WRITE-JSON ('file', 'C:\TEMP\FeldAttributeAusFormdesigner.csv', TRUE).
 
         REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
             FIND htmldokumente
@@ -730,28 +792,37 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 htmldokumente.tables         = ctables
                 htmldokumente.formtitle      = cformtitle
                 htmldokumente.itemsPerPage   = iItemsPerPage
-                htmldokumente.tableMaxHeight = ctableMaxHeight.
+                htmldokumente.tableMaxHeight = ctableMaxHeight
+                Htmldokumente.formColumns    = cFormColumns.
             htmltext = STRING(lcJsonConfig).
             // MESSAGE 'htmldokument gschrieben mit config ' STRING(lcJsonConfig).
             RELEASE htmldokumente.
             LEAVE.
         END.
-        
-        cBoxfields = ''.
+
+        cBoxfields    = ''.
+        cBoxfieldsFix = ''.
         CREATE QUERY hQuery.
         hQuery:SET-BUFFERS(hBuffer).
         hQuery:QUERY-PREPARE ('FOR EACH ttTemp NO-LOCK').
         hQuery:QUERY-OPEN ().
         hQuery:GET-FIRST ().
+        
         DO WHILE NOT hQuery:QUERY-OFF-END TRANSACTION:
             cFieldName = hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE.
             cFileName  = ENTRY(1, cFieldName, '_').
             cField     = REPLACE(cFieldName, cFileName + '_', '').
+            //
+            //  Standard-Label-Text für admin und table
+            //
+            clabel = hBuffer:BUFFER-FIELD('label'):BUFFER-VALUE.
+            calign = hBuffer:BUFFER-FIELD('align'):BUFFER-VALUE.
+            MESSAGE 'cFileName =' cFileName 'FieldName =' cField 'cLabel =' cLabel 'cAlign =' cAlign.
             FIND FIRST labeltexte
                 WHERE labeltexte.company     = ccompany
-                AND   labeltexte.user_name   = cuser_name
-                AND   labeltexte.program     = ''
-                AND   labeltexte.table_name  = cFileName
+                AND   labeltexte.user_name   = 'admin'
+                AND   labeltexte.program     = 'program'
+                AND   labeltexte.table_name  = 'table'
                 AND   labeltexte.field_name  = cField
                 AND   labeltexte.language_id = ilanguage_id NO-ERROR.
             IF NOT AVAILABLE labeltexte THEN 
@@ -759,55 +830,149 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 CREATE  labeltexte.
                 ASSIGN
                     labeltexte.company     = ccompany
-                    labeltexte.user_name   = cuser_name
-                    labeltexte.program     = ''
-                    labeltexte.table_name  = cFileName
+                    labeltexte.user_name   = 'admin'
+                    labeltexte.program     = 'program'
+                    labeltexte.table_name  = 'table'
                     labeltexte.field_name  = cField
                     labeltexte.language_id = ilanguage_id
-                    labeltexte.created_at  = NOW.
+                    labeltexte.created_at  = NOW
+                    labeltexte.sidelabel   = cLabel
+                    labeltexte.headlabel   = cLabel
+                    labeltexte.alignment   = cAlign.
             END.
             ELSE 
             DO:
-                ASSIGN                             
-                    labeltexte.updated_at = NOW.
+                IF cuser_name = 'admin' THEN 
+                DO:
+                    ASSIGN
+                        labeltexte.updated_at = NOW
+                        labeltexte.sidelabel  = cLabel
+                        labeltexte.headlabel  = cLabel
+                        labeltexte.alignment  = cAlign.
+                END.
             END.
-            ASSIGN 
-                labeltexte.sidelabel = hBuffer:BUFFER-FIELD('label'):BUFFER-VALUE
-                labeltexte.headlabel = hBuffer:BUFFER-FIELD('label'):BUFFER-VALUE
-                labeltexte.alignment = hBuffer:BUFFER-FIELD('align'):BUFFER-VALUE.
+            cadminlabel = labeltexte.headlabel.
+            cadminalign = labeltexte.alignment.
+            
+            DO WHILE TRUE:
+                IF  cLabel = cadminlabel AND
+                    cAlign = cadminalign THEN LEAVE.
+            
+                FIND FIRST labeltexte
+                    WHERE labeltexte.company     = ccompany
+                    AND   labeltexte.user_name   = 'admin'
+                    AND   labeltexte.program     = 'program'
+                    AND   labeltexte.table_name  = cFileName
+                    AND   labeltexte.field_name  = cField
+                    AND   labeltexte.language_id = ilanguage_id NO-ERROR.
+                IF NOT AVAILABLE labeltexte THEN 
+                DO:
+                    CREATE  labeltexte.
+                    ASSIGN
+                        labeltexte.company     = ccompany
+                        labeltexte.user_name   = 'admin'
+                        labeltexte.program     = 'program'
+                        labeltexte.table_name  = cFileName
+                        labeltexte.field_name  = cField
+                        labeltexte.language_id = ilanguage_id
+                        labeltexte.created_at  = NOW
+                        labeltexte.sidelabel   = cLabel
+                        labeltexte.headlabel   = cLabel
+                        labeltexte.alignment   = cAlign.
+                END.
+                IF cuser_name = 'admin' THEN LEAVE.
+            
+                cadminlabel = labeltexte.headlabel.
+                cadminalign = labeltexte.alignment.
                 
+                IF  cLabel = cadminlabel AND
+                    cAlign = cadminalign THEN LEAVE.
+                    
+                FIND FIRST labeltexte
+                    WHERE labeltexte.company     = ccompany
+                    AND   labeltexte.user_name   = cuser_name
+                    AND   labeltexte.program     = 'program'
+                    AND   labeltexte.table_name  = cFileName
+                    AND   labeltexte.field_name  = cField
+                    AND   labeltexte.language_id = ilanguage_id NO-ERROR.
+                IF NOT AVAILABLE labeltexte THEN 
+                DO:
+                    CREATE  labeltexte.
+                    ASSIGN
+                        labeltexte.company     = ccompany
+                        labeltexte.user_name   = cuser_name
+                        labeltexte.program     = 'program'
+                        labeltexte.table_name  = cFileName
+                        labeltexte.field_name  = cField
+                        labeltexte.language_id = ilanguage_id
+                        labeltexte.created_at  = NOW.
+                END.
+                ELSE 
+                DO:
+                    ASSIGN                             
+                        labeltexte.updated_at = NOW.
+                END.
+
+                ASSIGN 
+                    labeltexte.sidelabel = hBuffer:BUFFER-FIELD('label'):BUFFER-VALUE
+                    labeltexte.headlabel = hBuffer:BUFFER-FIELD('label'):BUFFER-VALUE
+                    labeltexte.alignment = hBuffer:BUFFER-FIELD('align'):BUFFER-VALUE.
+                
+                LEAVE.
+            END.
             RELEASE labeltexte.
+                
             
-            lBoxField = (IF hBuffer:BUFFER-FIELD('type'):BUFFER-VALUE = 'select' THEN TRUE ELSE FALSE).
-            IF lBoxField THEN 
+            hField = hBuffer:BUFFER-FIELD('id'):HANDLE NO-ERROR.
+            IF hField:BUFFER-VALUE = 'addresses_salutation_code' THEN 
             DO:
-                cBoxFields = cBoxfields
-                    + (IF cBoxfields = '' THEN '' ELSE ';')
-                    + hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE.
+                hField = hBuffer:BUFFER-FIELD('type'):HANDLE.
+                MESSAGE 'addresses_salutation_code type' hField:BUFFER-VALUE.
+                hField = hBuffer:BUFFER-FIELD('selectOptionsType'):HANDLE.
+                MESSAGE 'addresses_salutation_code selectOptionsType =' hField:BUFFER-VALUE.
             END.
-            
+
+            lBoxField = (IF hBuffer:BUFFER-FIELD('type'):BUFFER-VALUE = 'select' THEN TRUE ELSE FALSE).
+            DO WHILE lBoxField: 
+                hField = hBuffer:BUFFER-FIELD('selectOptionsType'):HANDLE NO-ERROR.
+                IF outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE) THEN LEAVE.
+                MESSAGE hField:NAME '-' hField:BUFFER-VALUE.
+                IF VALID-HANDLE(hField) AND hField:BUFFER-VALUE BEGINS 'variable' THEN
+                    cBoxFields = cBoxfields
+                        + (IF cBoxfields = '' THEN '' ELSE ';')
+                        + hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE.
+                ELSE 
+                    cBoxFieldsFix = cBoxfieldsFix
+                        + (IF cBoxfieldsFix = '' THEN '' ELSE ';')
+                        + hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE.
+                MESSAGE 'Feldname =' hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE VALID-HANDLE(hField).
+                LEAVE.
+            END.
+
             hQuery:GET-NEXT ().
         END. 
-        
-        IF cBoxfields <> '' THEN 
+
+        IF  cBoxfields    <> '' OR
+            cBoxFieldsFix <> '' THEN 
         DO:
             REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
                 FIND FIRST selectboxfields
                     WHERE selectboxfields.company   = ccompany
                     AND   selectboxfields.program   = cFormId
                     AND   selectboxfields.user_name = cuser_name
-                    AND   selectboxfield.table_Name = '' NO-ERROR.
+                    AND   selectboxfields.table_Name = '' NO-ERROR.
                 IF NOT AVAILABLE selectboxfields THEN 
                 DO:
                     CREATE  selectboxfields.
                     ASSIGN
-                        selectboxfields.company   = ccompany
-                        selectboxfields.program   = cFormId
-                        selectboxfields.user_name = cuser_name
-                        selectboxfield.table_Name = ''.
+                        selectboxfields.company    = ccompany
+                        selectboxfields.program    = cFormId
+                        selectboxfields.user_name  = cuser_name
+                        selectboxfields.table_Name = ''.
                 END.
                 ASSIGN 
-                    selectboxfield.boxfields = cBoxFields.
+                    selectboxfields.boxfields    = cBoxFields
+                    selectboxfields.boxfieldsFix = cBoxfieldsFix.
                 RELEASE selectboxfields.
                 LEAVE.
             END.

+ 21 - 24
admin/formprogramImpl.cls

@@ -27,6 +27,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
 
     DEFINE VARIABLE ccompany          AS CHARACTER        NO-UNDO.
     DEFINE VARIABLE cuser_name        AS CHARACTER        NO-UNDO.
+    DEFINE VARIABLE cuser             AS CHARACTER        NO-UNDO.
     DEFINE VARIABLE cAnzeigeName      AS CHARACTER        NO-UNDO.
     DEFINE VARIABLE ilanguage_id      AS INTEGER          NO-UNDO.
     DEFINE VARIABLE cSessionToken     AS CHARACTER        NO-UNDO.
@@ -100,7 +101,6 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
         DEFINE VARIABLE cFile               AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cFileName           AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cFieldName          AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE xuser_name          AS CHARACTER         NO-UNDO.
         
         DEFINE VARIABLE cQueryString        AS CHARACTER         NO-UNDO.
         
@@ -112,6 +112,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
         cFunction = poRequest:URI:GetQueryValue("function") NO-ERROR.
         
         cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
+
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
             INPUT  cQueryString ,
@@ -124,7 +125,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
             OUTPUT oJsonIdent   
             ).
 
-        oJsonIdent:WriteFile('C:\TEMP\formprogram_GET.json', TRUE).
+        // oJsonIdent:WriteFile('C:\TEMP\formprogram_GET.json', TRUE).
         
         // MESSAGE 'Inhalt von Header und Query ' STRING(oJsonIdent:GetJsonText()).
         
@@ -176,26 +177,22 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
 
         DO WHILE cFunction = 'loadconfig':
             cForm_Id = oJsonIdent:GetCharacter('form_id').
-            
-            xuser_name = cuser_name.
-            DO WHILE TRUE:
-                FIND htmldokumente NO-LOCK 
-                    WHERE htmldokumente.company     = ccompany
-                    AND   htmldokumente.user_name   = xuser_name
-                    AND   htmldokumente.form_id     = cForm_Id
-                    AND   htmldokumente.language_id = iLanguage_Id NO-ERROR.
-                IF AVAILABLE htmldokumente THEN LEAVE.
-                IF xuser_name = 'admin' THEN LEAVE.
-                xuser_name = 'admin'.
-            END.
-            MESSAGE 'htmldokument mit user' xuser_name 'gefunden'.
-            cFiles = htmldokumente.tables.
+            cuser    = oJsonIdent:GetCharacter('user').
+
+            FIND htmldokumente NO-LOCK 
+                WHERE htmldokumente.company     = ccompany
+                AND   htmldokumente.user_name   = cuser 
+                AND   htmldokumente.form_id     = cForm_Id
+                AND   htmldokumente.language_id = iLanguage_Id NO-ERROR.
+            IF NOT AVAILABLE htmldokumente THEN LEAVE.
+
+            cFiles = REPLACE(htmldokumente.tables, ',', ';').
 
             oJsonSelectBoxes = NEW JsonObject().
             FOR EACH selectboxfields NO-LOCK
                 WHERE selectboxfields.company   = htmldokumente.company
                 AND   selectboxfields.program   = htmldokumente.form_id
-                AND   selectboxfields.user_name = xuser_name:
+                AND   selectboxfields.user_name = cuser:
 
                 DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfields, ';'):
                     cFieldName = ENTRY(ii, selectboxfields.boxfields, ';').
@@ -245,7 +242,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
 
             oJsonResponse:ADD('records', oJsonRecords).            
             
-            // oJsonResponse:WriteFile('C:\TEMP\loadconfig.json', TRUE).
+            oJsonResponse:WriteFile('C:\TEMP\loadconfig_response.json', TRUE).
             oJsonResponse:WRITE(lcJsonInhalt, FALSE).
             
             lRetVal = TRUE.
@@ -253,10 +250,10 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
         END.
         
         DO WHILE cFunction = "getformconfig":
-            MESSAGE 'getformconfig'.
+// MESSAGE 'getformconfig'.
             FIND htmldokumente NO-LOCK 
                 WHERE htmldokumente.company     = oJsonIdent:GetCharacter('company')
-                AND   htmldokumente.user_name   = oJsonIdent:GetCharacter('user_name')
+                AND   htmldokumente.user_name   = oJsonIdent:GetCharacter('user')
                 AND   htmldokumente.form_id     = oJsonIdent:GetCharacter('form_id')
                 AND   htmldokumente.language_id = iLanguage_id NO-ERROR.
             IF NOT AVAILABLE htmldokumente THEN LEAVE.
@@ -265,7 +262,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
             oJsonResponse:ADD('formTitle'       , htmldokumente.formtitle) NO-ERROR.
             oJsonResponse:ADD('formId'          , htmldokumente.form_id  ) NO-ERROR.
             oJsonResponse:ADD('targetCompany'   , oJsonIdent:GetCharacter('company')    ) NO-ERROR.
-            oJsonResponse:ADD('targetUser'      , oJsonIdent:GetCharacter('user_name')  ) NO-ERROR.
+            oJsonResponse:ADD('targetUser'      , oJsonIdent:GetCharacter('user')  ) NO-ERROR.
             oJsonResponse:ADD('targetLanguageId', oJsonIdent:GetInteger  ('language_id')) NO-ERROR.
              
             oParser   = NEW ObjectModelParser().
@@ -274,7 +271,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
             oJsonSelectedFields = oJsonData:GetJsonArray('selectedFields').
             oJsonResponse:ADD('selectedFields'  , oJsonSelectedFields).
 
-            // oJsonResponse:WriteFile('C:\TEMP\getformconfigresponse.json', TRUE).
+// oJsonResponse:WriteFile('C:\TEMP\getformconfigresponse.json', TRUE).
             
             oJsonResponse:WRITE(lcJsonInhalt, FALSE ).
 
@@ -356,13 +353,13 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
 
         oJsonData:WRITE(lcJsonString, FALSE).
-        // MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
+// MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
             
         ccompany     = oJsonData:GetCharacter('company' ).
         cuser_name   = oJsonData:GetCharacter('user_name' ).
         ilanguage_id = INTEGER(oJsonData:GetCharacter('language_id')).
 
-        // MESSAGE 'HANDLE POST ' ccompany '-' cuser_name '-' ilanguage_id.
+// MESSAGE 'HANDLE POST ' ccompany '-' cuser_name '-' ilanguage_id.
         
     END METHOD.
 

+ 22 - 20
admin/programgeneratorImpl.cls

@@ -57,6 +57,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         
         DEFINE VARIABLE cFunction       AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cProgram        AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cUsers          AS CHARACTER         NO-UNDO INIT 'user,admin'.
         DEFINE VARIABLE cProgUser       AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE lRetVal         AS LOGICAL           NO-UNDO.
         DEFINE VARIABLE ii              AS INTEGER           NO-UNDO.
@@ -69,6 +70,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         outilitiesHandler = NEW utilitiesHandler().
 
         cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
+
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
             INPUT  cQueryString ,
@@ -85,9 +87,14 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         
         cProgram  = oJsonIdent:GetCharacter('program_name').
         
+        cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
+        cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.
+        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
+        
         cProgUser = cuser_name.
         lRetVal   = FALSE.
-        MESSAGE 'company = ' ccompany '- proguser = ' cproguser '- ilanguage_id = ' iLanguage_id '- program = ' cprogram. 
+// MESSAGE 'company = ' ccompany '- proguser = ' cproguser '- ilanguage_id = ' iLanguage_id '- program = ' cprogram. 
         DO WHILE TRUE:
             FIND FIRST htmldokumente NO-LOCK 
                 WHERE htmldokumente.company     = ccompany
@@ -101,21 +108,9 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
                 cProgUser = 'admin'.
                 NEXT.
             END.
-            MESSAGE 'gefunden mit user ' cproguser.
+// MESSAGE 'gefunden mit user ' cproguser.
             COPY-LOB htmldokumente.htmlprogram TO lcProgramCode.
 
-            cMaxHeight = '250px'.
-            iItemsPage = 50.
-            oParser   = NEW ObjectModelParser().
-            oJsonData = CAST(oParser:Parse(htmldokumente.htmltext), JsonObject) NO-ERROR.
-            IF oJsonData:HAS('tableMaxHeight') THEN DO:
-                cMaxHeight = oJsonData:GetCharacter('tableMaxHeight').
-            END.
-            IF oJsonData:HAS('itemsPerPage') THEN
-            DO:
-                iItemsPage = oJsonData:GetInteger('itemsPerPage').
-            END.
-            
             lRetVal = TRUE.
             LEAVE.
         END.
@@ -125,9 +120,9 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         oJsonResponse:ADD('form_id'     , cProgram).
         oJsonResponse:ADD('program_code', lcprogramcode).
         oJsonResponse:ADD('created_at'  , ISO-DATE(htmldokumente.created_at)).
-        /*        oJsonResponse:ADD('program_code', lcprogramcode).*/
+// oJsonResponse:ADD('program_code', lcprogramcode).
         
-        // oJsonResponse:WriteFile('C:\Temp\programmgenerator.json').
+// oJsonResponse:WriteFile('C:\Temp\programmgenerator.json').
         oJsonResponse:WRITE(lcJsonInhalt, FALSE).
 
         IF NOT lRetVal THEN 
@@ -142,7 +137,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
 
         oBody = NEW STRING(lcJsonInhalt).
         WebHandlerUtilities:createHttpResponse(INPUT INTEGER(StatusCodeEnum:OK), INPUT oBody, INPUT cContent-Type, INPUT cDefautlCharSet, INPUT cCorralationID, OUTPUT oResponse).
-//        oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
+// oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
 
         
         oWriter = NEW WebResponseWriter(oResponse).
@@ -196,10 +191,13 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         DEFINE VARIABLE lcBase64_code     AS LONGCHAR          NO-UNDO.
         DEFINE VARIABLE lcProgramCode     AS LONGCHAR          NO-UNDO.
         DEFINE VARIABLE mDecodedCode      AS MEMPTR            NO-UNDO.
+        DEFINE VARIABLE cMaxHeight        AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE iItemsPage        AS INTEGER           NO-UNDO.
+        DEFINE VARIABLE cFormColumns      AS CHARACTER         NO-UNDO.
         
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
         
-        IF oJsonData:has('program_code_base64') THEN 
+        IF oJsonData:HAS('program_code_base64') THEN 
         DO:
             lcBase64_code = oJsonData:GetLongchar("program_code_base64").
             mDecodedCode  = BASE64-DECODE(lcBase64_code).
@@ -209,7 +207,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
                 oJsonData:Remove('program_code_base64').
             END.
         END.
-        IF oJsonData:has('program_code') THEN 
+        IF oJsonData:HAS('program_code') THEN 
         DO:
             lcProgramcode = oJsonData:GetLongchar("program_code4").
             oJsonData:Remove('program_code_base64').
@@ -237,8 +235,12 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
             ASSIGN
                 htmldokumente.program = cProgram.
             COPY-LOB lcProgramCode TO htmldokumente.htmlprogram.
-            RELEASE htmldokumente.
             
+            cMaxHeight   = htmldokumente.tableMaxHeight.
+            iItemsPage   = htmldokumente.itemsPerPage.
+            cFormColumns = htmldokumente.formColumns.
+
+            RELEASE htmldokumente.
             lRetVal = TRUE.    
             LEAVE.
         END.

+ 5 - 8
admin/usersHandler.cls

@@ -346,7 +346,7 @@ CLASS admin.usersHandler FINAL:
                     REPLACE(ENTRY(i1, cKeyFields, ';'), 'users_', ''),
                     ENTRY(i1, cKeyValues, CHR(01))).
             END.
-            MESSAGE cWhere.
+            // MESSAGE cWhere.
             hBuffer = BUFFER busers:HANDLE.
             lRetVal = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
             IF lRetVal THEN 
@@ -463,7 +463,7 @@ CLASS admin.usersHandler FINAL:
                 cWhere = cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ')
                     + 'LOOKUP(' + cValue + ', users.wordindex, " ") > 0 '. 
             END.
-            MESSAGE 'search mit Where' cWhere.
+            // MESSAGE 'search mit Where' cWhere.
         END.
         ELSE 
         DO: 
@@ -541,18 +541,15 @@ CLASS admin.usersHandler FINAL:
         DO ii = 1 TO httusers:NUM-FIELDS:
             httusers:BUFFER-FIELD(ii):SERIALIZE-NAME = 'users_' + httusers:BUFFER-FIELD(ii):NAME NO-ERROR.
         END.
-        MESSAGE '1'.
         ii = 0.
         i1 = 0.
         ttusers:EMPTY-TEMP-TABLE ().
         CREATE QUERY hQuery.
         hQuery:SET-BUFFERS (hBuffer) NO-ERROR.
         hQuery:QUERY-PREPARE (SUBSTITUTE('FOR EACH users NO-LOCK &1 ', cWhere)) NO-ERROR.
-        MESSAGE ERROR-STATUS:ERROR ERROR-STATUS:GET-MESSAGE(1).  
         hQuery:QUERY-OPEN ().
-        MESSAGE hQuery:PREPARE-STRING
-            hQuery:GET-FIRST ().
-        MESSAGE '2'.
+        hQuery:GET-FIRST ().
+
         DO WHILE NOT hQuery:QUERY-OFF-END:
             ii = ii + 1.
             IF ii < iStartRecord THEN 
@@ -570,7 +567,7 @@ CLASS admin.usersHandler FINAL:
         END.
         hQuery:QUERY-CLOSE ().
         DELETE OBJECT hBuffer NO-ERROR.
-        MESSAGE 'Anzahl selektierter Records' ii.        
+        
         iPageCounter = ii / iMaxRecords.
         IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1.  
         oRecords = NEW JsonArray().

+ 0 - 15
adressen/Erstellen_JSON_Mapping.p

@@ -1,15 +0,0 @@
-
-OUTPUT TO 'C:\TEMP\Felder.json' NO-MAP NO-CONVERT.
-PUT CONTROL CHR(123) CHR(10).
-
-FIND _File WHERE _File._File-name = 'Adresse'.
-FOR EACH _Field OF _File :
-    PUT CONTROL '  "' _Field._Field-Name '": ' CHR(123) CHR(10)
-        '     "name": "' _Field._Field-Name '",' CHR(10)
-        '     "id": "' _Field._Field-Name '",' CHR(10)
-        '     "label": "' _Field._Field-Name '",' CHR(10)
-        '     "type": "Text", ' CHR(10)
-        '     "width": "100px" ' CHR(10)
-        CHR(125) ',' CHR(10).
-END.
-OUTPUT CLOSE.

+ 0 - 56
adressen/JsonAdresse.i

@@ -1,56 +0,0 @@
-{
-  "fields": [
-    {"name": "Firma", "type": "text", "label": "Mandant" },
-    {"name": "Knr", "type": "text", "label": "Nummer" },
-    {"name": "Suchbe", "type": "text", "label": "Suchbegriff" },
-    {"name": "Firma1", "type": "text", "label": "Firma1" },
-    {"name": "Firma2", "type": "text", "label": "Firma2" },
-    {"name": "Name", "type": "text", "label": "Name" },
-    {"name": "Vorname", "type": "text", "label": "Vorname" },
-    {"name": "Zusatz1", "type": "text", "label": "Zusatz1" },
-    {"name": "Zusatz2", "type": "text", "label": "Zusatz2" },
-    {"name": "Strasse", "type": "text", "label": "Strasse" },
-    {"name": "Postfach", "type": "text", "label": "Postfach" },
-    {"name": "Lkz", "type": "text", "label": "Lkz" },
-    {"name": "Plz", "type": "text", "label": "Plz" },
-    {"name": "Ort", "type": "text", "label": "Ort" },
-    {"name": "Sprcd", "type": "text", "label": "Sprache" },
-    {"name": "Anrcd", "type": "text", "label": "Anrede" },
-    {"name": "Titel", "type": "text", "label": "Titel" },
-    {"name": "BriefAnr", "type": "text", "label": "BriefAnr" },
-    {"name": "AdrArt", "type": "text", "label": "AdrArt" },
-    {"name": "Bem", "type": "text", "label": "Bem" },
-    {"name": "ErfDat", "type": "text", "label": "Erfasst" },
-    {"name": "ErfSb", "type": "text", "label": "ErfSb" },
-    {"name": "MutDat", "type": "text", "label": "Mutiert" },
-    {"name": "MutSb", "type": "text", "label": "MutSb" },
-    {"name": "Aktiv", "type": "text", "label": "Aktiv" },
-    {"name": "Tel-1", "type": "text", "label": "Tel-1" },
-    {"name": "Tel-2", "type": "text", "label": "Tel-2" },
-    {"name": "Tel-3", "type": "text", "label": "Tel-3" },
-    {"name": "Tel-4", "type": "text", "label": "Tel-4" },
-    {"name": "Anzeig_br", "type": "text", "label": "Anzeig_br" },
-    {"name": "Mail", "type": "text", "label": "Mail" },
-    {"name": "Natel", "type": "text", "label": "Natel" },
-    {"name": "Cd01", "type": "text", "label": "Cd01" },
-    {"name": "Cd02", "type": "text", "label": "Cd02" },
-    {"name": "Cd03", "type": "text", "label": "Cd03" },
-    {"name": "Cd04", "type": "text", "label": "Cd04" },
-    {"name": "Cd05", "type": "text", "label": "Cd05" },
-    {"name": "Cd06", "type": "text", "label": "Cd06" },
-    {"name": "Cd07", "type": "text", "label": "Cd07" },
-    {"name": "Cd08", "type": "text", "label": "Cd08" },
-    {"name": "Cd09", "type": "text", "label": "Cd09" },
-    {"name": "Cd10", "type": "text", "label": "Cd10" },
-    {"name": "Cd11", "type": "text", "label": "Cd11" },
-    {"name": "Cd12", "type": "text", "label": "Cd12" },
-    {"name": "Cd13", "type": "text", "label": "Cd13" },
-    {"name": "Cd14", "type": "text", "label": "Cd14" },
-    {"name": "Cd15", "type": "text", "label": "Cd15" },
-    {"name": "Funktion", "type": "text", "label": "Funktion" },
-    {"name": "AnschrFix", "type": "text", "label": "AnschrFix" },
-    {"name": "Homepage", "type": "text", "label": "Homepage" },
-    {"name": "WortIndex", "type": "text", "label": "WortIndex" },
-    {"name": "lFreigabe", "type": "text", "label": "lFreigabe" }
-  ]
-}

+ 0 - 903
adressen/adressenImpl.cls

@@ -1,903 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : adressenImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
-
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-USING utilities.utilitiesHandler FROM PROPATH.
-
-
-CLASS adressenImpl INHERITS WebHandler:
-    
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
-    
-    { ttInput.i    }
-    
-    DEFINE VARIABLE hFeld         AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httBrowserKo  AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httBrowserze  AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httViewerKo   AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httViewerZe   AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httBrowser    AS HANDLE    NO-UNDO.
-
-    DEFINE VARIABLE hbttDBTabelle AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httDBTabelle  AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE hqDBTabelle   AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE hbDBTabelle   AS HANDLE    NO-UNDO.
-    
-    DEFINE VARIABLE i1            AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE i2            AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE cInhalt       AS CHARACTER NO-UNDO.
-    DEFINE VARIABLE cFeld         AS CHARACTER NO-UNDO.
-    DEFINE VARIABLE iAnzRec       AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE cAktion       AS CHARACTER NO-UNDO.
-    DEFINE VARIABLE cUpdateAktion AS CHARACTER NO-UNDO
-        INIT 'add,update,copy'.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LONGCHAR addDatenFromJson(  ):
-        
-        DEFINE VARIABLE rRecid       AS RECID     NO-UNDO.
-        DEFINE VARIABLE cResult      AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld        AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cMessage     AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE iAnzahl      AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cTabelle     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere       AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE ii           AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cDataType    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE hFeld        AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE cWert        AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE lRetVal      AS LOGICAL   NO-UNDO.
-        
-        iAnzRec     = 0.
-        rRecid      = INT64(hbttInput::ident).
-        cTabelle    = hbttInput::tabelle.
-        
-        CREATE BUFFER hbDBTabelle FOR TABLE cTabelle.
-        hbttDBTabelle:FIND-FIRST ().
-        
-        cIndexFields = outilitiesHandler:getPrimaryIndexFields(cTabelle).
-        
-        cWhere = ''.
-        DO ii = 1 TO NUM-ENTRIES(cIndexFields, ','):
-            cFeld     = ENTRY(ii, cIndexFields, ',').
-            hFeld     = hbDBTabelle:BUFFER-FIELD (cFeld).
-            cWert     = hbttDBTabelle:BUFFER-FIELD(cFeld):BUFFER-VALUE(0).
-            cDataType = hFeld:DATA-TYPE.
-            CASE cDataType:
-                WHEN 'character' THEN 
-                    cWert = QUOTER(cWert).
-            END CASE.
-            cWhere = cWhere
-                + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ')
-                + SUBSTITUTE('&1.&3 = &2 ', cTabelle, cWert, cFeld ).
-        END.
-        lRetVal = hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(NO-LOCK) ) NO-ERROR.
-        
-        IF lRetVal THEN
-        DO:
-            outilitiesHandler:getErrorMessage(
-                INPUT '9',
-                INPUT INTEGER(hbttInput::sprcd),
-                INPUT hbttDBTabelle::Geb_Cd,
-                OUTPUT cMessage
-                ).
-            IF cMessage <> '' THEN
-            DO:
-                RETURN cMessage.
-            END.
-        END.
-
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            hbDBTabelle:BUFFER-CREATE().
-            hbDBTabelle:BUFFER-COPY(hbttDBTabelle).
-            hbttInput::ident = TRIM(STRING(hbDBTabelle:RECID,'>>>>>>>>9')).
-            rRecid = hbDBTabelle:RECID.
-            httBrowserKo::rRecid. 
-
-            hbDBTabelle:BUFFER-RELEASE().
-            LEAVE.
-        END.
-
-        iAnzahl = 0.
-        CREATE QUERY hqDBTabelle.
-        hqDBTabelle:SET-BUFFERS (hbDBTabelle).
-        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK WHERE &1.Firma = &2 ', cTabelle, QUOTER(hbttInput::mandant)).
-        hqDBTabelle:QUERY-PREPARE (cWhere).
-        hqDBTabelle:QUERY-OPEN().
-        hqDBTabelle:GET-FIRST() NO-ERROR.
-
-        DO WHILE NOT hqDBTabelle:QUERY-OFF-END:
-            iAnzahl = iAnzahl + 1.
-            IF hbDBTabelle:RECID = rRecid THEN LEAVE.
-            hqDBTabelle:GET-NEXT () NO-ERROR.
-        END.
-        
-        DELETE OBJECT hbDBTabelle NO-ERROR.
-        DELETE OBJECT hqDBTabelle NO-ERROR.
-
-        httBrowserKo::actualpage = (iAnzahl - (iAnzahl MOD httBrowserKo::pagesize)) / httBrowserKo::pagesize.
-        IF httBrowserKo::actualpage < 1 THEN httBrowserKo::actualpage = 0.
-        
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-
-        cAktion = 'next'.
-
-        createNextResponse().
-
-        cMessage = ''.
-        RETURN cMessage.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LONGCHAR copyDatenFromJson(  ):
-        
-        DEFINE VARIABLE rRecid   AS RECID     NO-UNDO.
-        DEFINE VARIABLE cResult  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cMessage AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE iAnzahl  AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere   AS CHARACTER NO-UNDO.
-
-        cAktion = 'add'.
-        
-        cMessage = addDatenFromJson().        
-
-        RETURN cMessage.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createLastResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBTabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createNextResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        DO WHILE TRUE:
-            iAnzRec = outilitiesHandler:fillBrowserTT (
-                INPUT        httBrowserKo,
-                INPUT        hqDBTabelle,
-                INPUT        hbttInput,
-                INPUT-OUTPUT httBrowser
-                ).
-            IF iAnzRec = 0 AND httBrowserKo::actualpage > 0 THEN 
-            DO:
-                httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-                NEXT.
-            END.
-            LEAVE.
-        END.
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createPrevResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage - 2.
-        IF (httBrowserKo::actualpage < 0) THEN httBrowserKo::actualpage = 0.
-        
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBTabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSameResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE cTitle  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cHeader AS CHARACTER NO-UNDO.
-        
-        cTitle = outilitiesHandler:getTitle(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Titel = ' cTitle.
-        cHeader = outilitiesHandler:getHeader(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Header = ' cHeader.
-        ASSIGN
-            hbttInput::params = SUBSTITUTE('Title=&1;Header=&2':U, cTitle, cHeader).
-            
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-        httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        DO WHILE TRUE:
-            iAnzRec = outilitiesHandler:fillBrowserTT (
-                INPUT        httBrowserKo,
-                INPUT        hqDBTabelle,
-                INPUT        hbttInput,
-                INPUT-OUTPUT httBrowser
-                ).
-            IF iAnzRec = 0 AND httBrowserKo::actualpage > 0 THEN 
-            DO:
-                httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-                NEXT.
-            END.
-            LEAVE.
-        END.
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSearchResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        // FIND FIRST ttInput.
-
-        /*        lRetVal = outilitiesHandler:getBrowserKopf(*/
-        /*            INPUT  hbttInput,                      */
-        /*            OUTPUT httBrowserKo                    */
-        /*            ).                                     */
-        /*                                                   */
-        httBrowserKo::actualpage = 0.
-        
-        outilitiesHandler:createSearchQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBtabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBtabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage = 0.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-        
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSelectResponse(  ):
-        
-        DEFINE VARIABLE ii         AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE hViewer_ze AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE lRetVal    AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE cInhalt    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE rRecid     AS RECID     NO-UNDO.
-        
-        iAnzRec    = 0.
-        hViewer_ze = BUFFER viewer_ze:HANDLE.
-        rRecid     = INT64(hbttInput::ident). 
-        
-        outilitiesHandler:startViewerKopf (
-            INPUT   hbttInput,
-            OUTPUT  httViewerKo
-            ).
-
-        outilitiesHandler:createTemptableViewer(
-            INPUT   hbttInput,
-            INPUT   httViewerKo,
-            OUTPUT  httDBTabelle
-            ).
-        
-        cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', hbttInput::tabelle, INT64(hbttInput::ident) ).
-        hbDBTabelle:FIND-UNIQUE(cWhere, INTEGER(NO-LOCK)) NO-ERROR.    
-
-        httDBTabelle:EMPTY-TEMP-TABLE().
-        httDBTabelle:BUFFER-CREATE().
-        httDBTabelle:BUFFER-COPY(hbDBtabelle).
-        httDBTabelle::ident = TRIM(STRING(hbDBTabelle:RECID,'>>>>>>>>9')).         
-            
-        iAnzRec = iAnzRec + 1.
-        
-        MESSAGE 'Start getField' httDBTabelle:NUM-FIELDS.
-        
-        DO ii = 1 TO httDBTabelle:NUM-FIELDS:
-            FIND FIRST viewer_ze NO-LOCK
-                WHERE viewer_ze.mandant  = hbttInput::mandant
-                AND   viewer_ze.benutzer = hbttInput::benutzer
-                AND   viewer_ze.program  = hbttInput::programm
-                AND   viewer_ze.tabelle  = hbttInput::tabelle
-                AND   viewer_ze.feld     = httDBTabelle:BUFFER-FIELD(ii):NAME
-                AND   viewer_ze.addFieldTabelle <> '' NO-ERROR.
-            IF NOT AVAILABLE viewer_ze THEN NEXT.
-            lRetVal = outilitiesHandler:getField(
-                INPUT hbttInput,
-                INPUT viewer_ze.addFieldTabelle,
-                INPUT viewer_ze.addFieldField,
-                INPUT viewer_ze.addFieldKeyFields,
-                INPUT viewer_ze.addFieldKeyValues,
-                INPUT httDBTabelle,
-                OUTPUT cInhalt
-                ).
-            httDBTabelle:BUFFER-FIELD(ii):BUFFER-VALUE(0) = cInhalt.
-            MESSAGE httDBTabelle:BUFFER-FIELD(ii):NAME httDBTabelle:BUFFER-FIELD(ii):BUFFER-VALUE(0).
-        END.
-        
-        httBrowserKo::lastrecid = httDBTabelle::ident.
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-                
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSortResponse(  ):
-        
-        DEFINE VARIABLE cSortfeld AS CHARACTER NO-UNDO INIT ''.
-        DEFINE VARIABLE cRichtung AS CHARACTER NO-UNDO INIT ''.
-        DEFINE VARIABLE cJsonFeld AS LONGCHAR  NO-UNDO INIT ''.
-        
-        DEFINE VARIABLE hQuery    AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hBuffer   AS HANDLE    NO-UNDO.
-        
-        FIND FIRST ttInput.
-        
-        cJsonFeld = CHR(123) + SUBSTITUTE(' "&1" : "&1" ', hbttInput::SORT) + CHR(125).
-        
-        outilitiesHandler:createTemptableBrowser(
-            INPUT  hbttInput     , 
-            INPUT  httBrowserKo ,
-            OUTPUT httBrowser
-            ).
-            
-        MESSAGE 'cJsonFeld = ' STRING(cJsonFeld).
-
-        httBrowser:READ-JSON('LONGCHAR', cJsonFeld, 'EMPTY').
-        
-        CREATE QUERY hQuery.
-        hQuery:SET-BUFFERS(httBrowser).
-        hQuery:QUERY-PREPARE ('FOR EACH ttBrowser NO-LOCK').
-        hQuery:QUERY-OPEN ().
-        hQuery:GET-FIRST ().
-        DO i1 = 1 TO httBrowser:NUM-FIELDS:
-            IF httBrowser:BUFFER-FIELD(i1):BUFFER-VALUE(0) = '' THEN NEXT.
-            cSortfeld = httBrowser:BUFFER-FIELD(i1):NAME.
-            LEAVE.
-        END.
-        hQuery:QUERY-CLOSE ().
-        DELETE OBJECT hQuery.       
-        
-        MESSAGE 'Sortfeld = ' cSortfeld.
-        
-        outilitiesHandler:setSortField(
-            INPUT cSortfeld             ,
-            INPUT-OUTPUT httBrowserKo
-            ).
-        
-        MESSAGE 'Sortierung neu' cSortfeld '->' httBrowserKo::sortfeld.
-        
-        cAktion = 'start'.
-        createStartResponse().
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createStartResponse(  ):
-        
-        DEFINE VARIABLE lcString AS LONGCHAR  NO-UNDO.
-        
-        DEFINE VARIABLE cTitle   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cHeader  AS CHARACTER NO-UNDO.
-
-        iAnzRec = 0.
-        
-        cTitle = outilitiesHandler:getTitle(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Titel = ' cTitle.
-        cHeader = outilitiesHandler:getHeader(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Header = ' cHeader.
-        ASSIGN
-            hbttInput::params = SUBSTITUTE('Title=&1;Header=&2':U, cTitle, cHeader).
-        
-        outilitiesHandler:startBrowserKopf (
-            INPUT   hbttInput,
-            OUTPUT  httBrowserKo
-            ).
-
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-        
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBTabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-            
-        httBrowserKo::actualpage = 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID deleteDatenFromJson(  ):
-
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.        
-        DEFINE VARIABLE rRecid   AS RECID     NO-UNDO.
-        DEFINE VARIABLE cWhere   AS CHARACTER NO-UNDO.
-        
-        iAnzRec    = 0.
-        rRecid     = INT64(hbttInput::ident).
-        cTabelle   = hbttInput::tabelle.
-        
-        CREATE BUFFER hbDBTabelle FOR TABLE cTabelle.
-
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', cTabelle, rRecid).
-            hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(EXCLUSIVE-LOCK) ) NO-ERROR.
-            hbDBTabelle:BUFFER-DELETE  ().
-            hbDBTabelle:BUFFER-RELEASE ().
-            hbDBTabelle:GET-PREV ().
-            rRecid = (IF hbDBTabelle:AVAILABLE THEN hbDBTabelle:RECID ELSE ? ).
-            LEAVE.
-        END.
-        
-        DELETE OBJECT hbDBTabelle NO-ERROR.
-
-        httDBTabelle:EMPTY-TEMP-TABLE().
-        IF rRecid = ? THEN
-        DO:
-            hbttInput::ident = ''.
-            cAktion          = 'first'.
-        END.
-        ELSE
-        DO:
-            hbttInput::ident = TRIM(STRING(rRecid,'>>>>>>>>9')).
-            cAktion          = 'next'.
-        END.
-
-        httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-        IF httBrowserKo::actualpage < 0 THEN httBrowserKo::actualpage = 0.
-        httBrowserKo::lastrecid  = rRecid.
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-
-        createNextResponse().
-
-        RETURN.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse    AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter      AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData    AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString AS LONGCHAR          NO-UNDO.
-        
-        DEFINE VARIABLE oJsonArray   AS JsonArray         NO-UNDO.
-        DEFINE VARIABLE oJsonDataset AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE oInput       AS JsonObject        NO-UNDO.
-        
-        DEFINE VARIABLE lRetVal      AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE iRetVal      AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE httBuffer    AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE cGetHtml     AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE lcHTML       AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE cString      AS CHARACTER         NO-UNDO.
-        
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest    = ' lRetVal.
-        
-        oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer eingangsstring = ' STRING(lcJsonString).
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        
-        CREATE TEMP-TABLE httDBTabelle.
-        CREATE BUFFER hbDBTabelle FOR TABLE ttInput.tabelle.
-        httDBTabelle:CREATE-LIKE (hbDBTabelle).
-        httDBTabelle:ADD-NEW-FIELD ('ident', 'character').
-        httDBTabelle:TEMP-TABLE-PREPARE(ttInput.tabelle).
-        hbttDBTabelle = httDBTabelle:DEFAULT-BUFFER-HANDLE.
-        
-        httDBTabelle:EMPTY-TEMP-TABLE ().
-        
-        outilitiesHandler = NEW utilitiesHandler ().
-
-        DO WHILE lRetVal:
-            MESSAGE 'Temptable-Name = ' httDBTabelle:NAME.
-
-            IF LOOKUP(cAktion, cUpdateAktion, ',') > 0 THEN 
-            DO:                  
-                lRetVal = outilitiesHandler:readInputDatenFromJson(
-                    INPUT oJsonData,
-                    INPUT hbttInput,
-                    INPUT-OUTPUT hbttDBTabelle
-                    ).
-                hbttDBTabelle:FIND-FIRST ().
-                IF NOT lRetVal THEN LEAVE.
-            END.
-            
-            lRetVal = outilitiesHandler:getBrowserKopf(
-                INPUT  hbttInput,
-                OUTPUT httBrowserKo
-                ).
-            IF cAktion = 'same' THEN ttInput.ident = TRIM(STRING(httBrowserKo::lastrecid,'>>>>>>>>9')).
-            
-            CASE cAktion:
-                WHEN 'start'  THEN createStartResponse ( ).
-                WHEN 'same'   THEN createSameResponse  ( ).
-                WHEN 'first'  THEN createStartResponse ( ).
-                WHEN 'last'   THEN createLastResponse  ( ).
-                WHEN 'next'   THEN createNextResponse  ( ).
-                WHEN 'prev'   THEN createPrevResponse  ( ).
-                WHEN 'select' THEN createSelectResponse( ).
-                WHEN 'search' THEN createSearchResponse( ).
-                WHEN 'sort'   THEN createSortResponse  ( ).
-                WHEN 'update' THEN updateDatenFromJson ( ).
-                WHEN 'delete' THEN deleteDatenFromJson ( ).
-                
-                WHEN 'copy'   THEN 
-                    DO:
-                        lcJsonString = copyDatenFromJson   ( ).
-                        IF lcJsonString <> '' THEN 
-                        DO:
-                            lRetVal = FALSE.
-                            LEAVE.
-                        END.
-                    END.
-                WHEN 'add'   THEN 
-                    DO:
-                        lcJsonString = addDatenFromJson   ( ).
-                        IF lcJsonString <> '' THEN 
-                        DO:
-                            lRetVal = FALSE.
-                            LEAVE.
-                        END.
-                    END.
-                    
-            END CASE.
-            
-            MESSAGE 'Anzahl gelesene Adress-Record = ' iAnzRec.
-            
-            hbttDBTabelle:FIND-FIRST () NO-ERROR.
-            FIND FIRST ttInput.
-            
-            /*  IF  NOT AVAILABLE ttBrowser  AND         */
-            /*      NOT AVAILABLE ttKGebinde THEN LEAVE. */
-
-            IF iAnzRec = 0 THEN 
-            DO:
-                lRetVal = FALSE.
-                LEAVE.
-            END.
-                
-            httBuffer = (IF cAktion = 'select' THEN httDBTabelle ELSE httBrowser).
-            
-            oJsonArray = NEW JsonArray().
-            
-            oJsonData = NEW JsonObject().
-            hbttInput:WRITE-JSON('JsonObject', oJsonData).
-            oJsonArray:Add(oJsonData).
-            
-            oJsonData = NEW JsonObject().
-            httBuffer:WRITE-JSON('JsonObject', oJsonData).
-            oJsonArray:Add(oJsonData).
-            
-            oJsonArray:WRITE(lcJsonString, FALSE).
-            oJsonData:WRITE(lcJsonString, FALSE).
-            MESSAGE 'JsonArray = ' STRING(lcJsonString).
-
-            MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString).
-
-            oResponse             = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "application/json;charset=utf-8".
-            oWriter               = NEW WebResponseWriter(oResponse).
-            
-            oWriter:Open().
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-            
-            LEAVE.
-        END.
-        
-        IF NOT lRetVal THEN 
-        DO:
-            oResponse = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "application/json;charset=utf-8".
-            oWriter = NEW WebResponseWriter(oResponse).
-            oWriter:Open().
-            MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-        END.
-
-        DELETE OBJECT httDBTabelle NO-ERROR.
-        DELETE OBJECT hbDBTabelle  NO-ERROR.
-        MESSAGE "Exiting HandlePost" VIEW-AS ALERT-BOX.
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LOGICAL updateDatenFromJson(  ):
-        
-        DEFINE VARIABLE lRetVal  AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE rRecid   AS RECID     NO-UNDO.
-        DEFINE VARIABLE cResult  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE iAnzahl  AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.
-        
-        iAnzRec    = 0.
-        rRecid     = INT64(hbttInput::ident).
-        cTabelle   = hbttInput::tabelle.
-        
-        CREATE BUFFER hbDBTabelle FOR TABLE cTabelle.
-
-        cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', hbttInput::tabelle, rRecid).
-        hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(NO-LOCK) ) NO-ERROR.
-        hbttDBTabelle:FIND-FIRST ().
-
-        lRetVal = hbDBTabelle:BUFFER-COMPARE(hbttDBTabelle).
-
-        REPEAT TRANSACTION WHILE NOT lRetVal ON ERROR UNDO, LEAVE:
-            cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', hbttInput::tabelle, rRecid).
-            hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(EXCLUSIVE-LOCK) ) NO-ERROR.
-            DO i1 = 1 TO hbDBTabelle:NUM-FIELDS:
-                cFeld = hbDBTabelle:BUFFER-FIELD(i1):NAME.
-                hFeld = hbttDBTabelle:BUFFER-FIELD(cFeld) NO-ERROR.
-                IF hFeld:BUFFER-VALUE(0) = hbDBTabelle:BUFFER-FIELD(i1):BUFFER-VALUE(0) THEN NEXT.
-                hbDBTabelle:BUFFER-FIELD(i1):BUFFER-VALUE(0) = hFeld:BUFFER-VALUE(0).
-            END.
-            hbDBTabelle:BUFFER-RELEASE ().
-            LEAVE.
-        END.
-
-        DELETE OBJECT hqDBTabelle NO-ERROR.
-        CREATE QUERY hqDBTabelle.
-        cWhere = SUBSTITUTE('FOR EACH &1 WHERE &1.Firma = &2 NO-LOCK ', cTabelle, QUOTER(hbttInput::mandant)).
-        hqDBTabelle:SET-BUFFERS(hbDBTabelle).
-        hqDBTabelle:QUERY-PREPARE(cWhere).
-        hqDBTabelle:QUERY-OPEN().
-        hqDBTabelle:GET-FIRST() NO-ERROR.
-        iAnzahl = 0.
-
-        DO WHILE NOT hqDBTabelle:QUERY-OFF-END:
-            iAnzahl = iAnzahl + 1.
-            IF hbDBTabelle:RECID = rRecid THEN LEAVE.
-            hqDBTabelle:GET-NEXT () NO-ERROR.
-        END.
-        
-        DELETE OBJECT hbDBTabelle NO-ERROR.
-        DELETE OBJECT hqDBTabelle NO-ERROR.
-
-        httBrowserKo::actualpage = (iAnzahl - (iAnzahl MOD httBrowserKo::pagesize)) / httBrowserKo::pagesize.
-        IF httBrowserKo::actualpage < 1 THEN httBrowserKo::actualpage = 0.
-
-        httDBTabelle:EMPTY-TEMP-TABLE ().
-        hbttInput::ident = TRIM(STRING(rRecid,'>>>>>>>>9')).
-        cAktion          = 'next'.
-
-        IF (iAnzahl MOD httBrowserKo::pagesize) = 0 THEN httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-        httBrowserKo::lastrecid  = INT64(ttInput.ident).
-
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-
-        createNextResponse().
-
-        lRetVal = TRUE.
-        RETURN lRetVal.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-    DESTRUCTOR PUBLIC adressenImpl ( ):
-	    
-        DELETE OBJECT outilitiesHandler NO-ERROR.
-	    
-        MESSAGE 'DESTRUCTOR adressenImpl'.
-
-    END DESTRUCTOR.
-
-END CLASS.

+ 0 - 183
adressen/anmeldungImpl.cls

@@ -1,183 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : anmeldungImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING utilities.utilitiesHandler FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-
-CLASS anmeldungImpl INHERITS WebHandler:
-    
-    DEFINE VARIABLE cAktion           AS CHARACTER        NO-UNDO.
-    
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler.
-    
-    DEFINE TEMP-TABLE ttMandant SERIALIZE-NAME 'mandanten'
-        FIELD mandant     AS CHARACTER 
-        FIELD bezeichnung AS CHARACTER
-        FIELD choose      AS CHARACTER 
-        .
-    { ttInput.i }
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse    AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter      AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData    AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString AS LONGCHAR          NO-UNDO.
-        
-        DEFINE VARIABLE lRetVal      AS LOGICAL           NO-UNDO.
-        
-        DEFINE VARIABLE hbttMandant  AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE cGetHtml     AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE lcHTML       AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE cDatei       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE ii           AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE lAdmin       AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE oInput       AS JsonObject        NO-UNDO.
-
-        MESSAGE "Entering HandlePost" VIEW-AS ALERT-BOX.
-        
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        oJsonData:WRITE(lcJsonString, FALSE).
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        
-        outilitiesHandler = NEW utilitiesHandler().
-
-        DO WHILE lRetVal:
-            hbttInput    = TEMP-TABLE ttInput   :DEFAULT-BUFFER-HANDLE.
-            hbttMandant  = TEMP-TABLE ttMandant :DEFAULT-BUFFER-HANDLE.
-            
-            MESSAGE 'Inputdaten gelesen mit returncode ' lRetVal.
-            IF NOT lRetVal THEN LEAVE.
-            
-            FIND FIRST ttInput.
-             
-            IF ttInput.action = 'first' THEN 
-            DO:
-                EMPTY TEMP-TABLE ttMandant.
-                FOR EACH Mandant NO-LOCK
-                    WHERE Mandant.Zustand = TRUE:
-                    CREATE  ttMandant.
-                    ASSIGN 
-                        ttMandant.Mandant     = Mandant.Firma
-                        ttMandant.Bezeichnung = Mandant.Name.
-                /*                    ttMandant.choose      = (IF Mandant = '2000' THEN '1' ELSE '0').*/
-                END.
-                
-                oJsonData = NEW JsonObject().
-                hbttMandant:WRITE-JSON('JsonObject', oJsonData).
-                oJsonData:WRITE(lcJsonString, TRUE).
-            END.
-            
-            IF ttInput.action = 'anmelden' THEN 
-            DO:
-                oJsonData:WRITE(lcJsonString, FALSE).
-                
-                FIND FIRST ttInput.
-                
-                IF INDEX(ttInput.benutzer, '_Admin') > 0 THEN 
-                DO:
-                    ttInput.benutzer = REPLACE(ttInput.benutzer, '_Admin', '').
-                    lAdmin = TRUE.
-                END.
-
-                IF NOT lAdmin THEN 
-                DO:
-                    FIND Benutzer NO-LOCK 
-                        WHERE Benutzer.Firma    = ttInput.mandant
-                        AND   Benutzer.Benutzer = ttInput.benutzer
-                        AND   Benutzer.Kennwort = ttInput.password NO-ERROR.
-                END.
-                ELSE 
-                DO:
-                    FIND FIRST Benutzer NO-LOCK 
-                        WHERE Benutzer.Firma    = ttInput.mandant
-                        AND   Benutzer.Benutzer = ttInput.benutzer NO-ERROR.
-                END.
-                IF NOT AVAILABLE (Benutzer) THEN 
-                DO:
-                    outilitiesHandler:getErrorMessage(INPUT '1990', INPUT 1, INPUT '', OUTPUT lcJsonString).
-                    
-                    oResponse = NEW OpenEdge.Web.WebResponse().
-                    oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
-                    oResponse:ContentType = "application/json;charset=utf-8".
-                    oWriter = NEW WebResponseWriter(oResponse).
-                    oWriter:Open().
-                    MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-                    oWriter:Write(lcJsonString).
-                    oWriter:Close().
-                    RETURN -1.
-                END.
-                
-                ttInput.action = 'return'.
-                ttInput.link   = 'gemis_start.html'.
-                ttInput.sprcd  = STRING(Benutzer.Sprcd).
-                    
-                lcJsonString = ''.
-                DO ii = 1 TO hbttInput:NUM-FIELDS:
-                    lcJsonString = lcJsonString
-                        + (IF lcJsonString = '' THEN '' ELSE ', ')
-                        + QUOTER(hbttInput:BUFFER-FIELD(ii):NAME) 
-                        + ': '
-                        + QUOTER(hbttInput:BUFFER-FIELD(ii):BUFFER-VALUE).
-                END.
-                lcJsonString = CHR(123) + lcJsonString + chr(125).
-                MESSAGE 'Return-Daten nach füllen aus ttInput ' STRING(lcJsonString).
-            END.
-            LEAVE.
-        END.
-
-        oResponse = NEW OpenEdge.Web.WebResponse().
-        oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-        oResponse:ContentType = "application/json;charset=utf-8".
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open().
-        MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-        oWriter:Write(lcJsonString).
-        oWriter:Close().
-
-        MESSAGE "Exiting HandlePost" VIEW-AS ALERT-BOX.
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 901
adressen/gebindeImpl.cls

@@ -1,901 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : gebindeImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.* FROM PROPATH.
-USING Progress.Lang.* FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-
-USING utilities.utilitiesHandler FROM PROPATH.
-
-CLASS gebindeImpl INHERITS WebHandler:
-    
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
-    
-    { ttInput.i    }
-    
-    DEFINE VARIABLE hFeld         AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httBrowserKo  AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httBrowserze  AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httViewerKo   AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httViewerZe   AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httBrowser    AS HANDLE    NO-UNDO.
-
-    DEFINE VARIABLE hbttDBTabelle AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE httDBTabelle  AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE hqDBTabelle   AS HANDLE    NO-UNDO.
-    DEFINE VARIABLE hbDBTabelle   AS HANDLE    NO-UNDO.
-    
-    DEFINE VARIABLE i1            AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE i2            AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE cInhalt       AS CHARACTER NO-UNDO.
-    DEFINE VARIABLE cFeld         AS CHARACTER NO-UNDO.
-    DEFINE VARIABLE iAnzRec       AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE cAktion       AS CHARACTER NO-UNDO.
-    DEFINE VARIABLE cUpdateAktion AS CHARACTER NO-UNDO
-        INIT 'add,update,copy'.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LONGCHAR addDatenFromJson(  ):
-        
-        DEFINE VARIABLE rRecid       AS RECID     NO-UNDO.
-        DEFINE VARIABLE cResult      AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld        AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cMessage     AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE iAnzahl      AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cTabelle     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cIndexFields AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere       AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE ii           AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cDataType    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE hFeld        AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE cWert        AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE lRetVal      AS LOGICAL   NO-UNDO.
-        
-        iAnzRec     = 0.
-        rRecid      = INT64(hbttInput::ident).
-        cTabelle    = hbttInput::tabelle.
-        
-        CREATE BUFFER hbDBTabelle FOR TABLE cTabelle.
-        hbttDBTabelle:FIND-FIRST ().
-        
-        cIndexFields = outilitiesHandler:getPrimaryIndexFields(cTabelle).
-        
-        cWhere = ''.
-        DO ii = 1 TO NUM-ENTRIES(cIndexFields, ','):
-            cFeld     = ENTRY(ii, cIndexFields, ',').
-            hFeld     = hbDBTabelle:BUFFER-FIELD (cFeld).
-            cWert     = hbttDBTabelle:BUFFER-FIELD(cFeld):BUFFER-VALUE(0).
-            cDataType = hFeld:DATA-TYPE.
-            CASE cDataType:
-                WHEN 'character' THEN 
-                    cWert = QUOTER(cWert).
-            END CASE.
-            cWhere = cWhere
-                + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ')
-                + SUBSTITUTE('&1.&3 = &2 ', cTabelle, cWert, cFeld ).
-        END.
-        lRetVal = hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(NO-LOCK) ) NO-ERROR.
-        
-        IF lRetVal THEN
-        DO:
-            outilitiesHandler:getErrorMessage(
-                INPUT '9',
-                INPUT INTEGER(hbttInput::sprcd),
-                INPUT hbttDBTabelle::Geb_Cd,
-                OUTPUT cMessage
-                ).
-            IF cMessage <> '' THEN
-            DO:
-                RETURN cMessage.
-            END.
-        END.
-
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            hbDBTabelle:BUFFER-CREATE().
-            hbDBTabelle:BUFFER-COPY(hbttDBTabelle).
-            hbttInput::ident = TRIM(STRING(hbDBTabelle:RECID,'>>>>>>>>9')).
-            rRecid = hbDBTabelle:RECID.
-            httBrowserKo::rRecid. 
-
-            hbDBTabelle:BUFFER-RELEASE().
-            LEAVE.
-        END.
-
-        iAnzahl = 0.
-        CREATE QUERY hqDBTabelle.
-        hqDBTabelle:SET-BUFFERS (hbDBTabelle).
-        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK WHERE &1.Firma = &2 ', cTabelle, QUOTER(hbttInput::mandant)).
-        hqDBTabelle:QUERY-PREPARE (cWhere).
-        hqDBTabelle:QUERY-OPEN().
-        hqDBTabelle:GET-FIRST() NO-ERROR.
-
-        DO WHILE NOT hqDBTabelle:QUERY-OFF-END:
-            iAnzahl = iAnzahl + 1.
-            IF hbDBTabelle:RECID = rRecid THEN LEAVE.
-            hqDBTabelle:GET-NEXT () NO-ERROR.
-        END.
-        
-        DELETE OBJECT hbDBTabelle NO-ERROR.
-        DELETE OBJECT hqDBTabelle NO-ERROR.
-
-        httBrowserKo::actualpage = (iAnzahl - (iAnzahl MOD httBrowserKo::pagesize)) / httBrowserKo::pagesize.
-        IF httBrowserKo::actualpage < 1 THEN httBrowserKo::actualpage = 0.
-        
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-
-        cAktion = 'next'.
-
-        createNextResponse().
-
-        cMessage = ''.
-        RETURN cMessage.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LONGCHAR copyDatenFromJson(  ):
-        
-        DEFINE VARIABLE rRecid   AS RECID     NO-UNDO.
-        DEFINE VARIABLE cResult  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cMessage AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE iAnzahl  AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere   AS CHARACTER NO-UNDO.
-
-        cAktion = 'add'.
-        
-        cMessage = addDatenFromJson().        
-
-        RETURN cMessage.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createLastResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBTabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createNextResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        DO WHILE TRUE:
-            iAnzRec = outilitiesHandler:fillBrowserTT (
-                INPUT        httBrowserKo,
-                INPUT        hqDBTabelle,
-                INPUT        hbttInput,
-                INPUT-OUTPUT httBrowser
-                ).
-            IF iAnzRec = 0 AND httBrowserKo::actualpage > 0 THEN 
-            DO:
-                httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-                NEXT.
-            END.
-            LEAVE.
-        END.
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createPrevResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage - 2.
-        IF (httBrowserKo::actualpage < 0) THEN httBrowserKo::actualpage = 0.
-        
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBTabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSameResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE cTitle  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cHeader AS CHARACTER NO-UNDO.
-        
-        cTitle = outilitiesHandler:getTitle(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Titel = ' cTitle.
-        cHeader = outilitiesHandler:getHeader(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Header = ' cHeader.
-        ASSIGN
-            hbttInput::params = SUBSTITUTE('Title=&1;Header=&2':U, cTitle, cHeader).
-            
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-        httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        DO WHILE TRUE:
-            iAnzRec = outilitiesHandler:fillBrowserTT (
-                INPUT        httBrowserKo,
-                INPUT        hqDBTabelle,
-                INPUT        hbttInput,
-                INPUT-OUTPUT httBrowser
-                ).
-            IF iAnzRec = 0 AND httBrowserKo::actualpage > 0 THEN 
-            DO:
-                httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-                NEXT.
-            END.
-            LEAVE.
-        END.
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage + 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSearchResponse(  ):
-        
-        DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO.
-        
-        // FIND FIRST ttInput.
-
-        /*        lRetVal = outilitiesHandler:getBrowserKopf(*/
-        /*            INPUT  hbttInput,                      */
-        /*            OUTPUT httBrowserKo                    */
-        /*            ).                                     */
-        /*                                                   */
-        httBrowserKo::actualpage = 0.
-        
-        outilitiesHandler:createSearchQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBtabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBtabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-        
-        httBrowserKo::actualpage = httBrowserKo::actualpage = 0.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-        
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSelectResponse(  ):
-        
-        DEFINE VARIABLE ii         AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE hViewer_ze AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE lRetVal    AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE cInhalt    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE rRecid     AS RECID     NO-UNDO.
-        
-        iAnzRec    = 0.
-        hViewer_ze = BUFFER viewer_ze:HANDLE.
-        rRecid     = INT64(hbttInput::ident). 
-        
-        outilitiesHandler:startViewerKopf (
-            INPUT   hbttInput,
-            OUTPUT  httViewerKo
-            ).
-
-        outilitiesHandler:createTemptableViewer(
-            INPUT   hbttInput,
-            INPUT   httViewerKo,
-            OUTPUT  httDBTabelle
-            ).
-        
-        cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', hbttInput::tabelle, INT64(hbttInput::ident) ).
-        hbDBTabelle:FIND-UNIQUE(cWhere, INTEGER(NO-LOCK)) NO-ERROR.    
-
-        httDBTabelle:EMPTY-TEMP-TABLE().
-        httDBTabelle:BUFFER-CREATE().
-        httDBTabelle:BUFFER-COPY(hbDBtabelle).
-        httDBTabelle::ident = TRIM(STRING(hbDBTabelle:RECID,'>>>>>>>>9')).         
-            
-        iAnzRec = iAnzRec + 1.
-        
-        MESSAGE 'Start getField' httDBTabelle:NUM-FIELDS.
-        
-        DO ii = 1 TO httDBTabelle:NUM-FIELDS:
-            FIND FIRST viewer_ze NO-LOCK
-                WHERE viewer_ze.mandant  = hbttInput::mandant
-                AND   viewer_ze.benutzer = hbttInput::benutzer
-                AND   viewer_ze.program  = hbttInput::programm
-                AND   viewer_ze.tabelle  = hbttInput::tabelle
-                AND   viewer_ze.feld     = httDBTabelle:BUFFER-FIELD(ii):NAME
-                AND   viewer_ze.addFieldTabelle <> '' NO-ERROR.
-            IF NOT AVAILABLE viewer_ze THEN NEXT.
-            lRetVal = outilitiesHandler:getField(
-                INPUT hbttInput,
-                INPUT viewer_ze.addFieldTabelle,
-                INPUT viewer_ze.addFieldField,
-                INPUT viewer_ze.addFieldKeyFields,
-                INPUT viewer_ze.addFieldKeyValues,
-                INPUT httDBTabelle,
-                OUTPUT cInhalt
-                ).
-            httDBTabelle:BUFFER-FIELD(ii):BUFFER-VALUE(0) = cInhalt.
-            MESSAGE httDBTabelle:BUFFER-FIELD(ii):NAME httDBTabelle:BUFFER-FIELD(ii):BUFFER-VALUE(0).
-        END.
-        
-        httBrowserKo::lastrecid = httDBTabelle::ident.
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-                
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createSortResponse(  ):
-        
-        DEFINE VARIABLE cSortfeld AS CHARACTER NO-UNDO INIT ''.
-        DEFINE VARIABLE cRichtung AS CHARACTER NO-UNDO INIT ''.
-        DEFINE VARIABLE cJsonFeld AS LONGCHAR  NO-UNDO INIT ''.
-        
-        DEFINE VARIABLE hQuery    AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hBuffer   AS HANDLE    NO-UNDO.
-        
-        FIND FIRST ttInput.
-        
-        cJsonFeld = CHR(123) + SUBSTITUTE(' "&1" : "&1" ', hbttInput::SORT) + CHR(125).
-        
-        outilitiesHandler:createTemptableBrowser(
-            INPUT  hbttInput     , 
-            INPUT  httBrowserKo ,
-            OUTPUT httBrowser
-            ).
-            
-        MESSAGE 'cJsonFeld = ' STRING(cJsonFeld).
-
-        httBrowser:READ-JSON('LONGCHAR', cJsonFeld, 'EMPTY').
-        
-        CREATE QUERY hQuery.
-        hQuery:SET-BUFFERS(httBrowser).
-        hQuery:QUERY-PREPARE ('FOR EACH ttBrowser NO-LOCK').
-        hQuery:QUERY-OPEN ().
-        hQuery:GET-FIRST ().
-        DO i1 = 1 TO httBrowser:NUM-FIELDS:
-            IF httBrowser:BUFFER-FIELD(i1):BUFFER-VALUE(0) = '' THEN NEXT.
-            cSortfeld = httBrowser:BUFFER-FIELD(i1):NAME.
-            LEAVE.
-        END.
-        hQuery:QUERY-CLOSE ().
-        DELETE OBJECT hQuery.       
-        
-        MESSAGE 'Sortfeld = ' cSortfeld.
-        
-        outilitiesHandler:setSortField(
-            INPUT cSortfeld             ,
-            INPUT-OUTPUT httBrowserKo
-            ).
-        
-        MESSAGE 'Sortierung neu' cSortfeld '->' httBrowserKo::sortfeld.
-        
-        cAktion = 'start'.
-        createStartResponse().
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createStartResponse(  ):
-        
-        DEFINE VARIABLE lcString AS LONGCHAR  NO-UNDO.
-        
-        DEFINE VARIABLE cTitle   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cHeader  AS CHARACTER NO-UNDO.
-
-        iAnzRec = 0.
-        
-        cTitle = outilitiesHandler:getTitle(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Titel = ' cTitle.
-        cHeader = outilitiesHandler:getHeader(
-            INPUT hbttInput
-            ).
-        MESSAGE 'Header = ' cHeader.
-        ASSIGN
-            hbttInput::params = SUBSTITUTE('Title=&1;Header=&2':U, cTitle, cHeader).
-        
-        outilitiesHandler:startBrowserKopf (
-            INPUT   hbttInput,
-            OUTPUT  httBrowserKo
-            ).
-
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqDBTabelle,
-            OUTPUT  hbDBTabelle
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-        
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqDBTabelle,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-            
-        httBrowserKo::actualpage = 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID deleteDatenFromJson(  ):
-
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.        
-        DEFINE VARIABLE rRecid   AS RECID     NO-UNDO.
-        DEFINE VARIABLE cWhere   AS CHARACTER NO-UNDO.
-        
-        iAnzRec    = 0.
-        rRecid     = INT64(hbttInput::ident).
-        cTabelle   = hbttInput::tabelle.
-        
-        CREATE BUFFER hbDBTabelle FOR TABLE cTabelle.
-
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', cTabelle, rRecid).
-            hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(EXCLUSIVE-LOCK) ) NO-ERROR.
-            hbDBTabelle:BUFFER-DELETE  ().
-            hbDBTabelle:BUFFER-RELEASE ().
-            hbDBTabelle:GET-PREV ().
-            rRecid = (IF hbDBTabelle:AVAILABLE THEN hbDBTabelle:RECID ELSE ? ).
-            LEAVE.
-        END.
-        
-        DELETE OBJECT hbDBTabelle NO-ERROR.
-
-        httDBTabelle:EMPTY-TEMP-TABLE().
-        IF rRecid = ? THEN
-        DO:
-            hbttInput::ident = ''.
-            cAktion          = 'first'.
-        END.
-        ELSE
-        DO:
-            hbttInput::ident = TRIM(STRING(rRecid,'>>>>>>>>9')).
-            cAktion          = 'next'.
-        END.
-
-        httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-        IF httBrowserKo::actualpage < 0 THEN httBrowserKo::actualpage = 0.
-        httBrowserKo::lastrecid  = rRecid.
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-
-        createNextResponse().
-
-        RETURN.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse    AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter      AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData    AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString AS LONGCHAR          NO-UNDO.
-        
-        DEFINE VARIABLE oJsonArray   AS JsonArray         NO-UNDO.
-        DEFINE VARIABLE oJsonDataset AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE oInput       AS JsonObject        NO-UNDO.
-        
-        DEFINE VARIABLE lRetVal      AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE iRetVal      AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE httBuffer    AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE cGetHtml     AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE lcHTML       AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE cString      AS CHARACTER         NO-UNDO.
-        
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest    = ' lRetVal.
-        
-        oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer eingangsstring = ' STRING(lcJsonString).
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        
-        CREATE TEMP-TABLE httDBTabelle.
-        CREATE BUFFER hbDBTabelle FOR TABLE ttInput.tabelle.
-        httDBTabelle:CREATE-LIKE (hbDBTabelle).
-        httDBTabelle:ADD-NEW-FIELD ('ident', 'character').
-        httDBTabelle:TEMP-TABLE-PREPARE(ttInput.tabelle).
-        hbttDBTabelle = httDBTabelle:DEFAULT-BUFFER-HANDLE.
-        
-        httDBTabelle:EMPTY-TEMP-TABLE ().
-        
-        outilitiesHandler = NEW utilitiesHandler ().
-        
-        DO WHILE lRetVal:
-            MESSAGE 'Temptable-Name = ' httDBTabelle:NAME.
-
-            IF LOOKUP(cAktion, cUpdateAktion, ',') > 0 THEN 
-            DO:                  
-                lRetVal = outilitiesHandler:readInputDatenFromJson(
-                    INPUT oJsonData,
-                    INPUT hbttInput,
-                    INPUT-OUTPUT hbttDBTabelle
-                    ).
-                hbttDBTabelle:FIND-FIRST ().
-                IF NOT lRetVal THEN LEAVE.
-            END.
-            
-            lRetVal = outilitiesHandler:getBrowserKopf(
-                INPUT  hbttInput,
-                OUTPUT httBrowserKo
-                ).
-            IF cAktion = 'same' THEN ttInput.ident = TRIM(STRING(httBrowserKo::lastrecid,'>>>>>>>>9')).
-            
-            CASE cAktion:
-                WHEN 'start'  THEN createStartResponse ( ).
-                WHEN 'same'   THEN createSameResponse  ( ).
-                WHEN 'first'  THEN createStartResponse ( ).
-                WHEN 'last'   THEN createLastResponse  ( ).
-                WHEN 'next'   THEN createNextResponse  ( ).
-                WHEN 'prev'   THEN createPrevResponse  ( ).
-                WHEN 'select' THEN createSelectResponse( ).
-                WHEN 'search' THEN createSearchResponse( ).
-                WHEN 'sort'   THEN createSortResponse  ( ).
-                WHEN 'update' THEN updateDatenFromJson ( ).
-                WHEN 'delete' THEN deleteDatenFromJson ( ).
-                
-                WHEN 'copy'   THEN 
-                    DO:
-                        lcJsonString = copyDatenFromJson   ( ).
-                        IF lcJsonString <> '' THEN 
-                        DO:
-                            lRetVal = FALSE.
-                            LEAVE.
-                        END.
-                    END.
-                WHEN 'add'   THEN 
-                    DO:
-                        lcJsonString = addDatenFromJson   ( ).
-                        IF lcJsonString <> '' THEN 
-                        DO:
-                            lRetVal = FALSE.
-                            LEAVE.
-                        END.
-                    END.
-                    
-            END CASE.
-            
-            MESSAGE 'Anzahl gelesene KGebinde-Record = ' iAnzRec.
-            
-            hbttDBTabelle:FIND-FIRST () NO-ERROR.
-            FIND FIRST ttInput.
-            
-            /*  IF  NOT AVAILABLE ttBrowser  AND         */
-            /*      NOT AVAILABLE ttKGebinde THEN LEAVE. */
-
-            IF iAnzRec = 0 THEN 
-            DO:
-                lRetVal = FALSE.
-                LEAVE.
-            END.
-                
-            httBuffer = (IF cAktion = 'select' THEN httDBTabelle ELSE httBrowser).
-            
-            oJsonArray = NEW JsonArray().
-            
-            oJsonData = NEW JsonObject().
-            hbttInput:WRITE-JSON('JsonObject', oJsonData).
-            oJsonArray:Add(oJsonData).
-            
-            oJsonData = NEW JsonObject().
-            httBuffer:WRITE-JSON('JsonObject', oJsonData).
-            oJsonArray:Add(oJsonData).
-            
-            oJsonArray:WRITE(lcJsonString, FALSE).
-            MESSAGE 'JsonArray = ' STRING(lcJsonString).
-
-            MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString).
-
-            oResponse             = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "application/json;charset=utf-8".
-            oWriter               = NEW WebResponseWriter(oResponse).
-            
-            oWriter:Open().
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-            
-            LEAVE.
-        END.
-        
-        IF NOT lRetVal THEN 
-        DO:
-            oResponse = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "application/json;charset=utf-8".
-            oWriter = NEW WebResponseWriter(oResponse).
-            oWriter:Open().
-            MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-        END.
-
-        DELETE OBJECT httDBTabelle NO-ERROR.
-        DELETE OBJECT hbDBTabelle  NO-ERROR.
-        MESSAGE "Exiting HandlePost" VIEW-AS ALERT-BOX.
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LOGICAL updateDatenFromJson(  ):
-        
-        DEFINE VARIABLE lRetVal  AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE rRecid   AS RECID     NO-UNDO.
-        DEFINE VARIABLE cResult  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cWhere   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE iAnzahl  AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.
-        
-        iAnzRec    = 0.
-        rRecid     = INT64(hbttInput::ident).
-        cTabelle   = hbttInput::tabelle.
-        
-        CREATE BUFFER hbDBTabelle FOR TABLE cTabelle.
-
-        cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', hbttInput::tabelle, rRecid).
-        hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(NO-LOCK) ) NO-ERROR.
-        hbttDBTabelle:FIND-FIRST ().
-
-        lRetVal = hbDBTabelle:BUFFER-COMPARE(hbttDBTabelle).
-
-        REPEAT TRANSACTION WHILE NOT lRetVal ON ERROR UNDO, LEAVE:
-            cWhere = SUBSTITUTE('WHERE RECID(&1) = &2 ', hbttInput::tabelle, rRecid).
-            hbDBTabelle:FIND-UNIQUE (cWhere, INTEGER(EXCLUSIVE-LOCK) ) NO-ERROR.
-            DO i1 = 1 TO hbDBTabelle:NUM-FIELDS:
-                cFeld = hbDBTabelle:BUFFER-FIELD(i1):NAME.
-                hFeld = hbttDBTabelle:BUFFER-FIELD(cFeld) NO-ERROR.
-                IF hFeld:BUFFER-VALUE(0) = hbDBTabelle:BUFFER-FIELD(i1):BUFFER-VALUE(0) THEN NEXT.
-                hbDBTabelle:BUFFER-FIELD(i1):BUFFER-VALUE(0) = hFeld:BUFFER-VALUE(0).
-            END.
-            hbDBTabelle:BUFFER-RELEASE ().
-            LEAVE.
-        END.
-
-        DELETE OBJECT hqDBTabelle NO-ERROR.
-        CREATE QUERY hqDBTabelle.
-        cWhere = SUBSTITUTE('FOR EACH &1 WHERE &1.Firma = &2 NO-LOCK ', cTabelle, QUOTER(hbttInput::mandant)).
-        hqDBTabelle:SET-BUFFERS(hbDBTabelle).
-        hqDBTabelle:QUERY-PREPARE(cWhere).
-        hqDBTabelle:QUERY-OPEN().
-        hqDBTabelle:GET-FIRST() NO-ERROR.
-        iAnzahl = 0.
-
-        DO WHILE NOT hqDBTabelle:QUERY-OFF-END:
-            iAnzahl = iAnzahl + 1.
-            IF hbDBTabelle:RECID = rRecid THEN LEAVE.
-            hqDBTabelle:GET-NEXT () NO-ERROR.
-        END.
-        
-        DELETE OBJECT hbDBTabelle NO-ERROR.
-        DELETE OBJECT hqDBTabelle NO-ERROR.
-
-        httBrowserKo::actualpage = (iAnzahl - (iAnzahl MOD httBrowserKo::pagesize)) / httBrowserKo::pagesize.
-        IF httBrowserKo::actualpage < 1 THEN httBrowserKo::actualpage = 0.
-
-        httDBTabelle:EMPTY-TEMP-TABLE ().
-        hbttInput::ident = TRIM(STRING(rRecid,'>>>>>>>>9')).
-        cAktion          = 'next'.
-
-        IF (iAnzahl MOD httBrowserKo::pagesize) = 0 THEN httBrowserKo::actualpage = httBrowserKo::actualpage - 1.
-        httBrowserKo::lastrecid  = INT64(ttInput.ident).
-
-        outilitiesHandler:updateBrowserKo(INPUT httBrowserKo).
-
-        createNextResponse().
-
-        lRetVal = TRUE.
-        RETURN lRetVal.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-    DESTRUCTOR PUBLIC gebindeImpl ( ):
-	    
-        DELETE OBJECT outilitiesHandler NO-ERROR.
-	    
-        MESSAGE 'DESTRUCTOR gebindeImpl'.
-
-    END DESTRUCTOR.
-
-END CLASS.

+ 0 - 325
adressen/gemis_startImpl.cls

@@ -1,325 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : gemis_startImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING utilities.utilitiesHandler FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-
-CLASS gemis_startImpl INHERITS WebHandler:
-    
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler.
-    
-    { ttInput.i }
-
-    DEFINE VARIABLE httBrowserKo  AS HANDLE NO-UNDO.
-    DEFINE VARIABLE httBrowserze  AS HANDLE NO-UNDO.
-    DEFINE VARIABLE httViewerKo   AS HANDLE NO-UNDO.
-    DEFINE VARIABLE httViewerZe   AS HANDLE NO-UNDO.
-    DEFINE VARIABLE httBrowser    AS HANDLE NO-UNDO.
-
-    DEFINE VARIABLE hbttDBTabelle AS HANDLE NO-UNDO.
-    DEFINE VARIABLE httDBTabelle  AS HANDLE NO-UNDO.
-    DEFINE VARIABLE hqDBTabelle   AS HANDLE NO-UNDO.
-    DEFINE VARIABLE hbDBTabelle   AS HANDLE NO-UNDO.
-    
-    DEFINE VARIABLE hqAufko       AS HANDLE NO-UNDO.
-    DEFINE VARIABLE hbAufko       AS HANDLE NO-UNDO.
-    
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID createAufkoResponse(  ):
-        
-        DEFINE VARIABLE lcString AS LONGCHAR  NO-UNDO.
-        
-        DEFINE VARIABLE cTitle   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cHeader  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE iAnzRec  AS INTEGER   NO-UNDO.
-        
-        FIND FIRST ttInput.
-        iAnzRec = 0.
-        
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        cTitle = outilitiesHandler:getTitle(
-            INPUT hbttInput
-            ).
-        cHeader = outilitiesHandler:getHeader(
-            INPUT hbttInput
-            ).
-            
-        ASSIGN
-            hbttInput::params = SUBSTITUTE('Title=&1;Header=&2':U, cTitle, cHeader).
-        
-        outilitiesHandler:startBrowserKopf (
-            INPUT   hbttInput,
-            OUTPUT  httBrowserKo
-            ).
-
-        outilitiesHandler:createQuery(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  hqAufko,
-            OUTPUT  hbAufko
-            ).
-            
-        outilitiesHandler:createTemptableBrowser(
-            INPUT   hbttInput,
-            INPUT   httBrowserKo,
-            OUTPUT  httBrowser
-            ).
-        
-        iAnzRec = outilitiesHandler:fillBrowserTT (
-            INPUT        httBrowserKo,
-            INPUT        hqAufko,
-            INPUT        hbttInput,
-            INPUT-OUTPUT httBrowser
-            ).
-            
-        httBrowserKo::actualpage = 1.
-        outilitiesHandler:updateBrowserKo( INPUT httBrowserKo ).
-        
-        RETURN.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse    AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter      AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData    AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString AS LONGCHAR          NO-UNDO.
-        
-        DEFINE VARIABLE lRetVal      AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE cAktion      AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE oInput       AS JsonObject        NO-UNDO.
-        
-        DEFINE VARIABLE hbttMandant  AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE lcHTML       AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE cDatei       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE ii           AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE lAdmin       AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE hFeld        AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE iAktStufe    AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE lFirst       AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE cKomma       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cQueryString AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cString      AS CHARACTER         NO-UNDO.
-        
-        DEFINE BUFFER bwebmenu FOR webmenu.
-
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest = ' lRetVal STRING(lcJsonString).
-        
-        oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer eingangsstring = ' STRING(lcJsonString).
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        
-        outilitiesHandler = NEW utilitiesHandler().
-
-        DO WHILE lRetVal:
-            IF cAktion = 'aufko' THEN 
-            DO:
-                createAufkoResponse ( ).
-                httBrowser:WRITE-JSON('JsonObject', oJsonData).
-                oJsonData:write(lcJsonString, FALSE).
-                LEAVE. 
-            END.
-             
-            REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-                IF ttInput.benutzer = 'Admin' THEN LEAVE.
-                FOR EACH webmenu NO-LOCK USE-INDEX webmenu-k1
-                    WHERE webmenu.mandant  = ttInput.mandant
-                    AND   webmenu.benutzer = 'Admin'
-                    AND   webmenu.sprcd    = INTEGER(ttInput.sprcd):
-                    FIND bwebmenu USE-INDEX webmenu-k1
-                        WHERE bwebmenu.mandant  = webmenu.mandant
-                        AND   bwebmenu.benutzer = ttInput.benutzer
-                        AND   bwebmenu.sprcd    = webmenu.sprcd
-                        AND   bwebmenu.stufe1   = webmenu.stufe1 NO-ERROR.
-                    IF NOT AVAILABLE bwebmenu THEN CREATE bwebmenu.
-                    BUFFER-COPY webmenu
-                        EXCEPT  webmenu.benutzer
-                        TO      bwebmenu
-                        ASSIGN  
-                        bwebmenu.benutzer = ttInput.benutzer.
-                END.
-                RELEASE webmenu.
-                RELEASE bwebmenu.
-                LEAVE.
-            END.
- 
-            lcJsonString = CHR(123).
-            lFirst       = TRUE.
-            iAktStufe    = 0.
-    
-            IF ttInput.action = 'first' THEN 
-            DO:
-                FOR EACH webmenu NO-LOCK USE-INDEX webmenu-k1
-                    WHERE webmenu.mandant  = ttInput.mandant
-                    AND   webmenu.benutzer = ttInput.benutzer
-                    AND   webmenu.sprcd    = INTEGER(ttInput.sprcd) :
-                    
-                    CASE webmenu.stufe2:
-                        WHEN 0 THEN
-                            DO:
-                                IF iAktStufe = 1 THEN
-                                DO:
-                                    lcJsonString = lcJsonString + SUBSTITUTE('&1,', CHR(125)).
-                                END.
-            
-                                IF iAktStufe = 2 THEN
-                                DO:
-                                    lcJsonString = lcJsonString + SUBSTITUTE('&1&1,', CHR(125)).
-                                END.
-                                IF NOT lFirst THEN 
-                                DO:
-                                    lcJsonString = lcJsonString + ','.
-                                    lFirst = FALSE.
-                                END. 
-                                IF webmenu.menulink = '' THEN lcJsonString = lcJsonString + SUBSTITUTE('&1: &2', QUOTER(webmenu.Menutext), CHR(123)                ).
-                                ELSE                          lcJsonString = lcJsonString + SUBSTITUTE('&1: &2', QUOTER(webmenu.menutext), QUOTER(webmenu.menulink)).
-                                iAktStufe = webmenu.stufe2.
-                            END.
-        
-                        WHEN 1 THEN
-                            DO:
-                                IF iAktStufe = 1 THEN lcJsonString = lcJsonString + ','. 
-                                IF iAktStufe = 2 THEN
-                                DO:
-                                    lcJsonString = lcJsonString + SUBSTITUTE('&1,', CHR(125)).
-                                END.
-                                IF webmenu.menulink = '' THEN lcJsonString = lcJsonString + SUBSTITUTE('&1: &2', QUOTER(webmenu.menutext), CHR(123)).
-                                ELSE                          lcJsonString = lcJsonString + SUBSTITUTE('&1: &2', QUOTER(webmenu.menutext), QUOTER(webmenu.menulink)).
-                                iAktStufe = webmenu.stufe1.
-                            END.
-        
-                        WHEN 2 THEN
-                            DO:
-                                IF iAktStufe = 2 THEN  lcJsonString = lcJsonString + ','.
-                                IF webmenu.menulink = '' THEN lcJsonString = lcJsonString + SUBSTITUTE('&1: &2', QUOTER(webmenu.menutext), CHR(123)                ).
-                                ELSE                          lcJsonString = lcJsonString + SUBSTITUTE('&1: &2', QUOTER(webmenu.menutext), QUOTER(webmenu.menulink)).
-                                iAktStufe = webmenu.stufe1.
-                            END.
-        
-                    END CASE.
-    
-                END.
-                
-                IF iAktStufe = 2 THEN lcJsonString = lcJsonString + SUBSTITUTE('&1&1', CHR(125)).
-                IF iAktStufe = 1 THEN lcJsonString = lcJsonString + SUBSTITUTE('&1'  , CHR(125)).
-                lcJsonString = lcJsonString + CHR(125).
-                LEAVE.
-            END.
-            
-            IF ttInput.action BEGINS 'stufe' THEN 
-            DO:
-                CASE ttInput.action:
-                    WHEN 'stufe0'  THEN 
-                        iAktStufe = 0.
-                    WHEN 'stufe1' THEN 
-                        iAktStufe = 1.
-                    WHEN 'stufe2' THEN  
-                        iAktStufe = 2.
-                END CASE.
-                
-                cKomma = ''.
-                
-                IF ttInput.params <> '' THEN 
-                DO:
-                    FIND FIRST webmenu NO-LOCK USE-INDEX webmenu-k1
-                        WHERE webmenu.mandant  = ttInput.mandant
-                        AND   webmenu.benutzer = ttInput.benutzer
-                        AND   webmenu.sprcd    = INTEGER(ttInput.sprcd)
-                        /*                        AND   webmenu.stufe    = iAktStufe - 1*/
-                        AND   webmenu.menutext = ttInput.params NO-ERROR.
-                    ii = webmenu.stufe1.
-                END.
-
-                FOR EACH webmenu NO-LOCK USE-INDEX webmenu-k1
-                    WHERE webmenu.mandant  = ttInput.mandant
-                    AND   webmenu.benutzer = ttInput.benutzer
-                    AND   webmenu.sprcd    = INTEGER(ttInput.sprcd)
-                    AND   webmenu.stufe1   > ii:
-
-                    IF webmenu.stufe2 < iAktStufe THEN LEAVE.
-                    IF webmenu.stufe2 > iAktStufe THEN NEXT.
-
-                    IF webmenu.menulink = '' THEN lcJsonString = lcJsonString + SUBSTITUTE('&3&1:&2', QUOTER(webmenu.menutext), QUOTER(STRING(iAktStufe,"9")), cKomma  ).
-                    ELSE                          lcJsonString = lcJsonString + SUBSTITUTE('&3&1:&2', QUOTER(webmenu.menutext), QUOTER(webmenu.menulink)     , cKomma ).
-                    cKomma = ', '.
-                END.
-                    
-                lcJsonString = lcJsonString + CHR(125).
-                LEAVE.
-            END.
-
-            FOR EACH webmenu NO-LOCK
-                WHERE webmenu.mandant  = ttInput.mandant
-                AND   webmenu.benutzer = ttInput.benutzer
-                AND   webmenu.sprcd    = INTEGER(ttInput.sprcd)
-                AND   INDEX(webmenu.wortindex, ttInput.suchfeld) > 0:
-                        
-                IF webmenu.menulink = '' THEN lcJsonString = lcJsonString + SUBSTITUTE('&3&1:&2', QUOTER(webmenu.menutext), QUOTER(STRING(iAktStufe,"9")), cKomma  ).
-                ELSE                          lcJsonString = lcJsonString + SUBSTITUTE('&3&1:&2', QUOTER(webmenu.menutext), QUOTER(webmenu.menulink)     , cKomma ).
-                cKomma = ', '.
-            END.
-            lcJsonString = lcJsonString + CHR(125).
-            LEAVE.
-        END.
-        
-        oResponse = NEW OpenEdge.Web.WebResponse().
-        oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-        oResponse:ContentType = "application/json;charset=utf-8".
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open().
-        MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString).
-        oWriter:Write(lcJsonString).
-        oWriter:Close().
-
-        MESSAGE "Exiting HandlePost".
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 317
adressen/getAdresseByKnrImpl.cls

@@ -1,317 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : getAdresseByKnrImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-
-CLASS getAdresseByKnrImpl INHERITS WebHandler:
-
-    { adressen/ttadresse.i }
-
-    METHOD PUBLIC LOGICAL createJsonStructur(INPUT iphBuffer AS HANDLE, OUTPUT lcStruktur AS LONGCHAR):
-        DEFINE VARIABLE i      AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE hFeld  AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE cZeile AS CHARACTER NO-UNDO.
-
-        MESSAGE "Entering createJsonStructur" VIEW-AS ALERT-BOX.
-
-        lcStruktur = CHR(123) + CHR(10) + '  "fields": [' + CHR(10).
-
-        DO i = 1 TO iphBuffer:NUM-FIELDS:
-            hFeld = iphBuffer:BUFFER-FIELD(i).
-            IF hFeld:EXTENT > 0 THEN NEXT.
-            cZeile = SUBSTITUTE('    &5"name": "&1", "type": "&2", "label": "&3", "value": "&4" &6',
-                hFeld:NAME, "text", (IF hFeld:LABEL <> "" THEN hFeld:LABEL ELSE hFeld:NAME), hFeld:BUFFER-VALUE, CHR(123), CHR(125)).
-            lcStruktur = lcStruktur + cZeile.
-            IF i <> iphBuffer:NUM-FIELDS THEN lcStruktur = lcStruktur + ','.
-            lcStruktur = lcStruktur + CHR(10).
-        END.
-        lcStruktur = lcStruktur + '  ]' + CHR(10) + CHR(125) + CHR(10).
-
-        MESSAGE "Exiting createJsonStructur" VIEW-AS ALERT-BOX.
-
-        RETURN TRUE.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse    AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter      AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData    AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE ipCompanyID  AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE ipCustomerID AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE lcJsonString AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE httAdresse   AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE lRetVal      AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE cSearchType  AS CHARACTER         NO-UNDO INITIAL "Knr".
-        DEFINE VARIABLE cWortIndex   AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE iPage        AS INTEGER           NO-UNDO INITIAL 1.
-        DEFINE VARIABLE iPageSize    AS INTEGER           NO-UNDO INITIAL 10.
-        DEFINE VARIABLE cGetHtml     AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE lcHTML       AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE cDatei       AS CHARACTER         NO-UNDO.
-
-        MESSAGE "Entering HandlePost" VIEW-AS ALERT-BOX.
-        
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest = ' lRetVal.
-
-        IF lRetVal THEN 
-        DO:
-            cGetHtml     = oJsonData:GetCharacter("gethtml")        NO-ERROR.
-            ipCompanyID  = oJsonData:GetCharacter("companyID")      NO-ERROR.
-            ipCustomerID = oJsonData:GetInteger("customerID")       NO-ERROR.
-            cSearchType  = oJsonData:GetCharacter("searchType")     NO-ERROR.
-            cWortIndex   = oJsonData:GetCharacter("WortIndex")      NO-ERROR.
-            iPage        = oJsonData:GetInteger("page")             NO-ERROR.
-            iPageSize    = oJsonData:GetInteger("pageSize")         NO-ERROR.
-            
-            MESSAGE 'gethtml = ' cGetHtml ' companyID = ' ipCompanyID ' customerID = ' ipCustomerID ' SearchType = ' cSearchType ' WortIndex = ' cWortIndex ' page = ' iPage ' pageSize = ' iPageSize.
-
-            IF cGetHtml = 'gethtml' THEN 
-            DO:
-                cDatei = 'html/adressen.html'.
-                cDatei = SEARCH(cDatei).
-                MESSAGE cDatei.
-                
-                COPY-LOB FILE 'C:\Entwicklung\Ge_MIS\pasoeGEMIS\webapps\ADRESSEN\WEB-INF\openedge\html/adressen.html' TO lcHTML.
-                oResponse = NEW OpenEdge.Web.WebResponse().
-                oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-                oResponse:ContentType = "text/html;charset=utf-8".
-                oWriter = NEW WebResponseWriter(oResponse).
-                oWriter:Open().
-                MESSAGE 'lcString Rückgabe: ' + STRING(lchtml) VIEW-AS ALERT-BOX.
-                oWriter:Write(lcHTML).
-                oWriter:Close().
-                RETURN 200.
-            END.
-            
-            IF cSearchType = "name" THEN 
-            DO:
-                RETURN getAdressenByWortIndex(poRequest, cWortIndex, ipCompanyID, iPage, iPageSize).
-            END.
-            
-            EMPTY TEMP-TABLE ttAdresse.
-
-            FIND Adresse NO-LOCK
-                WHERE Adresse.Firma = ipCompanyID
-                AND   Adresse.Knr   = ipCustomerID NO-ERROR.
-            IF AVAILABLE Adresse THEN 
-            DO:
-                CREATE ttAdresse.
-                BUFFER-COPY Adresse TO ttAdresse.
-                MESSAGE 'Address found and copied to ttAdresse' VIEW-AS ALERT-BOX.
-            END.
-            ELSE 
-            DO:
-                MESSAGE 'Address not found' VIEW-AS ALERT-BOX.
-            END.
-
-            httAdresse = TEMP-TABLE ttAdresse:DEFAULT-BUFFER-HANDLE.
-            oJsonData = NEW JsonObject().
-            httAdresse:WRITE-JSON('JsonObject', oJsonData).
-            oJsonData:WRITE(lcJsonString, TRUE).
-        END.
-        ELSE 
-        DO:
-            MESSAGE 'Fehler beim Abrufen der Daten' VIEW-AS ALERT-BOX.
-        END.
-
-        oResponse = NEW OpenEdge.Web.WebResponse().
-        oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-        oResponse:ContentType = "application/json;charset=utf-8".
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open().
-        MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-        oWriter:Write(lcJsonString).
-        oWriter:Close().
-
-        MESSAGE "Exiting HandlePost" VIEW-AS ALERT-BOX.
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-    END METHOD.
-
-    METHOD PUBLIC INTEGER getSuggestions(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE cWortIndex  AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cParams     AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cParam      AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cFeld       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cWert       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE ii          AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE oJsonArray  AS JsonArray         NO-UNDO.
-        DEFINE VARIABLE oJsonObject AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE oResponse   AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter     AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE lRetVal     AS LOGICAL           NO-UNDO.
-
-        MESSAGE "Entering getSuggestions" VIEW-AS ALERT-BOX.
-
-        lRetVal = WebHandlerUtilities:getAllKeysFromHeader(INPUT poRequest, OUTPUT cParams) NO-ERROR.
-        MESSAGE 'getAllKeysFromHeader = ' lRetVal VIEW-AS ALERT-BOX.
-
-        DO ii = 1 TO NUM-ENTRIES(cParams, '&'):
-            cParam = ENTRY(ii, cParams, '&').
-            cFeld = ENTRY(1, cParam, '=').
-            cWert = ENTRY(2, cParam, '=').
-            MESSAGE 'Parameter: ' cFeld ' = ' cWert VIEW-AS ALERT-BOX.
-
-            CASE cFeld:
-                WHEN 'WortIndex' THEN
-                    cWortIndex = cWert.
-            END CASE.
-        END.
-
-        EMPTY TEMP-TABLE ttAdresse.
-
-        FOR EACH Adresse NO-LOCK
-            WHERE Adresse.WortIndex BEGINS cWortIndex:
-            CREATE ttAdresse.
-            BUFFER-COPY Adresse TO ttAdresse.
-        END.
-
-        oJsonArray = NEW JsonArray().
-        FOR EACH ttAdresse NO-LOCK:
-            oJsonObject = NEW JsonObject().
-            oJsonObject:Add("Knr", ttAdresse.Knr).
-            oJsonObject:Add("Anzeig_br", ttAdresse.Anzeig_br).
-            oJsonArray:Add(oJsonObject).
-        END.
-
-        oResponse = NEW OpenEdge.Web.WebResponse().
-        oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-        oResponse:ContentType = "application/json;charset=utf-8".
-
-        DEFINE VARIABLE lcString AS LONGCHAR NO-UNDO.
-        oJsonArray:WRITE(lcString, FALSE).
-
-        COPY-LOB lcString TO FILE 'C:\TEMP\Json.txt'.
-
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open().
-        /*    oWriter:Write(oJsonArray:ToString()).*/
-        MESSAGE 'lcString Rückgabe: ' + STRING(lcString) VIEW-AS ALERT-BOX.        
-        oWriter:Write(lcString).
-        oWriter:Close().
-
-
-        MESSAGE "Exiting getSuggestions" VIEW-AS ALERT-BOX.
-
-        RETURN 0.
-    END METHOD.
-
-    METHOD PUBLIC INTEGER getAdressenByWortIndex(INPUT poRequest AS IWebRequest, cWortIndex AS CHARACTER, cCompanyID AS CHARACTER, iPage AS INTEGER, iPageSize AS INTEGER):
-        DEFINE VARIABLE ii          AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE oJsonArray  AS JsonArray         NO-UNDO.
-        DEFINE VARIABLE oJsonObject AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE oResponse   AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter     AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE iOffset     AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE lRetVal     AS LOGICAL           NO-UNDO.
-
-        MESSAGE "Entering getAdressenByWortIndex" VIEW-AS ALERT-BOX.
-
-        iOffset = (iPage - 1) * iPageSize.
-
-        EMPTY TEMP-TABLE ttAdresse.
-        
-        cWortIndex = ENTRY(1, cWortIndex, ' ').
-
-        FOR EACH Adresse NO-LOCK
-            WHERE INDEX(Adresse.WortIndex, cWortIndex) > 0
-            AND Adresse.Firma = cCompanyID
-            BY Adresse.Knr:
-            CREATE ttAdresse.
-            BUFFER-COPY Adresse TO ttAdresse.
-        END.
-
-        oJsonArray = NEW JsonArray().
-        FOR EACH ttAdresse NO-LOCK:
-            oJsonObject = NEW JsonObject().
-            oJsonObject:Add("Knr", ttAdresse.Knr).
-            oJsonObject:Add("Anzeig_br", ttAdresse.Anzeig_br).
-            oJsonArray:Add(oJsonObject).
-        END.
-
-        oResponse = NEW OpenEdge.Web.WebResponse().
-        oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-        oResponse:ContentType = "application/json;charset=utf-8".
-
-        DEFINE VARIABLE lcString AS LONGCHAR NO-UNDO.
-        oJsonArray:WRITE(lcString, FALSE).
-        lcString = CHR(123) + ' "ttAdresse" : ' + lcString + CHR(125).
-
-        COPY-LOB lcString TO FILE 'C:\TEMP\Json.txt'.
-
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open().
-        /*    oWriter:Write(oJsonArray:ToString()).*/
-        MESSAGE 'lcString Rückgabe: ' + STRING(lcString) VIEW-AS ALERT-BOX.        
-        oWriter:Write(lcString).
-        oWriter:Close().
-
-        MESSAGE "Exiting getAdressenByWortIndex" VIEW-AS ALERT-BOX.
-
-        RETURN 0.
-    END METHOD.
-
-    /* Methode zum Entfernen von Teilen des Strings außerhalb der eckigen Klammern */
-    METHOD PUBLIC CHARACTER TrimBracketsFromLongChar(INPUT inputLongChar AS LONGCHAR):
-        DEFINE VARIABLE startPosition AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE endPosition   AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE resultString  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE inputString   AS CHARACTER NO-UNDO.
-
-        /* Konvertiere LONGCHAR zu CHARACTER, da INDEX und R-INDEX mit CHARACTER arbeiten */
-        inputString = STRING(inputLongChar).
-
-        /* Finde die Position des ersten "[" */
-        startPosition = INDEX(inputString, "[").
-
-        /* Finde die Position des letzten "]" */
-        endPosition = R-INDEX(inputString, "]").
-
-        /* Überprüfe, ob beide Klammern gefunden wurden */
-        IF startPosition > 0 AND endPosition > 0 AND endPosition > startPosition THEN 
-        DO:
-            /* Extrahiere den String zwischen den Klammern */
-            resultString = SUBSTRING(inputString, startPosition + 1, endPosition - startPosition - 1).
-        END.
-        ELSE 
-        DO:
-            /* Wenn keine oder nur eine Klammer gefunden wurde, gib den ursprünglichen String zurück */
-            resultString = inputString.
-        END.
-
-        RETURN resultString.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 97
adressen/getErrorMessageImpl.cls

@@ -1,97 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : getErrorMessageImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING utilities.utilitiesHandler FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-
-CLASS getErrorMessageImpl INHERITS WebHandler:
-    
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler.
-    
-    { ttInput.i }
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse    AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter      AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData    AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString AS LONGCHAR          NO-UNDO.
-        
-        DEFINE VARIABLE lRetVal      AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE cAktion AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE oInput  AS JsonObject NO-UNDO.
-        
-        DEFINE VARIABLE hbttMandant  AS HANDLE            NO-UNDO.
-        
-        DEFINE BUFFER bwebmenu FOR webmenu.
-
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest = ' lRetVal STRING(lcJsonString).
-        
-        oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer eingangsstring = ' STRING(lcJsonString).
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        
-        outilitiesHandler = NEW utilitiesHandler().
-
-        DO WHILE lRetVal:
-            outilitiesHandler:getErrorMessage(INPUT ttInput.errorno, INTEGER(ttInput.sprcd), INPUT ttInput.params, OUTPUT lcJsonString).
-            
-            LEAVE.
-        END.
-        
-        oResponse = NEW OpenEdge.Web.WebResponse().
-        oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-        oResponse:ContentType = "application/json;charset=utf-8".
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open().
-        MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString).
-        oWriter:Write(lcJsonString).
-        oWriter:Close().
-
-        MESSAGE "Exiting HandlePost".
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 130
adressen/getFileDictImpl.cls

@@ -1,130 +0,0 @@
- 
-/*------------------------------------------------------------------------
-   File        : adresse_dict
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Thu Jun 26 13:56:20 CEST 2025
-   Notes       : 
- ----------------------------------------------------------------------*/
- 
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Core.String FROM PROPATH.
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-USING src.ch.adprime.gemis.ErrorMessage FROM PROPATH.
-
-CLASS getFileDIctImpl INHERITS WebHandler: 
-
-    DEFINE TEMP-TABLE tFileDIct
-        SERIALIZE-NAME 'fields'
-        FIELD cName   AS CHARACTER SERIALIZE-NAME 'name' 
-        FIELD cType   AS CHARACTER SERIALIZE-NAME 'type'
-        FIELD iLaenge AS INTEGER   SERIALIZE-NAME 'width'
-        .
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleGet (INPUT poRequest AS IWebRequest ):
-        DEFINE VARIABLE oResponse       AS IHttpResponse     NO-UNDO.         
-        DEFINE VARIABLE oWriter         AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oError          AS ErrorMessage      NO-UNDO.
-        DEFINE VARIABLE oBody           AS String            NO-UNDO.
-        DEFINE VARIABLE oJsonResponse   AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lDebug          AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE cDefautlCharSet AS CHARACTER         NO-UNDO INIT 'UTF-8'.
-           
-        DEFINE VARIABLE cCorralationID  AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cContent-Type   AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE htFileDIct      AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE oJsonArray      AS JsonArray         NO-UNDO.
-        DEFINE VARIABLE lcJsonInhalt    AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE ii              AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE cFileName       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cFelder         AS CHARACTER         NO-UNDO.
-        
-        cFileName = poRequest:URI:GetQueryValue("File").
-        MESSAGE 'File-Name = ' cFileName.
-        
-        FIND FIRST AnaDat._File NO-LOCK 
-            WHERE AnaDat._File._File-Name = cFileName NO-ERROR.
-        FOR EACH AnaDat._Field OF AnaDat._File:
-            CREATE tFileDIct.
-            ASSIGN
-                tFileDIct.cName   = AnaDat._Field._Field-Name
-                tFileDIct.cType   = REPLACE(AnaDat._Field._Data-Type, '-', '_')
-                tFileDIct.iLaenge = 10.
-            CASE AnaDat._Field._Data-Type:
-                WHEN 'logical' THEN 
-                    tFileDIct.cType   = 'checkbox'.
-                WHEN 'character' THEN 
-                    tFileDIct.cType   = 'text'.
-                WHEN 'integer' THEN 
-                    tFileDIct.cType   = 'number'.
-                WHEN 'logical' THEN 
-                    tFileDIct.cType   = 'checkbox'.
-            END CASE.
-        END.
-        htFileDIct = TEMP-TABLE tFileDIct:DEFAULT-BUFFER-HANDLE.
-                 
-        cContent-Type = "application/json".
-           
-        oError = NEW ErrorMessage().
-        oError:lDebug = lDebug.
-          
-        oJsonResponse = NEW JsonObject().
-        htFileDIct:WRITE-JSON('JsonObject', oJsonResponse).
-        
-        oJsonResponse:WRITE(lcJsonInhalt, FALSE).
-        /*        ii = INDEX(lcJsonInhalt, '[').                 */
-        /*        lcJsonInhalt = SUBSTRING(lcJsonInhalt, ii).    */
-        /*                                                       */
-        /*        ii = R-INDEX(lcJsonInhalt, ']').               */
-        /*        lcJsonInhalt = SUBSTRING(lcJsonInhalt, 01, ii).*/
-
-        MESSAGE "GetHandler".
-          
-//        oBody = NEW String(oJsonResponse:GetJsonText()).         
-        oBody = NEW String(lcJsonInhalt).         
-        WebHandlerUtilities:createHttpResponse(INPUT INTEGER(StatusCodeEnum:OK), INPUT oBody, INPUT cContent-Type, INPUT cDefautlCharSet, INPUT cCorralationID, OUTPUT oResponse).
-//        oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
-           
-        oWriter = NEW WebResponseWriter(oResponse).
-        oWriter:Open(). 
-        oWriter:Close(). 
-            
-        RETURN 0.
-        
-        CATCH e AS Progress.Lang.Error:
-
-        END CATCH.
-
-        FINALLY:
-
-        END FINALLY.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 734
adressen/getHTMLImpl.cls

@@ -1,734 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : getHTMLImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-USING utilities.utilitiesHandler FROM PROPATH.
-
-CLASS getHTMLImpl INHERITS WebHandler:
-
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
-    DEFINE VARIABLE htviewer_ze       AS HANDLE           NO-UNDO.
-    DEFINE VARIABLE iSprcd            AS INTEGER          NO-UNDO.
-
-    DEFINE TEMP-TABLE tviewer_ko LIKE viewer_ko.
-    DEFINE TEMP-TABLE tviewer_ze LIKE viewer_ze
-        FIELD iMaxLaenge AS INTEGER 
-        FIELD iBreite    AS INTEGER
-        FIELD iDecimals  AS INTEGER 
-        .
-
-    { ttInput.i    }
-    { properties_formular_html.i }
-
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LONGCHAR createHtmlFormular(  ):
-        
-        DEFINE VARIABLE lcHtmlFormular AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE iTabIndex      AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cIndexFields   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cString        AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cZeile         AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cAttribute     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cTabIndex      AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cStyle         AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE lcSelectTexte  AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE lcSelectWerte  AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE lcOption       AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE ii             AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE lRetVal        AS LOGICAL   NO-UNDO.
-        
-        DEFINE VARIABLE cLabelText     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE lFirma         AS LOGICAL   NO-UNDO INIT FALSE.
-        DEFINE VARIABLE iLength        AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE iMaxBreite     AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE iAnzSpalten    AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE iBerechSpalten AS INTEGER   NO-UNDO.
-        
-        DEFINE BUFFER bFile FOR AnaDat._File.
-        
-        FIX-CODEPAGE (lcHtmlFormular) = 'utf-8'.
-        
-        FIND FIRST ttInput.
-
-        EMPTY TEMP-TABLE tviewer_ko.
-        EMPTY TEMP-TABLE tviewer_ze.
-        
-        htviewer_ze = TEMP-TABLE tviewer_ze:DEFAULT-BUFFER-HANDLE.
-        
-        DO WHILE TRUE:
-            FIND FIRST viewer_ko NO-LOCK 
-                WHERE viewer_ko.mandant  = ttInput.mandant
-                AND   viewer_ko.benutzer = ttInput.benutzer
-                AND   viewer_ko.program  = ttInput.programm
-                AND   viewer_ko.tabelle  = ttInput.tabelle NO-ERROR.
-            IF AVAILABLE viewer_ko THEN LEAVE. 
-            FIND FIRST viewer_ko NO-LOCK 
-                WHERE viewer_ko.mandant  = ttInput.mandant
-                AND   viewer_ko.benutzer = 'admin'
-                AND   viewer_ko.program  = ttInput.programm
-                AND   viewer_ko.tabelle  = ttInput.tabelle NO-ERROR.
-            IF NOT AVAILABLE viewer_ko THEN RETURN lcHtmlFormular.
-            IF  viewer_ko.benutzer = 'admin' AND
-                ttInput.benutzer   = 'admin' THEN LEAVE. 
-
-            REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-                CREATE  tviewer_ko.
-                BUFFER-COPY viewer_ko
-                    EXCEPT  viewer_ko.benutzer
-                    TO      tviewer_ko
-                    ASSIGN
-                    tviewer_ko.benutzer = ttInput.benutzer.
-                FOR EACH viewer_ze NO-LOCK OF viewer_ko:
-                    CREATE  tviewer_ze.
-                    BUFFER-COPY viewer_ze
-                        EXCEPT  viewer_ze.benutzer
-                        TO      tviewer_ze
-                        ASSIGN 
-                        tviewer_ze.benutzer = ttInput.benutzer.
-                END.
-                FIND viewer_ko OF tviewer_ko NO-ERROR.
-                IF NOT AVAILABLE viewer_ko THEN 
-                DO:
-                    CREATE  viewer_ko.
-                    BUFFER-COPY tviewer_ko TO viewer_ko.
-                END.
-                FOR EACH tviewer_ze NO-LOCK:
-                    FIND viewer_ze OF tviewer_ze NO-ERROR.
-                    IF AVAILABLE viewer_ze THEN NEXT.
-                    CREATE viewer_ze.
-                    BUFFER-COPY tviewer_ze TO viewer_ze.
-                END.
-                LEAVE.
-            END.
-        END.
-        
-        EMPTY TEMP-TABLE tviewer_ko.
-        EMPTY TEMP-TABLE tviewer_ze.
-        
-        FIND bFile NO-LOCK 
-            WHERE bFile._File-Name = viewer_ko.tabelle.
-            
-        IF viewer_ko.anzahlspalten < 10 THEN 
-        DO:
-            ASSIGN 
-                iAnzSpalten    = viewer_ko.anzahlspalten
-                iBerechSpalten = viewer_ko.anzahlspalten.
-        END.
-        ELSE 
-        DO:
-            cString = STRING(viewer_ko.anzahlspalten,'99').
-            ASSIGN 
-                iAnzSpalten    = INTEGER(SUBSTRING(cString,01,01))
-                iBerechSpalten = INTEGER(SUBSTRING(cString,02,01)).
-        END.
-        
-        cIndexFields = outilitiesHandler:getPrimaryIndexFields( INPUT viewer_ko.tabelle ) NO-ERROR.
-        lcHtmlFormular = SUBSTITUTE(cform-container, iAnzSpalten) + CHR(10).
-
-        iTabIndex = 0.
-        CREATE  tviewer_ze.
-        htviewer_ze = TEMP-TABLE tviewer_ze:DEFAULT-BUFFER-HANDLE.
-
-        FOR EACH viewer_ze NO-LOCK OF viewer_ko
-            BY viewer_ze.prior:
-                
-            IF  ttInput.params         = '' AND
-                viewer_ze.privatedata <> '' THEN NEXT.
-            IF ttInput.params <> '' THEN 
-            DO:
-                DO ii = 1 TO NUM-ENTRIES(viewer_ze.privatedata, ';'):
-                    cString = ENTRY(ii, viewer_ze.privatedata, ';').
-                    IF INDEX(viewer_ze.privatedata, cString) > 0 THEN LEAVE.
-                END.
-                IF ii > NUM-ENTRIES(viewer_ze.privatedata, ';') THEN NEXT.
-            END.
-                
-            lcHtmlFormular = lcHtmlFormular + '    ' + cform-group + CHR(10).
-            
-            FIND FIRST tviewer_ze.
-            BUFFER-COPY viewer_ze TO tviewer_ze.
-            ASSIGN 
-                tviewer_ze.iMaxLaenge = 0
-                tviewer_ze.iBreite    = 0
-                tviewer_ze.iDecimals  = 0
-                .
-            
-            DO WHILE TRUE:
-                cLabelText = ''.
-                
-                IF tviewer_ze.feld BEGINS 'Dummy' OR
-                tviewer_ze.feld = 'ident'         THEN 
-                DO:
-                    ASSIGN 
-                        tviewer_ze.lHidden    = TRUE 
-                        tviewer_ze.lReadonly  = TRUE
-                        tviewer_ze.styles     = ''
-                        tviewer_ze.attributes = ''
-                        // tviewer_ze.privatedata = ''
-                        tviewer_ze.iMaxLaenge = 1
-                        .
-                    LEAVE.
-                END.     
-    
-                IF NOT tviewer_ze.lHidden THEN 
-                DO:
-                    cString    = getLabel(INPUT 'side', INPUT iSprcd) NO-ERROR.
-                    clabelText = FILL(' ',08) + SUBSTITUTE(clabel, tviewer_ze.feld, cString).
-                END.
-                
-                IF tviewer_ze.selecttabelle = 'selections' THEN 
-                DO:
-                    lRetVal = fillSelection (INPUT-OUTPUT htviewer_ze, OUTPUT lcSelectWerte, OUTPUT lcSelectTexte).
-                    IF lRetVal THEN 
-                        ASSIGN
-                            tviewer_ze.selecttabelle = ''
-                            tviewer_ze.feldtype      = 'select'.
-                    LEAVE.
-                END.
-                
-                IF tviewer_ze.selecttabelle <> '' THEN 
-                DO:
-                    lRetVal = fillSelectionAusTabelle(INPUT-OUTPUT htviewer_ze, OUTPUT lcSelectWerte, OUTPUT lcSelectTexte).
-                    IF lRetVal THEN 
-                        ASSIGN
-                            tviewer_ze.selecttabelle = ''
-                            tviewer_ze.feldtype      = 'select'.
-                    LEAVE.
-                END.
-                
-                FIND AnaDat._Field NO-LOCK
-                    WHERE AnaDat._Field._Field-name = tviewer_ze.feld
-                    AND   AnaDat._FIeld._File-Recid = RECID(bFile).
-                IF INDEX(_Field._View-AS, 'TOGGLE-BOX') > 0 THEN
-                DO:
-                    tviewer_ze.feldtype = 'checkbox'.
-                    LEAVE.
-                END.
-                IF INDEX(_Field._View-AS, 'EDITOR') > 0 THEN
-                DO:
-                    tviewer_ze.feldtype = 'textarea'.
-                    LEAVE.
-                END.
-
-                LEAVE.
-            END.
-            
-            iLength   = 0.
-            iDecimals = 0.
-            CASE tviewer_ze.feldtype:
-                WHEN 'character' THEN
-                    ASSIGN 
-                        tviewer_ze.iBreite    = getMaxLength(tviewer_ze.feldformat)
-                        tviewer_ze.iMaxLaenge = tviewer_ze.iBreite.
-                WHEN 'textarea' THEN
-                    ASSIGN 
-                        tviewer_ze.iBreite    = getMaxLength(tviewer_ze.feldformat)
-                        tviewer_ze.iMaxLaenge = tviewer_ze.iBreite.
-                WHEN 'integer' THEN 
-                    ASSIGN 
-                        tviewer_ze.iBreite    = LENGTH(tviewer_ze.feldformat)
-                        tviewer_ze.iMaxLaenge = tviewer_ze.iBreite
-                        tviewer_ze.iDecimals  = -1.
-                WHEN 'decimal' THEN 
-                    DO:
-                        tviewer_ze.iBreite    = LENGTH(tviewer_ze.feldformat).
-                        tviewer_ze.iMaxLaenge = tviewer_ze.iBreite.
-                        ii                 = INDEX(tviewer_ze.feldformat, '.').
-                        IF ii > 0 THEN  tviewer_ze.iDecimals = LENGTH(ENTRY(2, tviewer_ze.feldformat, '.')).
-                        ELSE            tviewer_ze.iDecimals = -1.
-                    END.
-                WHEN 'checkbox' THEN 
-                    DO:
-                        tviewer_ze.iBreite = 2.
-                    END.
-                WHEN 'select' THEN 
-                    DO:
-                        tviewer_ze.iBreite = iMaxBreite.
-                    END.
-                OTHERWISE 
-                ASSIGN 
-                    tviewer_ze.iBreite    = getMaxLength(tviewer_ze.feldformat)
-                    tviewer_ze.iMaxLaenge = tviewer_ze.iBreite.
-            END CASE.
-            
-            iMaxBreite = 0.
-            CASE iBerechSpalten:
-                WHEN 1 THEN 
-                    iMaxBreite = 90.
-                WHEN 2 THEN 
-                    iMaxBreite = 45.
-                WHEN 3 THEN 
-                    iMaxBreite = 30.
-                WHEN 4 THEN 
-                    iMaxBreite = 22.
-                OTHERWISE 
-                iMaxBreite = 20.
-            END CASE.
-                
-            IF tviewer_ze.iBreite > iMaxBreite THEN tviewer_ze.iBreite = iMaxBreite. 
-        
-            cAttribute = ''.
-            cTabIndex  = ''.
-            cStyle     = ''.
-            lcOption   = ''.
-            IF  NOT tviewer_ze.lHidden   AND 
-                NOT tviewer_ze.lReadonly THEN 
-            DO:
-                iTabIndex  = iTabIndex + 1.
-                cTabIndex  = SUBSTITUTE ('tabindex="&1" ', TRIM(STRING(iTabIndex,'>>>9'))).
-            END.
-    
-            DO WHILE lcSelectTexte <> '':
-                DO ii = 1 TO NUM-ENTRIES(lcSelectWerte, ';'):
-                    lcOption = lcOption
-                        + (IF lcOption = '' THEN '' ELSE CHR(10))
-                        + SUBSTITUTE('&3<option value="&1">&2</option>', ENTRY(ii, lcSelectWerte, ';'), ENTRY(ii, lcSelectTexte, ';'), FILL(' ',12)).
-                END.
-                LEAVE.
-            END.
-            //
-            //  Attribute definieren
-            //
-            cAttribute = SUBSTITUTE('id= "&1" name="&1" ', tviewer_ze.feld, tviewer_ze.feld).
-            IF tviewer_ze.lHidden  THEN cAttribute = cAttribute + 'type="hidden" '  .
-            ELSE 
-            DO:
-                CASE tviewer_ze.feldtype:
-                    WHEN 'checkbox' THEN 
-                        cAttribute = cAttribute + 'type="checkbox" '.
-                    WHEN 'textarea' THEN 
-                        cAttribute = cAttribute + 'type="text" wrap="soft" '.
-                    OTHERWISE    
-                    cAttribute = cAttribute + 'type="text" '.
-                END CASE.
-            END.
-            IF tviewer_ze.lReadonly THEN cAttribute = cAttribute + 'readonly="true" '.
-            IF tviewer_ze.iMaxLaenge > 0 THEN cAttribute = cAttribute + SUBSTITUTE('maxlength="&1" ', TRIM(STRING(tviewer_ze.iMaxLaenge))).
-            IF tviewer_ze.iDecimals  > 0 THEN cAttribute = cAttribute + SUBSTITUTE('step="0.&1" ', FILL('0', tviewer_ze.iDecimals)).
-            IF tviewer_ze.iDecimals  < 0 THEN cAttribute = cAttribute + 'step="0" '.
-            IF cTabIndex <> ''           THEN cAttribute = cAttribute + cTabIndex.
-            //
-            //  Style definieren
-            //
-            DO WHILE TRUE:
-                IF tviewer_ze.feldtype = 'select' THEN 
-                DO:
-                    cStyle = SUBSTITUTE('width: &1vw; text-align: &2;', tviewer_ze.iBreite, "left").
-                    LEAVE.
-                END.
-                IF tviewer_ze.feldtype = 'textarea' THEN 
-                DO:
-                    cStyle = SUBSTITUTE('width: &1vw; text-align: &2;', tviewer_ze.iBreite, "left").
-                    LEAVE.
-                END.
-                cStyle = SUBSTITUTE('width: &1vw; text-align: &2;', tviewer_ze.iBreite, tviewer_ze.textalign).
-                LEAVE.
-            END.
-            
-            cStyle = 'style=' + QUOTER(cStyle).
-            
-            CASE tviewer_ze.feldtype:
-                WHEN 'textarea'   THEN 
-                    cZeile = FILL(' ',08) +  SUBSTITUTE(cTextarea, cAttribute, cStyle, '' ).
-                WHEN 'select'    THEN 
-                    cZeile = FILL(' ',08) +  SUBSTITUTE(cSelect, cAttribute, cStyle, tviewer_ze.privatedata, CHR(10), lcOption, FILL(' ',08) ).
-                OTHERWISE
-                cZeile = FILL(' ',08) + SUBSTITUTE(cInput , cAttribute, cStyle, '' ).
-            END CASE.
-
-            IF cLabelText <> '' THEN lcHtmlFormular = lcHtmlFormular + cLabelText + CHR(10).              
-            lcHtmlFormular = lcHtmlFormular + cZeile + CHR(10).
-        
-            lcHtmlFormular = lcHtmlFormular + '    </div>' + CHR(10).
-    
-        END. 
-    
-        lcHtmlFormular = lcHtmlFormular + '</div>' + CHR(10).
-
-        RETURN lcHtmlFormular.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC CHARACTER createSelections(
-        INPUT  iprviewer_ze AS RECID,
-        INPUT  ipiSprcd     AS INTEGER,
-        OUTPUT cWerte       AS CHARACTER,
-        OUTPUT cAnzeige     AS CHARACTER
-        ):
-
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cInhalt  AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE lFound   AS LOGICAL   NO-UNDO.
-    
-        DEFINE BUFFER btviewer_ze FOR tviewer_ze.
-    
-        FIND btviewer_ze NO-LOCK WHERE RECID(btviewer_ze) = iprviewer_ze.
-
-        FOR EACH selections NO-LOCK 
-            WHERE selections.mandant = btviewer_ze.mandant
-            AND   selections.tabelle = btviewer_ze.tabelle
-            AND   selections.feld    = btviewer_ze.feld
-            AND   selections.sprcd   = ipiSprcd:
-            
-            cWerte = cWerte
-                + (IF cWerte = '' THEN '' ELSE ';')
-                + selections.wert.     
-            cAnzeige = cAnzeige
-                + (IF cAnzeige = '' THEN '' ELSE ';')
-                + selections.anzeige + SUBSTITUTE(' (&1) ':U, selections.wert).
-        END.
-    
-        IF cWerte <> '' THEN RETURN cWerte.
-         
-        FOR EACH selections NO-LOCK 
-            WHERE selections.mandant = btviewer_ze.mandant
-            AND   selections.tabelle = ''
-            AND   selections.feld    = btviewer_ze.feld
-            AND   selections.sprcd   = ipiSprcd:
-            cWerte = cWerte
-                + (IF cWerte = '' THEN '' ELSE ';')
-                + selections.wert.     
-            cAnzeige = cAnzeige
-                + (IF cAnzeige = '' THEN '' ELSE ';')
-                + selections.anzeige + SUBSTITUTE(' (&1) ':U, selections.wert).
-        END.
-    
-        IF cWerte <> '' THEN RETURN cWerte.
-         
-        FOR EACH selections NO-LOCK 
-            WHERE selections.mandant = btviewer_ze.mandant
-            AND   selections.tabelle = ''
-            AND   selections.feld    = btviewer_ze.feld:
-            cWerte = cWerte
-                + (IF cWerte = '' THEN '' ELSE ';')
-                + selections.wert.     
-            cAnzeige = cAnzeige
-                + (IF cAnzeige = '' THEN '' ELSE ';')
-                + selections.anzeige + SUBSTITUTE(' (&1) ':U, selections.wert).
-        END.
-    
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC CHARACTER getLabel(
-        INPUT ipcArt    AS CHARACTER,
-        INPUT ipiSprcd  AS INTEGER 
-        ):
-        
-        DEFINE VARIABLE cLabel AS CHARACTER NO-UNDO.
-    
-        DEFINE BUFFER btviewer_ze FOR tviewer_ze.
-    
-        FIND FIRST btviewer_ze NO-LOCK.
-    
-        IF  ipiSprcd = 0  OR
-            ipiSprcd > 10 THEN ipiSprcd = 1.
-    
-        FIND FIRST labeltexte NO-LOCK 
-            WHERE labeltexte.mandant   = btviewer_ze.mandant
-            AND   labeltexte.benutzer  = btviewer_ze.benutzer
-            AND   labeltexte.program   = btviewer_ze.program
-            AND   labeltexte.tabelle   = btviewer_ze.tabelle
-            AND   labeltexte.feld      = btviewer_ze.feld
-            AND   labeltexte.sprcd     = ipiSprcd NO-ERROR.
-        IF NOT AVAILABLE labeltexte THEN 
-        DO: 
-            FIND FIRST labeltexte NO-LOCK 
-                WHERE labeltexte.mandant   = btviewer_ze.mandant
-                AND   labeltexte.program   = btviewer_ze.program
-                AND   labeltexte.tabelle   = btviewer_ze.tabelle
-                AND   labeltexte.feld      = btviewer_ze.feld
-                AND   labeltexte.sprcd     = ipiSprcd NO-ERROR.
-        END.
-        IF NOT AVAILABLE labeltexte THEN 
-        DO:
-            FIND FIRST labeltexte NO-LOCK 
-                WHERE labeltexte.mandant   = btviewer_ze.mandant
-                AND   labeltexte.tabelle   = btviewer_ze.tabelle
-                AND   labeltexte.feld      = btviewer_ze.feld
-                AND   labeltexte.sprcd     = ipiSprcd NO-ERROR.
-        END.
-        IF NOT AVAILABLE labeltexte THEN 
-        DO:
-            FIND FIRST labeltexte NO-LOCK 
-                WHERE labeltexte.mandant   = btviewer_ze.mandant
-                AND   labeltexte.feld      = btviewer_ze.feld
-                AND   labeltexte.sprcd     = ipiSprcd NO-ERROR.
-        END.
-
-        CASE ipcArt:
-            WHEN 'side' THEN 
-                cLabel = (IF AVAILABLE labeltexte THEN labeltexte.sidelabel ELSE btviewer_ze.feld).
-            WHEN 'head' THEN 
-                cLabel = (IF AVAILABLE labeltexte THEN labeltexte.headlabel ELSE btviewer_ze.feld).
-        END CASE.
-    
-        RETURN cLabel.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC INTEGER getMaxLength(
-        ipcFormat AS CHARACTER
-        ):
-        /*------------------------------------------------------------------------------
-         Purpose:
-         Notes:
-        ------------------------------------------------------------------------------*/
-
-        DEFINE VARIABLE x1      AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cFormat AS CHARACTER NO-UNDO.
-    
-        x1 = INDEX(ipcFormat, '(').
-        IF x1 = 0 THEN RETURN LENGTH(ipcFormat).
-    
-        cFormat = REPLACE(ipcFormat, '(', ';').
-        cFormat = REPLACE(cFormat  , ')', ';').
-        x1 = INTEGER(ENTRY(2, cFormat, ';')).
-
-        RETURN x1.
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse     AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter       AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData     AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString  AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE oInput        AS JsonObject        NO-UNDO.
-        
-        DEFINE VARIABLE hbttDBTabelle AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE httDBTabelle  AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE hqDBTabelle   AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE hbDBTabelle   AS HANDLE            NO-UNDO.
-    
-        DEFINE VARIABLE lRetVal       AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE cAktion       AS CHARACTER         NO-UNDO.
-        
-        EMPTY TEMP-TABLE ttInput    .
-
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest    = ' lRetVal.
-        
-        oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer eingangsstring = ' STRING(lcJsonString).
-        
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        iSprcd  = INTEGER(ttInput.sprcd).
-        IF iSprcd < 1 OR iSprcd > 10 THEN iSprcd = 1.
-        
-        outilitiesHandler = NEW utilitiesHandler ().
-        
-        DO WHILE lRetVal:
-            lcJsonString = createHtmlFormular().
-            
-            MESSAGE 'Rückgabe: ' + STRING(lcJsonString).
-
-            oResponse             = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "text/plain".
-            oWriter               = NEW WebResponseWriter(oResponse).
-            
-            oWriter:Open().
-            /*            oWriter:Write(htmldokumente.htmltext).*/
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-            
-            LEAVE.
-        END.
-        
-        DO WHILE NOT lRetVal: 
-            oResponse = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "application/json;charset=utf-8".
-            oWriter = NEW WebResponseWriter(oResponse).
-            oWriter:Open().
-            MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-            LEAVE.
-        END.
-
-        MESSAGE "Exiting HandlePost" VIEW-AS ALERT-BOX.
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LOGICAL fillSelection(
-        INPUT-OUTPUT iphtviewer_ze AS HANDLE,
-        OUTPUT oplcSelectWerte     AS LONGCHAR, 
-        OUTPUT oplcSelectTexte     AS LONGCHAR 
-        ):
-
-        DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO.
-                
-        ASSIGN 
-            iphtviewer_ze::selecttexte = ''
-            iphtviewer_ze::selectwerte = ''
-            cTabelle                   = iphtviewer_ze::tabelle
-            oplcSelectWerte            = ''
-            oplcSelectTexte            = ''
-            NO-ERROR.
-            
-        FIND FIRST selections NO-LOCK 
-            WHERE selections.mandant = iphtviewer_ze::mandant
-            AND   selections.tabelle = cTabelle
-            AND   selections.feld    = iphtviewer_ze::feld
-            AND   selections.Sprcd   = iSprcd NO-ERROR.
-        IF NOT AVAILABLE selections THEN 
-        DO:
-            cTabelle = ''.
-            FIND FIRST selections NO-LOCK 
-                WHERE selections.mandant = iphtviewer_ze::mandant
-                AND   selections.tabelle = cTabelle
-                AND   selections.feld    = iphtviewer_ze::feld
-                AND   selections.Sprcd   = iSprcd NO-ERROR.
-        END.
-        IF NOT AVAILABLE (selections) THEN RETURN FALSE.
-
-        FOR EACH selections NO-LOCK 
-            WHERE selections.mandant = iphtviewer_ze::mandant
-            AND   selections.tabelle = cTabelle
-            AND   selections.feld    = iphtviewer_ze::feld
-            AND   selections.Sprcd   = iSprcd:
-            ASSIGN
-                oplcSelectTexte = oplcSelectTexte
-                    + (IF oplcSelectTexte = '' THEN '' ELSE ';')
-                    + selections.anzeige.
-            ASSIGN
-                oplcSelectWerte = oplcSelectWerte
-                    + (IF oplcSelectWerte = '' THEN '' ELSE ';')
-                    + selections.wert.
-        END.
-
-        RETURN TRUE.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LOGICAL fillSelectionAusTabelle(
-        INPUT-OUTPUT iphtviewer_ze AS HANDLE,
-        OUTPUT oplcSelectWerte     AS LONGCHAR, 
-        OUTPUT oplcSelectTexte     AS LONGCHAR 
-        ):
-            
-        DEFINE VARIABLE cTabelle   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFeld      AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cAnzeige   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE iFeldIndex AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cString    AS CHARACTER NO-UNDO.
-            
-        DEFINE VARIABLE hqTabelle  AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hbTabelle  AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE cWhere     AS CHARACTER NO-UNDO.
-            
-        ASSIGN 
-            cTabelle        = ENTRY(1, iphtviewer_ze::selecttabelle, ';')
-            cFeld           = ENTRY(2, iphtviewer_ze::selecttabelle, ';')
-            cAnzeige        = ENTRY(3, iphtviewer_ze::selecttabelle, ';')
-            
-            oplcSelectWerte = ''
-            oplcSelectTexte = ''
-            NO-ERROR.
-                
-        CREATE QUERY hqTabelle.
-        CREATE BUFFER hbTabelle FOR TABLE cTabelle.
-        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK WHERE &1.Firma = &2 ', cTabelle, QUOTER(iphtviewer_ze::mandant) ).
-        hqTabelle:SET-BUFFERS (hbTabelle).
-        hqTabelle:QUERY-PREPARE (cWhere).
-        hqTabelle:QUERY-OPEN ().
-        hqTabelle:GET-FIRST ().
-        
-        iFeldIndex = (IF hbTabelle:BUFFER-FIELD(cAnzeige):EXTENT = 0 THEN 0 ELSE iSprcd).
-
-        DO WHILE NOT hqTabelle:QUERY-OFF-END:
-            cString = hbTabelle:BUFFER-FIELD(cAnzeige):BUFFER-VALUE(iFeldIndex).
-            oplcSelectTexte = oplcSelectTexte
-                + (IF oplcSelectTexte = '' THEN '' ELSE ';')
-                + cString.
-                    
-            cString = hbTabelle:BUFFER-FIELD(cFeld):BUFFER-VALUE(0).
-            oplcSelectWerte = oplcSelectWerte
-                + (IF oplcSelectWerte = '' THEN '' ELSE ';')
-                + cString.
-            hqTabelle:GET-NEXT ().
-        END.
-            
-        hqTabelle:QUERY-CLOSE ().
-        DELETE OBJECT hbTabelle NO-ERROR.
-        DELETE OBJECT hqTabelle NO-ERROR.   
-        
-        RETURN TRUE .
-
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 122
adressen/getPrimaryIndexFieldsImpl.cls

@@ -1,122 +0,0 @@
-/*------------------------------------------------------------------------
-   File        : getPrimaryIndexFieldsImpl
-   Purpose     : 
-   Syntax      : 
-   Description : 
-   Author(s)   : walter.riechsteiner
-   Created     : Wed May 29 21:02:53 CEST 2024
-   Notes       : 
- ----------------------------------------------------------------------*/
-
-BLOCK-LEVEL ON ERROR UNDO, THROW.
-
-USING OpenEdge.Net.HTTP.IHttpResponse FROM PROPATH.
-USING OpenEdge.Net.HTTP.StatusCodeEnum FROM PROPATH.
-USING OpenEdge.Web.IWebRequest FROM PROPATH.
-USING OpenEdge.Web.WebHandler FROM PROPATH.
-USING OpenEdge.Web.WebResponseWriter FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
-USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
-USING utilities.utilitiesHandler FROM PROPATH.
-
-CLASS getPrimaryIndexFieldsImpl INHERITS WebHandler:
-
-    DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
-
-    { ttInput.i    }
-
-    METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE oResponse     AS IHttpResponse     NO-UNDO.
-        DEFINE VARIABLE oWriter       AS WebResponseWriter NO-UNDO.
-        DEFINE VARIABLE oJsonData     AS JsonObject        NO-UNDO.
-        DEFINE VARIABLE lcJsonString  AS LONGCHAR          NO-UNDO.
-        DEFINE VARIABLE oInput        AS JsonObject        NO-UNDO.
-        
-        DEFINE VARIABLE hbttDBTabelle AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE httDBTabelle  AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE hqDBTabelle   AS HANDLE            NO-UNDO.
-        DEFINE VARIABLE hbDBTabelle   AS HANDLE            NO-UNDO.
-    
-        DEFINE VARIABLE lRetVal       AS LOGICAL           NO-UNDO.
-        DEFINE VARIABLE iSprcd        AS INTEGER           NO-UNDO.
-        DEFINE VARIABLE cAktion       AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cIndexFields  AS CHARACTER         NO-UNDO.
-        
-        EMPTY TEMP-TABLE ttInput    .
-
-        lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest    = ' lRetVal.
-        
-        oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer eingangsstring = ' STRING(lcJsonString).
-        
-        //
-        //  Input-Daten (Steuersatz) aus JsonObject lesen und in ttInput füllen
-        //
-        EMPTY TEMP-TABLE ttInput    .
-        hbttInput = TEMP-TABLE ttInput:DEFAULT-BUFFER-HANDLE.
-        oInput    = NEW JsonObject().
-        oInput    = oJsonData:GetJsonObject('ttInput').
-        lRetVal   = hbttInput:READ-JSON ('JsonObject', oInput).
-        
-        FIND FIRST ttInput.
-        cAktion = ttInput.action.
-        
-        outilitiesHandler = NEW utilitiesHandler ().
-        
-        DO WHILE lRetVal:
-            
-            FIND FIRST ttInput.
-            cIndexFields = outilitiesHandler:getPrimaryIndexFields(
-                INPUT ttInput.tabelle
-                ).
-            
-            MESSAGE 'Rückgabe: ' + cIndexFields.
-
-            oResponse             = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "text/plain".
-            oWriter               = NEW WebResponseWriter(oResponse).
-            
-            oWriter:Open().
-            oWriter:Write(cIndexFields).
-            oWriter:Close().
-            
-            LEAVE.
-        END.
-        
-        DO WHILE NOT lRetVal: 
-            oResponse = NEW OpenEdge.Web.WebResponse().
-            oResponse:StatusCode = INTEGER(StatusCodeEnum:OK).
-            oResponse:ContentType = "application/json;charset=utf-8".
-            oWriter = NEW WebResponseWriter(oResponse).
-            oWriter:Open().
-            MESSAGE 'lcString Rückgabe: ' + STRING(lcJsonString) VIEW-AS ALERT-BOX.
-            oWriter:Write(lcJsonString).
-            oWriter:Close().
-            LEAVE.
-        END.
-
-        MESSAGE "Exiting HandlePost" VIEW-AS ALERT-BOX.
-
-        CATCH e AS Progress.Lang.Error:
-            MESSAGE "Exception occurred: " + e:GetMessage(1) VIEW-AS ALERT-BOX ERROR BUTTONS OK.
-            RETURN -1.
-        END CATCH.
-        
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotAllowedMethod(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotAllowedMethod called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-    METHOD OVERRIDE PROTECTED INTEGER HandleNotImplemented(INPUT poRequest AS IWebRequest):
-        DEFINE VARIABLE result AS INTEGER NO-UNDO.
-        MESSAGE "HandleNotImplemented called" VIEW-AS ALERT-BOX.
-        RETURN result.
-    END METHOD.
-
-END CLASS.

+ 0 - 58
adressen/ttadresse.i

@@ -1,58 +0,0 @@
-/* 30/05/24 workfile definition for table Adresse */
-/* {1} = "", "NEW" or "NEW SHARED" */
-/* {2} = "" or "NO-UNDO" */
-
-DEFINE TEMP-TABLE ttAdresse
-  FIELD AdrArt    AS CHARACTER   FORMAT "X(4)"
-  FIELD Aktiv     AS LOGICAL     FORMAT "J/N" INITIAL TRUE
-  FIELD Anrcd     AS INTEGER     FORMAT "z9" LABEL "Anrede"
-  FIELD AnschrFix AS LOGICAL
-  FIELD Anzeig_br AS CHARACTER   FORMAT "x(75)"
-  FIELD Bem       AS CHARACTER   FORMAT "X(500)"
-  FIELD BriefAnr  AS CHARACTER   FORMAT "X(50)"
-  FIELD Cd01      AS CHARACTER   FORMAT "X(4)"
-  FIELD Cd02      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd03      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd04      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd05      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd06      AS CHARACTER   FORMAT "X(4)"
-  FIELD Cd07      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd08      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd09      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd10      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd11      AS CHARACTER   FORMAT "X(4)"
-  FIELD Cd12      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd13      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd14      AS CHARACTER   FORMAT "x(4)"
-  FIELD Cd15      AS CHARACTER   FORMAT "x(4)"
-  FIELD ErfDat    AS DATE        FORMAT "99/99/9999" LABEL "Erfasst"
-  FIELD ErfSb     AS CHARACTER   FORMAT "X(4)"
-  FIELD Firma     AS CHARACTER   FORMAT "X(8)" LABEL "Mandant"
-  FIELD Firma1    AS CHARACTER   FORMAT "x(35)" LABEL "Firma1"
-  FIELD Firma2    AS CHARACTER   FORMAT "x(35)"
-  FIELD Funktion  AS CHARACTER   FORMAT "x(50)"
-  FIELD Homepage  AS CHARACTER   FORMAT "x(50)"
-  FIELD Knr       AS INTEGER     FORMAT "999999" LABEL "Nummer"
-  FIELD lFreigabe AS LOGICAL     INITIAL TRUE
-  FIELD Lkz       AS CHARACTER   FORMAT "X(3)"
-  FIELD Mail      AS CHARACTER   FORMAT "x(60)"
-  FIELD MutDat    AS DATE        FORMAT "99/99/9999" LABEL "Mutiert"
-  FIELD MutSb     AS CHARACTER   FORMAT "X(4)"
-  FIELD Name      AS CHARACTER   FORMAT "x(35)" LABEL "Name"
-  FIELD Natel     AS CHARACTER   FORMAT "x(20)"
-  FIELD Ort       AS CHARACTER   FORMAT "X(30)"
-  FIELD Plz       AS CHARACTER   FORMAT "X(8)"
-  FIELD Postfach  AS CHARACTER   FORMAT "X(30)"
-  FIELD Sprcd     AS INTEGER     FORMAT "9" LABEL "Sprache"
-  FIELD Strasse   AS CHARACTER   FORMAT "X(30)"
-  FIELD Suchbe    AS CHARACTER   FORMAT "X(20)" LABEL "Suchbegriff"
-  FIELD Tel-1     AS CHARACTER   FORMAT "X(20)"
-  FIELD Tel-2     AS CHARACTER   FORMAT "X(20)"
-  FIELD Tel-3     AS CHARACTER   FORMAT "X(20)"
-  FIELD Tel-4     AS CHARACTER   FORMAT "X(20)"
-  FIELD Titel     AS CHARACTER   FORMAT "X(20)" LABEL "Titel"
-  FIELD Vorname   AS CHARACTER   FORMAT "X(25)" LABEL "Vorname"
-  FIELD WortIndex AS CHARACTER   FORMAT "x(500)"
-  FIELD Zusatz1   AS CHARACTER   FORMAT "x(35)"
-  FIELD Zusatz2   AS CHARACTER   FORMAT "x(35)"
-  .

+ 7 - 7
auth/loginImpl.cls

@@ -169,18 +169,18 @@ CLASS auth.loginImpl INHERITS WebHandler:
         DEFINE VARIABLE ix             AS INTEGER                      NO-UNDO.
         DEFINE VARIABLE lcRetVal       AS LONGCHAR                     NO-UNDO.
         DEFINE VARIABLE oHeader        AS OpenEdge.Net.HTTP.HttpHeader NO-UNDO.
-        MESSAGE 'start post'.        
+// MESSAGE 'start post'.        
 
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest    = ' lRetVal.
+// MESSAGE 'getJsonFromRequest    = ' lRetVal.
 
         oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
+// MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
 
         ccompany   = oJsonData:GetCharacter('company' ).
         cuser_name = oJsonData:GetCharacter('user_name' ).
         cpassword  = oJsonData:GetCharacter('password').
-        MESSAGE ccompany '-' cuser_name '-' cpassword.
+// MESSAGE ccompany '-' cuser_name '-' cpassword.
 
         lcErrorMessage    = ''.
         lError            = FALSE.
@@ -299,7 +299,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
             oJsonResponse:ADD('labels', oJsonLabels).
             
             oJsonResponse:WRITE(lcJsonString, FALSE).
-            MESSAGE 'Rueckmeldung' STRING(lcJsonString).
+// MESSAGE 'Rueckmeldung' STRING(lcJsonString).
 
             oWriter:Open().
             oWriter:Write(lcJsonString).
@@ -309,7 +309,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
 
         END.
         
-        MESSAGE 'Meldung von getErrorMessage ' STRING(lcMessage).
+// MESSAGE 'Meldung von getErrorMessage ' STRING(lcMessage).
                         
         oResponse             = NEW OpenEdge.Web.WebResponse().
         oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
@@ -321,7 +321,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
         oJsonResponse:ADD('message', lcMessage) NO-ERROR.
         
         oJsonResponse:WRITE(lcJsonString, FALSE).
-        MESSAGE 'R�ckmeldung ' STRING(lcJsonString).
+// MESSAGE 'Rueckmeldung ' STRING(lcJsonString).
 
         oWriter:Open().
         oWriter:Write(lcJsonString).

+ 8 - 64
dashboard/dashboardImpl.cls

@@ -130,7 +130,7 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
             OUTPUT oJsonIdent   
             ).
 
-        oJsonIdent:WriteFile('C:\TEMP\dashboard_GET.json', TRUE).
+// oJsonIdent:WriteFile('C:\TEMP\dashboard_GET.json', TRUE).
 
         cuser_name = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
         IF NOT ERROR-STATUS:ERROR AND LOOKUP(cuser_name, cUsers, ',') = 0 THEN cUsers = cuser_name + ',' + cUsers.
@@ -220,7 +220,7 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
             lcJsonInhalt = SUBSTRING(lcJsonInhalt, ii).
             ii = R-INDEX(lcJsonInhalt, ']').
             lcJsonInhalt = SUBSTRING(lcJsonInhalt,01,ii).
-            MESSAGE STRING(lcJsonInhalt).
+// MESSAGE STRING(lcJsonInhalt).
             
             lRetVal = TRUE.
             LEAVE.
@@ -228,7 +228,7 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
         
         oBody = NEW STRING(lcJsonInhalt).
         WebHandlerUtilities:createHttpResponse(INPUT INTEGER(StatusCodeEnum:OK), INPUT oBody, INPUT cContent-Type, INPUT cDefautlCharSet, INPUT cCorralationID, OUTPUT oResponse).
-//        oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
+// oResponse:SetHeader(HttpHeaderBuilder:Build(cHeaderCorralationID):Value(cCorralationID):Header).
 
            
         oWriter = NEW WebResponseWriter(oResponse).
@@ -300,10 +300,10 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
         cSessionToken = oHeader:VALUE.
 
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        MESSAGE 'getJsonFromRequest    = ' lRetVal.
+// MESSAGE 'getJsonFromRequest    = ' lRetVal.
 
         oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
+// MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
 
         MESSAGE ccompany '-' cuser_name '-' cSessionToken.
 
@@ -314,66 +314,11 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
         DO WHILE TRUE:
             FIND FIRST users NO-LOCK
                 WHERE users.user_name = cuser_name NO-ERROR.
-            /*            IF NOT AVAILABLE users THEN              */
-            /*            DO:                                      */
-            /*                lError = TRUE.                       */
-            /*                outilitiesHandler:getErrorMessage (  */
-            /*                    INPUT '1990',                    */
-            /*                    INPUT 1     , /* Sprcd*/         */
-            /*                    INPUT ''    ,    /* Parameter  */*/
-            /*                    OUTPUT lcMessage                 */
-            /*                    ).                               */
-            /*                LEAVE.                               */
-            /*            END.                                     */
-        
             ilanguage_id = users.language_id.
             
-            /*            IF users.password <> cPassword THEN      */
-            /*            DO:                                      */
-            /*                lError = TRUE.                       */
-            /*                outilitiesHandler:getErrorMessage (  */
-            /*                    INPUT '1992',                    */
-            /*                    INPUT ilanguage_id, /* Sprcd*/   */
-            /*                    INPUT ''    ,    /* Parameter  */*/
-            /*                    OUTPUT lcMessage                 */
-            /*                    ).                               */
-            /*                LEAVE.                               */
-            /*            END.                                     */
-            
             FIND FIRST userauthorization NO-LOCK 
                 WHERE userauthorization.company   = ccompany
                 AND   userauthorization.user_name = cuser_name NO-ERROR.
-            /*            IF NOT AVAILABLE userauthorization THEN        */
-            /*            DO:                                            */
-            /*                lError = TRUE.                             */
-            /*                outilitiesHandler:getErrorMessage (        */
-            /*                    INPUT '1991'      ,                    */
-            /*                    INPUT ilanguage_id, /* Sprcd*/         */
-            /*                    INPUT ''          ,    /* Parameter  */*/
-            /*                    OUTPUT lcMessage                       */
-            /*                    ).                                     */
-            /*                LEAVE.                                     */
-            /*            END.                                           */
-
-            /*            REPEAT TRANSACTION ON ERROR UNDO, LEAVE:                */
-            /*                FIND FIRST userdata NO-LOCK                         */
-            /*                    WHERE userdata.user_name   = cuser_name         */
-            /*                    AND   userdata.record_type = 'LOGIN'            */
-            /*                    AND   userdata.key_type    = 'company' NO-ERROR.*/
-            /*                IF NOT AVAILABLE userdata THEN                      */
-            /*                DO:                                                 */
-            /*                    CREATE  userdata.                               */
-            /*                    ASSIGN                                          */
-            /*                        userdata.user_name   = cuser_name           */
-            /*                        userdata.record_type = 'LOGIN'              */
-            /*                        userdata.key_type    = 'company'.           */
-            /*                END.                                                */
-            /*                ASSIGN                                              */
-            /*                    userdata.cfield_1 = ccompany                    */
-            /*                    userdata.cfield_2 = cuser_name.                 */
-            /*                RELEASE userdata.                                   */
-            /*                LEAVE.                                              */
-            /*            END.                                                    */
             
             oResponse             = NEW OpenEdge.Web.WebResponse().
             oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
@@ -387,9 +332,8 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
             oJsonResponse:ADD('user_name'    , cuser_name   ).
             oJsonResponse:ADD('language_id'  , ilanguage_id ).
             
-            
             oJsonResponse:WRITE(lcJsonString, FALSE).
-            MESSAGE 'R�ckmeldung ' STRING(lcJsonString).
+// MESSAGE 'Rueckmeldung ' STRING(lcJsonString).
 
             oWriter:Open().
             oWriter:Write(lcJsonString).
@@ -399,7 +343,7 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
 
         END.
         
-        MESSAGE 'Meldung von getErrorMessage ' STRING(lcMessage).
+// MESSAGE 'Meldung von getErrorMessage ' STRING(lcMessage).
                         
         oResponse             = NEW OpenEdge.Web.WebResponse().
         oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
@@ -412,7 +356,7 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
         oJsonResponse:ADD('message', 'ung�ltiger users oder ung�ltiges Passwort!') NO-ERROR.
         oJsonResponse:WRITE(lcJsonString, TRUE).
         
-        MESSAGE 'R�ckmeldung ' STRING(lcJsonString).
+// MESSAGE 'Rueckmeldung ' STRING(lcJsonString).
 
         oWriter:Open().
         oWriter:Write(lcJsonString).

+ 113 - 2
update/update2webdb.p

@@ -1,4 +1,6 @@
- FOR EACH benutzer:
+DEFINE VARIABLE ii      AS INTEGER  NO-UNDO.
+/*
+FOR EACH benutzer:
     FIND users
         WHERE users.user_name  = benutzer.benutzer NO-ERROR.
     IF NOT AVAILABLE users THEN
@@ -17,7 +19,7 @@
  END.
 
  FOR EACH Sprache:
-    FIND LANGUAGES
+    FIaddresses.active addresses.additional_1 addresses.additional_2 addresses.address[1] addresses.address[2] addresses.address[3] addresses.address[4] addresses.address[5] addresses.address[6] addresses.address[7] addresses.address[8] addresses.address[9] addresses.address[10] addresses.address[11] addresses.address[12] addresses.address_display addresses.address_fix addresses.address_id addresses.address_title addresses.address_type addresses.Cd01 addresses.Cd02 addresses.Cd03 addresses.Cd04 addresses.Cd05 addresses.Cd06 addresses.Cd07 addresses.Cd08 addresses.Cd09 addresses.Cd10 addresses.Cd11 addresses.Cd12 addresses.Cd13 addresses.Cd14 addresses.Cd15 addresses.city addresses.company addresses.company_name_1 addresses.company_name_2 addresses.country_code addresses.created_at addresses.create_by addresses.e-mail addresses.fax addresses.first_name addresses.function addresses.homepage addresses.language_id addresses.lapproved addresses.last_name addresses.letter_salutation addresses.mobile_business addresses.mobile_private addresses.phone_business addresses.phone_private addresses.postal_code addresses.po_box addresses.remarks addresses.salutation_code addresses.search_field addresses.street addresses.street_no addresses.updated_at addresses.updated_by addresses.wordindexND LANGUAGES
         WHERE LANGUAGES.language_id = Sprache.Sprcd.
     IF NOT AVAILABLE LANGUAGES THEN
     DO:
@@ -60,3 +62,112 @@ FOR EACH Berecht:
         userauthorization.lspecial  = berecht.pws
         userauthorization.lupdate   = berecht.pwm.
 END.
+*/
+CURRENT-VALUE(masterdata_id) = 0.
+FOR EACH addresses:
+    DELETE addresses.
+END.
+FOR EACH Adresse NO-LOCK WHERE Firma = '1000':
+    CREATE  addresses.
+    ASSIGN  addresses.address_id = NEXT-VALUE(masterdata_id).
+    ASSIGN
+        addresses.active            = Adresse.aktiv
+        addresses.additional_1      = Adresse.Zusatz1
+        addresses.additional_2      = Adresse.Zusatz2
+        addresses.address_display   = Adresse.Anzeig_br
+        addresses.address_fix       = Adresse.AnschrFix
+        addresses.address_title     = Adresse.Titel
+        addresses.address_type      = Adresse.AdrArt
+        addresses.Cd01              = Adresse.Cd01
+        addresses.Cd02              = Adresse.Cd02
+        addresses.Cd03              = Adresse.Cd03
+        addresses.Cd04              = Adresse.Cd04
+        addresses.Cd05              = Adresse.Cd05
+        addresses.Cd06              = Adresse.Cd06
+        addresses.Cd07              = Adresse.Cd07
+        addresses.Cd08              = Adresse.Cd08
+        addresses.Cd09              = Adresse.Cd09
+        addresses.Cd10              = Adresse.Cd10
+        addresses.Cd11              = Adresse.Cd11
+        addresses.Cd12              = Adresse.Cd12
+        addresses.Cd13              = Adresse.Cd13
+        addresses.Cd14              = Adresse.Cd14
+        addresses.Cd15              = Adresse.Cd15
+        addresses.city              = Adresse.Ort
+        addresses.company           = Adresse.Firma
+        addresses.company_name_1    = Adresse.Firma1
+        addresses.company_name_2    = Adresse.Firma2
+        addresses.country_code      = Adresse.Lkz
+        addresses.created_at        = Adresse.erfDat
+        addresses.create_by         = Adresse.erfSB
+        addresses.e-mail            = Adresse.Mail
+        addresses.fax               = Adresse.Tel-4
+        addresses.first_name        = Adresse.Vorname
+        addresses.function          = Adresse.Funktion
+        addresses.homepage          = Adresse.homepage
+        addresses.language_id       = Adresse.Sprcd
+        addresses.lapproved         = Adresse.lFreigabe
+        addresses.last_name         = Adresse.Name
+        addresses.letter_salutation = Adresse.BriefAnr
+        addresses.mobile_business   = Adresse.Natel
+        addresses.mobile_private    = ''
+        addresses.phone_business    = Adresse.Tel-1
+        addresses.phone_private     = Adresse.Tel-2
+        addresses.postal_code       = Adresse.Plz
+        addresses.po_box            = Adresse.Postfach
+        addresses.remarks           = Adresse.Bem
+        addresses.salutation_code   = Adresse.Anrcd
+        addresses.search_field      = Adresse.Suchbe
+        addresses.street            = Adresse.Strasse
+        addresses.street_no         = ''
+        addresses.updated_at        = Adresse.MutDat
+        addresses.updated_by        = Adresse.MutSB
+        addresses.wordindex         = Adresse.WortIndex
+        .
+    DO ii = 1 TO 12:
+        addresses.address[ii] = Adresse.Anschrift[ii].
+    END.
+END.
+/*  Aus ERP Curaden */
+/*
+FOR EACH Laender NO-LOCK:
+    CREATE  countries.
+    ASSIGN
+        countries.language_id      = Sprcd
+        countries.city_pos         = LaSOrt
+        countries.country_code     = Lkz
+        countries.country_code_iso = ISO_Code
+        countries.country_code_pos = LaSLkz
+        countries.country_name     = Bezeichnung
+        countries.postal_code_pos  = LaSPlz
+        countries.EU_country       = EULand
+        .
+END.
+
+FOR EACH salutations:
+    DELETE salutations.
+END.
+FOR EACH Anrede NO-LOCK:
+    CREATE  salutations.
+    ASSIGN
+        salutations.language_id         = Anrede.Sprcd
+        salutations.letter_business     = Anrede.Anr_Text_G
+        salutations.letter_privat       = Anrede.Anr_Text_P
+        salutations.letterhead_business = Anrede.Anr_BK_G
+        salutations.letterhead_privat   = Anrede.Anr_BK_P
+        salutations.salutation          = Anrede.Anr_Anrede
+        salutations.salutation_code     = Anrede.Anrcd
+        salutations.salutation_display  = Anrede.Anr_Anzeige
+        salutations.to_attention_of     = Anrede.Anr_zhv
+        .
+END.
+
+FOR EACH Orte NO-LOCK:
+    CREATE  cities.
+    ASSIGN
+        cities.country_code = Orte.Lkz
+        cities.postal_code  = orte.plz
+        cities.city         = Orte.Ort
+        cities.wordindex    = Orte.lkz + ' ' + orte.plz + ' ' + orte.ort.
+END.
+*/

+ 212 - 0
utilities/lookupHandler.cls

@@ -0,0 +1,212 @@
+ 
+/*------------------------------------------------------------------------
+   File        : lookupHandler
+   Purpose     : 
+   Syntax      : 
+   Description : 
+   Author(s)   : walter.riechsteiner
+   Created     : Mon Dec 29 20:24:32 CET 2025
+   Notes       : 
+ ----------------------------------------------------------------------*/
+
+
+BLOCK-LEVEL ON ERROR UNDO, THROW.
+
+USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
+
+CLASS utilities.lookupHandler: 
+    
+    DEFINE VARIABLE httLookup  AS HANDLE NO-UNDO.   
+    DEFINE VARIABLE hbttLookup AS HANDLE NO-UNDO. 
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL city(
+        INPUT  oJsonIdent  AS JsonObject,
+        OUTPUT oJsonResult AS JsonObject
+        ):
+          
+        DEFINE VARIABLE lRetVal            AS LOGICAL    NO-UNDO INIT FALSE.  
+        DEFINE VARIABLE cSearchField       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE ccountry_code      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cField             AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hcities            AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE iLanguage_id       AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cDisplayFields     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE ii                 AS INTEGER    NO-UNDO.
+        
+        DEFINE VARIABLE oJsonDisplayLabels AS JsonObject.
+
+        cSearchField   = oJsonIdent:GetCharacter('search').
+        cDisplayFields = oJsonIdent:GetCharacter('displayFields').
+        cDisplayFields = REPLACE(cDisplayFields, ' ', '').
+
+        CREATE TEMP-TABLE httLookup.
+        DO ii = 1 TO NUM-ENTRIES(cDisplayFields, ','):
+            cField = ENTRY(ii, cDisplayFields, ',').
+            httLookup:ADD-NEW-FIELD (cField, 'character').
+        END.
+        httLookup:TEMP-TABLE-PREPARE ('results').
+        hbttLookup = httLookup:DEFAULT-BUFFER-HANDLE.
+        
+        cField        = oJsonIdent:GetCharacter('file_name') + '_country_code'.
+        cCountry_code = oJsonIdent:GetCharacter(cField).
+        cField        = oJsonIdent:GetCharacter('file_name') + '_language_id'.
+        iLanguage_Id  = INTEGER(oJsonIdent:GetCharacter(cField)).
+        oJsonIdent:SET('language_id', iLanguage_id).
+
+        hcities = BUFFER cities:HANDLE.
+        FOR EACH cities NO-LOCK
+            WHERE INDEX(cities.wordindex, cSearchField) > 0
+            AND   cities.country_code = cCountry_Code:
+                
+/*            IF NOT cities.postal_code BEGINS cSearchField THEN NEXT.*/
+                            
+            hbttLookup:BUFFER-CREATE ().
+            hbttLookup:BUFFER-COPY(hcities).
+        END.        
+            
+        oJsonResult = NEW JsonObject().
+        httLookup:WRITE-JSON('JsonObject', oJsonResult) NO-ERROR.
+        
+        getDisplayLabels(
+            INPUT  oJsonIdent        ,
+            INPUT  cDisplayFields    ,
+            OUTPUT oJsonDisplayLabels
+            ).
+            
+        oJsonResult:ADD('displayLabels', oJsonDisplayLabels).
+        
+        lRetVal = TRUE.
+        RETURN lRetVal.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC VOID getDisplayLabels(
+        INPUT  oJsonIdent         AS JsonObject,
+        INPUT  cFieldNames        AS CHARACTER ,
+        OUTPUT oJsonDisplayLabels AS JsonObject
+        ):
+            
+        DEFINE VARIABLE cUsers       AS CHARACTER NO-UNDO INIT 'admin'.
+        DEFINE VARIABLE cFileNames   AS CHARACTER NO-UNDO INIT 'table'.
+        DEFINE VARIABLE cProgram     AS CHARACTER NO-UNDO INIT 'program'.
+        DEFINE VARIABLE cFileName    AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cUserName    AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cCompany     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE iLanguage_id AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE cField       AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE i1           AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE i2           AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE i3           AS INTEGER   NO-UNDO.
+        
+        cFileName    = oJsonIdent:GetCharacter('file_name').
+        iLanguage_id = oJsonIdent:GetInteger  ('language_id').
+        cUserName    = oJsonIdent:GetCharacter('user_name').
+        cCompany     = oJsonIdent:GetCharacter('company').
+
+        cFileNames = cFileNames + ',' + cFileName.                    
+        IF cUserName <> cUsers THEN cUsers = cUsers + ',' + cUserName.
+        
+        oJsonDisplayLabels = NEW JsonObject().
+        DO i1 = 1 TO NUM-ENTRIES(cFieldNames, ','):
+            oJsonDisplayLabels:ADD(ENTRY(i1, cFieldNames, ','), ENTRY(i1, cFieldNames, ',')).
+        END.
+            
+        DO i1 = 1 TO NUM-ENTRIES(cFileNames):
+            cFileName = ENTRY(i1, cFileNames, ',').
+            DO i2 = 1 TO NUM-ENTRIES(cUsers):
+                cUserName = ENTRY(i2, cUsers, ',').
+                DO i3 = 1 TO NUM-ENTRIES(cFieldNames, ','):
+                    cField = ENTRY(i3, cFieldNames, ',').
+                    FIND FIRST labeltexte
+                        WHERE labeltexte.company     = ccompany
+                        AND   labeltexte.user_name   = cUserName
+                        AND   labeltexte.program     = cProgram
+                        AND   labeltexte.table_name  = cFileName
+                        AND   labeltexte.field_name  = cField
+                        AND   labeltexte.language_id = ilanguage_id NO-ERROR.
+                    IF AVAILABLE labeltexte THEN oJsonDisplayLabels:SET(cField, labeltexte.headlabel).
+                END.
+            END.
+        END.                     
+            
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC LOGICAL postal_code( 
+        INPUT  oJsonIdent  AS JsonObject,
+        OUTPUT oJsonResult AS JsonObject
+        ):
+          
+        DEFINE VARIABLE lRetVal            AS LOGICAL    NO-UNDO INIT FALSE.  
+        DEFINE VARIABLE cSearchField       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE ccountry_code      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cField             AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hcities            AS HANDLE     NO-UNDO.
+        DEFINE VARIABLE iLanguage_id       AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cDisplayFields     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE ii                 AS INTEGER    NO-UNDO.
+        
+        DEFINE VARIABLE oJsonDisplayLabels AS JsonObject.
+
+        cSearchField   = oJsonIdent:GetCharacter('search').
+        cDisplayFields = oJsonIdent:GetCharacter('displayFields').
+        cDisplayFields = REPLACE(cDisplayFields, ' ', '').
+
+        CREATE TEMP-TABLE httLookup.
+        DO ii = 1 TO NUM-ENTRIES(cDisplayFields, ','):
+            cField = ENTRY(ii, cDisplayFields, ',').
+            httLookup:ADD-NEW-FIELD (cField, 'character').
+        END.
+        httLookup:TEMP-TABLE-PREPARE ('results').
+        hbttLookup = httLookup:DEFAULT-BUFFER-HANDLE.
+        
+        cField        = oJsonIdent:GetCharacter('file_name') + '_country_code'.
+        cCountry_code = oJsonIdent:GetCharacter(cField).
+        cField        = oJsonIdent:GetCharacter('file_name') + '_language_id'.
+        iLanguage_Id  = INTEGER(oJsonIdent:GetCharacter(cField)).
+        oJsonIdent:SET('language_id', iLanguage_id).
+
+        hcities = BUFFER cities:HANDLE.
+        FOR EACH cities NO-LOCK
+            WHERE INDEX(cities.wordindex, cSearchField) > 0
+            AND   cities.country_code = cCountry_Code:
+                
+            IF NOT cities.postal_code BEGINS cSearchField THEN NEXT.
+                            
+            hbttLookup:BUFFER-CREATE ().
+            hbttLookup:BUFFER-COPY(hcities).
+        END.        
+            
+        oJsonResult = NEW JsonObject().
+        httLookup:WRITE-JSON('JsonObject', oJsonResult) NO-ERROR.
+        
+        getDisplayLabels(
+            INPUT  oJsonIdent        ,
+            INPUT  cDisplayFields    ,
+            OUTPUT oJsonDisplayLabels
+            ).
+            
+        oJsonResult:ADD('displayLabels', oJsonDisplayLabels).
+        
+        lRetVal = TRUE.
+        RETURN lRetVal.
+
+    END METHOD.
+
+END CLASS.

+ 285 - 54
utilities/selectboxHandler.cls

@@ -12,19 +12,38 @@
 USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
 USING OpenEdge.Net.HTTP.IHttpRequest FROM PROPATH.
 USING System.Drawing.CharacterRange FROM ASSEMBLY.
+USING Progress.Json.ObjectModel.JsonArray FROM PROPATH.
 
 CLASS utilities.selectboxHandler: 
 
     DEFINE VARIABLE i1 AS INTEGER NO-UNDO.
     DEFINE VARIABLE i2 AS INTEGER NO-UNDO.
-
+    
+    DEFINE TEMP-TABLE ttSelect
+        FIELD ind    AS INTEGER   SERIALIZE-HIDDEN
+        FIELD cValue AS CHARACTER SERIALIZE-NAME 'value'
+        FIELD cLabel AS CHARACTER SERIALIZE-NAME 'label'.
+    DEFINE VARIABLE httSelect     AS HANDLE NO-UNDO.
+    DEFINE VARIABLE httSelectBuff AS HANDLE NO-UNDO.
+    
+    DEFINE TEMP-TABLE ttParam
+        FIELD company     AS CHARACTER
+        FIELD user_name   AS CHARACTER 
+        FIELD table_name  AS CHARACTER 
+        FIELD field_name  AS CHARACTER 
+        FIELD language_id AS INTEGER 
+        FIELD field_value AS CHARACTER.
+    DEFINE VARIABLE httParam     AS HANDLE NO-UNDO.
+    DEFINE VARIABLE httParamBuff AS HANDLE NO-UNDO.  
         
     /*------------------------------------------------------------------------------
      Purpose:
      Notes:
     ------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC HANDLE getSelboxCompany( INPUT cFileName AS CHARACTER ):
+    METHOD PUBLIC HANDLE getSelboxCompany(
+        INPUT cFileName AS CHARACTER
+        ):
         
         DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
         
@@ -56,7 +75,9 @@ CLASS utilities.selectboxHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC HANDLE getSelboxLanguage( INPUT cFileName AS CHARACTER ):
+    METHOD PUBLIC HANDLE getSelboxLanguage(
+        INPUT cFileName AS CHARACTER
+        ):
         
         DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
         
@@ -87,7 +108,9 @@ CLASS utilities.selectboxHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC HANDLE getSelboxTables( INPUT cFileName AS CHARACTER ):
+    METHOD PUBLIC HANDLE getSelboxTables(
+        INPUT cFileName AS CHARACTER
+        ):
         
         DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
         
@@ -132,7 +155,9 @@ CLASS utilities.selectboxHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC HANDLE getSelboxUsers( INPUT cFileName AS CHARACTER  ):
+    METHOD PUBLIC HANDLE getSelboxUsers(
+        INPUT cFileName AS CHARACTER
+        ):
         
         DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
         
@@ -163,73 +188,230 @@ CLASS utilities.selectboxHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC HANDLE getSelectBoxData(
-        INPUT ipoIdent      AS JsonObject,
-        INPUT ipcFileName   AS CHARACTER,
-        INPUT ipcValueField AS CHARACTER,
-        INPUT ipcLabelField AS CHARACTER 
+    METHOD PUBLIC VOID getSelectBoxCountry( 
+        INPUT  iLanguage_Id AS INTEGER   ,
+        INPUT  cFile_Name   AS CHARACTER ,
+        OUTPUT oJsonBoxEval AS JsonArray
         ):
-            
+        
         DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
         
         DEFINE VARIABLE httSelect     AS HANDLE    NO-UNDO.
         DEFINE VARIABLE httBuffer     AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hBuffer       AS HANDLE    NO-UNDO.
+        
+        cttBufferName = SUBSTITUTE('&1_country_code', cFile_Name).
+
+        CREATE TEMP-TABLE httSelect.
+        httSelect:ADD-NEW-FIELD('value', 'character'   ).
+        httSelect:ADD-NEW-FIELD('label', 'character' ).
+        httSelect:TEMP-TABLE-PREPARE (cttBufferName).
+        httBuffer = httSelect:DEFAULT-BUFFER-HANDLE.
+        
+        FOR EACH countries NO-LOCK
+            WHERE countries.language_id = iLanguage_id: 
+            httBuffer:BUFFER-CREATE ().
+            ASSIGN 
+                httBuffer:BUFFER-FIELD('value'):BUFFER-VALUE = countries.country_code
+                httBuffer:BUFFER-FIELD('label'):BUFFER-VALUE = countries.country_name.
+        END.
+        
+        /*        httBuffer:SERIALIZE-NAME = 'cFileName'.*/
+        
+        oJsonBoxEval = NEW JsonArray().
+        httBuffer:WRITE-JSON('JsonArray', oJsonBoxEval). 
+
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC VOID getSelectBoxData(
+        INPUT  oJsonIdent  AS JsonObject,
+        INPUT  cField_Name AS CHARACTER,
+        OUTPUT oJsonBox    AS JsonArray 
+        ):
+            
+        DEFINE VARIABLE httParam      AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE httParamBuff  AS HANDLE    NO-UNDO.
         DEFINE VARIABLE hQuery        AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hFeld         AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE lcompany      AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE lactive       AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE lwhere        AS LOGICAL   NO-UNDO.
+        DEFINE VARIABLE httSelect     AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE httSelectBuff AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hBuffer       AS HANDLE    NO-UNDO.
+        
+        DEFINE VARIABLE ii            AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE cReplace      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFileName     AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cWhere        AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE ccompany      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cuser_name    AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE ilanguage_id  AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE ctable_name   AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE oJsonBoxEval  AS JsonArray NO-UNDO.
+// MESSAGE 'Selectbox für' cField_Name.
+        ccompany     = oJsonIdent:GetCharacter('company')     NO-ERROR.
+        cuser_name   = oJsonIdent:GetCharacter('user_name')   NO-ERROR.
+        ctable_name  = oJsonIdent:GetCharacter('file_name')   NO-ERROR.
+        ilanguage_id = oJsonIdent:GetInteger  ('language_id') NO-ERROR.
+        
+        cFileName   = ENTRY(1, cField_Name, '_').
+        cReplace    = cFileName + '_'.
+        cField_Name = REPLACE(cField_Name, cReplace, '').
         
-        cttBufferName = SUBSTITUTE('&1_&2', ipcFileName, ipcValueField).
-        CREATE BUFFER hBuffer FOR TABLE ipcFileName.
-        MESSAGE cttBufferName.        
-        IF ipcFileName <> 'companies' THEN 
+        IF cField_Name = 'country_code' THEN 
         DO:
-            hFeld = hBuffer:BUFFER-FIELD('company'):HANDLE NO-ERROR.
-            lcompany = (IF VALID-HANDLE(hFeld) THEN TRUE ELSE FALSE).
+            getSelectBoxCountry (
+                INPUT  iLanguage_id ,
+                INPUT  cFileName    ,
+                OUTPUT oJsonBoxEval
+                ).
+            oJsonBox = oJsonBoxEval.
+            RETURN.
+        END.
+        IF cField_Name = 'salutation_code' THEN 
+        DO:
+            getSelectBoxSalutation (
+                INPUT  iLanguage_id ,
+                INPUT  cFileName    ,
+                OUTPUT oJsonBoxEval
+                ).
+            oJsonBox = oJsonBoxEval.
+            RETURN.
+        END.
+        //
+        httParam     = BUFFER ttParam:HANDLE.
+        httParamBuff = TEMP-TABLE ttParam:DEFAULT-BUFFER-HANDLE.
+        //
+        //  Felder der Temptable initial füllen
+        //
+        EMPTY TEMP-TABLE ttParam.
+        EMPTY TEMP-TABLE ttSelect.
+        CREATE  ttParam.
+        ASSIGN
+            ttParam.company     = ccompany
+            ttParam.user_name   = 'admin'
+            ttParam.table_name  = 'table'
+            ttParam.field_name  = cField_Name
+            ttParam.language_id = iLanguage_id
+            .
+        //            
+        CREATE QUERY hQuery.
+        hBuffer = BUFFER selections:HANDLE.
+        hQuery:SET-BUFFERS(hBuffer).
+        
+        DO ii = 1 TO 4:
+            // IF hQuery:QUERY-OPEN () THEN hQuery:QUERY-CLOSE ().
+            
+            FIND FIRST ttParam.
+            
+            cWhere = ''.
+            cWhere = cWhere + SUBSTITUTE('WHERE selections.company     = &1 AND selections.user_name  = &2 ', QUOTER(ttParam.company)   , QUOTER(ttParam.user_name) ).
+            cWhere = cWhere + SUBSTITUTE('AND   selections.table_name  = &1 AND selections.field_name = &2 ', QUOTER(ttParam.table_name), QUOTER(ttParam.field_name)).
+            cWhere = cWhere + SUBSTITUTE('AND   selections.language_id = &1 ', ttParam.language_id).
+            cWhere = 'FOR EACH selections NO-LOCK ' + cWhere.
+// MESSAGE 'cWhere = ' cWhere.
+            hQuery:QUERY-PREPARE(cWhere).
+            hQuery:QUERY-OPEN ().
+            hQuery:GET-FIRST () NO-ERROR.
+            
+            DO WHILE NOT hQuery:QUERY-OFF-END:
+                CREATE  ttSelect.
+                ASSIGN 
+                    ttSelect.ind    = ii
+                    ttSelect.cvalue = hBuffer::field_value
+                    ttSelect.cLabel = hBuffer::field_show
+                    .
+                hQuery:GET-NEXT () NO-ERROR.
+            END.
+            
+            CASE ii:
+                WHEN 1 THEN 
+                    DO:
+                        ASSIGN 
+                            ttParam.table_name = cFileName.
+                    END.
+                WHEN 2 THEN 
+                    DO:
+                        IF cuser_name = 'admin' THEN LEAVE. 
+                        ASSIGN 
+                            ttParam.user_name  = cuser_name
+                            ttParam.table_name = 'table'.
+                    END.
+                WHEN 3 THEN 
+                    DO:
+                        ASSIGN 
+                            ttParam.user_name  = cuser_name
+                            ttParam.table_name = cFileName.
+                    END.
+            END CASE.
+        END.
+        
+        FOR EACH ttSelect
+            BREAK
+            BY ttSelect.cValue
+            BY ttSelect.ind:
+                
+            IF LAST-OF ( ttSelect.cValue) THEN NEXT.
+            DELETE ttSelect.
         END.
         
-        hFeld = hBuffer:BUFFER-FIELD('active'):HANDLE NO-ERROR.
-        lactive  = (IF VALID-HANDLE(hFeld) THEN TRUE ELSE FALSE).
+        httSelectBuff = TEMP-TABLE ttSelect:DEFAULT-BUFFER-HANDLE.
+        httSelectBuff:SERIALIZE-NAME = 'cFileName'.
+        
+        oJsonBox = NEW JsonArray().
+        httSelectBuff:WRITE-JSON('JsonArray', oJsonBox). 
+        
+        /*        DEFINE VARIABLE cLogFile AS CHARACTER NO-UNDO.               */
+        /*                                                                     */
+        /*        cLogFile = SUBSTITUTE('C:\Temp\Select_&1.json', cField_Name).*/
+        /*        oJsonBox:WriteFile(cLogFile, TRUE).                          */
+
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC VOID getSelectBoxSalutation( 
+        INPUT  iLanguage_Id AS INTEGER   ,
+        INPUT  cFile_Name   AS CHARACTER ,
+        OUTPUT oJsonBoxEval AS JsonArray
+        ):
+        
+        DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
+        
+        DEFINE VARIABLE httSelect     AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE httBuffer     AS HANDLE    NO-UNDO.
         
+        cttBufferName = SUBSTITUTE('&1_salutation_code', cFile_Name).
+
         CREATE TEMP-TABLE httSelect.
-        httSelect:ADD-NEW-FIELD('value', 'character').
-        httSelect:ADD-NEW-FIELD('label', 'character').
+        httSelect:ADD-NEW-FIELD('value', 'character'   ).
+        httSelect:ADD-NEW-FIELD('label', 'character' ).
         httSelect:TEMP-TABLE-PREPARE (cttBufferName).
         httBuffer = httSelect:DEFAULT-BUFFER-HANDLE.
-        MESSAGE 'lcompany = ' lcompany  ' lactive = ' lactive.        
-        lWhere = (IF lcompany OR lactive THEN TRUE ELSE FALSE).
-        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK ', ipcFileName).
-        IF lcompany THEN 
-        DO:
-            cWhere = cWhere + SUBSTITUTE('&1 &2.company = &3 ', (IF lWhere THEN 'WHERE' ELSE 'AND'), ipcFileName, QUOTER(ipoIdent:getCharacter('company'))).
-            lwhere = FALSE.
-        END.
-        IF lactive  THEN 
-        DO:
-            cWhere = cWhere + SUBSTITUTE('&1 &2.active  = &3 ', (IF lWhere THEN 'WHERE' ELSE 'AND'), ipcFileName, TRUE                            ).
-            lwhere = FALSE.
-        END.
-        MESSAGE cWhere.
         
-        CREATE QUERY hQuery.
-        hQuery:SET-BUFFERS(hBuffer).
-        hQuery:QUERY-PREPARE (cWhere).
-        hQuery:QUERY-OPEN().
-        hQuery:GET-FIRST ().
-        DO WHILE NOT hQuery:QUERY-OFF-END:
+        FOR EACH salutations NO-LOCK
+            WHERE salutations.language_id = iLanguage_id: 
             httBuffer:BUFFER-CREATE ().
             ASSIGN 
-                httBuffer:BUFFER-FIELD('value'):BUFFER-VALUE = hBuffer:BUFFER-FIELD(ipcValueField):BUFFER-VALUE
-                httBuffer:BUFFER-FIELD('label'):BUFFER-VALUE = hBuffer:BUFFER-FIELD(ipcLabelField):BUFFER-VALUE.
-            hQuery:GET-NEXT ().
+                httBuffer:BUFFER-FIELD('value'):BUFFER-VALUE = salutations.salutation_code.
+            httBuffer:BUFFER-FIELD('label'):BUFFER-VALUE = salutations.salutation_display.
         END.
+        
+        /*        httBuffer:SERIALIZE-NAME = 'cFileName'.*/
+        
+        oJsonBoxEval = NEW JsonArray().
+        httBuffer:WRITE-JSON('JsonArray', oJsonBoxEval). 
 
-        // httBuffer:WRITE-JSON('FILE', 'C:\TEMP\httBuffer.json', TRUE).
+        RETURN.
 
-        RETURN httBuffer.
 
     END METHOD.
 
@@ -267,10 +449,59 @@ CLASS utilities.selectboxHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
+    METHOD PUBLIC LOGICAL getVariableSelectBoxes(
+        INPUT  oJsonIdent       AS JsonObject,
+        OUTPUT oJsonSelectBoxes AS JsonObject
+        ):
+        
+        DEFINE VARIABLE lRetVal    AS LOGICAL    NO-UNDO INIT FALSE.
+        DEFINE VARIABLE ii         AS INTEGER    NO-UNDO.
+        
+        DEFINE VARIABLE cCompany   AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormId    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFormUser  AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFieldName AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFileName  AS CHARACTER  NO-UNDO.
+        
+        DEFINE VARIABLE oJsonBox   AS JsonArray  NO-UNDO.
+        
+        cCompany  = oJsonIdent:GetCharacter('company').
+        cFormId   = oJsonIdent:GetCharacter('formId').
+        cFormUser = oJsonIdent:GetCharacter('formUser').
+
+        oJsonSelectBoxes = NEW JsonObject().
+        FOR EACH selectboxfields NO-LOCK
+            WHERE selectboxfields.company       = ccompany
+            AND   selectboxfields.program       = cformId
+            AND   selectboxfields.user_name     = cFormUser
+            AND   selectboxfields.boxfields <> '':
+
+            DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfields, ';'):
+                cFieldName = ENTRY(ii, selectboxfields.boxfields, ';').
+                cFileName  = ENTRY(1, cFieldName, '_').
+                getSelectBoxData(
+                    INPUT  oJsonIdent,
+                    INPUT  cFieldName,
+                    OUTPUT oJsonBox
+                    ).
+// oJsonBox:WriteFile('C:\TEMP\JsonBox.json', TRUE).
+                oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
+oJsonSelectBoxes:WriteFile(SUBSTITUTE('C:\TEMP\&1_JsonSelectBoxes.json', cFieldName), TRUE).
+            END.
+        END.
+
+        lRetVal = TRUE.
+        RETURN lRetVal.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
     DESTRUCTOR PUBLIC selectboxHandler ( ):
-        MESSAGE 'Destructor selectboxHandler '.
-    /*        DELETE OBJECT hQuery NO-ERROR.    */
-    /*        DELETE OBJECT hBuffer NO-ERROR.   */
+// MESSAGE 'Destructor selectboxHandler '.
     END DESTRUCTOR.
 
 END CLASS.

Разница между файлами не показана из-за своего большого размера
+ 223 - 700
utilities/utilitiesHandler.cls


Некоторые файлы не были показаны из-за большого количества измененных файлов