Przeglądaj źródła

Summary 08.04.2026 18:15

walter.riechsteiner 1 miesiąc temu
rodzic
commit
4f717b623b

Plik diff jest za duży
+ 557 - 196
addresses/addressprogsHandler.cls


+ 401 - 240
admin/adminprogsHandler.cls

@@ -246,12 +246,14 @@ CLASS admin.adminprogsHandler FINAL:
         DEFINE VARIABLE lRetVal          AS LOGICAL    NO-UNDO.
         DEFINE VARIABLE lOK              AS LOGICAL    NO-UNDO.
         DEFINE VARIABLE ii               AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE i1               AS INTEGER    NO-UNDO.
         DEFINE VARIABLE iIndex           AS INTEGER    NO-UNDO.
         DEFINE VARIABLE cWordIndex       AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE 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.
@@ -291,21 +293,20 @@ CLASS admin.adminprogsHandler FINAL:
 
         CREATE BUFFER hBuffer FOR TABLE cFileName.
         
-/*        CASE cFileName:                                        */
-/*            WHEN 'xxxxxxx' THEN                                */
-/*                httTable::xxxxx_id = NEXT-VALUE(masterdata_id).*/
-/*        END CASE.                                              */
-// MESSAGE httTable::xxxxx_id.                
+        /*        CASE cFileName:                                        */
+        /*            WHEN 'xxxxxxx' THEN                                */
+        /*                httTable::xxxxx_id = NEXT-VALUE(masterdata_id).*/
+        /*        END CASE.                                              */
         
         createUniqueWhere(
             INPUT  httTable,
-            OUTPUT cWhere
+            OUTPUT cUniqueWhere
             ).
-        cUniqueWhere = cWhere.
+        cWhere = cUniqueWhere.
 
         lRetVal = FALSE.
         REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            lOK = hBuffer:FIND-UNIQUE(cWhere) NO-ERROR. 
+            lOK = hBuffer:FIND-UNIQUE(cUniqueWhere, NO-LOCK) NO-ERROR. 
             IF lOK THEN 
             DO:
                 outilitiesHandler:createErrorBox(
@@ -332,15 +333,24 @@ CLASS admin.adminprogsHandler FINAL:
             //
             hBuffer:BUFFER-CREATE ().
             DO ii = 1 TO httTable:NUM-FIELDS:
-                hField  = hBuffer:BUFFER-FIELD(ii):HANDLE NO-ERROR.
-                IF  ERROR-STATUS:ERROR       OR
-                    NOT VALID-HANDLE(hField) THEN NEXT.
-                    
                 htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR.
+                cField  = htField:NAME.
+                hField  = hBuffer:BUFFER-FIELD(cField):HANDLE NO-ERROR.
                 IF  ERROR-STATUS:ERROR       OR
                     NOT VALID-HANDLE(hField) THEN NEXT.
                     
-                hField:BUFFER-VALUE = htField:BUFFER-VALUE. 
+                IF hField:EXTENT > 0 THEN 
+                DO:
+                    cFieldValue = htField:BUFFER-VALUE.
+                    DO i1 = 1 TO hField:EXTENT:
+                        hField:BUFFER-VALUE(i1) = ENTRY(i1, cFieldValue, CHR(10)) NO-ERROR.
+                    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.
@@ -350,6 +360,9 @@ CLASS admin.adminprogsHandler FINAL:
             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('created_by'):HANDLE NO-ERROR.
+            IF  NOT ERROR-STATUS:ERROR AND 
+                VALID-HANDLE(htField)  THEN htField:BUFFER-VALUE = oJsonIdent:GetCharacter('H_display_name').
             
             htField = hBuffer:BUFFER-FIELD('wordindex'):HANDLE NO-ERROR.
             IF  NOT ERROR-STATUS:ERROR AND 
@@ -361,6 +374,7 @@ CLASS admin.adminprogsHandler FINAL:
                 htField:BUFFER-VALUE = cWordIndex.
             END.
             rBuffer = hBuffer:RECID.
+            oJsonIdent:ADD('rBuffer', INT64(rBuffer)) NO-ERROR.
 
             hBuffer:BUFFER-RELEASE ().
             
@@ -381,11 +395,14 @@ CLASS admin.adminprogsHandler FINAL:
                 INPUT  cFileName ,
                 OUTPUT cWhere
                 ).
+            MESSAGE 'LAST cWhere =' cWHere.
             outilitiesHandler:evaluatePageNumber(
                 INPUT-OUTPUT oJsonIdent   ,
                 INPUT        cWhere       ,
                 INPUT        rBuffer
-                ).            
+                ).
+                
+            httTable:EMPTY-TEMP-TABLE ().            
             createTempTable(
                 INPUT oJsonIdent
                 ).
@@ -398,7 +415,9 @@ CLASS admin.adminprogsHandler FINAL:
             
             hUniqueBuffer:FIND-UNIQUE (cUniqueWhere, NO-LOCK) NO-ERROR.
             outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
-            oJsonIdent:SET('language_id', hUniqueBuffer::language_id).
+            hField = hUniqueBuffer:BUFFER-FIELD('language_id'):HANDLE NO-ERROR.
+            IF  VALID-HANDLE(hField)   AND
+                NOT ERROR-STATUS:ERROR THEN oJsonIdent:SET('language_id', hField:BUFFER-VALUE).
 
             oselectboxHandler:getVariableSelectBoxes(
                 INPUT  oJsonIdent      ,
@@ -409,7 +428,8 @@ CLASS admin.adminprogsHandler FINAL:
             lRetVal      = TRUE.
             LEAVE.
         END.
-        DELETE OBJECT hBuffer NO-ERROR.
+        DELETE OBJECT hBuffer       NO-ERROR.
+        DELETE OBJECT hUniqueBuffer NO-ERROR.
 
         IF lRetVal THEN 
         DO:
@@ -419,7 +439,8 @@ CLASS admin.adminprogsHandler FINAL:
                 INPUT  ''               ,
                 OUTPUT oJsonMessageBox
                 ) NO-ERROR.
-            oJsonReturn:ADD('showMessage' , oJsonMessageBox).
+            oJsonReturn:ADD('showMessage', oJsonMessageBox).
+            oJsonReturn:ADD('success',     TRUE           ).
             RETURN lRetVal.
         END.
 
@@ -479,6 +500,8 @@ CLASS admin.adminprogsHandler FINAL:
                 cttName = 'record'.
             WHEN 'create' THEN 
                 cttName = 'record'.
+            WHEN 'loaddataunique' THEN 
+                cttName = 'record'.
             OTHERWISE 
             cttName = 'records'.
         END CASE.
@@ -491,11 +514,6 @@ CLASS admin.adminprogsHandler FINAL:
             CASE httTable:BUFFER-FIELD(ii):NAME:
                 WHEN 'active' THEN 
                     cSerializeName = 'active'.
-/*                WHEN 'address' THEN                                */
-/*                    DO:                                            */
-/*                        httTable:BUFFER-FIELD(ii):SERIALIZE-HIDDEN.*/
-/*                        NEXT.                                      */
-/*                    END.                                           */
                 OTHERWISE 
                 cSerializeName = cFileName + '_' + httTable:BUFFER-FIELD(ii):NAME.
             END CASE.
@@ -550,20 +568,23 @@ CLASS admin.adminprogsHandler FINAL:
         OUTPUT oJsonReturn AS JsonObject  
         ):
 
-        DEFINE VARIABLE oJsonMessage    AS JsonObject NO-UNDO.
-        DEFINE VARIABLE oJsonMessageBox AS JsonObject NO-UNDO.
+        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.
+        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.
+        DEFINE VARIABLE oRecord          AS JsonObject 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.
@@ -596,24 +617,10 @@ CLASS admin.adminprogsHandler FINAL:
         //
         //  Erzeugen von Where-Statement für UNIQUE-Find
         //
-        cWhere = ''.
-        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.
-            cWhere = cWhere + cString
-                + SUBSTITUTE(' &1.&2 = &3 ', ttPrimaryIndex.cFileName, ttPrimaryIndex.cFieldName, cValue).
-            cString = 'AND'.
-        END.
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cWhere
+            ).
 
         lRetVal = FALSE.
         REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
@@ -658,6 +665,9 @@ CLASS admin.adminprogsHandler FINAL:
                 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('H_display_name').
 
                 httTable:BUFFER-COPY(hBuffer).
                 
@@ -671,44 +681,44 @@ CLASS admin.adminprogsHandler FINAL:
                 lRetVal = hBuffer:BUFFER-DELETE ().
                 hBuffer:BUFFER-RELEASE ().
                 
-                IF iIndex > 0 THEN iIndex = iIndex - 1. 
-
                 LEAVE.
             END.
-            
             //
-            //  Anzahl Records in der Tabellenanzeige ermitteln
+            //  Letzte Abfrage wiederholen und Temp-Tabelle füllen
             //
             outilitiesHandler:readLastcWhere(
                 INPUT  oJsonIdent,
                 INPUT  cFileName,
                 OUTPUT cQueryWhere) NO-ERROR.
             outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
-            cQueryWhere = REPLACE(cQueryWhere, 'FOR', 'PRESELECT').
+            
+            httTable:EMPTY-TEMP-TABLE ().            
+            createTempTable(
+                INPUT oJsonIdent
+                ).
+            
+            fillTemptableFromTable(
+                INPUT  oJsonIdent   ,
+                INPUT  cQueryWhere  ,
+                OUTPUT oJsonReturn
+                ).
  
-            CREATE QUERY hQuery.
-            hQuery:SET-BUFFERS(hBuffer).
-            hQuery:QUERY-PREPARE (cQueryWhere).
-            hQuery:QUERY-OPEN ().
-            iAnzRecords = hQuery:NUM-RESULTS.
-            hQuery:QUERY-CLOSE ().
+            oRecords = NEW JsonArray().
+            oRecords = oJsonReturn:GetJsonArray('records').
+            oRecord  = NEW JsonObject().
+            oRecord  = oRecords:GetJsonObject(iIndex + 1). 
             
+            oselectboxHandler:getVariableSelectBoxes(
+                INPUT  oJsonIdent,
+                OUTPUT oJsonSelectBoxes
+                ).
+            IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
             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.
 
@@ -755,12 +765,18 @@ CLASS admin.adminprogsHandler FINAL:
         DEFINE VARIABLE cAddress      AS CHARACTER NO-UNDO.
         DEFINE VARIABLE hFeld         AS HANDLE    NO-UNDO.
         DEFINE VARIABLE cUniqueWHere  AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE rBuffer       AS RECID     NO-UNDO.
         
         DEFINE VARIABLE oRecords      AS JsonArray NO-UNDO.
         
-        iStartPage   = 1.
-        iMaxRecords  = 25.
-        cFileName    = oJsonIdent:GetCharacter('file_name').
+        outilitiesHandler = NEW utilitiesHandler().
+        oselectboxHandler = NEW selectboxHandler().
+        
+        iStartPage  = 1.
+        iMaxRecords = 25.
+        iIndex      = 0.
+        cFileName   = oJsonIdent:GetCharacter('file_name').
+        rBuffer     = (IF oJsonIdent:HAS('rBuffer') THEN oJsonIdent:GetInt64('rBuffer') ELSE ?).
         //
         //  Manchmal kommen die Werte als Integer, manchmal als character
         //
@@ -780,7 +796,6 @@ CLASS admin.adminprogsHandler FINAL:
         //
         //  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.
@@ -791,24 +806,28 @@ CLASS admin.adminprogsHandler FINAL:
         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. 
+            hFeld = hBuffer:BUFFER-FIELD('address'):HANDLE NO-ERROR.
+            IF  VALID-HANDLE(hFeld)    AND 
+                NOT ERROR-STATUS:ERROR THEN 
+            DO:
+                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.
+            END. 
+            IF rBuffer <> ? AND hBuffer:RECID = rBuffer THEN iIndex = iAnzahlRecords - 1.
             IF iAnzahlRecords >= iMaxRecords THEN LEAVE.
             hQuery:GET-NEXT ().
         END.
@@ -830,7 +849,8 @@ CLASS admin.adminprogsHandler FINAL:
         oJsonReturn:ADD('recordCount' , iAnzahlRecords).
         oJsonReturn:ADD('currentIndex', iIndex        ).
         
-        IF iAnzahlRecords > 0 THEN 
+        IF  iAnzahlRecords > 0 AND
+            rBuffer        = ? THEN 
         DO:
             httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
             createUniqueWhere(
@@ -843,7 +863,7 @@ CLASS admin.adminprogsHandler FINAL:
                 ). 
         END.
         
-// oJsonReturn:WriteFile('C:\TEMP\addresses_getData_messages.json', TRUE).
+// oJsonReturn:WriteFile(SUBSTITUTE('C:\TEMP\adminprogs_fillTemptablefrom_table_&1.json', ETIME), TRUE).
         
         lRetVal = (IF iAnzahlRecords = 0 THEN FALSE ELSE TRUE).        
         RETURN lRetVal.
@@ -880,6 +900,8 @@ CLASS admin.adminprogsHandler FINAL:
         DEFINE VARIABLE cReplace        AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE lNew            AS LOGICAL    NO-UNDO.
         DEFINE VARIABLE iType           AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cUniqueWhere    AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cChangeAction   AS CHARACTER  NO-UNDO.
         
         DEFINE VARIABLE cFunction       AS CHARACTER  NO-UNDO.
 
@@ -888,7 +910,7 @@ CLASS admin.adminprogsHandler FINAL:
         DEFINE VARIABLE oJsonArray      AS JsonArray  NO-UNDO.
         
         outilitiesHandler = NEW utilitiesHandler().
-        
+
         httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
         httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
         //
@@ -903,7 +925,7 @@ CLASS admin.adminprogsHandler FINAL:
             INPUT-OUTPUT httKeyFields   ,
             INPUT-OUTPUT httPrimaryIndex
             ).
-            
+
         cFunction = oJsonIdent:GetCharacter('function').
         CREATE BUFFER hBuffer FOR TABLE cFileName.
 
@@ -913,21 +935,19 @@ CLASS admin.adminprogsHandler FINAL:
             
         oJsonRecord = NEW JsonObject().
         oJsonRecord = oJsonData:GetJsonObject('record').
-        oJsonRecord:WriteFile('C:\TEMP\adminprogsHandler_JsonRecord.json', TRUE ).
 
         httTable:BUFFER-CREATE().
-        cReplace    = SUBSTITUTE('&1_', cFileName).            
+        cReplace    = SUBSTITUTE('&1_', cFileName).
         cFieldNames = oJsonRecord:GetNames().
-
         DO ii = 1 TO EXTENT(cFieldNames):
             cField       = cFieldNames[ii].
-            MESSAGE 'cField =' cField 'cFileName =' cFileName.
             IF NOT cField BEGINS cFileName THEN NEXT.
             cBufferField = REPLACE(cField, cReplace, '').
             hField       = httTable:BUFFER-FIELD(cBufferField):HANDLE NO-ERROR.
-            lOk          = outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
-            IF lOk THEN NEXT.
-                        
+            IF ERROR-STATUS:ERROR        THEN NEXT.
+            IF NOT VALID-HANDLE (hField) THEN NEXT.
+            IF hField:DATA-TYPE = 'date' THEN cValue = outilitiesHandler:iso2date(INPUT cValue). 
+                         
             iType = oJsonRecord:getType(cField). 
             CASE iType:
                 WHEN 2 THEN 
@@ -950,33 +970,25 @@ CLASS admin.adminprogsHandler FINAL:
             lOk = outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE).
             IF lOk THEN NEXT.
         END.
-        httTable:WRITE-JSON ('FILE', 'C:\TEMP\ttTable_Inhalt.json', TRUE).
-        oJsonData:WriteFile('C:\TEMP\adminprogshandler_getChanges.json', TRUE).
-        
+// httTable:WRITE-JSON ('FILE', 'C:\TEMP\ttTable_Inhalt.json', TRUE).
         //
         //  Erzeugen von Where-Statement für UNIQUE-Find
         //
         httTable:FIND-FIRST('', NO-LOCK) NO-ERROR.
-        cWhere = ''.
-        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.
-            cWhere = cWhere + cString
-                + SUBSTITUTE(' &1.&2 = &3 ', ttPrimaryIndex.cFileName, ttPrimaryIndex.cFieldName, cValue).
-            cString = 'AND'.
-        END.
-        lOK = hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cUniqueWhere
+            ).
+        cWhere = cUniqueWhere.
+        
+        lOK = hBuffer:FIND-UNIQUE(cUniqueWhere, NO-LOCK) NO-ERROR.
         IF NOT lOK THEN lNew = TRUE.
+        
+        oJsonReturn = NEW JsonObject().
+        oJsonReturn:ADD('success', TRUE).
+        
+        cChangeAction = oJsonIdent:GetCharacter('changeAction').
+
         DO WHILE NOT lNew:
             cField = oJsonData:GetCharacter('changedField').
             cValue = oJsonData:GetCharacter('changedValue').
@@ -998,9 +1010,6 @@ CLASS admin.adminprogsHandler FINAL:
             LEAVE.
         END. 
         
-        oJsonReturn = NEW JsonObject().
-        oJsonReturn:ADD('success', TRUE).
-        
         oJsonRecord = NEW JsonObject().
         oJsonArray  = NEW JsonArray ().
         
@@ -1026,85 +1035,84 @@ CLASS admin.adminprogsHandler FINAL:
         OUTPUT oJsonReturn AS JsonObject  
         ):
         
-        DEFINE VARIABLE ii        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 cFunction AS CHARACTER NO-UNDO.
+        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 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').
+        cFileName = oJsonIdent:GetCharacter('file_name').
 
         httKeyFields    = TEMP-TABLE ttKeyFields   :DEFAULT-BUFFER-HANDLE.
         httPrimaryIndex = TEMP-TABLE ttPrimaryIndex:DEFAULT-BUFFER-HANDLE.
-
-        IF cFunction <> 'rebuild' THEN 
-        DO:
-            iIndex = 0.        
-            buildWhere(
-                INPUT  oJsonIdent 
-                ).
-        END.
+// oJsonIdent:WriteFile('C:\Temp\adminprogs_getdata_jsoniden.json', TRUE).
+        iIndex = 0.        
+        buildWhere(
+            INPUT  oJsonIdent 
+            ).
 
         ii      = 0.
         iAnzRec = 0.
         ttTable:EMPTY-TEMP-TABLE ().
         CREATE QUERY hQuery.
-        IF  cFunction = 'loaddata' THEN 
+        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR.
+// MESSAGE 'cWhere loaddate for adminprogs ' cWhere.
+// oJsonIdent:WriteFile('C:\TEMP\adminprogs_getData_oJsonIdent.json', TRUE ).
+        IF NOT oJsonIdent:HAS('search') THEN 
         DO:
-            cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR.
-            IF NOT oJsonIdent:HAS('search') THEN 
-            DO:
-                outilitiesHandler:writeLastcWhere(
-                    INPUT  oJsonIdent ,
-                    INPUT  cFileName  ,
-                    INPUT  cWhere
-                    ).
-            END.
+            outilitiesHandler:writeLastcWhere(
+                INPUT  oJsonIdent ,
+                INPUT  cFileName  ,
+                INPUT  cWhere
+                ).
         END.
         //
         //  Für das Dynamische Query wird PRESELECT verwendet für die Pagination
         //
-        cWhere = REPLACE(cWhere, 'FOR', 'PRESELECT').         
-        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 ().
-
-        ii = hQuery:NUM-RESULTS.
-        hQuery:REPOSITION-FORWARD(iStartRecord - 1) NO-ERROR.
-        hQuery:GET-NEXT ().
-        iCurrentPosition = 0.
-        // MESSAGE 'Start query mit StartRecord ' iStartRecord 'und cWhere ' cWhere.
-        DO WHILE NOT hQuery:QUERY-OFF-END:
-            IF iCurrentPosition = 0 THEN iCurrentPosition = iStartRecord.
-            iAnzRec = iAnzRec + 1.
-            httTable:BUFFER-CREATE().
-            httTable:BUFFER-COPY(hBuffer).
-            IF iAnzRec >= iMaxRecords THEN LEAVE.
-            hQuery:GET-NEXT ().
+        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.
-        hQuery:QUERY-CLOSE ().
-        DELETE OBJECT hQuery  NO-ERROR.
-        DELETE OBJECT hBuffer NO-ERROR.
-
-        iPageCounter = ii / iMaxRecords.
-        IF (iPageCounter * iMaxRecords) < ii THEN iPageCounter = iPageCounter + 1.
-        // MESSAGE 'iAnzahl Records =' iAnzRec 'Pagecounter =' iPageCounter 'Max Records =' ii 'MaxRecords =' iMaxRecords.
-        oRecords = NEW JsonArray().
-        httTable:WRITE-JSON('JsonArray', oRecords).
-
-        oJsonReturn = NEW JsonObject().
-        oJsonReturn:ADD('records'     , oRecords     ).
-        oJsonReturn:ADD('currentPage' , iStartPage   ).
-        oJsonReturn:ADD('maxRecords'  , ii           ).
-        oJsonReturn:ADD('pageCount'   , iPageCounter ).
-        oJsonReturn:ADD('recordCount' , iAnzRec      ).
-        oJsonReturn:ADD('currentIndex', iIndex       ).
+             
+        lRetVal = httTable:FIND-FIRST('', NO-LOCK).
+        hFeld   = httTable:BUFFER-FIELD('language_id'):HANDLE NO-ERROR.
+        IF  VALID-HANDLE(hFeld)    AND
+            NOT ERROR-STATUS:ERROR THEN oJsonIdent:SET('language_id', hFeld:BUFFER-VALUE).
+        oselectboxHandler:getVariableSelectBoxes(
+            INPUT  oJsonIdent      ,
+            OUTPUT oJsonSelectBoxes
+            ).
+        IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
 
         outilitiesHandler:writePosition(
             INPUT  oJsonIdent       ,
@@ -1113,10 +1121,9 @@ CLASS admin.adminprogsHandler FINAL:
             INPUT  iStartPage       ,
             INPUT  iMaxRecords
             ).
-
-        // oJsonReturn:WriteFile('C:\TEMP\getData_messages.json', TRUE).
+// oJsonReturn:WriteFile('C:\TEMP\addresses_getData_messages.json', TRUE).
         
-        lRetVal = TRUE.
+        lRetVal = TRUE.        
         RETURN lRetVal.
 
     END METHOD.
@@ -1131,38 +1138,68 @@ CLASS admin.adminprogsHandler FINAL:
         OUTPUT oJsonReturn AS JsonObject  
         ):
         
-        DEFINE VARIABLE ii      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 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().
-
-        cFileName    = oJsonIdent:GetCharacter('file_name').
-        iStartPage   = 1.
-        iMaxRecords  = 25.
-        IF oJsonIdent:HAS('limit') THEN iMaxRecords = INTEGER(oJsonIdent:GetCharacter('limit')) NO-ERROR.
-        iStartRecord = ((iStartPage - 1) * iMaxRecords) + 1.
+        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.
+        oJsonIdent:ADD('rBuffer', INT64(rBuffer)).
+// MESSAGE hUniqueBuffer::address_id '-' rBuffer.
         outilitiesHandler:readLastcWhere(
             INPUT  oJsonIdent,
             INPUT  cFileName ,
-            OUTPUT cWhere).
-            
-        CREATE BUFFER hBuffer FOR TABLE cFileName.
-        
+            OUTPUT cWhere
+            ).
+        outilitiesHandler:evaluatePageNumber(
+            INPUT-OUTPUT oJsonIdent   ,
+            INPUT        cWhere       ,
+            INPUT        rBuffer
+            ).            
+// oJsonIdent:WriteFile('C:\TEMP\adminprog_rebuildData_JsonIdent.json', TRUE).        
+// MESSAGE 'LAST-WHERE' cWhere.            
+       
         createTempTable(
             INPUT oJsonIdent
             ).
             
-        oJsonIdent:SET('function', 'rebuild').
-        
-        lRetVal = getData(
-            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.
@@ -1172,6 +1209,114 @@ CLASS admin.adminprogsHandler FINAL:
      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 cUniqueWhere     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.
+        hField = httTable:BUFFER-FIELD('language_id'):HANDLE NO-ERROR.
+        IF  VALID-HANDLE(hField)   AND
+            NOT ERROR-STATUS:ERROR THEN oJsonIdent:SET('language_id', httTable::language_id).
+        //
+        //  Erzeugen von Where-Statement für UNIQUE-Find
+        //
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cUniqueWhere
+            ).
+// MESSAGE 'Where-Statement von Primary-Index =' cUniqueWhere.
+        outilitiesHandler:writeLastRecord(
+            INPUT  oJsonIdent   ,
+            INPUT  cUniqueWhere       
+            ).            
+
+        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   ,
@@ -1210,23 +1355,30 @@ CLASS admin.adminprogsHandler FINAL:
 
     METHOD PUBLIC LOGICAL updateData(
         INPUT  oJsonIdent  AS JsonObject,
-        INPUT  oJsonRecord AS jsonObject,
+        INPUT  oJsonData   AS jsonObject,
         OUTPUT oJsonReturn AS JsonObject  
         ):
     
-        DEFINE VARIABLE oJsonMessage    AS JsonObject NO-UNDO.
-        DEFINE VARIABLE oJsonMessageBox AS JsonObject NO-UNDO.
+        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 cWordIndex      AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE rBuffer         AS RECID      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 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 cUniqueWhere     AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cFieldValue      AS CHARACTER  NO-UNDO.
         
-        DEFINE VARIABLE cFunction       AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE oJsonRecord      AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oMasterKeyFields AS JsonObject NO-UNDO.
+        
+        DEFINE VARIABLE cFunction        AS CHARACTER  NO-UNDO.
 
         outilitiesHandler = NEW utilitiesHandler().
         
@@ -1245,6 +1397,12 @@ CLASS admin.adminprogsHandler FINAL:
             INPUT-OUTPUT httPrimaryIndex
             ).
             
+        oJsonRecord = NEW JsonObject().
+        oJsonRecord = oJsonData:GetJsonObject('record') NO-ERROR.
+        
+        oMasterKeyFields = NEW JsonObject().
+        oMasterKeyFields = oJsonData:GetJsonObject('masterKeyFields') NO-ERROR.
+            
         cFunction = oJsonIdent:GetCharacter('function').
         CREATE BUFFER hBuffer FOR TABLE cFileName.
 
@@ -1259,39 +1417,27 @@ CLASS admin.adminprogsHandler FINAL:
         //
         //  Erzeugen von Where-Statement für UNIQUE-Find
         //
-        cWhere = ''.
-        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.
-            cWhere = cWhere + cString
-                + SUBSTITUTE(' &1.&2 = &3 ', ttPrimaryIndex.cFileName, ttPrimaryIndex.cFieldName, cValue).
-            cString = 'AND'.
-        END.
+        createUniqueWhere(
+            INPUT  httTable,
+            OUTPUT cUniqueWhere
+            ).
 
         lRetVal = FALSE.
         REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            lOK = hBuffer:FIND-UNIQUE(cWhere, EXCLUSIVE-LOCK, NO-WAIT) NO-ERROR. 
+            lOK = hBuffer:FIND-UNIQUE(cUniqueWhere, EXCLUSIVE-LOCK, NO-WAIT) NO-ERROR. 
             IF hBuffer:LOCKED THEN 
             DO:
-                hBuffer:FIND-UNIQUE(cWhere, NO-LOCK) NO-ERROR.
+                hBuffer:FIND-UNIQUE(cUniqueWhere, NO-LOCK) NO-ERROR.
                 rBuffer = hBuffer:RECID. 
                 outilitiesHandler:createLockMessage(
                     INPUT  oJsonIdent,
                     INPUT  rBuffer  ,
                     OUTPUT oJsonMessageBox
                     ).
-                lcMessage = oJsonMessageBox:GetLongchar('message').
-                LEAVE.
+                oJsonReturn = NEW JsonObject().
+                oJsonReturn:ADD('success'     , FALSE          ).
+                oJsonReturn:ADD('showMessage', oJsonMessageBox).
+                RETURN TRUE.
             END.
             IF NOT hBuffer:AVAILABLE THEN 
             DO:
@@ -1335,17 +1481,32 @@ CLASS admin.adminprogsHandler FINAL:
             END.
 
             DO ii = 1 TO httTable:NUM-FIELDS:
-                hField = hBuffer:BUFFER-FIELD(ii):HANDLE NO-ERROR.
+                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.
-                htField = httTable:BUFFER-FIELD(ii):HANDLE NO-ERROR.
-                IF htField:BUFFER-VALUE = hField:BUFFER-VALUE THEN NEXT.
-                hField:BUFFER-VALUE = htField:BUFFER-VALUE. 
+                IF hField:EXTENT > 0 THEN 
+                DO:
+                    cFieldValue = htField:BUFFER-VALUE.
+                    DO i1 = 1 TO hField:EXTENT:
+                        hField:BUFFER-VALUE(i1) = ENTRY(i1, cFieldValue, CHR(10)) NO-ERROR.
+                    END.
+                END.
+                ELSE 
+                DO:
+                    IF COMPARE(htField:BUFFER-VALUE, '=', hField:BUFFER-VALUE, 'CASE-SENSITIVE') 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('H_display_name').
             
             hField = hBuffer:BUFFER-FIELD('wordindex'):HANDLE NO-ERROR.
             IF  NOT ERROR-STATUS:ERROR AND

Plik diff jest za duży
+ 431 - 509
admin/dynamicformImpl.cls


+ 187 - 117
admin/formdesignerImpl.cls

@@ -24,6 +24,7 @@ USING src.ch.adprime.gemis.WebHandlerUtilities FROM PROPATH.
 USING utilities.utilitiesHandler FROM PROPATH.
 USING Progress.Json.ObjectModel.JsonDataType FROM PROPATH.
 USING System.Windows.Forms.HtmlDocument FROM ASSEMBLY.
+USING System.Windows.Forms.VisualStyles.FilenameProperty FROM ASSEMBLY.
 
 CLASS admin.formdesignerImpl INHERITS WebHandler: 
 
@@ -75,6 +76,8 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         FIELD leditable    AS LOGICAL   SERIALIZE-NAME 'editable'
         FIELD lhidden      AS LOGICAL   SERIALIZE-NAME 'hidden'
         FIELD cAusrichtung AS CHARACTER SERIALIZE-NAME 'align'
+        FIELD iMaxExtent   AS INTEGER   SERIALIZE-NAME 'maxExtent'
+        FIELD iAnzZeilen   AS INTEGER   SERIALIZE-NAME 'rowSpan'
         .
         
     DEFINE TEMP-TABLE tConfig
@@ -226,53 +229,88 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE j1           AS INTEGER   NO-UNDO.
         DEFINE VARIABLE j2           AS INTEGER   NO-UNDO.
         DEFINE VARIABLE lRetVal      AS LOG       NO-UNDO INIT FALSE.
-        DEFINE VARIABLE hBuffer      AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hField       AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hQuery       AS HANDLE    NO-UNDO.
         DEFINE VARIABLE rFile        AS RECID     NO-UNDO.
         DEFINE VARIABLE cViewas      AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cSidelabel   AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cHeadlabel   AS CHARACTER NO-UNDO.
         DEFINE VARIABLE rLabelTexte  AS RECID     NO-UNDO.
         
+        DEFINE VARIABLE hBuffer      AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hField       AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hQuery       AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE httTable     AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hBufferFile  AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hBufferField AS HANDLE    NO-UNDO.
+        
         DEFINE VARIABLE cFileNames   AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cFileName    AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cFieldName   AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cLDBName     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cDBName      AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cTestName    AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cDBFileName  AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cWhere       AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cValue       AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cLabel       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 BUFFER blabeltexte FOR labeltexte.
+        DEFINE BUFFER btFileDict  FOR tFileDict.
         
         ccompany     = oJsonIdent:GetCharacter('company').
         cuser_name   = oJsonIdent:GetCharacter('user_name').
         iLanguage_id = oJsonIdent:GetInteger  ('language_id').
-
+        
+        outilitiesHandler = NEW utilitiesHandler().
+        
         EMPTY TEMP-TABLE tFileDict.
         lRetVal = FALSE.
-        cFileNames = REPLACE(oJsonIdent:GetCharacter('tables'), ',', ';').
+        cFileNames = oJsonIdent:GetCharacter('tables').
+        cFileNames = REPLACE(cFileNames, '%2C', ';').
+        cFileNames = REPLACE(cFileNames, '%3C', ';').
+        cFileNames = REPLACE(cFileNames, ',', ';').
+
         DO ii = 1 TO NUM-ENTRIES(cFileNames, ';'):
-            cFileName = ENTRY(ii,cFileNames, ';').
-            CREATE BUFFER hBuffer FOR TABLE cFileName NO-ERROR.
-            IF  ERROR-STATUS:ERROR        OR 
-                NOT VALID-HANDLE(hBuffer) THEN NEXT.
+            cFileName   = ENTRY(ii,cFileNames, ';').
+            cLDBName    = outilitiesHandler:getLogicalDBName(cFileName).
+            cDBFileName = cLDBName + '.' + '_File'.
+            CREATE BUFFER hBufferFile FOR TABLE cDBFileName.
 
-            DO i1 = 1 TO hBuffer:NUM-FIELDS:
-                hField     = hBuffer:BUFFER-FIELD(i1).
-                cFieldName = hField:NAME.
-                IF cFieldName  = 'wordindex' THEN NEXT.
+            hBufferFile:FIND-UNIQUE(SUBSTITUTE('WHERE _File._File-Name = &1', QUOTER(cFileName)), NO-LOCK) NO-ERROR.
+
+            CREATE QUERY hQuery.
+            cDBFileName = REPLACE(cDBFileName, '_File', '_Field').
+            CREATE BUFFER hBufferField FOR TABLE cDBFileName.
+            hQuery:SET-BUFFERS(hBufferField).
+            cWhere = SUBSTITUTE('FOR EACH _Field WHERE _Field._File-recid = &1 BY _Order', hBufferFile:RECID ).
+            hQuery:QUERY-PREPARE(cWhere).
+
+            hQuery:QUERY-OPEN ().
+            hQuery:GET-FIRST(). 
+            hBuffer = hBufferField.
+            DO WHILE NOT hQuery:QUERY-OFF-END:
+                cFieldName = hBufferField::_Field-Name.
+                
+                IF cFieldName  = 'wordindex' THEN 
+                DO:
+                    hQuery:GET-NEXT ().
+                    NEXT.
+                END.
+                
+                hField = hBufferField:BUFFER-FIELD('_Label'):HANDLE NO-ERROR.
+                IF VALID-HANDLE(hField) THEN cLabel = hField:BUFFER-VALUE.
 
+                IF  cLabel = ?   OR
+                    cLabel = '?' OR
+                    clabel = ''  THEN cLabel = cFieldName.
+                
                 CREATE  tFileDict.
                 ASSIGN
                     tFileDict.cId          = cFileName + '_' + cFieldName
                     tFileDict.cName        = cFilename + '_' + cFieldName
-                    tFileDict.cFormat      = hBuffer:BUFFER-FIELD(cFieldName):FORMAT
-                    tFileDict.cType        = hBuffer:BUFFER-FIELD(cFieldName):DATA-TYPE
+                    tFileDict.cFormat      = hBuffer::_FORMAT
+                    tFileDict.cType        = hBuffer::_DATA-TYPE
                     tFileDict.iDecimals    = 0
                     tFileDict.lhidden      = FALSE
                     tFileDict.leditable    = TRUE
@@ -282,43 +320,37 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                     tFileDict.lShowSpinner = ?
                     tFileDict.cInputMode   = ?
                     .
-
                 DO WHILE TRUE TRANSACTION:
-                    FIND FIRST labeltexte NO-LOCK 
+                    FIND FIRST labeltexte NO-LOCK
                         WHERE labeltexte.company     = ccompany
                         AND   labeltexte.user_name   = 'admin'
                         AND   labeltexte.table_name  = cFileName
                         AND   labeltexte.field_name  = cFieldName
                         AND   labeltexte.language_id = iLanguage_id
                         AND   labeltexte.program     = '' NO-ERROR.
-                    IF AVAILABLE labeltexte THEN 
+                    IF AVAILABLE labeltexte THEN
                     DO:
                         rLabelTexte = RECID(labeltexte).
                         LEAVE.
                     END.
-                    
-                    FIND FIRST blabeltexte NO-LOCK 
+
+                    FIND FIRST blabeltexte NO-LOCK
                         WHERE blabeltexte.company     = ccompany
                         AND   blabeltexte.user_name   = 'admin'
                         AND   blabeltexte.field_name  = cFieldName
                         AND   blabeltexte.language_id = iLanguage_id
                         AND   blabeltexte.program     = '' NO-ERROR.
                     IF AVAILABLE blabeltexte THEN
-                        ASSIGN 
+                        ASSIGN
                             cSidelabel = blabeltexte.sidelabel
                             cHeadlabel = blabeltexte.headlabel.
                     ELSE
-                        IF hField:LABEL <> ? THEN 
-                            ASSIGN 
-                                cSidelabel = hField:LABEL 
-                                cHeadlabel = hField:LABEL.
-                        ELSE
-                            ASSIGN 
-                                cSidelabel = hField:NAME 
-                                cHeadlabel = hField:NAME.
-                        
+                        ASSIGN
+                            cSidelabel = cLabel
+                            cHeadlabel = cLabel.
+
                     CREATE  labeltexte.
-                    ASSIGN  
+                    ASSIGN
                         labeltexte.company     = ccompany
                         labeltexte.user_name   = 'admin'
                         labeltexte.table_name  = cFileName
@@ -326,82 +358,88 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                         labeltexte.language_id = iLanguage_id
                         labeltexte.program     = ''
                         labeltexte.created_at  = NOW NO-ERROR.
-                    
-                    ASSIGN 
+
+                    ASSIGN
                         labeltexte.sidelabel = cSidelabel
                         labeltexte.headlabel = cHeadlabel.
-                        
+
                     rLabelTexte = RECID(labeltexte).
                     RELEASE labeltexte.
                     RELEASE blabeltexte.
                     LEAVE.
                 END.
-                
+
                 DO WHILE TRUE TRANSACTION:
                     IF cuser_name = 'admin' THEN LEAVE.
-                    
-                    FIND FIRST labeltexte NO-LOCK 
+
+                    FIND FIRST labeltexte NO-LOCK
                         WHERE labeltexte.company     = ccompany
                         AND   labeltexte.user_name   = cuser_name
                         AND   labeltexte.table_name  = cFileName
                         AND   labeltexte.field_name  = cFieldName
                         AND   labeltexte.language_id = iLanguage_id
                         AND   labeltexte.program     = '' NO-ERROR.
-                    IF AVAILABLE labeltexte THEN 
+                    IF AVAILABLE labeltexte THEN
                     DO:
                         rLabelTexte = RECID(labeltexte).
                         LEAVE.
                     END.
-                    
-                    FIND FIRST blabeltexte NO-LOCK 
+
+                    FIND FIRST blabeltexte NO-LOCK
                         WHERE blabeltexte.company     = ccompany
                         AND   blabeltexte.user_name   = cuser_name
                         AND   blabeltexte.field_name  = cFieldName
                         AND   blabeltexte.language_id = iLanguage_id
                         AND   blabeltexte.program     = '' NO-ERROR.
-                    IF AVAILABLE blabeltexte THEN 
+                    IF AVAILABLE blabeltexte THEN
                     DO:
                         rLabelTexte = RECID(blabeltexte).
                         LEAVE.
                     END.
                     LEAVE.
                 END.
-                
-                FIND labeltexte NO-LOCK 
+
+                FIND labeltexte NO-LOCK
                     WHERE RECID(labeltexte) = rLabelTexte.
                 tFileDict.cLabel = labeltexte.headlabel.
 
-                IF INDEX(hField:FORMAT, '(') = 0 THEN tFileDict.iMaxLength = LENGTH(hField:FORMAT).
-                ELSE 
+                IF INDEX(hBuffer::_FORMAT, '(') = 0 THEN tFileDict.iMaxLength = LENGTH(hBuffer::_FORMAT).
+                ELSE
                 DO:
-                    j1 = INDEX(hField:FORMAT, '(') + 1.
-                    j2 = INDEX(hField:FORMAT, ')').
-                    tFileDict.iMaxLength = INTEGER(SUBSTRING(hField:FORMAT, j1, j2 - j1)).
+                    j1 = INDEX(hBuffer::_FORMAT, '(') + 1.
+                    j2 = INDEX(hBuffer::_FORMAT, ')').
+                    tFileDict.iMaxLength = INTEGER(SUBSTRING(hBuffer::_FORMAT, j1, j2 - j1)).
                 END.
-                IF hField:EXTENT > 0 THEN tFileDict.iMaxLength = tFileDict.iMaxLength * hField:EXTENT. 
-                
+                IF hBuffer::_EXTENT > 0 THEN tFileDict.iMaxLength = tFileDict.iMaxLength * hBuffer::_EXTENT.
+
                 CASE tFileDict.cType:
-                    WHEN 'character' THEN 
-                        DO: 
-                            ASSIGN 
+                    WHEN 'character' THEN
+                        DO:
+                            ASSIGN
                                 tFileDict.cType     = 'text'
                                 tFileDict.iDecimals = 0.
-                            IF hField:EXTENT > 0 THEN tFileDict.cType = 'textarea'. 
+                            IF hBuffer::_Extent > 0 THEN 
+                            DO:
+                                ASSIGN 
+                                    tFileDict.cType      = 'extent'
+                                    tFileDict.iMaxExtent = hBuffer::_Extent
+                                    tFileDict.iAnzZeilen = tFileDict.iMaxExtent.
+                            END. 
                         END.
-                    WHEN 'Date' THEN 
-                        DO: 
-                            ASSIGN 
+                    WHEN 'Date' THEN
+                        DO:
+                            ASSIGN
                                 tFileDict.cType        = 'date'
                                 tFileDict.cFormat      = '99.99.9999'
                                 tFileDict.iDecimals    = 0
                                 tFileDict.iMaxLength   = tFileDict.iMaxLength + 2
                                 tFileDict.cAusrichtung = 'center'.
                         END.
-                    WHEN 'Decimal' THEN 
-                        DO: 
-                            ASSIGN 
+                    WHEN 'Decimal' THEN
+                        DO:
+                            ASSIGN
                                 tFileDict.cType        = 'decimal'
-                                tFileDict.iDecimals    = hField:DECIMALS
+                                tFileDict.iDecimals    = hBuffer::_DECIMALS
                                 tFileDict.cDisplayType = 'text'
                                 tFileDict.cInputMode   = 'decimal'
                                 tFileDict.lShowSpinner = FALSE
@@ -409,9 +447,9 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                                 tFileDict.cAusrichtung = 'right'.
                         END.
                     WHEN 'Integer' OR
-                    WHEN 'Int64'   THEN 
-                        DO: 
-                            ASSIGN 
+                    WHEN 'Int64'   THEN
+                        DO:
+                            ASSIGN
                                 tFileDict.cType        = 'integer'
                                 tFileDict.iDecimals    = 0
                                 tFileDict.cDisplayType = 'text'
@@ -420,9 +458,9 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                                 tFileDict.iMaxLength   = tFileDict.iMaxLength
                                 tFileDict.cAusrichtung = 'right'.
                         END.
-                    WHEN 'Recid' THEN 
-                        DO: 
-                            ASSIGN 
+                    WHEN 'Recid' THEN
+                        DO:
+                            ASSIGN
                                 tFileDict.cType        = 'integer'
                                 tFileDict.iDecimals    = 0
                                 tFileDict.cDisplayType = 'text'
@@ -431,25 +469,54 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                                 tFileDict.lHidden      = TRUE
                                 tFileDict.leditable    = FALSE.
                         END.
-                    WHEN 'logical' THEN 
+                    WHEN 'logical' THEN
                         DO:
-                            ASSIGN  
+                            ASSIGN
                                 tFileDict.cType        = 'checkbox'
                                 tFileDict.cAusrichtung = 'center'.
                         END.
                 END CASE.
+
+                cViewas = hBuffer::_VIEW-AS NO-ERROR.
+                IF ERROR-STATUS:ERROR THEN 
+                DO:
+                    hQuery:GET-NEXT ().
+                    NEXT.
+                END.
+                IF INDEX(cViewas, 'COMBO-BOX') > 0 THEN cViewAS = 'combo-box'.
                 
-                cViewas = hField:VIEW-AS.
                 CASE cViewas:
-                    WHEN 'combo-box' THEN 
-                        tFileDict.cType = 'select'.
+                    WHEN 'combo-box' THEN
+                        DO:
+                            tFileDict.cType = 'select'.
+                            CREATE btFileDict.
+                            ASSIGN
+                                btFileDict.cId          = cFileName + '_' + cFieldName + '_BoxField'
+                                btFileDict.cName        = cFilename + '_' + cFieldName + '_BoxField'
+                                btFileDict.cFormat      = 'x(100)'
+                                btFileDict.cType        = 'character'
+                                btFileDict.iDecimals    = 0
+                                btFileDict.lhidden      = TRUE
+                                btFileDict.leditable    = FALSE
+                                btFileDict.iMaxLength   = 100
+                                btFileDict.cAusrichtung = 'left'
+                                btFileDict.cDisplayType = ?
+                                btFileDict.lShowSpinner = ?
+                                btFileDict.cInputMode   = ?
+                                btFileDict.cLabel       = cFieldName + '_BoxField'.
+                            .
+                        END.
                     WHEN 'editor' THEN
-                        ASSIGN  
+                        ASSIGN
                             tFileDict.cType = 'textarea'.
                 END CASE.
-                
+
+                hQuery:GET-NEXT().
             END.
-            DELETE OBJECT hBuffer NO-ERROR.
+
+            DELETE OBJECT hBufferFile   NO-ERROR.
+            DELETE OBJECT hBufferField  NO-ERROR.
+            DELETE OBJECT hQuery        NO-ERROR.
         END.
         
         lResult = TRUE.
@@ -481,6 +548,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE cFileNames      AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cFileName       AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE ii              AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE iMatches        AS INTEGER    NO-UNDO.
         DEFINE VARIABLE dDateTime       AS DATETIME   NO-UNDO.
         DEFINE VARIABLE cDateTime       AS CHARACTER  NO-UNDO.
         
@@ -492,11 +560,10 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE cQueryValue     AS CHARACTER  NO-UNDO.
         
         outilitiesHandler = NEW utilitiesHandler().
-        MESSAGE 'GetHandler '.
+// MESSAGE 'GetHandler '.
         cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
-            INPUT  cQueryString ,
             OUTPUT ccompany     ,
             OUTPUT cuser_name   ,
             OUTPUT cAnzeigeName ,
@@ -506,8 +573,8 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
             OUTPUT oJsonIdent   
             ).
             
-        oJsonIdent:WriteFile('C:\TEMP\formdesigner_GET.json', TRUE).
-        MESSAGE 'getHandler Function =' cFunction.        
+// 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:
@@ -558,17 +625,19 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 ).
 
             cFileNames = oJsonIdent:GetCharacter('tables').
-            MESSAGE 'File-Namen ' cFileNames.
+            cFileNames = REPLACE(cFileNames, ',', ';').
+
             EMPTY TEMP-TABLE tConfig.
             FOR EACH htmldokumente NO-LOCK 
                 WHERE htmldokumente.company     = ccompany
                 AND   htmldokumente.user_name   = cuser_name
                 AND   htmldokumente.language_id = ilanguage_id:
 
+                iMatches = 0.
                 DO ii = 1 TO NUM-ENTRIES(cFileNames, ';'):
                     cFileName = ENTRY(ii, cFileNames, ';').
 
-                    IF INDEX(htmldokumente.Form_Id, cFileName) = 0 THEN NEXT.
+                    IF INDEX(htmldokumente.Tables, cFileName) = 0 THEN NEXT.
                     
                     IF htmldokumente.updated_at = ? THEN 
                     DO:
@@ -580,20 +649,22 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                         dDateTime = htmldokumente.updated_at. 
                         cDateTime = STRING(htmldokumente.updated_at,'99-99-9999THH:MM:SS').
                     END.
+                    iMatches = iMatches + 1.
+                END.
+                IF  iMatches <> NUM-ENTRIES(cFileNames, ';')           OR
+                    iMatches <> NUM-ENTRIES(htmldokumente.tables, ',') THEN NEXT. 
 
-                    CREATE  tConfig.
-                    ASSIGN  
-                        tConfig.cId        = htmldokumente.form_id
-                        tConfig.cFormTitle = htmldokumente.formtitle
-                        tConfig.cCreated   = STRING(YEAR(dDateTime),'9999')
+                CREATE  tConfig.
+                ASSIGN  
+                    tConfig.cId        = htmldokumente.formId
+                    tConfig.cFormTitle = htmldokumente.formtitle
+                    tConfig.cCreated   = STRING(YEAR(dDateTime),'9999')
                                        + '-'
                                        + STRING(MONTH(dDateTime),'99')
                                        + '-'
                                        + STRING(DAY(dDateTime),'99')
                                        + SUBSTRING(cDateTime,11).
 
-                    LEAVE.
-                END.
             END.
         
             htFileDict  = TEMP-TABLE tFileDict :DEFAULT-BUFFER-HANDLE.
@@ -603,8 +674,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
             oJsonResponse = NEW JsonObject().
             oJsonResponse:READ(hdsResponse).
             oJsonResponse:WRITE(lcJsonInhalt, FALSE).
-
-            lRetVal = TRUE.
+// oJsonResponse:WriteFile('C:\TEMP\Dataset_loaddata_formdesigner.json', TRUE).
             LEAVE.
         END.
         
@@ -614,7 +684,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 WHERE htmldokumente.company     = ccompany
                 AND   htmldokumente.user_name   = cuser_name
                 AND   htmldokumente.language_id = ilanguage_id
-                AND   htmldokumente.form_id     = cConfig_id NO-ERROR.
+                AND   htmldokumente.formId     = cConfig_id NO-ERROR.
                 
             lcJsonInhalt    = htmldokumente.htmltext.
             lRetVal         = TRUE.
@@ -629,7 +699,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                     WHERE htmldokumente.company     = ccompany
                     AND   htmldokumente.user_name   = cuser_name
                     AND   htmldokumente.language_id = ilanguage_id
-                    AND   htmldokumente.form_id     = cConfig_id NO-ERROR.
+                    AND   htmldokumente.formId     = cConfig_id NO-ERROR.
                 IF NOT AVAILABLE htmldokumente THEN LEAVE.
                 DELETE  htmldokumente.
                 lRetVal = TRUE.
@@ -712,7 +782,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE cuser_name      AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE ilanguage_id    AS INTEGER           NO-UNDO.
         DEFINE VARIABLE cformtitle      AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cformid         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.
@@ -734,13 +804,13 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         DEFINE VARIABLE cadminAlign     AS CHARACTER         NO-UNDO.
 
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        // MESSAGE 'getJsonFromRequest    = ' lRetVal.
+// MESSAGE 'getJsonFromRequest    = ' lRetVal.
         
         cFunction = poRequest:URI:GetQueryValue("function").
-        // MESSAGE 'Funktion = ' cFunction.
+// MESSAGE 'Funktion = ' cFunction.
         
         oJsonData:WRITE(lcJsonString, FALSE).
-        MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
+// MESSAGE 'ganzer Eingangsstring = ' STRING(lcJsonString).
         
         outilitiesHandler = NEW utilitiesHandler().
         
@@ -753,7 +823,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         oJsonConfig     = NEW JsonObject().
         oJsonConfig     = oJsonData:GetJsonObject ('config'        ).
         cformtitle      = oJsonConfig:GetCharacter('formTitle'     ).
-        cformid         = oJsonConfig:GetCharacter('formId'        ).
+        cFormId         = oJsonConfig:GetCharacter('formId'        ).
         iItemsPerPage   = oJsonConfig:Getinteger  ('itemsPerPage'  ).
         ctableMaxHeight = oJsonConfig:GetCharacter('tableMaxHeight').
         cFormColumns    = oJsonConfig:GetCharacter('formColumns'   ).
@@ -762,21 +832,21 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         oJsonFields     = oJsonConfig:GetJsonArray('selectedFields').
         oJsonConfig:WRITE(lcJsonConfig, FALSE).
         
-        oJsonConfig:WriteFile('C:\TEMP\FormDesignerConfig.json', TRUE).
-        oJsonFields:WriteFile('C:\TEMP\FormDesignerFields.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
                 WHERE htmldokumente.company     = ccompany
                 AND   htmldokumente.user_name   = cuser_name
-                AND   htmldokumente.form_id     = cformid
+                AND   htmldokumente.formId      = cFormId
                 AND   htmldokumente.language_id = ilanguage_id NO-ERROR.
             IF NOT AVAILABLE htmldokumente THEN 
             DO:
@@ -784,7 +854,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 ASSIGN 
                     htmldokumente.company     = ccompany
                     htmldokumente.user_name   = cuser_name
-                    htmldokumente.form_id     = cformid
+                    htmldokumente.formId      = cFormId
                     htmldokumente.language_id = ilanguage_id
                     htmldokumente.created_at  = NOW.
             END.
@@ -795,7 +865,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                 htmldokumente.tableMaxHeight = ctableMaxHeight
                 Htmldokumente.formColumns    = cFormColumns.
             htmltext = STRING(lcJsonConfig).
-            // MESSAGE 'htmldokument gschrieben mit config ' STRING(lcJsonConfig).
+// MESSAGE 'htmldokument gschrieben mit config ' STRING(lcJsonConfig).
             RELEASE htmldokumente.
             LEAVE.
         END.
@@ -817,7 +887,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
             //
             clabel = hBuffer:BUFFER-FIELD('label'):BUFFER-VALUE.
             calign = hBuffer:BUFFER-FIELD('align'):BUFFER-VALUE.
-            MESSAGE 'cFileName =' cFileName 'FieldName =' cField 'cLabel =' cLabel 'cAlign =' cAlign.
+// MESSAGE 'cFileName =' cFileName 'FieldName =' cField 'cLabel =' cLabel 'cAlign =' cAlign.
             FIND FIRST labeltexte
                 WHERE labeltexte.company     = ccompany
                 AND   labeltexte.user_name   = 'admin'
@@ -927,16 +997,16 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
             IF hField:BUFFER-VALUE = 'addresses_salutation_code' THEN 
             DO:
                 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.
+// MESSAGE 'addresses_salutation_code type' hField:BUFFER-VALUE.
+                hField = hBuffer:BUFFER-FIELD('selectOptionsType'):HANDLE NO-ERROR.
+// 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 outilitiesHandler:evaluateErrorStatus(ERROR-STATUS:HANDLE) THEN LEAVE.
+// MESSAGE 'Selectboxfeld ->' hField:NAME '-' hField:BUFFER-VALUE.
                 IF VALID-HANDLE(hField) AND hField:BUFFER-VALUE BEGINS 'variable' THEN
                     cBoxFields = cBoxfields
                         + (IF cBoxfields = '' THEN '' ELSE ';')
@@ -945,7 +1015,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                     cBoxFieldsFix = cBoxfieldsFix
                         + (IF cBoxfieldsFix = '' THEN '' ELSE ';')
                         + hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE.
-                MESSAGE 'Feldname =' hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE VALID-HANDLE(hField).
+// MESSAGE 'Feldname =' hBuffer:BUFFER-FIELD('fieldName'):BUFFER-VALUE VALID-HANDLE(hField).
                 LEAVE.
             END.
 
@@ -960,7 +1030,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                     WHERE selectboxfields.company   = ccompany
                     AND   selectboxfields.program   = cFormId
                     AND   selectboxfields.user_name = cuser_name
-                    AND   selectboxfields.table_Name = '' NO-ERROR.
+                    AND   selectboxfields.table_Name = 'table' NO-ERROR.
                 IF NOT AVAILABLE selectboxfields THEN 
                 DO:
                     CREATE  selectboxfields.
@@ -968,7 +1038,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
                         selectboxfields.company    = ccompany
                         selectboxfields.program    = cFormId
                         selectboxfields.user_name  = cuser_name
-                        selectboxfields.table_Name = ''.
+                        selectboxfields.table_Name = 'table'.
                 END.
                 ASSIGN 
                     selectboxfields.boxfields    = cBoxFields
@@ -978,7 +1048,7 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
             END.
         END. 
         
-        // MESSAGE 'geschrieben ' ccompany '-' cuser_name '-' cformid '-' ilanguage_id.
+// MESSAGE 'geschrieben ' ccompany '-' cuser_name '-' cFormId '-' ilanguage_id.
             
         oResponse             = NEW OpenEdge.Web.WebResponse().
         oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
@@ -986,10 +1056,10 @@ CLASS admin.formdesignerImpl INHERITS WebHandler:
         oWriter               = NEW WebResponseWriter(oResponse).
         
         oJsonMessage = NEW JsonObject().
-        oJsonMessage:ADD('id', cformid).
+        oJsonMessage:ADD('id', cFormId).
         oJsonMessage:ADD('message', 'erfolgreich gespeichert').
         oJsonMessage:WRITE(lcJsonString, TRUE).
-        // MESSAGE 'Rueckmeldung ' STRING(lcJsonString).
+// MESSAGE 'Rueckmeldung ' STRING(lcJsonString).
             
         oWriter:Open().
         oWriter:Write(lcJsonString).

+ 9 - 10
admin/formprogramImpl.cls

@@ -32,7 +32,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
     DEFINE VARIABLE ilanguage_id      AS INTEGER          NO-UNDO.
     DEFINE VARIABLE cSessionToken     AS CHARACTER        NO-UNDO.
     DEFINE VARIABLE cFunction         AS CHARACTER        NO-UNDO.
-    DEFINE VARIABLE cForm_Id          AS CHARACTER        NO-UNDO.
+    DEFINE VARIABLE cFormId          AS CHARACTER        NO-UNDO.
     
     DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
     DEFINE VARIABLE oSelectboxHandler AS selectboxHandler NO-UNDO.
@@ -115,7 +115,6 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
 
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
-            INPUT  cQueryString ,
             OUTPUT ccompany     ,
             OUTPUT cuser_name   ,
             OUTPUT cAnzeigeName ,
@@ -125,7 +124,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,13 +175,13 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
         END.
 
         DO WHILE cFunction = 'loadconfig':
-            cForm_Id = oJsonIdent:GetCharacter('form_id').
+            cFormId = oJsonIdent:GetCharacter('formId').
             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.formId     = cFormId
                 AND   htmldokumente.language_id = iLanguage_Id NO-ERROR.
             IF NOT AVAILABLE htmldokumente THEN LEAVE.
 
@@ -191,7 +190,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
             oJsonSelectBoxes = NEW JsonObject().
             FOR EACH selectboxfields NO-LOCK
                 WHERE selectboxfields.company   = htmldokumente.company
-                AND   selectboxfields.program   = htmldokumente.form_id
+                AND   selectboxfields.program   = htmldokumente.formId
                 AND   selectboxfields.user_name = cuser:
 
                 DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfields, ';'):
@@ -230,7 +229,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
 
             oJsonResponse = NEW JsonObject().
             oJsonResponse:ADD('formTitle', htmldokumente.formtitle).
-            oJsonResponse:ADD('formId'   , htmldokumente.form_id  ).
+            oJsonResponse:ADD('formId'   , htmldokumente.formId  ).
 
             oParser   = NEW ObjectModelParser().
             oJsonData = CAST(oParser:Parse(htmldokumente.htmltext), JsonObject).
@@ -242,7 +241,7 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
 
             oJsonResponse:ADD('records', oJsonRecords).            
             
-            oJsonResponse:WriteFile('C:\TEMP\loadconfig_response.json', TRUE).
+            // oJsonResponse:WriteFile('C:\TEMP\loadconfig_response.json', TRUE).
             oJsonResponse:WRITE(lcJsonInhalt, FALSE).
             
             lRetVal = TRUE.
@@ -254,13 +253,13 @@ CLASS admin.formprogramImpl INHERITS WebHandler:
             FIND htmldokumente NO-LOCK 
                 WHERE htmldokumente.company     = oJsonIdent:GetCharacter('company')
                 AND   htmldokumente.user_name   = oJsonIdent:GetCharacter('user')
-                AND   htmldokumente.form_id     = oJsonIdent:GetCharacter('form_id')
+                AND   htmldokumente.formId     = oJsonIdent:GetCharacter('formId')
                 AND   htmldokumente.language_id = iLanguage_id NO-ERROR.
             IF NOT AVAILABLE htmldokumente THEN LEAVE.
             
             oJsonResponse = NEW JsonObject().
             oJsonResponse:ADD('formTitle'       , htmldokumente.formtitle) NO-ERROR.
-            oJsonResponse:ADD('formId'          , htmldokumente.form_id  ) NO-ERROR.
+            oJsonResponse:ADD('formId'          , htmldokumente.formId  ) NO-ERROR.
             oJsonResponse:ADD('targetCompany'   , oJsonIdent:GetCharacter('company')    ) NO-ERROR.
             oJsonResponse:ADD('targetUser'      , oJsonIdent:GetCharacter('user')  ) NO-ERROR.
             oJsonResponse:ADD('targetLanguageId', oJsonIdent:GetInteger  ('language_id')) NO-ERROR.

+ 0 - 2
admin/menudesignerImpl.cls

@@ -147,7 +147,6 @@ CLASS admin.menudesignerImpl INHERITS WebHandler:
         cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
-            INPUT  cQueryString ,
             OUTPUT ccompany     ,
             OUTPUT cuser_name   ,
             OUTPUT cAnzeigeName ,
@@ -383,7 +382,6 @@ CLASS admin.menudesignerImpl INHERITS WebHandler:
         cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
-            INPUT  cQueryString ,
             OUTPUT ccompany     ,
             OUTPUT cuser_name   ,
             OUTPUT cAnzeigeName ,

+ 22 - 27
admin/programgeneratorImpl.cls

@@ -32,6 +32,8 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
     DEFINE VARIABLE cAnzeigeName      AS CHARACTER        NO-UNDO.
     DEFINE VARIABLE ilanguage_id      AS INTEGER          NO-UNDO.
     DEFINE VARIABLE cSessionToken     AS CHARACTER        NO-UNDO.
+    DEFINE VARIABLE cFormId           AS CHARACTER        NO-UNDO.
+    DEFINE VARIABLE cProgram          AS CHARACTER        NO-UNDO.
     
     DEFINE VARIABLE outilitiesHandler AS utilitiesHandler NO-UNDO.
 
@@ -56,7 +58,6 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         DEFINE VARIABLE oJsonData       AS JsonObject        NO-UNDO.
         
         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.
@@ -73,7 +74,6 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
 
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
-            INPUT  cQueryString ,
             OUTPUT ccompany     ,
             OUTPUT cuser_name   ,
             OUTPUT cAnzeigeName ,
@@ -83,7 +83,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
             OUTPUT oJsonIdent   
             ).
 
-        // oJsonIdent:WriteFile('C:\TEMP\programgenerator_GET.json', TRUE).
+oJsonIdent:WriteFile('C:\TEMP\programgenerator_getHeaderData.json', TRUE).
         
         cProgram  = oJsonIdent:GetCharacter('program_name').
         
@@ -91,10 +91,10 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         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.
-        
+// MESSAGE 'load hrmldokument mir program' cProgram.
         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
@@ -108,7 +108,8 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
                 cProgUser = 'admin'.
                 NEXT.
             END.
-// MESSAGE 'gefunden mit user ' cproguser.
+            cFormId = htmldokumente.formId.
+MESSAGE cProgram 'gefunden mit user ' cproguser.
             COPY-LOB htmldokumente.htmlprogram TO lcProgramCode.
 
             lRetVal = TRUE.
@@ -116,8 +117,8 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         END.
         
         oJsonResponse = NEW JsonObject().
-        oJsonResponse:ADD('program_name', cProgram).
-        oJsonResponse:ADD('form_id'     , cProgram).
+        oJsonResponse:ADD('program'     , cProgram).
+        oJsonResponse:ADD('formId'      , cFormId).
         oJsonResponse:ADD('program_code', lcprogramcode).
         oJsonResponse:ADD('created_at'  , ISO-DATE(htmldokumente.created_at)).
 // oJsonResponse:ADD('program_code', lcprogramcode).
@@ -143,7 +144,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         oWriter = NEW WebResponseWriter(oResponse).
         oWriter:Open(). 
         oWriter:Close(). 
-
+// MESSAGE 'ENDE Get ProgramGenerator Load ' STRING(lcJsonInhalt).
         RETURN 0.
         
         CATCH e AS Progress.Lang.Error:
@@ -176,11 +177,6 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         DEFINE VARIABLE cJSON             AS LONGCHAR          NO-UNDO.
         DEFINE VARIABLE i1                AS INTEGER           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 cProgram          AS CHARACTER         NO-UNDO.
-        DEFINE VARIABLE cFormId           AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cFunction         AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cTargetUser       AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE cQueryString      AS CHARACTER         NO-UNDO.
@@ -196,7 +192,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
         DEFINE VARIABLE cFormColumns      AS CHARACTER         NO-UNDO.
         
         lRetVal = WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
-        
+
         IF oJsonData:HAS('program_code_base64') THEN 
         DO:
             lcBase64_code = oJsonData:GetLongchar("program_code_base64").
@@ -212,23 +208,23 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
             lcProgramcode = oJsonData:GetLongchar("program_code4").
             oJsonData:Remove('program_code_base64').
         END.
-        
+
         outilitiesHandler = NEW utilitiesHandler().
         
-        // oJsonData:WriteFile('C:\TEMP\programgenerator_post.json', TRUE).
-        cfunction         =         oJsonData:GetCharacter('function'          ).
-        cProgram          =         oJsonData:GetCharacter('program_name'      ).        
-        cFormId           =         oJsonData:GetCharacter('form_id'           ).        
-        cTargetUser       =         oJsonData:GetCharacter('target_user'       ).        
-        iTargetLanguageId =         oJsonData:GetInteger  ('target_language_id').
-        cTargetCompany    =         oJsonData:GetCharacter('target_company'    ).
+// oJsonData:WriteFile('C:\TEMP\programgenerator_post.json', TRUE).
+        cfunction         = oJsonData:GetCharacter('function'          ) NO-ERROR.
+        cProgram          = oJsonData:GetCharacter('program_name'      ) NO-ERROR.        
+        cFormId           = oJsonData:GetCharacter('formId'            ) NO-ERROR.        
+        cTargetUser       = oJsonData:GetCharacter('target_user'       ) NO-ERROR.        
+        iTargetLanguageId = oJsonData:GetInteger  ('target_language_id') NO-ERROR.
+        cTargetCompany    = oJsonData:GetCharacter('target_company'    ) NO-ERROR.
 
         lRetVal = FALSE.
         REPEAT TRANSACTION WHILE cFunction = 'save' ON ERROR UNDO, LEAVE:
             FIND htmldokumente  
                 WHERE htmldokumente.company     = cTargetCompany
                 AND   htmldokumente.user_name   = cTargetUser
-                AND   htmldokumente.form_id     = cFormId
+                AND   htmldokumente.formId      = cFormId
                 AND   htmldokumente.language_id = iTargetLanguageId NO-ERROR.
             IF NOT AVAILABLE htmldokumente THEN LEAVE.
             
@@ -244,7 +240,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
             lRetVal = TRUE.    
             LEAVE.
         END.
-                    
+
         oResponse             = NEW OpenEdge.Web.WebResponse().
         oResponse:StatusCode  = INTEGER(StatusCodeEnum:OK).
         oResponse:ContentType = "application/json;charset=utf-8".
@@ -262,8 +258,7 @@ CLASS admin.programgeneratorImpl INHERITS WebHandler:
             oJsonMessage:ADD('message', 'Fehler beim erstellen der Menu-Struktur').
             oJsonMessage:WRITE(lcJsonString, FALSE).
         END.
-        // MESSAGE 'R�ckmeldung ' STRING(lcJsonString).
-                            
+
         oWriter:Open().
         oWriter:Write(lcJsonString).
         oWriter:Close().

+ 4 - 4
auth/loginImpl.cls

@@ -59,7 +59,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
         DEFINE VARIABLE cuser_name      AS CHARACTER         NO-UNDO.
         
         cuser_name = poRequest:URI:GetQueryValue("user_name").
-        
+MESSAGE '1'.
         ii = 0.
         EMPTY TEMP-TABLE tcompanies.
         FOR EACH companies NO-LOCK
@@ -74,7 +74,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
         END.
         
         outilitiesHandler = NEW utilitiesHandler().
-
+MESSAGE '2'.
         //  Ist dem Benutzer ein company zugeteilt ?
         FIND FIRST users NO-LOCK
             WHERE users.user_name = cuser_name NO-ERROR.
@@ -84,7 +84,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
                 tcompanies.lselected = (IF tcompanies.company = users.company THEN TRUE ELSE FALSE).
             END.
         END.  
-                
+MESSAGE '3'.
         htcompanies     = TEMP-TABLE tcompanies:DEFAULT-BUFFER-HANDLE.
         cContent-Type   = "application/json".
         cDefautlCharSet = 'utf-8'. 
@@ -100,7 +100,7 @@ CLASS auth.loginImpl INHERITS WebHandler:
         oJsonResponse:ADD('companies', oJsonArray) NO-ERROR.
 
         oJsonResponse:WRITE(lcJsonInhalt, FALSE).
-        
+MESSAGE STRING(lcJsonInhalt).
         oBody = NEW STRING(lcJsonInhalt).
         WebHandlerUtilities:createHttpResponse(INPUT INTEGER(StatusCodeEnum:OK), INPUT oBody, INPUT cContent-Type, INPUT cDefautlCharSet, INPUT cCorralationID, OUTPUT oResponse).
            

+ 0 - 2
dashboard/dashboardImpl.cls

@@ -117,10 +117,8 @@ CLASS dashboard.dashboardImpl INHERITS WebHandler:
         
         outilitiesHandler = NEW utilitiesHandler().
         
-        cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING"))    NO-ERROR.
         outilitiesHandler:getHeaderData(
             INPUT  poRequest    ,
-            INPUT  cQueryString ,
             OUTPUT ccompany     ,
             OUTPUT cuser_name   ,
             OUTPUT cAnzeigeName ,

+ 10 - 0
update/ListAllFormIds.p

@@ -0,0 +1,10 @@
+
+DEF VAR cString AS CHAR NO-UNDO.
+
+FOR EACH htmlDOkumente WHERE company = '1000' AND user_name = 'admin' AND language_id = 1:
+    cString = cString
+        + (IF cString = '' THEN '' ELSE ', ')
+        + htmldokumente.form_id.
+END.
+
+UPDATE cstring VIEW-AS EDITOR SIZE 60 BY 3.

+ 4 - 0
utilities/lookupHandler.cls

@@ -209,4 +209,8 @@ CLASS utilities.lookupHandler:
 
     END METHOD.
 
+    DESTRUCTOR PUBLIC lookupHandler ( ):
+
+    END DESTRUCTOR.
+
 END CLASS.

+ 4 - 9
utilities/selectboxHandler.cls

@@ -251,7 +251,7 @@ CLASS utilities.selectboxHandler:
         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.
@@ -303,7 +303,7 @@ CLASS utilities.selectboxHandler:
         hQuery:SET-BUFFERS(hBuffer).
         
         DO ii = 1 TO 4:
-            // IF hQuery:QUERY-OPEN () THEN hQuery:QUERY-CLOSE ().
+// IF hQuery:QUERY-OPEN () THEN hQuery:QUERY-CLOSE ().
             
             FIND FIRST ttParam.
             
@@ -312,7 +312,7 @@ CLASS utilities.selectboxHandler:
             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.
@@ -364,11 +364,6 @@ CLASS utilities.selectboxHandler:
         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.
@@ -486,7 +481,7 @@ CLASS utilities.selectboxHandler:
                     ).
 // oJsonBox:WriteFile('C:\TEMP\JsonBox.json', TRUE).
                 oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
-oJsonSelectBoxes:WriteFile(SUBSTITUTE('C:\TEMP\&1_JsonSelectBoxes.json', cFieldName), TRUE).
+// oJsonSelectBoxes:WriteFile(SUBSTITUTE('C:\TEMP\&1_JsonSelectBoxes.json', cFieldName), TRUE).
             END.
         END.
 

+ 258 - 146
utilities/utilitiesHandler.cls

@@ -10,7 +10,8 @@
  ----------------------------------------------------------------------*/
 
 USING Progress.Json.ObjectModel.JsonObject FROM PROPATH.
-USING OpenEdge.Net.HTTP.IHttpRequest       FROM PROPATH.
+
+USING OpenEdge.Web.IWebRequest             FROM PROPATH.
 
 CLASS utilities.utilitiesHandler: 
 
@@ -20,11 +21,11 @@ PROCEDURE GetUserNameA EXTERNAL "advapi32.dll":
     DEFINE RETURN       PARAMETER bool         AS SHORT.
 END PROCEDURE.
 
-    DEFINE VARIABLE i1        AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE i2        AS INTEGER   NO-UNDO.
-    DEFINE VARIABLE cProgramm AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE i1       AS INTEGER   NO-UNDO.
+    DEFINE VARIABLE i2       AS INTEGER   NO-UNDO.
+    DEFINE VARIABLE cProgram AS CHARACTER NO-UNDO.
     
-    DEFINE VARIABLE hBuffer   AS HANDLE    NO-UNDO.
+    // DEFINE VARIABLE hBuffer  AS HANDLE    NO-UNDO.
 
     /*------------------------------------------------------------------------------
      Purpose:
@@ -49,6 +50,7 @@ END PROCEDURE.
             INPUT  ''           ,
             OUTPUT lcTitle  
             ).
+            
         getErrorMessage(
             INPUT  cErrorNumber,
             INPUT  ilanguage_id,
@@ -121,8 +123,8 @@ END PROCEDURE.
         DEFINE VARIABLE cLockName    AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cLockUser    AS INTEGER   NO-UNDO.
         DEFINE VARIABLE lcMessage    AS LONGCHAR  NO-UNDO.
-        DEFINE VARIABLE iLanguage_id AS INTEGER  NO-UNDO.
-        DEFINE VARIABLE lcTitle      AS LONGCHAR NO-UNDO.
+        DEFINE VARIABLE iLanguage_id AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE lcTitle      AS LONGCHAR  NO-UNDO.
 
         DO WHILE NOT lFound:            
             FIND FIRST Ge_MIS._Lock NO-LOCK
@@ -260,109 +262,156 @@ END PROCEDURE.
         DEFINE VARIABLE cWord      AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cField     AS CHARACTER NO-UNDO.
         DEFINE VARIABLE hField     AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE iNumerisch AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE iNumerisch AS INT64     NO-UNDO.
+        DEFINE VARIABLE cBuffValue AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE i1         AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE dDate      AS DATE      NO-UNDO.
+        DEFINE VARIABLE nValue     AS DECIMAL   NO-UNDO.
 
         cWords = ''.
         DO ii = 1 TO hBuffer:NUM-FIELDS:
             hField = hBuffer:BUFFER-FIELD(ii):HANDLE.
-            IF INDEX(hField:NAME, 'SHA')  > 0  THEN NEXT.
-            IF INDEX(hField:NAME, 'word') > 0  THEN NEXT.
+            IF hField:EXTENT > 0                   THEN NEXT.
+            IF INDEX(hField:NAME, 'SHA')      > 0  THEN NEXT.
+            IF INDEX(hField:NAME, 'word')     > 0  THEN NEXT.
+            IF INDEX(hField:NAME, 'updated_') > 0  THEN NEXT.
+            IF INDEX(hField:NAME, 'created_') > 0  THEN NEXT.
             
             cDatatype = hField:DATA-TYPE.
-            IF hField:EXTENT = 0 THEN 
-            DO:
-                IF hField:BUFFER-VALUE = ?   THEN NEXT.
-                IF hField:BUFFER-VALUE = ''  THEN NEXT.
-                IF hField:BUFFER-VALUE = '0' THEN NEXT.
+            IF cDatatype = 'logical' THEN NEXT.
+            
+            cBuffValue = hField:BUFFER-VALUE.
+            IF  cBuffValue = ''  OR
+                cBuffValue = '0' OR
+                cBuffValue = ?   THEN NEXT.
+
+            DO i1 = 1 TO NUM-ENTRIES(cBuffValue, ' '):
+                cWord = ENTRY(i1, cBuffValue, ' ').
                 
-                IF  hField:NAME BEGINS 'phone'  OR
-                    hField:NAME BEGINS 'mobile' THEN 
-                DO:
-                    cWord  = REPLACE(hField:BUFFER-VALUE, ' ', '').
-                    iNumerisch = INTEGER(cWord) NO-ERROR.
-                    IF NOT ERROR-STATUS:ERROR THEN cWord = TRIM(STRING(iNumerisch,'>>>>>>>>>>>>>>9')).
-                    cWords = cWords + ' ' + SUBSTITUTE('&1&2&1', CHR(01), cWord).
-                    NEXT.
-                END.
-        
                 CASE cDatatype:
-                    WHEN 'logical'   THEN 
-                        NEXT.
-                    WHEN 'character' THEN 
-                        DO: 
-                            cWord      = hField:BUFFER-VALUE.
-                            iNumerisch = INTEGER(cWord) NO-ERROR.
-                            IF NOT ERROR-STATUS:ERROR THEN cWord = SUBSTITUTE('&1&2&1', CHR(01), cWord).
-                            cWords     = cWords + ' ' + cWord.
-                        END.
-                    WHEN 'integer'   OR
-                    WHEN 'int64'     THEN 
+                    WHEN 'date' THEN 
                         DO:
-                            cWord  = TRIM(STRING(INTEGER(hField:BUFFER-VALUE),'zzzzzzzz9-')).
-                            cWords = cWords + ' ' + CHR(01) + cWord + CHR(01).
+                            dDate = DATE(cWord) NO-ERROR.
+                            IF ERROR-STATUS:ERROR THEN NEXT.
+                            cWord = STRING(dDate,'99.99.9999').
                         END.
-                    WHEN 'decimal'   THEN 
+                    WHEN 'integer' OR 
+                    WHEN 'in64'    OR 
+                    WHEN 'decimal' THEN 
                         DO:
-                            cWord  = TRIM(STRING(DECIMAL(hField:BUFFER-VALUE),'zzzzzzzz9.9<<<-')).
-                            cWords = cWords + ' ' + CHR(01) + cWord + CHR(01).
+                            cWord = SUBSTITUTE('&1&2&1', CHR(01), cWord).
                         END.
-                    WHEN 'date'   THEN 
+                    OTHERWISE 
+                    DO:
+                        nValue = DECIMAL(cWord) NO-ERROR.
+                        IF NOT ERROR-STATUS:ERROR THEN 
                         DO:
-                            cWord  = STRING(DATE(hField:BUFFER-VALUE),'99.99.9999').
-                            cWords = cWords + ' ' + cWord.
+                            cWord = TRIM(STRING(nValue,'->>>>>>>>>9.999999')).
+                            cWord = REPLACE(cWord, '.000000', '').
+                            cWord = SUBSTITUTE('&1&2&1', CHR(01), cWord).
                         END.
-                    OTHERWISE 
-                    NEXT.
-                END CASE.
+                    END.
+                END.
+                IF LOOKUP(cWord, cWords, ' ') > 0 THEN NEXT.
+                
+                cWords = cWords + (IF cWords = '' THEN '' ELSE ' ') + cWord.
             END.
-            ELSE 
-            DO:
-                DO i1 = 1 TO hField:EXTENT:
-                    IF hField:BUFFER-VALUE(i1) = ?   THEN NEXT.
-                    IF hField:BUFFER-VALUE(i1) = ''  THEN NEXT.
-                    IF hField:BUFFER-VALUE(i1) = '0' THEN NEXT.
+        END.
         
+        cWords     = TRIM(cWords).
+        cWords     = REPLACE(cWords, '  ', ' ').
+        cWordIndex = TRIM(cWords).
+
+        RETURN cWordIndex.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
+    METHOD PUBLIC CHARACTER createWordindexFromTable(
+        INPUT hBuffer AS HANDLE
+        ):
+        
+        DEFINE VARIABLE cWordIndex AS CHARACTER NO-UNDO.
+        
+        DEFINE VARIABLE cWords     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE ii         AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE cDatatype  AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cWord      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cField     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE hField     AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE iNumerisch AS INT64     NO-UNDO.
+        DEFINE VARIABLE cBuffValue AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE i1         AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE dDate      AS DATE      NO-UNDO.
+        DEFINE VARIABLE nValue     AS DECIMAL   NO-UNDO.
+        
+        DEFINE VARIABLE hQuery     AS HANDLE    NO-UNDO.
+
+        CREATE QUERY hQuery.
+        hQuery:SET-BUFFERS(hBuffer).
+        hQuery:QUERY-PREPARE ('FOR EACH ttWordIndexTable NO-LOCK ').
+        hQuery:QUERY-OPEN ().
+        hQuery:GET-FIRST () NO-ERROR.
+        cWords = ''.
+        DO WHILE NOT hQuery:QUERY-OFF-END:
+            cDatatype  = hBuffer::cDataType.
+            cBuffValue = hBuffer::cValue.
+            cField     = hBuffer::cFieldName.
+
+            DO WHILE TRUE:
+                IF  cBuffValue = ''  OR
+                    cBuffValue = '0' OR
+                    cBuffValue = ?   THEN LEAVE.
+
+                cBuffValue = REPLACE(cBuffValue, '  '   , ' '). 
+                cBuffValue = REPLACE(cBuffValue, CHR(10), ' '). 
+                cBuffValue = REPLACE(cBuffValue, CHR(13), ' '). 
+                DO i1 = 1 TO NUM-ENTRIES(cBuffValue, ' '):
+                    cWord = ENTRY(i1, cBuffValue, ' ').
+                
                     CASE cDatatype:
-                        WHEN 'logical'   THEN 
-                            NEXT.
-                        WHEN 'character' THEN 
-                            DO: 
-                                cWord      = hField:BUFFER-VALUE(i1).
-                                iNumerisch = INTEGER(cWord) NO-ERROR.
-                                IF NOT ERROR-STATUS:ERROR THEN cWord = SUBSTITUTE('&1&2&1', CHR(01), cWord).
-                                cWords     = cWords + ' ' + cWord.
-                            END.
-                        WHEN 'integer'   THEN 
+                        WHEN 'date' THEN 
                             DO:
-                                cWord  = TRIM(STRING(INTEGER(hField:BUFFER-VALUE(i1)),'zzzzzzzz9-')).
-                                cWords = cWords + ' ' + CHR(01) + cWord + CHR(01).
+                                dDate = DATE(cWord) NO-ERROR.
+                                IF ERROR-STATUS:ERROR THEN NEXT.
+                                cWord = STRING(dDate,'99.99.9999').
                             END.
-                        WHEN 'decimal'   THEN 
+                        WHEN 'integer' OR 
+                        WHEN 'in64'    OR 
+                        WHEN 'decimal' THEN 
                             DO:
-                                cWord  = TRIM(STRING(DECIMAL(hField:BUFFER-VALUE(i1)),'zzzzzzzz9.9<<<-')).
-                                cWords = cWords + ' ' + CHR(01) + cWord + CHR(01).
+                                cWord = SUBSTITUTE('&1&2&1', CHR(01), cWord).
                             END.
-                        WHEN 'date'   THEN 
+                        OTHERWISE 
+                        DO:
+                            nValue = DECIMAL(cWord) NO-ERROR.
+                            IF NOT ERROR-STATUS:ERROR THEN 
                             DO:
-                                cWord  = STRING(DATE(hField:BUFFER-VALUE(i1)),'99.99.9999').
-                                cWords = cWords + ' ' + cWord.
+                                cWord = TRIM(STRING(nValue,'->>>>>>>>>9.999999')).
+                                cWord = REPLACE(cWord, '.000000', '').
+                                cWord = SUBSTITUTE('&1&2&1', CHR(01), cWord).
                             END.
-                        OTHERWISE 
-                        NEXT.
+                        END.
                     END CASE.
+
+                    IF LOOKUP(cWord, cWords, ' ') > 0 THEN NEXT.
+                
+                    cWords = cWords + (IF cWords = '' THEN '' ELSE ' ') + cWord.
                 END.
+                LEAVE.
             END.
+            hQuery:GET-NEXT ().
         END.
-        cWordIndex = ''.
+        
         cWords     = TRIM(cWords).
         cWords     = REPLACE(cWords, '  ', ' ').
-        DO ii = 1 TO NUM-ENTRIES(cWords, ' '):
-            cWord = TRIM(ENTRY(ii, cWords, ' ')).
-            IF LOOKUP(cWord, cWordIndex, ' ') > 0 THEN NEXT.
-            cWordIndex = cWordIndex + ' ' + cWord.
-        END.
-        cWordIndex = TRIM(cWordIndex).
-        cWordIndex = REPLACE(cWordIndex, '  ', ' ').
+        cWordIndex = TRIM(cWords).
+        
+        DELETE OBJECT hQuery.
 
         RETURN cWordIndex.
 
@@ -373,6 +422,23 @@ END PROCEDURE.
      Notes:
     ------------------------------------------------------------------------------*/
 
+    METHOD PUBLIC CHARACTER date2iso(
+        INPUT dDate AS DATE
+        ):
+        
+        DEFINE VARIABLE cisoDate AS CHARACTER NO-UNDO.
+        
+        cisoDate = SUBSTITUTE('&1-&2-&3', STRING(YEAR(dDate),'9999'), STRING(MONTH(dDate),'99'), STRING(DAY(dDate),'99')).
+
+        RETURN cisoDate.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
     METHOD PUBLIC LOGICAL evaluateErrorStatus(
         INPUT hError AS HANDLE
         ):
@@ -419,15 +485,15 @@ END PROCEDURE.
         
         DEFINE VARIABLE ccompany         AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cuser_name       AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cprogram         AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cClassName       AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cActiveSelection AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFormId          AS CHARACTER NO-UNDO.
         
         DEFINE VARIABLE rPrimeIndex      AS RECID     NO-UNDO.
         DEFINE VARIABLE rField           AS RECID     NO-UNDO.
         DEFINE VARIABLE hQuery           AS HANDLE    NO-UNDO.
         DEFINE VARIABLE cKeyField        AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cField           AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFieldName       AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cValue           AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cFieldNames      AS CHARACTER NO-UNDO EXTENT.
         DEFINE VARIABLE cKeyFieldReplace AS CHARACTER NO-UNDO.
@@ -435,14 +501,13 @@ END PROCEDURE.
         ccompany   = oJsonIdent:GetCharacter('company'  ) NO-ERROR.            
         cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.            
         cprogram   = oJsonIdent:GetCharacter('program'  ) NO-ERROR.
-                    
-        cFileName  = ENTRY(1, oJsonIdent:GetCharacter('formId'), '_').
-        cClassName = ENTRY(1, oJsonIdent:GetCharacter('formId'), '_').
-        
-        IF oJsonIdent:HAS('file_name')  THEN oJsonIdent:SET('file_name' , cFileName ).
-        ELSE                                 oJsonIdent:ADD('file_name' , cFileName ).
-        IF oJsonIdent:HAS('class_name') THEN oJsonIdent:SET('class_name', cClassName).
-        ELSE                                 oJsonIdent:ADD('class_name', cClassName).
+        cFormId    = oJsonIdent:GetCharacter('formId'   ) NO-ERROR.
+        IF oJsonIdent:HAS('file_name') THEN cFileName = oJsonIdent:GetCharacter('file_name').
+        ELSE 
+        DO:
+            cFileName = ENTRY(1, cFormId, '_').
+            oJsonIdent:ADD('file_name', cFileName).
+        END.
 
         ASSIGN 
             lCompany   = FALSE
@@ -560,20 +625,24 @@ END PROCEDURE.
         cFieldNames      = oJsonIdent:getNames().
         cKeyFieldReplace = SUBSTITUTE ('keyField_&1_', cFileName).
         DO i1 = 1 TO EXTENT(cFieldNames):
-            IF NOT cFieldNames[i1] BEGINS 'keyfield' THEN NEXT.
-            cKeyField = cFieldNames[i1].
-            cField    = REPLACE(cKeyField, cKeyFieldReplace, '').
+            IF NOT cFieldNames[i1] BEGINS 'keyfield'          THEN NEXT.
             
+            cFieldName = cFieldNames[i1].
+            IF NOT ENTRY(2, cFieldName, '_') = cFileName THEN ENTRY(2, cFieldName, '_') = cFileName.
+            
+            cKeyField = cFieldNames[i1].
+            cField    = REPLACE(cFieldName, cKeyFieldReplace, '').
+
             cWhere = SUBSTITUTE('WHERE cFieldName = &1 ', QUOTER(cField) ).
             lOK = httKeyFields:FIND-FIRST(cWhere, NO-LOCK) NO-ERROR.
             IF lOK THEN 
             DO:
-                cValue = oJsonIdent:GetCharacter(cKeyField).
+                cValue = oJsonIdent:GetCharacter(cKeyField) NO-ERROR.
                 httKeyFields::cvalue = cValue.
                 NEXT.
             END.
-            
-            cValue    = oJsonIdent:GetCharacter(cKeyField).
+
+            cValue    = oJsonIdent:GetCharacter(cKeyField) NO-ERROR.
             cWhere    = SUBSTITUTE('WHERE &1._File-recid = &2 AND &1._Field-Name = &3', '_Field', rRecid, QUOTER(cField)).
             hField:FIND-FIRST(cWhere, NO-LOCK).
             httKeyFields:BUFFER-CREATE().
@@ -680,10 +749,14 @@ END PROCEDURE.
         iPage          = 1.       
         iMaxRecords    = 25.
         iCurrentPos    = 0.
-        IF oJsonIdent:HAS('limit') THEN
-            iMaxRecords = (IF oJsonIdent:getType('limit') = 1 THEN INTEGER(oJsonIdent:GetCharacter('limit')) ELSE oJsonIdent:GetInteger('limit')) NO-ERROR.
+        IF oJsonIdent:HAS('limit') THEN 
+        DO:
+            iMaxRecords = (IF  oJsonIdent:getType('limit') = 1
+                THEN INTEGER(oJsonIdent:GetCharacter('limit'))
+                ELSE oJsonIdent:GetInteger('limit')) NO-ERROR.
+        END.
         cWhere = REPLACE(cWhere, 'FOR', 'PRESELECT').
-MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
+//MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         CREATE QUERY hQuery.
         CREATE BUFFER hBuffer FOR TABLE cFileName.
         hQuery:SET-BUFFERS (hBuffer).
@@ -713,6 +786,10 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
             iPage  = ((iCurrentPos - iIndex) / iMaxRecords) + 1.
             iIndex = iIndex - 1.
         END. 
+        IF (iPage * iMaxRecords) > iTotalRecords THEN iMaxRecords = iMaxRecords - ((iPage * iMaxRecords) - iTotalRecords).
+        IF oJsonIdent:HAS('recordCount')
+            THEN oJsonIdent:SET('recordCount', iMaxRecords).
+        ELSE oJsonIdent:ADD('recordCount', iMaxRecords).
 
         IF oJsonIdent:HAS('page')
             THEN oJsonIdent:SET('page', iPage).
@@ -723,7 +800,8 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         IF oJsonIdent:HAS('totalRecords')
             THEN oJsonIdent:SET('totalRecords', iTotalRecords).
         ELSE     oJsonIdent:ADD('totalRecords', iTotalRecords).
-        MESSAGE 'page =' iPage 'index =' iIndex 'totalRecords =' iTotalRecords 'Max Records =' iMaxRecords 'Current Pos =' iCurrentPos.
+// MESSAGE 'page =' iPage 'index =' iIndex 'totalRecords =' iTotalRecords 'Max Records =' iMaxRecords 'Current Pos =' iCurrentPos.
+// oJsonIdent:WriteFile('C:\TEMP\evaluatePageNumber_jsonIdent.json', TRUE).
         lRetVal = TRUE.
         RETURN lRetVal.
 
@@ -776,12 +854,13 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         DEFINE VARIABLE ccompany   AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cProgram   AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cUsers     AS CHARACTER NO-UNDO.
         
         ASSIGN 
             ccompany   = oJsonIdent:GetCharacter('company')
             cuser_name = oJsonIdent:GetCharacter('user_name')
             cProgram   = oJsonIdent:GetCharacter('program').
- 
+            
         FIND userdata NO-LOCK
             WHERE userdata.user_name   = cuser_name
             AND   userdata.company     = ccompany
@@ -804,6 +883,31 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
      Notes:
     ------------------------------------------------------------------------------*/
 
+    METHOD PUBLIC CHARACTER getBoxFieldText(
+        INPUT oJsonIdent  AS JsonObject,
+        INPUT cField      AS CHARACTER ,
+        INPUT cFieldValue AS CHARACTER 
+        ):
+        
+        DEFINE VARIABLE cText AS CHARACTER NO-UNDO.
+        
+        FIND selections NO-LOCK 
+            WHERE selections.company     = oJsonIdent:GetCharacter('company')
+            AND   selections.table_name  = 'table'
+            AND   selections.user_name   = oJsonIdent:GetCharacter('user_name')
+            AND   selections.language_id = oJsonIdent:GetInteger('language_id')
+            AND   selections.field_name  = cField
+            AND   selections.field_value = cFieldValue NO-ERROR.
+        cText = (IF AVAILABLE selections THEN selections.field_show ELSE '').
+        RETURN cText.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
     METHOD PUBLIC CHARACTER getBufferFieldValue( INPUT iphfield_name AS HANDLE, OUTPUT oplQuoter AS LOGICAL ):
         
         DEFINE VARIABLE cfield_nameInhalt AS CHARACTER NO-UNDO.
@@ -1052,8 +1156,7 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
     ------------------------------------------------------------------------------*/
 
     METHOD PUBLIC LOGICAL getHeaderData(
-        INPUT  poRequest     AS IHttpRequest,
-        INPUT  cQueryString  AS CHARACTER   ,
+        INPUT  poRequest     AS IWebRequest ,
         OUTPUT ccompany      AS CHARACTER   ,
         OUTPUT cuser_name    AS CHARACTER   ,
         OUTPUT cAnzeigeName  AS CHARACTER   ,
@@ -1063,17 +1166,18 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         OUTPUT oJsonIdent    AS JsonObject
         ):
         
-        DEFINE VARIABLE oHeader     AS OpenEdge.Net.HTTP.HttpHeader NO-UNDO.
+        DEFINE VARIABLE oHeader      AS OpenEdge.Net.HTTP.HttpHeader NO-UNDO.
         
-        DEFINE VARIABLE lRetVal     AS LOGICAL                      NO-UNDO.
-        DEFINE VARIABLE ii          AS INTEGER                      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 lRetVal      AS LOGICAL                      NO-UNDO.
+        DEFINE VARIABLE ii           AS INTEGER                      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 cQueryString AS CHARACTER                    NO-UNDO.
         
-        DEFINE VARIABLE cFormId     AS CHARACTER                    NO-UNDO.
-        DEFINE VARIABLE cClassName  AS CHARACTER                    NO-UNDO.
-        DEFINE VARIABLE cFilename   AS CHARACTER                    NO-UNDO.
+        DEFINE VARIABLE cFormId      AS CHARACTER                    NO-UNDO.
+        DEFINE VARIABLE cClassName   AS CHARACTER                    NO-UNDO.
+        DEFINE VARIABLE cFilename    AS CHARACTER                    NO-UNDO.
 
         oHeader      = poRequest:GetHeader('X-COMPANY').
         ccompany     = oHeader:VALUE.
@@ -1090,11 +1194,15 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         oHeader = poRequest:GetHeader('X-SESSION-TOKEN').
         cSessionToken = oHeader:VALUE.
         
+        cQueryString = STRING(poRequest:GetContextValue("QUERY_STRING")) NO-ERROR.
+        cQueryString = OpenEdge.Net.URI:Decode(cQueryString).
+// MESSAGE 'cQueryYString =' cQueryString.
         oJsonIdent = NEW JsonObject().
-        oJsonIdent:ADD('H_company'    , ccompany     )   NO-ERROR.
-        oJsonIdent:ADD('H_user_name'  , cuser_name   )   NO-ERROR.
-        oJsonIdent:ADD('H_language_id', iLanguage_id )   NO-ERROR.
-        oJsonIdent:ADD('sessionToken' , cSessionToken)   NO-ERROR.
+        oJsonIdent:ADD('H_company'     , ccompany     )   NO-ERROR.
+        oJsonIdent:ADD('H_user_name'   , cuser_name   )   NO-ERROR.
+        oJsonIdent:ADD('H_language_id' , iLanguage_id )   NO-ERROR.
+        oJsonIdent:ADD('H_display_name', cAnzeigeName )   NO-ERROR.
+        oJsonIdent:ADD('sessionToken'  , cSessionToken)   NO-ERROR.
         //
         //  Alle Parameter aus dem Query-String lesen und im Object oJsonIdent ergänzenz
         //
@@ -1109,20 +1217,26 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         IF NOT oJsonIdent:HAS('company'    ) THEN oJsonIdent:ADD('company'    , oJsonIdent:GetCharacter('H_company'    )).
         IF NOT oJsonIdent:HAS('user_name'  ) THEN oJsonIdent:ADD('user_name'  , oJsonIdent:GetCharacter('H_user_name'  )).
         IF NOT oJsonIdent:HAS('language_id') THEN oJsonIdent:ADD('language_id', oJsonIdent:GetJsonText ('H_language_id')).
+        
         //  language_id soll immer ein Interger-Wert sein
         oJsonIdent:SET('language_id', INTEGER(oJsonIdent:GetJsonText('language_id'))).
         
-// cFileName = SUBSTITUTE ('C:\TEMP\oJsonIdent_getHeaderData_&1.log', REPLACE(STRING(TIME,'HH:MM:SS'),':', '')).
-// oJsonIdent:WriteFile(cFileName, TRUE).
-
         IF oJsonIdent:HAS('formId') THEN 
         DO:
-            cFormId = oJsonIdent:GetCharacter('formId') NO-ERROR.
-
-            cClassname  = ENTRY(1, cFormId, '_').
-            cFileName   = ENTRY(1, cFormId, '_').
-            oJsonIdent:ADD('class_name', cClassName).
-            oJsonIdent:ADD('file_name' , cFileName ).
+            cFormId   = oJsonIdent:GetCharacter('formId').
+            cFileName = ENTRY(1, cFormId, '_'). 
+            IF NOT oJsonIdent:HAS('file_name') THEN oJsonIdent:ADD('file_name', cFileName).
+        
+// cFileName = SUBSTITUTE ('C:\TEMP\oJsonIdent_getHeaderData_&1.log', cFormId).
+// oJsonIdent:WriteFile(cFileName, TRUE).
+            FIND FIRST programs NO-LOCK 
+                WHERE programs.FormId = cFormId NO-ERROR.
+            IF AVAILABLE programs THEN 
+            DO:
+                oJsonIdent:ADD('class_name', programs.program_class).
+                cProgram = programs.program.
+// MESSAGE 'programm gefunden mit FormId' cFormId.
+            END.
         END.
         
         ccompany     = oJsonIdent:GetCharacter('company').
@@ -1257,7 +1371,6 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         INPUT-OUTPUT cMaxHeight    AS CHARACTER
         ):
         
-        DEFINE VARIABLE cProgram     AS CHARACTER NO-UNDO.
         DEFINE VARIABLE ccompany     AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cFormId      AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cProgramUser AS CHARACTER NO-UNDO.
@@ -1265,12 +1378,13 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         cProgram = ''.
         ccompany = oJsonIdent:GetCharacter('company').
         cFormId  = oJsonIdent:GetCharacter('formId' ).
+        
         DO i1 = 1 TO NUM-ENTRIES(cUsers, ','): 
             cProgramUser = ENTRY(i1, cUsers).
             FIND FIRST htmldokumente NO-LOCK 
-                WHERE htmldokumente.company     = ccompany
-                AND   htmldokumente.user_name   = cProgramUser
-                AND   htmldokumente.form_id     = cFormId NO-ERROR.
+                WHERE htmldokumente.company   = ccompany
+                AND   htmldokumente.user_name = cProgramUser
+                AND   htmldokumente.FormId    = cFormId NO-ERROR.
             IF NOT AVAILABLE htmldokumente THEN NEXT. 
 
             ASSIGN 
@@ -1340,22 +1454,19 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         INPUT  oJsonIdent       AS JsonObject,
         OUTPUT cWhere           AS CHARACTER
         ):
-            
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata NO-LOCK
-                WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                AND   userdata.company     = oJsonIdent:GetCharacter('company')
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'lastrecord'
-                AND   userdata.section     = oJsonIdent:GetCharacter('file_name') 
-                AND   userdata.key_type    = '' NO-ERROR.
+
+        FIND userdata NO-LOCK
+            WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+            AND   userdata.company     = oJsonIdent:GetCharacter('company')
+            AND   userdata.branch      = '0000'
+            AND   userdata.record_type = 'lastrecord'
+            AND   userdata.section     = oJsonIdent:GetCharacter('file_name') 
+            AND   userdata.key_type    = '' NO-ERROR.
               
-            IF NOT AVAILABLE userdata THEN RETURN FALSE.
+        IF NOT AVAILABLE userdata THEN RETURN FALSE.
              
-            cWhere = userdata.cfield_1.
-            RELEASE userdata.
-            LEAVE.
-        END.
+        cWhere = userdata.cfield_1.
+        RELEASE userdata.
         
         RETURN TRUE.
         
@@ -1412,6 +1523,8 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         DEFINE VARIABLE cFieldName AS CHARACTER NO-UNDO.
         DEFINE VARIABLE ix         AS INTEGER   NO-UNDO.
         
+        DEFINE VARIABLE hBuffer    AS HANDLE    NO-UNDO.
+        
         DO ix = 1 TO NUM-ENTRIES(cDBNames, ';'):
             cDBName   = ENTRY(ix, cDBNames, ';').
             cFileName = SUBSTITUTE('&1.&2', cDBName, ipcTable).
@@ -1516,7 +1629,7 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
         hbttTemp:FIND-FIRST ().
         
         hbttTemp:WRITE-JSON('longchar', lcJsonString, FALSE).
-        MESSAGE 'Daten zweiter Buffer -> ' STRING(lcJsonString). 
+// MESSAGE 'Daten zweiter Buffer -> ' STRING(lcJsonString). 
 
         lRetVal = TRUE.
         RETURN lRetVal.
@@ -1605,7 +1718,6 @@ MESSAGE 'cWhere =' cWhere 'Filename =' cFileName.
             
         DEFINE VARIABLE ccompany   AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cProgram   AS CHARACTER NO-UNDO.
         
         ASSIGN 
             ccompany   = oJsonIdent:GetCharacter('company')

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików