Browse Source

Summary 03.06.2026 09:40

walter.riechsteiner 3 weeks ago
parent
commit
3bc15c915c

+ 185 - 102
addresses/addressprogsHandler.cls

@@ -31,6 +31,8 @@ CLASS addresses.addressprogsHandler FINAL:
     DEFINE VARIABLE oJsonPosition    AS JsonObject        NO-UNDO.
     DEFINE VARIABLE oJsonIdent       AS JsonObject        NO-UNDO.
     
+    DEFINE VARIABLE oJsonBoxContacts AS JsonObject        NO-UNDO.
+    
     DEFINE VARIABLE cUser_Name       AS CHARACTER         NO-UNDO.
     DEFINE VARIABLE cCompany         AS CHARACTER         NO-UNDO.
     DEFINE VARIABLE iLanguage_id     AS INTEGER           NO-UNDO.
@@ -62,7 +64,9 @@ CLASS addresses.addressprogsHandler FINAL:
     DEFINE VARIABLE hError           AS HANDLE            NO-UNDO.
     
     DEFINE VARIABLE cWhere           AS CHARACTER         NO-UNDO.
-    DEFINE VARIABLE cUniqueWhere     AS CHARACTER         NO-UNDO.
+    DEFINE VARIABLE cUniqueWhere AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cLastAddressWhere     AS CHARACTER         NO-UNDO.
+    DEFINE VARIABLE hLastAddressBuff AS HANDLE NO-UNDO.
     
     DEFINE VARIABLE iAnzahlRecords   AS INTEGER           NO-UNDO.
     DEFINE VARIABLE iActualPage      AS INTEGER           NO-UNDO.
@@ -150,6 +154,7 @@ CLASS addresses.addressprogsHandler FINAL:
         DEFINE VARIABLE cUsers     AS CHARACTER         NO-UNDO.
         DEFINE VARIABLE iItemsPage AS INTEGER           NO-UNDO.
         DEFINE VARIABLE cMaxHeight AS CHARACTER         NO-UNDO.
+        DEFINE VARIABLE cOrigFileName AS CHARACTER NO-UNDO.
         
         hError = ERROR-STATUS:HANDLE.
         
@@ -173,6 +178,22 @@ CLASS addresses.addressprogsHandler FINAL:
         //
         //  Ermitteln des Tabellennamens, ob die Tabelle das Feld "company" und/oder das Feld "active" enthält
         //
+        IF oJsonIdent:HAS('file_name') THEN cFileName = oJsonIdent:GetCharacter('file_name').
+        IF  ipcFunction = 'loaddata' AND 
+            cFileName <> 'addresses' THEN 
+        DO:
+            cOrigFileName = cFileName.
+            oJsonIdent:SET('file_name', 'addresses') NO-ERROR .
+            outilitiesHandler:readLastRecord(
+                INPUT  oJsonIdent,
+                OUTPUT cLastAddressWhere
+                ).
+            CREATE BUFFER hLastAddressBuff FOR TABLE 'addresses'.
+            hLastAddressBuff:FIND-UNIQUE(cLastAddressWhere, NO-LOCK).
+            oJsonIdent:ADD(SUBSTITUTE('keyfield_&1_address_id', cFileName), STRING(hLastAddressBuff::address_id)).
+            oJsonIdent:set('file_name', cOrigFileName).
+        END.
+        
         outilitiesHandler:evaluateFile(
             INPUT-OUTPUT oJsonIdent     ,
             OUTPUT       cFileName      ,
@@ -182,10 +203,25 @@ CLASS addresses.addressprogsHandler FINAL:
             INPUT-OUTPUT httKeyFields   ,
             INPUT-OUTPUT httPrimaryIndex
             ).
-        oJsonIdent:write(lcString).
         //
         //  erstellen TEMP-TABLE aus oJsonObject mit dem HADLE htt
         //
+MESSAGE 'CONSTRUCTOR ipcFunction =' ipcFunction SKIP
+        'CONSTRUCTOR cFileName   =' oJsonIdent:GetCharacter('file_name') '/' cFileName.
+/*        IF  ipcFunction = 'loaddata' AND                                                  */
+/*            cFileName <> 'addresses' THEN DO:                                             */
+/*            cOrigFileName = cFileName.                                                    */
+/*            oJsonIdent:SET('file_name', 'addresses') NO-ERROR .                           */
+/*            outilitiesHandler:readLastRecord(                                             */
+/*                INPUT  oJsonIdent,                                                        */
+/*                OUTPUT cLastAddressWhere                                                  */
+/*                ).                                                                        */
+/*            CREATE BUFFER hLastAddressBuff FOR TABLE 'addresses'.                         */
+/*            hLastAddressBuff:FIND-UNIQUE(cLastAddressWhere, NO-LOCK).                     */
+/*            oJsonIdent:ADD('keyfield_addresses_address_id', hLastAddressBuff::address_id).*/
+/*            oJsonIdent:set('file_name', cOrigFileName).                                   */
+/*        END.                                                                              */
+oJsonIdent:WriteFile(SUBSTITUTE('C:\TEMP\adressprogsHandler_contructore_&1_&2.json', ipcFunction, cFileName), TRUE).
         oJsonIdent:WRITE(lcInput, FALSE).
 // MESSAGE STRING(lcInput).
         CREATE TEMP-TABLE ttJsonIdent.
@@ -236,7 +272,7 @@ CLASS addresses.addressprogsHandler FINAL:
         DEFINE VARIABLE cFilter      AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cDBField     AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cType        AS CHARACTER NO-UNDO.
-
+MESSAGE 'FileName in BuildWhere' cFileName.
         CREATE BUFFER hBuffer FOR TABLE cFileName.
         
         cSortField  = ''.
@@ -640,7 +676,7 @@ CLASS addresses.addressprogsHandler FINAL:
 // oJsonRecord:WriteFile('C:\TEMP\createBegin_jsonrecord_request.json', TRUE).        
         oMasterKeyFields = NEW JsonObject().
         oMasterKeyFields = oJsonData:GetJsonObject('masterKeyfields') NO-ERROR.
-// oMasterKeyFields:WriteFile('C:\TEMP\createBegin_MasterKeyFields.json', TRUE).        
+oMasterKeyFields:WriteFile(SUBSTITUTE('C:\TEMP\createBegin_MasterKeyFields_&1.json', cFileName), TRUE).        
         
         CREATE BUFFER hBuffer FOR TABLE cFileName.
         createTempTable().
@@ -650,40 +686,6 @@ CLASS addresses.addressprogsHandler FINAL:
         outilitiesHandler:evaluateErrorStatus(hError).
         httTable:FIND-FIRST('', NO-LOCK).
 
-        /*        EXTENT(cFieldNames) = ?.                                                                                          */
-        /*        cFieldNames = oMasterKeyFields:GetNames().                                                                        */
-        /*        DO ii = 1 TO EXTENT(cFieldNames):                                                                                 */
-        /*            cField       = cFieldNames[ii].                                                                               */
-        /*            cField       = ENTRY(1, cField, '_').                                                                         */
-        /*            cBufferField = SUBSTRING(cField,02).                                                                          */
-        /*            hField       = httTable:BUFFER-FIELD(cBufferField):HANDLE NO-ERROR.                                           */
-        /*            IF ERROR-STATUS:ERROR        THEN NEXT.                                                                       */
-        /*            IF NOT VALID-HANDLE (hField) THEN NEXT.                                                                       */
-        /*                                                                                                                          */
-        /*            iType = oJsonRecord:getType(cField).                                                                          */
-        /*            CASE iType:                                                                                                   */
-        /*                WHEN 2 THEN                                                                                               */
-        /*                    DO:                                                                                                   */
-        /*                        iValue = oJsonRecord:GetInteger(cField).                                                          */
-        /*                        hField:BUFFER-VALUE = iValue NO-ERROR.                                                            */
-        /*                        oJsonRecord:SET(cField, iValue).                                                                  */
-        /*                    END.                                                                                                  */
-        /*                WHEN 3 THEN                                                                                               */
-        /*                    DO:                                                                                                   */
-        /*                        lValue = oJsonRecord:GetLogical(cField).                                                          */
-        /*                        hField:BUFFER-VALUE = lValue NO-ERROR.                                                            */
-        /*                        oJsonRecord:SET(cField, lValue).                                                                  */
-        /*                    END.                                                                                                  */
-        /*                OTHERWISE                                                                                                 */
-        /*                DO:                                                                                                       */
-        /*                    cValue = oJsonRecord:GetCharacter(cField).                                                            */
-        /*                    IF hField:DATA-TYPE = 'character' THEN hField:BUFFER-VALUE = cValue NO-ERROR.                         */
-        /*                    IF hField:DATA-TYPE = 'date'      THEN hField:BUFFER-VALUE = DATE(outilitiesHandler:iso2date(cValue)).*/
-        /*                    oJsonRecord:SET(cField, cValue).                                                                      */
-        /*                END.                                                                                                      */
-        /*            END CASE.                                                                                                     */
-        /*            lOk = outilitiesHandler:evaluateErrorStatus(hError).                                             */
-        /*        END.                                                                                                              */
         IF lCompany THEN 
         DO:
             httTable::company = cCompany.
@@ -695,7 +697,7 @@ CLASS addresses.addressprogsHandler FINAL:
             VALID-HANDLE(hField) THEN 
         DO:
             hField:BUFFER-VALUE = NOW.
-            oJsonRecord:SET(SUBSTITUTE('&1_&2', cFileName, 'created_at'), outilitiesHandler:date2iso(TODAY)).
+            IF INDEX(lcttTable, 'created_at') > 0 THEN oJsonRecord:SET(SUBSTITUTE('&1_&2', cFileName, 'created_at'), outilitiesHandler:date2iso(TODAY)).
         END.
               
         hField = httTable:BUFFER-FIELD('created_by') NO-ERROR.
@@ -703,7 +705,7 @@ CLASS addresses.addressprogsHandler FINAL:
             VALID-HANDLE(hField) THEN 
         DO:
             hField:BUFFER-VALUE = oJsonIdent:GetCharacter('H_display_name').
-            oJsonRecord:SET(SUBSTITUTE('&1_&2', cFileName, 'created_by'), oJsonIdent:GetCharacter('H_display_name')).
+            IF INDEX(lcttTable, 'created_by') > 0 THEN oJsonRecord:SET(SUBSTITUTE('&1_&2', cFileName, 'created_by'), oJsonIdent:GetCharacter('H_display_name')).
         END.
             
         /*        oMasterKeyFields    = NEW JsonObject().                          */
@@ -784,6 +786,7 @@ CLASS addresses.addressprogsHandler FINAL:
         DEFINE VARIABLE rBuffer          AS RECID      NO-UNDO.
         DEFINE VARIABLE iContact_Id      AS INTEGER    NO-UNDO.
         DEFINE VARIABLE cFieldValue      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE hContact         AS HANDLE     NO-UNDO.
         
         DEFINE VARIABLE lcttTable        AS LONGCHAR   NO-UNDO.
 
@@ -815,7 +818,27 @@ CLASS addresses.addressprogsHandler FINAL:
 
         CASE cFileName:
             WHEN 'addresses' THEN 
-                httTable::address_id = NEXT-VALUE(masterdata_id).
+                DO:
+                    iAddress_Id          = NEXT-VALUE(masterdata_id).
+                    httTable::address_id = iAddress_Id.
+                    
+                    FIND contact_persons 
+                        WHERE contact_persons.company    = cCompany
+                        AND   contact_persons.address_Id = iAddress_Id
+                        AND   contact_persons.contact_id = 0 NO-ERROR.
+                    IF NOT AVAILABLE contact_persons THEN 
+                    DO:
+                        CREATE  contact_persons.
+                        ASSIGN
+                            contact_persons.company    = cCompany
+                            contact_persons.address_id = iAddress_Id
+                            contact_persons.contact_id = 0.
+                    END.
+                    hContact =  BUFFER contact_persons:HANDLE.
+                    hContact:BUFFER-COPY(httTable, 'commpany,address_id,contact_id,created_at,created_by,updated_at,updated_by').
+                    contact_persons.created_at = NOW.
+                    contact_persons.created_by = oJsonIdent:GetCharacter('H_display_name').
+                END.
             WHEN 'contact_persons' THEN 
                 DO:
                     FIND LAST contact_persons NO-LOCK 
@@ -833,7 +856,7 @@ CLASS addresses.addressprogsHandler FINAL:
             ).
 
         lRetVal = FALSE.
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+        REPEAT /*TRANSACTION*/ ON ERROR UNDO, LEAVE:
             lOK = hBuffer:FIND-UNIQUE(cUniqueWhere, NO-LOCK) NO-ERROR.
             //
             //  Wenn gefunden, dann Fehler weil doppelte ID
@@ -1002,6 +1025,7 @@ CLASS addresses.addressprogsHandler FINAL:
             
         CREATE BUFFER hUniqueBuffer FOR TABLE 'addresses'.
         hUniqueBuffer:FIND-UNIQUE (cUniqueWhere, NO-LOCK) NO-ERROR.
+        iAddress_Id = hUniqueBuffer::address_id.
 // MESSAGE 'createInfoRecord address_id ' hUniqueBuffer:AVAILABLE hUniqueBuffer::address_id.
 
         oInfoRecord = NEW JsonObject().            
@@ -1025,6 +1049,10 @@ CLASS addresses.addressprogsHandler FINAL:
         /*                oInfoRecord:ADD('lsupplier', (IF available suppliers THEN TRUE ELSE false)).*/
         END.
         
+/*        IF cOrigFileName = 'contact_persons' THEN DO:*/
+/*            httTable:find-first                      */
+/*            END.                                     */
+        
         hUniqueBuffer:BUFFER-RELEASE ().
         DELETE OBJECT hUniqueBuffer.
         
@@ -1071,6 +1099,8 @@ CLASS addresses.addressprogsHandler FINAL:
         
         CREATE TEMP-TABLE ttTable.
         ttTable:ADD-FIELDS-FROM (cFileName, 'wordindex').   /*  Alle Felder aus dem Buffer, ausser wordindex    */
+        ttTable:ADD-NEW-FIELD ('color', 'character', 0, 'x(20)').
+        ttTable:ADD-NEW-FIELD ('fieldColors', 'character', 5, 'x(20)').
 
         IF lBoxFields THEN  
         DO:
@@ -1208,7 +1238,7 @@ CLASS addresses.addressprogsHandler FINAL:
             ).
         MESSAGE 'cUniqueWhere =' cUniqueWhere.
         lRetVal = FALSE.
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+        REPEAT /*TRANSACTION*/ ON ERROR UNDO, LEAVE:
             lOK = hBuffer:FIND-UNIQUE(cUniqueWhere, NO-LOCK) NO-ERROR.
             IF NOT lOK THEN 
             DO:
@@ -1322,29 +1352,37 @@ CLASS addresses.addressprogsHandler FINAL:
                 INPUT  oJsonIdent,
                 OUTPUT oJsonSelectBoxes
                 ).
-            IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
-            
-            LEAVE.
-        END.
-
-        IF lRetVal THEN 
-        DO:             
-            oJsonReturn:ADD('success', TRUE).
-            RETURN lRetVal.
-        END.
+            /*            IF cFileName = 'communication' THEN                                                           */
+            /*            DO:                                                                                           */
+            /*                oselectboxHandler:getSelectBoxContacts(                                                   */
+            /*                    INPUT  iAddress_Id ,                                                                  */
+            /*                    INPUT  oJsonIdent  ,                                                                  */
+            /*                    OUTPUT oJsonBoxContacts                                                               */
+            /*                    ).                                                                                    */
+            /*                IF VALID-HANDLE(oJsonContacts) THEN DO:                                                   */
+            /*                IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).*/
+            /*            END.                                                                                          */
+
+            IF lRetVal THEN 
+            DO:             
+                oJsonReturn:ADD('success', TRUE).
+                RETURN lRetVal.
+            END.
 
-        IF NOT lRetVal THEN 
-        DO:
-            oJsonMessage = NEW JsonObject().
-            oJsonMessage:ADD('success', FALSE).
-            oJsonMessage:ADD('message', lcMessage).
+            IF NOT lRetVal THEN 
+            DO:
+                oJsonMessage = NEW JsonObject().
+                oJsonMessage:ADD('success', FALSE).
+                oJsonMessage:ADD('message', lcMessage).
             
-            oJsonMessage:WRITE(lcJsonString, FALSE).
+                oJsonMessage:WRITE(lcJsonString, FALSE).
             
-            oJsonReturn = oJsonMessage.
-        END.
+                oJsonReturn = oJsonMessage.
+            END.
         
-        RETURN lRetVal.
+            RETURN lRetVal.
+        END.
+
         
         CATCH e AS Progress.Lang.Error:
         
@@ -1409,7 +1447,7 @@ CLASS addresses.addressprogsHandler FINAL:
 // MESSAGE '-> MaxRecords =' iMaxRecords SKIP 'Startpage =' iStartPage SKIP 'Index =' iIndex SKIP 'Startrecord =' iStartRecord.
 // MESSAGE 'cWhere in fillTempTable =' cFileName '->' cWhere.
         cPreWhere = SUBSTITUTE(' PRESELECT EACH &1 &2 NO-LOCK ', cFileName, cWhere) NO-ERROR.
-// MESSAGE 'cPreWhere in fillTempTable =' cPreWhere.
+        MESSAGE 'cPreWhere in fillTempTable =' cPreWhere.
         CREATE QUERY hQuery.
         
         CREATE BUFFER hBuffer FOR TABLE cFileName.
@@ -1525,12 +1563,14 @@ CLASS addresses.addressprogsHandler FINAL:
     METHOD PUBLIC VOID fillWordIndexTable(
         ):
             
-        DEFINE VARIABLE i1         AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE hwibuffer  AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE hField     AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE cValue     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cCommTypes AS CHARACTER NO-UNDO
-            INIT '1,2,3,4,6'.
+        DEFINE VARIABLE i1          AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE hwibuffer   AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE hField      AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE cValue      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cPhoneTypes AS CHARACTER NO-UNDO
+            INIT '1,2,3,4,7'.
+        DEFINE VARIABLE cMailTypes  AS CHARACTER NO-UNDO
+            INIT '5,6'.
         
         EMPTY TEMP-TABLE ttWordIndexTable.
 
@@ -1588,13 +1628,18 @@ CLASS addresses.addressprogsHandler FINAL:
                 cValue = hField:BUFFER-VALUE ().
                 IF cValue = ? THEN NEXT.
                 
-                IF LOOKUP(TRIM(STRING(communication.comm_type,'>>9')), cCommTypes, ',') > 0 THEN 
+                IF LOOKUP(TRIM(STRING(communication.comm_type,'>>9')), cPhoneTypes, ',') > 0 THEN 
                 DO:
                     cValue = REPLACE(cValue, ' ', '').
                     cValue = REPLACE(cValue, '.', '').
                     cValue = REPLACE(cValue, "'", '').
                     cValue = REPLACE(cValue, '-', '').
                 END.
+                IF LOOKUP(TRIM(STRING(communication.comm_type,'>>9')), cMailTypes, ',') > 0 THEN 
+                DO:
+                    cValue = REPLACE(cValue, ' ', '').
+                    cValue = REPLACE(cValue, '-', '').
+                END.
             
                 CREATE  ttWordIndexTable.
                 ASSIGN 
@@ -1612,7 +1657,7 @@ CLASS addresses.addressprogsHandler FINAL:
             ).
 
 // MESSAGE 'wordIndex =' cValue.            
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:        
+        REPEAT /*TRANSACTION*/ ON ERROR UNDO, LEAVE:        
             FIND addresses
                 WHERE addresses.address_id = iAddress_id NO-ERROR.
             addresses.wordIndex = cValue.
@@ -1779,33 +1824,35 @@ CLASS addresses.addressprogsHandler FINAL:
         OUTPUT oJsonReturn AS JsonObject  
         ):
         
-        DEFINE VARIABLE ii               AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE i1               AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE iAnzRec          AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE lRetVal          AS LOGICAL    NO-UNDO.
-        DEFINE VARIABLE iRetVal          AS INTEGER    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 cFormUser        AS CHARACTER  NO-UNDO.
-        
-        DEFINE VARIABLE oRecords         AS JsonArray  NO-UNDO.
-        DEFINE VARIABLE oJsonEditable    AS JsonArray  NO-UNDO.
-        DEFINE VARIABLE oJsonBox         AS JsonArray  NO-UNDO.
-        DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
-        DEFINE VARIABLE oJsonMessageBox  AS JsonObject NO-UNDO.
-        DEFINE VARIABLE oInfoRecord      AS JsonObject 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 iRetVal             AS INTEGER    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 cFormUser           AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cContactField       AS CHARACTER  NO-UNDO.
+        
+        DEFINE VARIABLE oRecords            AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonEditable       AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonBox            AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonSelectBoxes    AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonSelectContacts AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonMessageBox     AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oInfoRecord         AS JsonObject NO-UNDO.
+MESSAGE 'GETDATA START' cFileName.
         iIndex = 0.        
         buildWhere().
-
+MESSAGE 'NACH BUILDWHERE'.
         ii      = 0.
         iAnzRec = 0.
         ttTable:EMPTY-TEMP-TABLE ().
         CREATE QUERY hQuery.
 //        cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK &2 ', cFileName, cWhere) NO-ERROR.
-// MESSAGE 'cWhere loaddate for ' cFileName '->' cWhere.
-        oJsonIdent:WriteFile('C:\TEMP\getData_oJsonIdent.json', TRUE ).
+        MESSAGE 'cWhere loaddate for ' cFileName '->' cWhere.
+        oJsonIdent:WriteFile(SUBSTITUTE('C:\TEMP\getData_&1_oJsonIdent.json', cFileName), TRUE ).
         /*        IF NOT oJsonIdent:HAS('search') THEN  */
         /*        DO:                                   */
         /*            outilitiesHandler:writeLastcWhere(*/
@@ -1850,7 +1897,24 @@ CLASS addresses.addressprogsHandler FINAL:
             INPUT  oJsonIdent      ,
             OUTPUT oJsonSelectBoxes
             ).
+        IF NOT VALID-OBJECT (oJsonSelectBoxes) THEN oJsonSelectBoxes = NEW JsonObject().
+        
+        iAddress_Id   = httTable::address_id.
+        cContactField = SUBSTITUTE('&1_contact_id', cFileName).
+        oselectboxHandler:getSelectBoxContacts(
+            INPUT  iAddress_Id        ,
+            INPUT  oJsonIdent         ,
+            OUTPUT oJsonSelectContacts
+            ).
+        IF VALID-OBJECT(oJsonSelectContacts) THEN DO:
+oJsonSelectContacts:WriteFile('C:\TEMP\Selectboxes_contacts.json', TRUE).
+            IF oJsonSelectBoxes:HAS(cContactField) THEN oJsonSelectBoxes:Remove(cContactField). 
+oJsonSelectBoxes:WriteFile('C:\TEMP\Selectboxes_Boxes.json', TRUE).
+            oJsonSelectBoxes:ADD(cContactField, oJsonSelectContacts).
+        END.
+oJsonSelectBoxes:WriteFile(SUBSTITUTE('C:\TEMP\SelectBoxes_&1.json', cFileName), TRUE).
         IF VALID-OBJECT(oJsonSelectBoxes) THEN oJsonReturn:ADD('selectOptions', oJsonSelectBoxes).
+oJsonReturn:WriteFile(SUBSTITUTE('C:\TEMP\getdata_&1_return.json', cFileName), TRUE).
 
         outilitiesHandler:writePosition(
             INPUT  oJsonIdent       ,
@@ -1945,8 +2009,6 @@ CLASS addresses.addressprogsHandler FINAL:
         OUTPUT oJsonReturn AS JsonObject  
         ):
         
-        /*        DEFINE VARIABLE ii               AS INTEGER    NO-UNDO.*/
-        /*        DEFINE VARIABLE i1               AS INTEGER    NO-UNDO.*/
         DEFINE VARIABLE iAnzRec          AS INTEGER    NO-UNDO.
         DEFINE VARIABLE lRetVal          AS LOGICAL    NO-UNDO.
         DEFINE VARIABLE iRetVal          AS INTEGER    NO-UNDO.
@@ -2032,13 +2094,14 @@ CLASS addresses.addressprogsHandler FINAL:
         DEFINE VARIABLE oInfoRecord      AS JsonObject NO-UNDO.
         DEFINE VARIABLE oJsonBox         AS JsonArray  NO-UNDO.
         DEFINE VARIABLE oJsonSelectBoxes AS JsonObject NO-UNDO.
+        DEFINE VARIABLE cContactField    AS CHARACTER  NO-UNDO.
         
         CREATE BUFFER hBuffer FOR TABLE cFileName.
         createTempTable().
 
         oJsonRecord = NEW JsonObject().
         oJsonRecord = oJsonData:GetJsonObject('record').
-// oJsonRecord:WriteFile('C:\Temp\RecordChange_record.json', TRUE).
+        oJsonRecord:WriteFile(SUBSTITUTE('C:\Temp\RecordChange_&1.json', cFileName), TRUE).
         httTable:READ-JSON('JsonObject', oJsonRecord) NO-ERROR.
         outilitiesHandler:evaluateErrorStatus(hError).
         //
@@ -2055,7 +2118,7 @@ CLASS addresses.addressprogsHandler FINAL:
             INPUT  httTable,
             OUTPUT cUniqueWhere
             ).
-
+        MESSAGE 'recordChange uniquewhere' cUniqueWhere.
         outilitiesHandler:writeLastRecord(
             INPUT  oJsonIdent   ,
             INPUT  cUniqueWhere       
@@ -2125,7 +2188,7 @@ CLASS addresses.addressprogsHandler FINAL:
         cFileName   = oJsonIdent:GetCharacter('file_name').
         oJsonRecord = NEW JsonObject().
         oJsonRecord = oJsonData:GetJsonObject('record').
-        
+        oJsonData:WriteFile(SUBSTITUTE('C:\TEMP\updateBegin_&1.json', cFileName), TRUE).
         IF  cFileName = 'addresses' AND
             iFormTabIndex = 1       THEN 
         DO: 
@@ -2177,7 +2240,7 @@ CLASS addresses.addressprogsHandler FINAL:
 
         EMPTY TEMP-TABLE ttcommunication.
 
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+        REPEAT /*TRANSACTION*/ ON ERROR UNDO, LEAVE:
             CASE cFileName:
                 WHEN 'addresses' THEN 
                     DO:
@@ -2231,7 +2294,7 @@ CLASS addresses.addressprogsHandler FINAL:
                             ttcommunication.company    = oJsonIdent:GetCharacter('company')
                             ttcommunication.address_id = hBuffer::address_id
                             ttcommunication.contact_id = iContact_Id
-                            ttcommunication.comm_type  = 6
+                            ttcommunication.comm_type  = 7
                             ttcommunication.content    = hBuffer::fax.
                         .
                         CREATE  ttcommunication.
@@ -2239,7 +2302,7 @@ CLASS addresses.addressprogsHandler FINAL:
                             ttcommunication.company    = oJsonIdent:GetCharacter('company')
                             ttcommunication.address_id = hBuffer::address_id
                             ttcommunication.contact_id = iContact_Id
-                            ttcommunication.comm_type  = 7
+                            ttcommunication.comm_type  = 8
                             ttcommunication.content    = hBuffer::homepage.
                         .
                 
@@ -2307,9 +2370,9 @@ CLASS addresses.addressprogsHandler FINAL:
                                     addresses.mobile_privat   = communication.content.
                                 WHEN 5 THEN 
                                     addresses.e-mail          = communication.content.
-                                WHEN 6 THEN 
-                                    addresses.fax             = communication.content.
                                 WHEN 7 THEN 
+                                    addresses.fax             = communication.content.
+                                WHEN 8 THEN 
                                     addresses.homepage        = communication.content.
                             END.
                         END.
@@ -2347,12 +2410,13 @@ CLASS addresses.addressprogsHandler FINAL:
         DEFINE VARIABLE htField          AS HANDLE     NO-UNDO.
         DEFINE VARIABLE rBuffer          AS RECID      NO-UNDO.
         DEFINE VARIABLE iContact_Id      AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE hContact         AS HANDLE     NO-UNDO.
         
         DEFINE VARIABLE lcttTable        AS LONGCHAR   NO-UNDO.
 
         oJsonRecord = NEW JsonObject().
         oJsonRecord = oJsonData:GetJsonObject('record') NO-ERROR.
-// oJsonRecord:WriteFile('C:\TEMP\createAnschrift_record.json', TRUE).
+        oJsonRecord:WriteFile(SUBSTitut('C:\TEMP\createAnschrift_&1.json', cFileName), TRUE).
         oMasterKeyFields = NEW JsonObject().
         oMasterKeyFields = oJsonData:GetJsonObject('masterKeyFields') NO-ERROR.
         
@@ -2453,6 +2517,25 @@ CLASS addresses.addressprogsHandler FINAL:
                         INPUT  iContact_Id
                         ).
                 END.
+                IF cFileName = 'addresses' THEN 
+                DO:
+                    FIND contact_persons 
+                        WHERE contact_persons.company    = cCompany
+                        AND   contact_persons.address_Id = iAddress_Id
+                        AND   contact_persons.contact_id = 0 NO-ERROR.
+                    IF NOT AVAILABLE contact_persons THEN 
+                    DO:
+                        CREATE  contact_persons.
+                        ASSIGN
+                            contact_persons.company    = cCompany
+                            contact_persons.address_id = iAddress_Id
+                            contact_persons.contact_id = 0.
+                    END.
+                    hContact =  BUFFER contact_persons:HANDLE.
+                    hContact:BUFFER-COPY(httTable, 'commpany,address_id,contact_id,created_at,created_by,updated_at,updated_by').
+                    contact_persons.created_at = NOW.
+                    contact_persons.created_by = oJsonIdent:GetCharacter('H_display_name').
+                END.
                 //
                 //  Anschrift und Briefanrede erstellen
                 //

File diff suppressed because it is too large
+ 429 - 230
admin/adminprogsHandler.cls


+ 96 - 62
admin/dynamicformImpl.cls

@@ -119,40 +119,40 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID createJsonIdent(
-        INPUT poRequest AS IWebRequest
-        ):
-            
-        DEFINE VARIABLE cUser     AS CHARACTER NO-UNDO.
-        
-        DEFINE VARIABLE httBuffer AS HANDLE    NO-UNDO.
-        
-        outilitiesHandler:getHeaderData(
-            INPUT  poRequest    ,
-            OUTPUT ccompany     ,
-            OUTPUT cUser_Name   ,
-            OUTPUT cAnzeigeName ,
-            OUTPUT ilanguage_id ,
-            OUTPUT cSessionToken,
-            OUTPUT cFunction    ,
-            OUTPUT oJsonIdent   
-            ).
-        cFormId   = oJsonIdent:GetCharacter('formId').
-        cFileName = ENTRY(1, cFormId, '_').
-        //
-        //  mögliche Benutzer für das durchsuchen von HTML-Dokumenten und Labeltexten ...
-        //
-        cUser = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
-        cUser = oJsonIdent:GetCharacter('user_name') NO-ERROR.
-        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.
-        oJsonIdent:ADD('cUsers', cUsers).
-        //
-        //  Wenn ein UI Multi-Tab hat, wird es hier erstellt
-        //
-        RETURN.
-
-    END METHOD.
+    /*    METHOD PUBLIC VOID createJsonIdent(                                                                 */
+    /*        INPUT poRequest AS IWebRequest                                                                  */
+    /*        ):                                                                                              */
+    /*                                                                                                        */
+    /*        DEFINE VARIABLE cUser     AS CHARACTER NO-UNDO.                                                 */
+    /*                                                                                                        */
+    /*        DEFINE VARIABLE httBuffer AS HANDLE    NO-UNDO.                                                 */
+    /*MESSAGE 'CREATE JSONIDENT **********************************'.                                          */
+    /*        outilitiesHandler:getHeaderData(                                                                */
+    /*            INPUT  poRequest    ,                                                                       */
+    /*            OUTPUT ccompany     ,                                                                       */
+    /*            OUTPUT cUser_Name   ,                                                                       */
+    /*            OUTPUT cAnzeigeName ,                                                                       */
+    /*            OUTPUT ilanguage_id ,                                                                       */
+    /*            OUTPUT cSessionToken,                                                                       */
+    /*            OUTPUT cFunction    ,                                                                       */
+    /*            OUTPUT oJsonIdent                                                                           */
+    /*            ).                                                                                          */
+    /*        cFormId   = oJsonIdent:GetCharacter('formId').                                                  */
+    /*        cFileName = ENTRY(1, cFormId, '_').                                                             */
+    /*        //                                                                                              */
+    /*        //  mögliche Benutzer für das durchsuchen von HTML-Dokumenten und Labeltexten ...               */
+    /*        //                                                                                              */
+    /*        cUser = oJsonIdent:GetCharacter('H_user_name') NO-ERROR.                                        */
+    /*        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.*/
+    /*        cUser = oJsonIdent:GetCharacter('user_name') NO-ERROR.                                          */
+    /*        IF NOT ERROR-STATUS:ERROR AND LOOKUP(cUser, cUsers, ',') = 0 THEN cUsers = cUser + ',' + cUsers.*/
+    /*        oJsonIdent:ADD('cUsers', cUsers).                                                               */
+    /*        //                                                                                              */
+    /*        //  Wenn ein UI Multi-Tab hat, wird es hier erstellt                                            */
+    /*        //                                                                                              */
+    /*        RETURN.                                                                                         */
+    /*                                                                                                        */
+    /*    END METHOD.                                                                                         */
 
     /*------------------------------------------------------------------------------
      Purpose:
@@ -166,14 +166,16 @@ CLASS admin.dynamicformImpl INHERITS WebHandler:
         DEFINE VARIABLE cTabGroup            AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cHtmlUser            AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE ii                   AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE cDBName              AS CHARACTER  NO-UNDO.
         
         DEFINE VARIABLE cTabProgram          AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cHtmlFileName        AS CHARACTER  NO-UNDO.
         DEFINE VARIABLE cKeyField            AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cKeyFields           AS CHARACTER  NO-UNDO.
         
         DEFINE VARIABLE oJsonTab             AS JsonObject NO-UNDO.
         DEFINE VARIABLE oJsonMasterKeyFields AS JsonArray  NO-UNDO.
-MESSAGE 'START MULTITAB'.                
+// MESSAGE 'START MULTITAB'.                
         oJsonTabs = NEW JsonArray().
 
         FIND programs NO-LOCK 
@@ -206,7 +208,7 @@ MESSAGE 'START MULTITAB'.
             BY programs.tab_index:
 
             cTabProgram = programs.program.
-            MESSAGE 'Tab-Gruppe' cTabGroup '-' cTabProgram.
+// MESSAGE 'Tab-Gruppe' cTabGroup '-' cTabProgram.
             DO ii = 1 TO NUM-ENTRIES(cUsers, ','):
                 cHtmlUser = ENTRY(ii, cUsers, ',').
                 FIND FIRST htmldokumente
@@ -217,7 +219,11 @@ MESSAGE 'START MULTITAB'.
                 IF AVAILABLE htmldokumente THEN LEAVE.
             END.
                 
-            cHtmlFileName = ENTRY(1, htmldokumente.formId, '_').
+            outilitiesHandler:getFileNameFromFormId(
+                INPUT  htmldokumente.formId,
+                OUTPUT cHtmlFileName,
+                OUTPUT cDBName
+                ).
                                  
             oJsonTab = NEW JsonObject().
             oJsonTab:ADD('tabIndex'   , programs.tab_index). 
@@ -231,16 +237,19 @@ MESSAGE 'START MULTITAB'.
             oJsonTab:ADD('allowDelete', programs.allowDelete).
             oJsonTab:ADD('allowCopy'  , programs.allowCopy).
 
-            cKeyField = SUBSTITUTE('&1_address_id', 'addresses' /*cHtmlFileName*/).            
-            oJsonMasterKeyFields = NEW JsonArray().
-            oJsonMasterKeyFields:ADD(cKeyField).
-            oJsonTab:ADD('masterKeyFields', oJsonMasterKeyFields).
+            cKeyFields = REPLACE(programs.masterkeyfields, ',', ';').
+            DO ii = 1 TO NUM-ENTRIES(cKeyFields, ';').
+                cKeyField = ENTRY(ii, cKeyFields, ';').            
+                oJsonMasterKeyFields = NEW JsonArray().
+                oJsonMasterKeyFields:ADD(cKeyField).
+                oJsonTab:ADD('masterKeyFields', oJsonMasterKeyFields).
+            END.
                 
             oJsonTabs:ADD(oJsonTab).
         END.
-            
+// oJsonTabs:WriteFile('C:\TEMP\oJsonTabs_createMultiTab.json', TRUE).            
         // oJsonTabs:WRITE(lcString).
-        MESSAGE 'ENDE MULTITAB'.        
+// MESSAGE 'ENDE MULTITAB'.        
         RETURN.
 
     END METHOD.
@@ -296,7 +305,7 @@ MESSAGE 'START MULTITAB'.
             outilitiesHandler:evaluateErrorStatus(INPUT hError).
 // MESSAGE lRetVal.
             oJsonResult:WRITE(lcString, FALSE).
-//MESSAGE STRING(lcString).
+// MESSAGE STRING(lcString).
             responseOK(
                 INPUT oJsonResult
                 ).
@@ -377,7 +386,7 @@ MESSAGE 'START MULTITAB'.
         END.
 
         DO WHILE cFunction = 'loaddata' AND cProgram <> '':
-// MESSAGE 'loaddata' cFileName.
+// MESSAGE 'do while loaddata' cFileName.
             IF oJsonIdent:HAS('sortField') THEN 
             DO:
                 DEFINE VARIABLE cSortField AS CHARACTER NO-UNDO.
@@ -573,11 +582,11 @@ MESSAGE 'START MULTITAB'.
 
     METHOD OVERRIDE PROTECTED INTEGER HandlePost(INPUT poRequest AS IWebRequest):
         
-        DEFINE VARIABLE oJsonResult          AS JsonObject NO-UNDO.
+        DEFINE VARIABLE oJsonResult AS JsonObject NO-UNDO.
 
-        DEFINE VARIABLE lRetVal              AS LOGICAL    NO-UNDO.
-        DEFINE VARIABLE iRetVal              AS INTEGER    NO-UNDO.
-        DEFINE VARIABLE ii                   AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE lRetVal     AS LOGICAL    NO-UNDO.
+        DEFINE VARIABLE iRetVal     AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE ii          AS INTEGER    NO-UNDO.
         
         WebHandlerUtilities:getJsonFromRequest(INPUT poRequest, OUTPUT oJsonData) NO-ERROR.
 
@@ -610,13 +619,13 @@ MESSAGE 'START MULTITAB'.
             END.
                 
             cMethode = oJsonData:GetCharacter('changeAction').
-MESSAGE 'changeAction =' cMethode.
+// MESSAGE 'changeAction =' cMethode.
             lRetVal  = DYNAMIC-INVOKE ( oHandler, cMethode,
                 INPUT  oJsonData    ,
                 OUTPUT oJsonResponse
                 ) NO-ERROR.
             outilitiesHandler:evaluateErrorStatus(INPUT hError).
-            
+// oJsonResponse:WriteFile(SUBSTITUTE('C:\TEMP\Change_response_&1.json', cFileName), TRUE).            
             responseOK(
                 INPUT oJsonResponse
                 ).
@@ -786,7 +795,10 @@ MESSAGE 'changeAction =' cMethode.
         ):
             
         DEFINE VARIABLE ii                   AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE i1                   AS INTEGER    NO-UNDO.
         DEFINE VARIABLE cUser                AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cSelectFileName      AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cDBName              AS CHARACTER  NO-UNDO.
 
         DEFINE VARIABLE oJsonBox             AS JsonArray  NO-UNDO.            
         DEFINE VARIABLE oJsonSelectBoxes     AS JsonObject NO-UNDO.            
@@ -807,9 +819,22 @@ MESSAGE 'changeAction =' cMethode.
             OUTPUT cFunction    ,
             OUTPUT oJsonIdent   
             ).
-        cFormId   = oJsonIdent:GetCharacter('formId') NO-ERROR.
-        cFileName = ENTRY(1, cFormId, '_').
-MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId' cFormId.            
+        IF oJsonIdent:HAS('file_name') THEN MESSAGE 'getHeaderData' oJsonIdent:GetCharacter('file_name').
+        ELSE                                MESSAGE 'getHeaderData ohne FileName'.
+        cFormId = oJsonIdent:GetCharacter('formId') NO-ERROR.
+        outilitiesHandler:getFileNameFromFormId(
+            INPUT  cFormId  ,
+            OUTPUT cFileName,
+            OUTPUT cDBName
+            ).
+/*            cFileName    = ''.                            */
+/*        ii           = NUM-ENTRIES(cFileAusForm, '_') - 1.*/
+/*        DO i1 = 1 TO ii:                                  */
+/*            cFileName = cFileName                         */
+/*                + (IF cFileName = '' THEN '' ELSE '_')    */
+/*                + entry(i1, cFileAusForm, '_').           */
+/*        END.                                              */
+        MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId' cFormId.            
         IF NOT oJsonIdent:has('user_name') THEN oJsonIdent:ADD('user_name', cUser_Name).
         //
         //  mögliche Benutzer für das durchsuchen von HTML-Dokumenten und Labeltexten ...
@@ -903,13 +928,21 @@ MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId'
             AND   selectboxfields.boxfieldsFix <> '':
 
             DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfieldsFix, ';'):
-                cFieldName = ENTRY(ii, selectboxfields.boxfieldsFix, ';').
-                cFileName  = ENTRY(1, cFieldName, '_').
-
+                cFieldName      = ENTRY(ii, selectboxfields.boxfieldsFix, ';').
+                cSelectFileName = ENTRY(1, cFieldName, '_').
+                DO WHILE TRUE:
+                    CREATE BUFFER hBuffer FOR TABLE cSelectFileName NO-ERROR.
+                    IF VALID-HANDLE(hBuffer) THEN LEAVE.
+                    cSelectFileName = cSelectFileName
+                        + '_'
+                        + entry(2, cFieldName, '_').
+                END.
+                DELETE OBJECT hBuffer.
+// MESSAGE 'SelectFileName =' cSelectFileName '-' cFieldName.
                 IF cFieldName MATCHES('*company*') THEN 
                 DO:
                     oJsonBox  = NEW JsonArray().
-                    httBuffer = oSelectboxHandler:getSelboxCompany(INPUT cFileName).
+                    httBuffer = oSelectboxHandler:getSelboxCompany(INPUT cSelectFileName).
                     httBuffer:WRITE-JSON ('JsonArray', oJsonBox).
                     oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
                     NEXT.
@@ -918,7 +951,7 @@ MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId'
                 IF cFieldName MATCHES('*language_id*') THEN 
                 DO:
                     oJsonBox  = NEW JsonArray().
-                    httBuffer = oSelectboxHandler:getSelboxLanguage(INPUT cFileName) NO-ERROR.
+                    httBuffer = oSelectboxHandler:getSelboxLanguage(INPUT cSelectFileName) NO-ERROR.
                     httBuffer:WRITE-JSON ('JsonArray', oJsonBox) NO-ERROR.
                     oJsonSelectBoxes:ADD(cFieldName, oJsonBox) NO-ERROR.
                     NEXT.
@@ -927,7 +960,7 @@ MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId'
                 IF cFieldName MATCHES('*user_name*') THEN 
                 DO:
                     oJsonBox  = NEW JsonArray().
-                    httBuffer = oSelectboxHandler:getSelboxUsers(INPUT cFileName).
+                    httBuffer = oSelectboxHandler:getSelboxUsers(INPUT cSelectFileName).
                     httBuffer:WRITE-JSON ('JsonArray', oJsonBox).
                     oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
                     NEXT.
@@ -936,7 +969,7 @@ MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId'
                 IF cFieldName MATCHES('*table_name*') THEN 
                 DO:
                     oJsonBox  = NEW JsonArray().
-                    httBuffer = oSelectboxHandler:getSelboxTables(INPUT cFileName).
+                    httBuffer = oSelectboxHandler:getSelboxTables(INPUT cSelectFileName).
                     httBuffer:WRITE-JSON ('JsonArray', oJsonBox).
                     oJsonSelectBoxes:ADD(cFieldName, oJsonBox).
                     NEXT.
@@ -1027,7 +1060,7 @@ MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId'
         oWriter               = NEW WebResponseWriter(oResponse).
         
         oJsonResponse:WRITE(lcJsonString, FALSE). 
-        MESSAGE 'responsOK oResponse ->' STRING(lcJsonString).
+// MESSAGE 'responsOK oResponse ->' STRING(lcJsonString).
         oWriter:Open().
         oWriter:Write(lcJsonString).
         oWriter:Close().
@@ -1051,6 +1084,7 @@ MESSAGE 'API-Call mit Function' cFunction 'und FileName' cFileName 'und FormId'
         oWriter               = NEW WebResponseWriter(oResponse) NO-ERROR.
         
         oJsonReturn:WRITE(lcJsonString, FALSE).
+// oJsonReturn:WriteFile(SUBSTITUTE('C:\TEMP\getData_&1.json', cFileName), TRUE ).
 
         oWriter:Open() NO-ERROR.
         outilitiesHandler:evaluateErrorStatus(hError).

+ 58 - 9
utilities/selectboxHandler.cls

@@ -188,6 +188,55 @@ CLASS utilities.selectboxHandler:
      Notes:
     ------------------------------------------------------------------------------*/
 
+    METHOD PUBLIC VOID getSelectBoxContacts(
+        INPUT  iAddress_Id  AS INT64     ,
+        INPUT  oJsonIdent   AS JsonObject,
+        OUTPUT oJsonBoxEval AS JsonArray
+        ):
+        
+        DEFINE VARIABLE cttBufferName AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cCompany      AS CHARACTER NO-UNDO.
+        
+        DEFINE VARIABLE httSelect     AS HANDLE    NO-UNDO.
+        DEFINE VARIABLE httBuffer     AS HANDLE    NO-UNDO.
+        
+        cCompany = oJsonIdent:GetCharacter('company').
+        
+        cttBufferName = 'contact_persons'.
+
+        CREATE TEMP-TABLE httSelect.
+        httSelect:ADD-NEW-FIELD('value', 'character'   ).
+        httSelect:ADD-NEW-FIELD('label', 'character' ).
+        httSelect:TEMP-TABLE-PREPARE (cttBufferName).
+        httBuffer = httSelect:DEFAULT-BUFFER-HANDLE.
+
+        FOR EACH contact_persons NO-LOCK
+            WHERE contact_persons.company    = cCompany
+            AND   contact_persons.address_id = iAddress_id,
+            
+            FIRST addresses NO-LOCK
+            WHERE addresses.address_id = iAddress_Id:
+                 
+            httBuffer:BUFFER-CREATE ().
+            ASSIGN 
+                httBuffer:BUFFER-FIELD('value'):BUFFER-VALUE = contact_persons.contact_id
+                httBuffer:BUFFER-FIELD('label'):BUFFER-VALUE = SUBSTITUTE('(&1) &2', contact_persons.contact_id, contact_persons.address_display).
+        END.
+        
+        /*        httBuffer:SERIALIZE-NAME = 'cFileName'.*/
+        
+        oJsonBoxEval = NEW JsonArray().
+        httBuffer:WRITE-JSON('JsonArray', oJsonBoxEval). 
+
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
     METHOD PUBLIC VOID getSelectBoxCountry( 
         INPUT  iLanguage_Id AS INTEGER   ,
         INPUT  cFile_Name   AS CHARACTER ,
@@ -449,16 +498,16 @@ CLASS utilities.selectboxHandler:
         OUTPUT oJsonSelectBoxes AS JsonObject
         ):
         
-        DEFINE VARIABLE lRetVal    AS LOGICAL    NO-UNDO INIT FALSE.
-        DEFINE VARIABLE ii         AS INTEGER    NO-UNDO.
+        DEFINE VARIABLE lRetVal    AS LOGICAL   NO-UNDO INIT FALSE.
+        DEFINE VARIABLE ii         AS INTEGER   NO-UNDO.
         
-        DEFINE VARIABLE cCompany   AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFormId    AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFormUser  AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFieldName AS CHARACTER  NO-UNDO.
-        DEFINE VARIABLE cFileName  AS CHARACTER  NO-UNDO.
+        DEFINE VARIABLE cCompany   AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFormId    AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFormUser  AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFieldName AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFileName  AS CHARACTER NO-UNDO.
         
-        DEFINE VARIABLE oJsonBox   AS JsonArray  NO-UNDO.
+        DEFINE VARIABLE oJsonBox   AS JsonArray NO-UNDO.
         
         cCompany  = oJsonIdent:GetCharacter('company').
         cFormId   = oJsonIdent:GetCharacter('formId').
@@ -471,7 +520,7 @@ CLASS utilities.selectboxHandler:
             AND   selectboxfields.user_name     = cFormUser
             AND   selectboxfields.boxfields <> '':
 
-            DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfields, ';'):
+            DO ii = 1 TO NUM-ENTRIES(selectboxfields.boxfields  , ';'):
                 cFieldName = ENTRY(ii, selectboxfields.boxfields, ';').
                 cFileName  = ENTRY(1, cFieldName, '_').
                 getSelectBoxData(

+ 737 - 639
utilities/utilitiesHandler.cls

@@ -487,6 +487,9 @@ END PROCEDURE.
         DEFINE VARIABLE cuser_name       AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cActiveSelection AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cFormId          AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFileAusForm     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE ii               AS INTEGER   NO-UNDO.
+        DEFINE VARIABLE i1               AS INTEGER   NO-UNDO.
         
         DEFINE VARIABLE rPrimeIndex      AS RECID     NO-UNDO.
         DEFINE VARIABLE rField           AS RECID     NO-UNDO.
@@ -497,16 +500,28 @@ END PROCEDURE.
         DEFINE VARIABLE cValue           AS CHARACTER NO-UNDO.
         DEFINE VARIABLE cFieldNames      AS CHARACTER NO-UNDO EXTENT.
         DEFINE VARIABLE cKeyFieldReplace AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cKeyFields       AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cKeyValues       AS CHARACTER NO-UNDO.
 
         ccompany   = oJsonIdent:GetCharacter('company'  ) NO-ERROR.            
         cuser_name = oJsonIdent:GetCharacter('user_name') NO-ERROR.            
         cprogram   = oJsonIdent:GetCharacter('program'  ) NO-ERROR.
         cFormId    = oJsonIdent:GetCharacter('formId'   ) NO-ERROR.
-        IF oJsonIdent:HAS('file_name') THEN cFileName = oJsonIdent:GetCharacter('file_name').
+        IF oJsonIdent:HAS('file_name') THEN 
+        DO:
+            cFileName = oJsonIdent:GetCharacter('file_name') NO-ERROR.
+            cDBName   = oJsonIdent:GetCharacter('DBName')    NO-ERROR.
+        END.
         ELSE 
         DO:
-            cFileName = ENTRY(1, cFormId, '_').
+            cFileName = ''.
+            getFileNameFromFormId(
+                INPUT  cFormId  ,
+                OUTPUT cFileName,
+                OUTPUT cDBName
+                ).
             oJsonIdent:ADD('file_name', cFileName).
+            oJsonIdent:ADD('DBName'   , cDBName  ).
         END.
 
         ASSIGN 
@@ -514,22 +529,24 @@ END PROCEDURE.
             lActive    = FALSE
             lWordIndex = FALSE.
             
-        DO WHILE TRUE:
-            cDBName = 'Ge_MIS'.
-            cDBFileName = SUBSTITUTE('&1.&2', cDBName, cFileName).
-            CREATE BUFFER hBuffer FOR TABLE cDBFileName NO-ERROR.
-            IF VALID-HANDLE(hBuffer) THEN LEAVE.
-            
-            cDBName = 'FRAMEWORK'.
-            DELETE OBJECT hBuffer NO-ERROR.
-            cDBFileName = SUBSTITUTE('&1.&2', cDBName, cFileName).
-            CREATE BUFFER hBuffer FOR TABLE cDBFileName NO-ERROR.
-            IF VALID-HANDLE(hBuffer) THEN LEAVE.
-            
-            RETURN.
-        END.
-        
-        oJsonIdent:ADD('DBName', cDBName).
+        /*        DO WHILE TRUE:                                            */
+        /*            cDBName = 'Ge_MIS'.                                   */
+        /*            cDBFileName = SUBSTITUTE('&1.&2', cDBName, cFileName).*/
+        /*            CREATE BUFFER hBuffer FOR TABLE cDBFileName NO-ERROR. */
+        /*            IF VALID-HANDLE(hBuffer) THEN LEAVE.                  */
+        /*                                                                  */
+        /*            cDBName = 'FRAMEWORK'.                                */
+        /*            DELETE OBJECT hBuffer NO-ERROR.                       */
+        /*            cDBFileName = SUBSTITUTE('&1.&2', cDBName, cFileName).*/
+        /*            CREATE BUFFER hBuffer FOR TABLE cDBFileName NO-ERROR. */
+        /*            IF VALID-HANDLE(hBuffer) THEN LEAVE.                  */
+        /*                                                                  */
+        /*            RETURN.                                               */
+        /*        END.                                                      */
+        /*                                                                  */
+        /*        oJsonIdent:ADD('DBName', cDBName).                        */
+        /*                                                                  */
+        CREATE BUFFER hBuffer FOR TABLE cFileName NO-ERROR.
         
         hField = hBuffer:BUFFER-FIELD('active') NO-ERROR.
         IF  NOT ERROR-STATUS:ERROR AND
@@ -551,7 +568,7 @@ END PROCEDURE.
         CREATE BUFFER hDictFile FOR TABLE cDBFileName NO-ERROR.
 
         cWhere = SUBSTITUTE('WHERE _File-Name = &1 ', QUOTER(cFileName)).
-        lOK = hDictFile:FIND-FIRST (cWhere) NO-ERROR.
+        lOK = hDictFile:FIND-FIRST (cWhere, NO-LOCK) NO-ERROR.
         rRecid      = hDictFile:RECID.
         rPrimeIndex = hDictFile::_Prime-Index.
 
@@ -621,29 +638,48 @@ END PROCEDURE.
         //
         //  restlichen Keyfelder in Tabelle schreiben
         //
+        getKeyFields(
+            INPUT  oJsonIdent,
+            OUTPUT cKeyFields,
+            OUTPUT cKeyValues
+            ).
+        MESSAGE
+            'cKeyFields =' cKeyFields SKIP
+            'cKeyValue  =' cKeyValues SKIP.
         CREATE BUFFER hField FOR TABLE SUBSTITUTE('&1._Field', cDBName).
-        cFieldNames      = oJsonIdent:getNames().
-        cKeyFieldReplace = SUBSTITUTE ('keyField_&1_', cFileName).
-        DO i1 = 1 TO EXTENT(cFieldNames):
-            IF NOT cFieldNames[i1] BEGINS 'keyfield'          THEN NEXT.
+        
+        /*        cFieldNames      = oJsonIdent:getNames().                 */
+        /*        cKeyFieldReplace = SUBSTITUTE ('keyField_&1_', cFileName).*/
+        /*        MESSAGE                                                   */
+        /*            'cFileName        =' cFileName          SKIP          */
+        /*            'cFieldNames      =' cFieldNames[01]    SKIP          */
+        /*            'cKeyFieldReplace =' cKeyFieldReplace   SKIP          */
+        /*            'cDBName          =' cDBName.                         */
+        DO i1 = 1 TO NUM-ENTRIES(cKeyFields, ';'):
+            cFieldName = ENTRY(i1, cKeyFields, ';').
+            cValue     = ENTRY(i1, cKeyValues, CHR(01)).
+// MESSAGE 'cFieldName-1' cFieldName ' / ' 'Value ->' cValue.
+            cFieldName = REPLACE(cFieldName, 'keyfield_', '').
+// MESSAGE 'cFieldName-2' cFieldName '/' cFileName.
+            cFieldName = REPLACE(cFieldName, cFileName + '_'  , '').
+// MESSAGE 'cFieldName-3' cFieldName '/' cFileName.
+            //IF NOT ENTRY(2, cFieldName, '_') = cFileName THEN ENTRY(2, cFieldName, '_') = cFileName.
             
-            cFieldName = cFieldNames[i1].
-            IF NOT ENTRY(2, cFieldName, '_') = cFileName THEN ENTRY(2, cFieldName, '_') = cFileName.
+            cKeyField = ENTRY(i1, cKeyFields, ';').
+            cField    = cFieldName.
             
-            cKeyField = cFieldNames[i1].
-            cField    = REPLACE(cFieldName, cKeyFieldReplace, '').
-
-            cWhere = SUBSTITUTE('WHERE cFieldName = &1 ', QUOTER(cField) ).
+            cWhere = SUBSTITUTE('WHERE cFieldName = &1 ', QUOTER(cFieldName) ).
+// MESSAGE 'cWhere bei _Field =' cWhere.
             lOK = httKeyFields:FIND-FIRST(cWhere, NO-LOCK) NO-ERROR.
             IF lOK THEN 
             DO:
-                cValue = oJsonIdent:GetCharacter(cKeyField) NO-ERROR.
+                // cValue = oJsonIdent:GetCharacter(cKeyField) NO-ERROR.
                 httKeyFields::cvalue = cValue.
                 NEXT.
             END.
 
-            cValue    = oJsonIdent:GetCharacter(cKeyField) NO-ERROR.
-            cWhere    = SUBSTITUTE('WHERE &1._File-recid = &2 AND &1._Field-Name = &3', '_Field', rRecid, QUOTER(cField)).
+            // cValue    = oJsonIdent:GetCharacter(cKeyField) NO-ERROR.
+            cWhere    = SUBSTITUTE('WHERE _File-Recid = &1 AND _Field-Name = &2', rRecid, QUOTER(cFieldName)).
             hField:FIND-FIRST(cWhere, NO-LOCK).
             httKeyFields:BUFFER-CREATE().
             ASSIGN 
@@ -655,6 +691,7 @@ END PROCEDURE.
                 httKeyFields::cDataType  = hField::_Data-Type
                 httKeyFields::lKeyfield  = TRUE. 
         END.
+        httKeyFields:WRITE-JSON ('FILE', SUBSTITUTE('C:\TEMP\ttKeyfields_&1.json', cFileName), TRUE).
         //
         //  Filterfelder
         //
@@ -1129,6 +1166,36 @@ END PROCEDURE.
      Notes:
     ------------------------------------------------------------------------------*/
 
+    METHOD PUBLIC VOID getFileNameFromFormId(
+        INPUT  cFormId     AS CHARACTER,
+        OUTPUT cFileName   AS CHARACTER,
+        OUTPUT cDBName     AS CHARACTER 
+        ):
+            
+        DEFINE VARIABLE ii      AS INTEGER NO-UNDO.
+        DEFINE VARIABLE hBuffer AS HANDLE  NO-UNDO.
+        
+        cFileName = ENTRY(1, cFormId, '_').
+        ii        = 1.  
+        DO WHILE TRUE:
+            CREATE BUFFER hBuffer FOR TABLE cFileName NO-ERROR.
+            IF VALID-OBJECT(hBuffer) THEN LEAVE.
+            ii = ii + 1.
+            cFileName = cFileName
+                + '_'
+                + ENTRY(ii, cFormId, '_').
+        END.
+        cDBName = hBuffer:DBNAME.
+        DELETE OBJECT hBuffer NO-ERROR.
+        RETURN.
+
+    END METHOD.
+
+    /*------------------------------------------------------------------------------
+     Purpose:
+     Notes:
+    ------------------------------------------------------------------------------*/
+
     METHOD PUBLIC CHARACTER getHeader(
         INPUT httInput  AS HANDLE
         ):
@@ -1184,6 +1251,7 @@ END PROCEDURE.
         DEFINE VARIABLE cFormId      AS CHARACTER                    NO-UNDO.
         DEFINE VARIABLE cClassName   AS CHARACTER                    NO-UNDO.
         DEFINE VARIABLE cFilename    AS CHARACTER                    NO-UNDO.
+        DEFINE VARIABLE cDBName      AS CHARACTER                    NO-UNDO.
 
         oHeader      = poRequest:GetHeader('X-COMPANY').
         ccompany     = oHeader:VALUE.
@@ -1227,11 +1295,20 @@ END PROCEDURE.
         //  language_id soll immer ein Interger-Wert sein
         oJsonIdent:SET('language_id', INTEGER(oJsonIdent:GetJsonText('language_id'))).
         
+        IF NOT oJsonIdent:HAS('function') THEN MESSAGE 'getHeaderData ohne Function'.
+        
         IF oJsonIdent:HAS('formId') THEN 
         DO:
             cFormId   = oJsonIdent:GetCharacter('formId').
-            cFileName = ENTRY(1, cFormId, '_'). 
-            IF NOT oJsonIdent:HAS('file_name') THEN oJsonIdent:ADD('file_name', cFileName).
+            getFileNameFromFormId(
+                INPUT  cFormId   ,
+                OUTPUT cFileName ,
+                OUTPUT cDBName
+                ).
+            oJsonIdent:ADD('DBName'   , cDBName).
+            oJsonIdent:ADD('file_name', cFileName).
+            
+// 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).
@@ -1244,6 +1321,11 @@ END PROCEDURE.
 // MESSAGE 'programm gefunden mit FormId' cFormId.
             END.
         END.
+        ELSE 
+        DO:
+// MESSAGE 'getHeaderData ohne formid ********************************************************'.
+        END.
+// MESSAGE 'createHeaderData -> FileName' cFileName.
         
         ccompany     = oJsonIdent:GetCharacter('company').
         cuser_name   = oJsonIdent:GetCharacter('user_name').  
@@ -1271,9 +1353,27 @@ END PROCEDURE.
         
         DEFINE VARIABLE cFieldNames AS CHARACTER NO-UNDO EXTENT.
         DEFINE VARIABLE cFieldName  AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cFileName   AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cDBName     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cDBFile     AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cWhere      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE rFile       AS RECID     NO-UNDO.
         DEFINE VARIABLE cString     AS CHARACTER NO-UNDO.
         DEFINE VARIABLE lOK         AS LOGICAL   NO-UNDO.
-        DEFINE VARIABLE cValue      AS CHARACTER NO-UNDO.
+        DEFINE VARIABLE cValue      AS LONGCHAR  NO-UNDO.
+        DEFINE VARIABLE cDataType   AS CHARACTER NO-UNDO.
+        
+        DEFINE VARIABLE hFileBuff   AS HANDLE    NO-UNDO.
+        
+        cFileName = oJsonIdent:GetCharacter('file_name').
+        cDBName   = oJsonIdent:GetCharacter('DBName').
+        cDBFile   = SUBSTITUTE('&1._File', cDBName).
+        CREATE BUFFER hFileBuff FOR TABLE cDBFile NO-ERROR.
+        cWhere    = SUBSTITUTE('WHERE &1._File-Name = &2', cDBFile, QUOTER(cFileName)).
+        hFileBuff:FIND-FIRST(cWhere, NO-LOCK) NO-ERROR.
+        rFile = hFileBuff:RECID.
+        
+        DELETE OBJECT hFileBuff NO-ERROR.
         
         cKeyFields  = ''.
         cKeyValues  = ''.
@@ -1283,736 +1383,734 @@ END PROCEDURE.
             cKeyFields = cKeyFields
                 + (IF cKeyFields = '' THEN '' ELSE ';')
                 + REPLACE(cFieldNames[i1], 'keyfield_', '').
-            cValue = oJsonIdent:GetCharacter(cFieldNames[i1]).
+            cValue = oJsonIdent:GetJsonText(cFieldNames[i1]).
             cKeyValues = cKeyValues
                 + (IF cKeyValues = '' THEN '' ELSE CHR(01))
                 + cValue. 
         END.
+        
+        cDBFile = SUBSTITUTE('&1._Field', cDBName).
+        CREATE BUFFER hFileBuff FOR TABLE cDBFile NO-ERROR.
+// MESSAGE 'Buffer für Field = ' hFileBuff:NAME.
         lOK = TRUE.
         DO i1 = 1 TO NUM-ENTRIES(cKeyFields, ';'):
-            cString    = ENTRY(i1, cKeyFields, ';').
-            cString    = ENTRY(1, cString, '_') + '_'.
+            cString    = cFileName + '_'.
+// MESSAGE 'replace String =' cString.
             cFieldName = REPLACE(ENTRY(i1, cKeyFields, ';'), cString, '').
+// MESSAGE 'FELDNAME =' cFieldName.
+            cWhere = SUBSTITUTE('WHERE _File-Recid = &1 AND _Field-Name = &2 ', rFile, QUOTER(cFieldName)).
+// MESSAGE 'cWhere bei _Field =' cWhere.
+            hFileBuff:FIND-FIRST(cWhere, NO-LOCK).
+// MESSAGE hFileBuff::_Data-Type.
+
+            cDataType = hFileBuff::_Data-Type.
+            CASE cDataType:
+                WHEN 'character' THEN 
+                    ENTRY(i1, cKeyValues, CHR(01)) = ENTRY(i1, cKeyValues, CHR(01)).
+                WHEN 'logical'   THEN 
+                    ENTRY(i1, cKeyValues, CHR(01)) = STRING(ENTRY(i1, cKeyValues, CHR(01)),"TRUE/FALSE").
+            END CASE.
+        END.
             
-            DO WHILE lOK:
-                FIND FIRST Ge_MIS._Field NO-LOCK 
-                    WHERE Ge_MIS._Field._Field-Name = cFieldname NO-ERROR.
-                IF NOT AVAILABLE Ge_MIS._Field THEN 
-                DO:
-                    lOK = FALSE.
-                    LEAVE.
-                END.
-                
-                CASE Ge_MIS._Field._Data-Type:
-                    WHEN 'character' THEN 
-                        ENTRY(i1, cKeyValues, CHR(01)) = QUOTER(ENTRY(i1, cKeyValues, CHR(01))).
-                    WHEN 'logical'   THEN 
-                        ENTRY(i1, cKeyValues, CHR(01)) = STRING(ENTRY(i1, cKeyValues, CHR(01)),"TRUE/FALSE").
-                END CASE.
-            
+        DO WHILE NOT lOK:
+            FIND FIRST FRAMEWORK._Field NO-LOCK 
+                WHERE FRAMEWORK._Field._Field-Name = cFieldname NO-ERROR.
+            IF NOT AVAILABLE FRAMEWORK._Field THEN 
+            DO:
+                lOK = FALSE.
                 LEAVE.
             END.
-            
-            DO WHILE NOT lOK:
-                FIND FIRST FRAMEWORK._Field NO-LOCK 
-                    WHERE FRAMEWORK._Field._Field-Name = cFieldname NO-ERROR.
-                IF NOT AVAILABLE FRAMEWORK._Field THEN 
-                DO:
-                    lOK = FALSE.
-                    LEAVE.
-                END.
                 
-                CASE FRAMEWORK._Field._Data-Type:
-                    WHEN 'character' THEN 
-                        ENTRY(i1, cKeyValues, CHR(01)) = QUOTER(ENTRY(i1, cKeyValues, CHR(01))).
-                    WHEN 'logical'   THEN 
-                        ENTRY(i1, cKeyValues, CHR(01)) = STRING(ENTRY(i1, cKeyValues, CHR(01)),"TRUE/FALSE").
-                END CASE.
+            CASE FRAMEWORK._Field._Data-Type:
+                WHEN 'character' THEN 
+                    ENTRY(i1, cKeyValues, CHR(01)) = QUOTER(ENTRY(i1, cKeyValues, CHR(01))).
+                WHEN 'logical'   THEN 
+                    ENTRY(i1, cKeyValues, CHR(01)) = STRING(ENTRY(i1, cKeyValues, CHR(01)),"TRUE/FALSE").
+            END CASE.
             
-                LEAVE.
-            END.
+            LEAVE.
         END.
 
-        lRetVal = TRUE.
-        RETURN lRetVal.
+    lRetVal = TRUE.
+    RETURN lRetVal.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC CHARACTER getLogicalDBName(
-        INPUT ipcFilename AS CHARACTER 
-        ):
+METHOD PUBLIC CHARACTER getLogicalDBName(
+    INPUT ipcFilename AS CHARACTER 
+    ):
         
-        DEFINE VARIABLE cLogicalDBName AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cLogicalDBName AS CHARACTER NO-UNDO.
         
-        DEFINE VARIABLE hDictBuffer    AS HANDLE    NO-UNDO.
-        DEFINE VARIABLE cFileName      AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE hDictBuffer    AS HANDLE    NO-UNDO.
+    DEFINE VARIABLE cFileName      AS CHARACTER NO-UNDO.
         
-        cFileName = SUBSTITUTE('Ge_MIS.&1', ipcFilename) NO-ERROR.
-        CREATE BUFFER hDictBuffer FOR TABLE cFileName NO-ERROR.
+    cFileName = SUBSTITUTE('Ge_MIS.&1', ipcFilename) NO-ERROR.
+    CREATE BUFFER hDictBuffer FOR TABLE cFileName NO-ERROR.
 
-        cLogicalDBName = (IF VALID-HANDLE(hDictBuffer) THEN 'Ge_MIS' ELSE 'FRAMEWORK').
+    cLogicalDBName = (IF VALID-HANDLE(hDictBuffer) THEN 'Ge_MIS' ELSE 'FRAMEWORK').
         
-        DELETE OBJECT hDictBuffer NO-ERROR.
+    DELETE OBJECT hDictBuffer NO-ERROR.
         
-        RETURN cLogicalDBName.
+    RETURN cLogicalDBName.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC CHARACTER getProgramName(
-        INPUT        oJsonIdent    AS JsonObject,
-        INPUT        cUsers        AS CHARACTER ,
-        OUTPUT       cFormUser     AS CHARACTER ,
-        OUTPUT       cFormColumns  AS CHARACTER ,
-        INPUT-OUTPUT iItemsPerPage AS INTEGER   ,
-        INPUT-OUTPUT cMaxHeight    AS CHARACTER
-        ):
+METHOD PUBLIC CHARACTER getProgramName(
+    INPUT        oJsonIdent    AS JsonObject,
+    INPUT        cUsers        AS CHARACTER ,
+    OUTPUT       cFormUser     AS CHARACTER ,
+    OUTPUT       cFormColumns  AS CHARACTER ,
+    INPUT-OUTPUT iItemsPerPage AS INTEGER   ,
+    INPUT-OUTPUT cMaxHeight    AS CHARACTER
+    ):
         
-        DEFINE VARIABLE ccompany     AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFormId      AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cProgramUser 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.
 
-        cProgram = ''.
-        ccompany = oJsonIdent:GetCharacter('company').
-        cFormId  = oJsonIdent:GetCharacter('formId' ).
+    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.FormId    = cFormId NO-ERROR.
-            IF NOT AVAILABLE htmldokumente THEN NEXT. 
+    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.FormId    = cFormId NO-ERROR.
+        IF NOT AVAILABLE htmldokumente THEN NEXT. 
 
-            ASSIGN 
-                cProgram      = htmldokumente.program
-                cFormUser     = cProgramUser
-                iItemsPerPage = htmldokumente.itemsPerPage
-                cMaxHeight    = htmldokumente.tableMaxHeight
-                cFormColumns  = htmldokumente.formColumns. 
-            LEAVE.
-        END.
-        
-        RETURN cProgram.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC CHARACTER iso2date(
-        INPUT  cIsoDate  AS CHARACTER
-        ):
+        ASSIGN 
+            cProgram      = htmldokumente.program
+            cFormUser     = cProgramUser
+            iItemsPerPage = htmldokumente.itemsPerPage
+            cMaxHeight    = htmldokumente.tableMaxHeight
+            cFormColumns  = htmldokumente.formColumns. 
+        LEAVE.
+    END.
+        
+    RETURN cProgram.
+
+END METHOD.
+
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
+
+METHOD PUBLIC CHARACTER iso2date(
+    INPUT  cIsoDate  AS CHARACTER
+    ):
             
-        DEFINE VARIABLE cDate AS CHARACTER NO-UNDO.
-        
-        IF  cIsoDate = '' OR
-            cIsoDate = ?  THEN RETURN cDate.    
-        cDate = SUBSTITUTE('&1/&2/&3', ENTRY(2, cIsoDate, '-'), ENTRY(3, cIsoDate, '-'), ENTRY(1, cIsoDate, '-') ). 
-        
-        RETURN cDate.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID readLastcWhere(
-        INPUT  oJsonIdent  AS JsonObject,
-        INPUT  cFileName   AS CHARACTER ,
-        OUTPUT cWhere      AS CHARACTER 
-        ):
-        
-        FIND userdata
-            WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-            AND   userdata.company     = oJsonIdent:GetCharacter('company')
-            AND   userdata.branch      = '0000'
-            AND   userdata.record_type = 'where'
-            AND   userdata.section     = cFileName 
-            AND   userdata.key_type    = 'last' NO-ERROR.
+    DEFINE VARIABLE cDate AS CHARACTER NO-UNDO.
+        
+    IF  cIsoDate = '' OR
+        cIsoDate = ?  THEN RETURN cDate.    
+    cDate = SUBSTITUTE('&1/&2/&3', ENTRY(2, cIsoDate, '-'), ENTRY(3, cIsoDate, '-'), ENTRY(1, cIsoDate, '-') ). 
+        
+    RETURN cDate.
+
+END METHOD.
+
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
+
+METHOD PUBLIC VOID readLastcWhere(
+    INPUT  oJsonIdent  AS JsonObject,
+    INPUT  cFileName   AS CHARACTER ,
+    OUTPUT cWhere      AS CHARACTER 
+    ):
+        
+    FIND userdata
+        WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+        AND   userdata.company     = oJsonIdent:GetCharacter('company')
+        AND   userdata.branch      = '0000'
+        AND   userdata.record_type = 'where'
+        AND   userdata.section     = cFileName 
+        AND   userdata.key_type    = 'last' NO-ERROR.
               
-        IF AVAILABLE userdata THEN cWhere = userdata.cfield_1. 
-        RELEASE userdata.
-
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC LOGICAL readLastRecord(
-        INPUT  oJsonIdent       AS JsonObject,
-        OUTPUT cWhere           AS CHARACTER
-        ):
-
-        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 AVAILABLE userdata THEN cWhere = userdata.cfield_1. 
+    RELEASE userdata.
+
+    RETURN.
+
+END METHOD.
+
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
+
+METHOD PUBLIC LOGICAL readLastRecord(
+    INPUT  oJsonIdent       AS JsonObject,
+    OUTPUT cWhere           AS CHARACTER
+    ):
+
+    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.
+    cWhere = userdata.cfield_1.
+    RELEASE userdata.
         
-        RETURN TRUE.
+    RETURN TRUE.
         
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID readSortFields(
-        INPUT  oJsonIdent  AS JsonObject,
-        INPUT  cFileName   AS CHARACTER ,
-        OUTPUT cSortField  AS CHARACTER ,
-        OUTPUT cDirection  AS CHARACTER 
-        ):
+METHOD PUBLIC VOID readSortFields(
+    INPUT  oJsonIdent  AS JsonObject,
+    INPUT  cFileName   AS CHARACTER ,
+    OUTPUT cSortField  AS CHARACTER ,
+    OUTPUT cDirection  AS CHARACTER 
+    ):
             
-        DEFINE VARIABLE cCompany   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cUser_Name AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cCompany   AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cUser_Name AS CHARACTER NO-UNDO.
             
-        cSortField = ''.
-        cDirection = ''.
-        cCompany   = oJsonIdent:GetCharacter('company'  ).
-        cUser_Name = oJsonIdent:GetCharacter('user_name').
-        FIND userdata NO-LOCK
-            WHERE userdata.user_name   = cUser_Name
-            AND   userdata.company     = cCompany
-            AND   userdata.branch      = '0000'
-            AND   userdata.record_type = 'sortField'
-            AND   userdata.section     = cFileName 
-            AND   userdata.key_type    = '' NO-ERROR.
-        IF AVAILABLE userdata THEN 
-            ASSIGN
-                cSortField = userdata.cfield_1
-                cDirection = (IF userdata.cfield_2 BEGINS 'asc' THEN '' ELSE userdata.cfield_2).
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC CHARACTER getPrimaryIndexFields(
-        INPUT ipctable AS CHARACTER
-        ):
-        
-        DEFINE VARIABLE cFields    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cDBNames   AS CHARACTER NO-UNDO INIT 'Ge_MIS;FRAMEWORK'.
-        DEFINE VARIABLE cDBName    AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cFileName  AS CHARACTER NO-UNDO.
-        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).
-            CREATE BUFFER hBuffer FOR TABLE cFileName NO-ERROR.
-            IF  NOT ERROR-STATUS:ERROR    AND
-                VALID-HANDLE(hBuffer)     THEN LEAVE. 
+    cSortField = ''.
+    cDirection = ''.
+    cCompany   = oJsonIdent:GetCharacter('company'  ).
+    cUser_Name = oJsonIdent:GetCharacter('user_name').
+    FIND userdata NO-LOCK
+        WHERE userdata.user_name   = cUser_Name
+        AND   userdata.company     = cCompany
+        AND   userdata.branch      = '0000'
+        AND   userdata.record_type = 'sortField'
+        AND   userdata.section     = cFileName 
+        AND   userdata.key_type    = '' NO-ERROR.
+    IF AVAILABLE userdata THEN 
+        ASSIGN
+            cSortField = userdata.cfield_1
+            cDirection = (IF userdata.cfield_2 BEGINS 'asc' THEN '' ELSE userdata.cfield_2).
+        
+    RETURN.
+
+END METHOD.
+
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
+
+METHOD PUBLIC CHARACTER getPrimaryIndexFields(
+    INPUT ipctable AS CHARACTER
+    ):
+        
+    DEFINE VARIABLE cFields    AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cDBNames   AS CHARACTER NO-UNDO INIT 'Ge_MIS;FRAMEWORK'.
+    DEFINE VARIABLE cDBName    AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cFileName  AS CHARACTER NO-UNDO.
+    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).
+        CREATE BUFFER hBuffer FOR TABLE cFileName NO-ERROR.
+        IF  NOT ERROR-STATUS:ERROR    AND
+            VALID-HANDLE(hBuffer)     THEN LEAVE. 
 
-            DELETE OBJECT hBuffer NO-ERROR.
-            cDBName = ''.
-        END.
         DELETE OBJECT hBuffer NO-ERROR.
+        cDBName = ''.
+    END.
+    DELETE OBJECT hBuffer NO-ERROR.
 
-        cFields = ''.               
-        CASE cDBName:
-            WHEN 'Ge_MIS' THEN 
-                DO:
-                    FIND FIRST Ge_MIS._File NO-LOCK 
-                        WHERE Ge_MIS._File._File-Name = ipctable NO-ERROR.
-                    FOR EACH Ge_MIS._Index-Field NO-LOCK 
-                        WHERE Ge_MIS._Index-Field._Index-Recid = Ge_MIS._File._Prime-Index,
+    cFields = ''.               
+    CASE cDBName:
+        WHEN 'Ge_MIS' THEN 
+            DO:
+                FIND FIRST Ge_MIS._File NO-LOCK 
+                    WHERE Ge_MIS._File._File-Name = ipctable NO-ERROR.
+                FOR EACH Ge_MIS._Index-Field NO-LOCK 
+                    WHERE Ge_MIS._Index-Field._Index-Recid = Ge_MIS._File._Prime-Index,
                         
-                        FIRST Ge_MIS._Field NO-LOCK
-                        WHERE RECID(Ge_MIS._Field) = Ge_MIS._index-Field._Field-recid
+                    FIRST Ge_MIS._Field NO-LOCK
+                    WHERE RECID(Ge_MIS._Field) = Ge_MIS._index-Field._Field-recid
                         
-                        BY Ge_MIS._Index-Field._Index-Seq:
+                    BY Ge_MIS._Index-Field._Index-Seq:
                             
-                        cFields = cFields 
-                            + (IF cFields = '' THEN '' ELSE ';')
-                            + Ge_MIS._Field._Field-Name.
-                    END. 
-                END.
-            WHEN 'FRAMEWORK' THEN 
-                DO:
-                    FIND FIRST FRAMEWORK._File NO-LOCK 
-                        WHERE FRAMEWORK._File._File-Name = ipctable NO-ERROR.
-                    FOR EACH FRAMEWORK._Index-Field NO-LOCK 
-                        WHERE FRAMEWORK._Index-Field._Index-Recid = FRAMEWORK._File._Prime-Index,
+                    cFields = cFields 
+                        + (IF cFields = '' THEN '' ELSE ';')
+                        + Ge_MIS._Field._Field-Name.
+                END. 
+            END.
+        WHEN 'FRAMEWORK' THEN 
+            DO:
+                FIND FIRST FRAMEWORK._File NO-LOCK 
+                    WHERE FRAMEWORK._File._File-Name = ipctable NO-ERROR.
+                FOR EACH FRAMEWORK._Index-Field NO-LOCK 
+                    WHERE FRAMEWORK._Index-Field._Index-Recid = FRAMEWORK._File._Prime-Index,
                         
-                        FIRST FRAMEWORK._Field NO-LOCK
-                        WHERE RECID(FRAMEWORK._Field) = FRAMEWORK._index-Field._Field-recid
+                    FIRST FRAMEWORK._Field NO-LOCK
+                    WHERE RECID(FRAMEWORK._Field) = FRAMEWORK._index-Field._Field-recid
                         
-                        BY FRAMEWORK._Index-Field._Index-Seq:
+                    BY FRAMEWORK._Index-Field._Index-Seq:
                             
-                        cFields = cFields 
-                            + (IF cFields = '' THEN '' ELSE ';')
-                            + FRAMEWORK._Field._Field-Name.
-                    END. 
-                END.
-        END CASE.
+                    cFields = cFields 
+                        + (IF cFields = '' THEN '' ELSE ';')
+                        + FRAMEWORK._Field._Field-Name.
+                END. 
+            END.
+    END CASE.
 
-        RETURN cFields.
+    RETURN cFields.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC CHARACTER getSysUser(  ):
+METHOD PUBLIC CHARACTER getSysUser(  ):
 
-        DEFINE VARIABLE mBen  AS MEMPTR    NO-UNDO.
-        DEFINE VARIABLE iLeng AS INTEGER   INIT 100 NO-UNDO.
-        DEFINE VARIABLE fok   AS INTEGER   NO-UNDO.
-        DEFINE VARIABLE cBen  AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE mBen  AS MEMPTR    NO-UNDO.
+    DEFINE VARIABLE iLeng AS INTEGER   INIT 100 NO-UNDO.
+    DEFINE VARIABLE fok   AS INTEGER   NO-UNDO.
+    DEFINE VARIABLE cBen  AS CHARACTER NO-UNDO.
 
-        SET-SIZE(mBen) = iLeng.
-        RUN GetUserNameA( OUTPUT mBen, INPUT-OUTPUT iLeng, OUTPUT fok ) NO-ERROR.
-        ASSIGN 
-            cBen = GET-STRING(mBen,1) NO-ERROR.
+    SET-SIZE(mBen) = iLeng.
+    RUN GetUserNameA( OUTPUT mBen, INPUT-OUTPUT iLeng, OUTPUT fok ) NO-ERROR.
+    ASSIGN 
+        cBen = GET-STRING(mBen,1) NO-ERROR.
 
-        SET-SIZE(mBen) = 0.
+    SET-SIZE(mBen) = 0.
 
-        RETURN cBen.
+    RETURN cBen.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC LOGICAL readInputDatenFromJson(
-        INPUT oJsonObject       AS JsonObject,
-        INPUT hbttInput         AS HANDLE,
-        INPUT-OUTPUT hbttTemp   AS HANDLE
-        ):
+METHOD PUBLIC LOGICAL readInputDatenFromJson(
+    INPUT oJsonObject       AS JsonObject,
+    INPUT hbttInput         AS HANDLE,
+    INPUT-OUTPUT hbttTemp   AS HANDLE
+    ):
         
-        DEFINE VARIABLE lcJsonString AS LONGCHAR   NO-UNDO.
-        DEFINE VARIABLE lcOriginal   AS LONGCHAR   NO-UNDO.
+    DEFINE VARIABLE lcJsonString AS LONGCHAR   NO-UNDO.
+    DEFINE VARIABLE lcOriginal   AS LONGCHAR   NO-UNDO.
         
-        DEFINE VARIABLE ctable       AS CHARACTER  NO-UNDO.
+    DEFINE VARIABLE ctable       AS CHARACTER  NO-UNDO.
         
-        DEFINE VARIABLE jsonttTemp   AS jsonObject NO-UNDO.
+    DEFINE VARIABLE jsonttTemp   AS jsonObject NO-UNDO.
         
-        DEFINE VARIABLE lRetVal      AS LOGICAL    NO-UNDO INIT FALSE.
-        DEFINE VARIABLE cString      AS CHARACTER  NO-UNDO.
+    DEFINE VARIABLE lRetVal      AS LOGICAL    NO-UNDO INIT FALSE.
+    DEFINE VARIABLE cString      AS CHARACTER  NO-UNDO.
         
-        jsonttTemp = NEW JsonObject().
-        jsonttTemp = oJsonObject:GetJsonObject('ttTemp').
-        lRetVal    = hbttTemp:READ-JSON ('JsonObject', jsonttTemp).
-        hbttTemp:FIND-FIRST ().
+    jsonttTemp = NEW JsonObject().
+    jsonttTemp = oJsonObject:GetJsonObject('ttTemp').
+    lRetVal    = hbttTemp:READ-JSON ('JsonObject', jsonttTemp).
+    hbttTemp:FIND-FIRST ().
         
-        hbttTemp:WRITE-JSON('longchar', lcJsonString, FALSE).
+    hbttTemp:WRITE-JSON('longchar', lcJsonString, FALSE).
 // MESSAGE 'Daten zweiter Buffer -> ' STRING(lcJsonString). 
 
-        lRetVal = TRUE.
-        RETURN lRetVal.
+    lRetVal = TRUE.
+    RETURN lRetVal.
         
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID readPosition(
-        INPUT  oJsonIdent       AS JsonObject ,
-        INPUT  cFileName        AS CHARACTER  ,
-        OUTPUT iCurrentPosition AS INTEGER    ,
-        OUTPUT iStartPage       AS INTEGER    ,
-        OUTPUT iMaxRecords      AS INTEGER   
-        ):
+METHOD PUBLIC VOID readPosition(
+    INPUT  oJsonIdent       AS JsonObject ,
+    INPUT  cFileName        AS CHARACTER  ,
+    OUTPUT iCurrentPosition AS INTEGER    ,
+    OUTPUT iStartPage       AS INTEGER    ,
+    OUTPUT iMaxRecords      AS INTEGER   
+    ):
             
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata
-                WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                AND   userdata.company     = oJsonIdent:GetCharacter('company')
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'position'
-                AND   userdata.section     = cFileName 
-                AND   userdata.key_type    = '' NO-ERROR.
-            IF AVAILABLE userdata THEN 
-            DO:
-                ASSIGN               
-                    iCurrentPosition = userdata.ifield_1
-                    iStartPage       = userdata.ifield_2
-                    iMaxRecords      = userdata.ifield_3.
-            END.
-            ELSE 
-            DO:
-                ASSIGN               
-                    iCurrentPosition = 1
-                    iStartPage       = 1
-                    iMaxRecords      = 25.
-            END.
-            RELEASE userdata.
-            LEAVE.
-        END.
-        
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-
-    METHOD PUBLIC VOID readStartcWhere(
-        INPUT  oJsonIdent  AS JsonObject,
-        INPUT  cFileName   AS CHARACTER ,
-        OUTPUT cWhere      AS CHARACTER 
-        ):
-        
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
         FIND userdata
             WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
             AND   userdata.company     = oJsonIdent:GetCharacter('company')
             AND   userdata.branch      = '0000'
-            AND   userdata.record_type = 'where'
+            AND   userdata.record_type = 'position'
             AND   userdata.section     = cFileName 
-            AND   userdata.key_type    = 'start' NO-ERROR.
-              
-        IF AVAILABLE userdata THEN cWhere = userdata.cfield_1. 
+            AND   userdata.key_type    = '' NO-ERROR.
+        IF AVAILABLE userdata THEN 
+        DO:
+            ASSIGN               
+                iCurrentPosition = userdata.ifield_1
+                iStartPage       = userdata.ifield_2
+                iMaxRecords      = userdata.ifield_3.
+        END.
+        ELSE 
+        DO:
+            ASSIGN               
+                iCurrentPosition = 1
+                iStartPage       = 1
+                iMaxRecords      = 25.
+        END.
         RELEASE userdata.
+        LEAVE.
+    END.
+        
+    RETURN.
+
+END METHOD.
+
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
+
+METHOD PUBLIC VOID readStartcWhere(
+    INPUT  oJsonIdent  AS JsonObject,
+    INPUT  cFileName   AS CHARACTER ,
+    OUTPUT cWhere      AS CHARACTER 
+    ):
+        
+    FIND userdata
+        WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+        AND   userdata.company     = oJsonIdent:GetCharacter('company')
+        AND   userdata.branch      = '0000'
+        AND   userdata.record_type = 'where'
+        AND   userdata.section     = cFileName 
+        AND   userdata.key_type    = 'start' NO-ERROR.
+              
+    IF AVAILABLE userdata THEN cWhere = userdata.cfield_1. 
+    RELEASE userdata.
 
-        RETURN.
+    RETURN.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID setActiveSelection(
-        INPUT  oJsonIdent       AS JsonObject,
-        INPUT  cFileName        AS CHARACTER ,
-        INPUT  cActiveSelection AS CHARACTER 
-        ):
+METHOD PUBLIC VOID setActiveSelection(
+    INPUT  oJsonIdent       AS JsonObject,
+    INPUT  cFileName        AS CHARACTER ,
+    INPUT  cActiveSelection AS CHARACTER 
+    ):
             
-        DEFINE VARIABLE ccompany   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE ccompany   AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cuser_name AS CHARACTER NO-UNDO.
         
-        ASSIGN 
-            ccompany   = oJsonIdent:GetCharacter('company')
-            cuser_name = oJsonIdent:GetCharacter('user_name')
-            cProgram   = oJsonIdent:GetCharacter('program').
+    ASSIGN 
+        ccompany   = oJsonIdent:GetCharacter('company')
+        cuser_name = oJsonIdent:GetCharacter('user_name')
+        cProgram   = oJsonIdent:GetCharacter('program').
  
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
-            FIND userdata 
-                WHERE userdata.user_name   = cuser_name
-                AND   userdata.company     = ccompany
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'active'
-                AND   userdata.section     = cFileName 
-                AND   userdata.key_type    = cProgram NO-ERROR.
-            IF NOT AVAILABLE userdata THEN 
-            DO:
-                CREATE userdata.
-                ASSIGN
-                    userdata.user_name     = cuser_name
-                    userdata.company       = ccompany
-                    userdata.branch        = '0000'
-                    userdata.record_type   = 'active'
-                    userdata.section       = cFileName 
-                    userdata.key_type      = cProgram
-                    userdata.creation_date = NOW NO-ERROR.
-            END.
-            ELSE 
-            DO:
-                userdata.access_date = NOW.
-            END.
-            userdata.cfield_1    = cActiveSelection.
-            RELEASE userdata.
-            LEAVE.
-        END.   
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:
+        FIND userdata 
+            WHERE userdata.user_name   = cuser_name
+            AND   userdata.company     = ccompany
+            AND   userdata.branch      = '0000'
+            AND   userdata.record_type = 'active'
+            AND   userdata.section     = cFileName 
+            AND   userdata.key_type    = cProgram NO-ERROR.
+        IF NOT AVAILABLE userdata THEN 
+        DO:
+            CREATE userdata.
+            ASSIGN
+                userdata.user_name     = cuser_name
+                userdata.company       = ccompany
+                userdata.branch        = '0000'
+                userdata.record_type   = 'active'
+                userdata.section       = cFileName 
+                userdata.key_type      = cProgram
+                userdata.creation_date = NOW NO-ERROR.
+        END.
+        ELSE 
+        DO:
+            userdata.access_date = NOW.
+        END.
+        userdata.cfield_1    = cActiveSelection.
+        RELEASE userdata.
+        LEAVE.
+    END.   
 
-        RETURN.
+    RETURN.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC LONGCHAR trimStructure(
-        INPUT oJsonInput AS JsonObject
-        ):
+METHOD PUBLIC LONGCHAR trimStructure(
+    INPUT oJsonInput AS JsonObject
+    ):
 
-        DEFINE VARIABLE lcResult AS LONGCHAR NO-UNDO.
-        DEFINE VARIABLE ii       AS INTEGER  NO-UNDO.
+    DEFINE VARIABLE lcResult AS LONGCHAR NO-UNDO.
+    DEFINE VARIABLE ii       AS INTEGER  NO-UNDO.
         
-        lcResult = TRIM(oJsonInput:GetJsonText()).
-        lcResult = SUBSTRING(lcResult,02).
-        ii = LENGTH(lcResult) - 1.
-        lcResult = SUBSTRING(lcResult,01, ii).
+    lcResult = TRIM(oJsonInput:GetJsonText()).
+    lcResult = SUBSTRING(lcResult,02).
+    ii = LENGTH(lcResult) - 1.
+    lcResult = SUBSTRING(lcResult,01, ii).
         
-        RETURN lcResult.
+    RETURN lcResult.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID writeLastcWhere(
-        INPUT  oJsonIdent  AS JsonObject,
-        INPUT  cFileName   AS CHARACTER ,
-        INPUT  cWhere      AS CHARACTER 
-        ):
+METHOD PUBLIC VOID writeLastcWhere(
+    INPUT  oJsonIdent  AS JsonObject,
+    INPUT  cFileName   AS CHARACTER ,
+    INPUT  cWhere      AS CHARACTER 
+    ):
         
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata
-                WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                AND   userdata.company     = oJsonIdent:GetCharacter('company')
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'where'
-                AND   userdata.section     = cFileName 
-                AND   userdata.key_type    = 'last' NO-ERROR.
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
+        FIND userdata
+            WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+            AND   userdata.company     = oJsonIdent:GetCharacter('company')
+            AND   userdata.branch      = '0000'
+            AND   userdata.record_type = 'where'
+            AND   userdata.section     = cFileName 
+            AND   userdata.key_type    = 'last' NO-ERROR.
               
-            IF NOT AVAILABLE userdata THEN 
-            DO:
-                CREATE  userdata.
-                ASSIGN 
-                    userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                    userdata.company     = oJsonIdent:GetCharacter('company')
-                    userdata.branch      = '0000'
-                    userdata.record_type = 'where'
-                    userdata.section     = cFileName 
-                    userdata.key_type    = 'last' NO-ERROR.
-            END.
-            ASSIGN  
-                userdata.cfield_1 = cWhere.
-            RELEASE userdata.
-            LEAVE.
+        IF NOT AVAILABLE userdata THEN 
+        DO:
+            CREATE  userdata.
+            ASSIGN 
+                userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+                userdata.company     = oJsonIdent:GetCharacter('company')
+                userdata.branch      = '0000'
+                userdata.record_type = 'where'
+                userdata.section     = cFileName 
+                userdata.key_type    = 'last' NO-ERROR.
         END.
+        ASSIGN  
+            userdata.cfield_1 = cWhere.
+        RELEASE userdata.
+        LEAVE.
+    END.
 
-        RETURN.
+    RETURN.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC LOGICAL writeLastRecord(
-        INPUT  oJsonIdent       AS JsonObject,
-        INPUT  cWhere           AS CHARACTER
-        ):
+METHOD PUBLIC LOGICAL writeLastRecord(
+    INPUT  oJsonIdent       AS JsonObject,
+    INPUT  cWhere           AS CHARACTER
+    ):
             
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata
-                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.
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
+        FIND userdata
+            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 
-            DO:
-                CREATE  userdata.
-                ASSIGN 
-                    userdata.user_name     = oJsonIdent:GetCharacter('user_name')
-                    userdata.company       = oJsonIdent:GetCharacter('company')
-                    userdata.branch        = '0000'
-                    userdata.record_type   = 'lastrecord'
-                    userdata.section       = oJsonIdent:GetCharacter('file_name') 
-                    userdata.key_type      = ''
-                    userdata.creation_date = NOW NO-ERROR.
-            END.
-            ASSIGN  
-                userdata.cfield_1    = cWhere
-                userdata.access_date = NOW.
-            RELEASE userdata.
-            LEAVE.
+        IF NOT AVAILABLE userdata THEN 
+        DO:
+            CREATE  userdata.
+            ASSIGN 
+                userdata.user_name     = oJsonIdent:GetCharacter('user_name')
+                userdata.company       = oJsonIdent:GetCharacter('company')
+                userdata.branch        = '0000'
+                userdata.record_type   = 'lastrecord'
+                userdata.section       = oJsonIdent:GetCharacter('file_name') 
+                userdata.key_type      = ''
+                userdata.creation_date = NOW NO-ERROR.
         END.
+        ASSIGN  
+            userdata.cfield_1    = cWhere
+            userdata.access_date = NOW.
+        RELEASE userdata.
+        LEAVE.
+    END.
         
-        RETURN TRUE.
+    RETURN TRUE.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID writePosition(
-        INPUT  oJsonIdent       AS JsonObject,
-        INPUT  cFileName        AS CHARACTER ,
-        INPUT  iCurrentPosition AS INTEGER   ,
-        INPUT  iStartPage       AS INTEGER   ,
-        INPUT  iMaxRecords      AS INTEGER    
-        ):
+METHOD PUBLIC VOID writePosition(
+    INPUT  oJsonIdent       AS JsonObject,
+    INPUT  cFileName        AS CHARACTER ,
+    INPUT  iCurrentPosition AS INTEGER   ,
+    INPUT  iStartPage       AS INTEGER   ,
+    INPUT  iMaxRecords      AS INTEGER    
+    ):
             
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata
-                WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                AND   userdata.company     = oJsonIdent:GetCharacter('company')
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'position'
-                AND   userdata.section     = cFileName 
-                AND   userdata.key_type    = '' NO-ERROR.
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
+        FIND userdata
+            WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+            AND   userdata.company     = oJsonIdent:GetCharacter('company')
+            AND   userdata.branch      = '0000'
+            AND   userdata.record_type = 'position'
+            AND   userdata.section     = cFileName 
+            AND   userdata.key_type    = '' NO-ERROR.
               
-            IF NOT AVAILABLE userdata THEN 
-            DO:
-                CREATE  userdata.
-                ASSIGN 
-                    userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                    userdata.company     = oJsonIdent:GetCharacter('company')
-                    userdata.branch      = '0000'
-                    userdata.record_type = 'position'
-                    userdata.section     = cFileName 
-                    userdata.key_type    = '' NO-ERROR.
-            END.
-            ASSIGN  
-                userdata.ifield_1 = iCurrentPosition
-                userdata.iField_2 = iStartPage
-                userdata.ifield_3 = iMaxRecords.
-            RELEASE userdata.
-            LEAVE.
+        IF NOT AVAILABLE userdata THEN 
+        DO:
+            CREATE  userdata.
+            ASSIGN 
+                userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+                userdata.company     = oJsonIdent:GetCharacter('company')
+                userdata.branch      = '0000'
+                userdata.record_type = 'position'
+                userdata.section     = cFileName 
+                userdata.key_type    = '' NO-ERROR.
         END.
+        ASSIGN  
+            userdata.ifield_1 = iCurrentPosition
+            userdata.iField_2 = iStartPage
+            userdata.ifield_3 = iMaxRecords.
+        RELEASE userdata.
+        LEAVE.
+    END.
         
-        RETURN.
+    RETURN.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID writeSortfields(
-        INPUT  oJsonIdent  AS JsonObject,
-        INPUT  cFileName   AS CHARACTER ,
-        INPUT  cSortField  AS CHARACTER ,
-        INPUT  cDirection  AS CHARACTER 
-        ):
+METHOD PUBLIC VOID writeSortfields(
+    INPUT  oJsonIdent  AS JsonObject,
+    INPUT  cFileName   AS CHARACTER ,
+    INPUT  cSortField  AS CHARACTER ,
+    INPUT  cDirection  AS CHARACTER 
+    ):
         
-        DEFINE VARIABLE cCompany   AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cUser_Name AS CHARACTER NO-UNDO.
-        DEFINE VARIABLE cReplace   AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cCompany   AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cUser_Name AS CHARACTER NO-UNDO.
+    DEFINE VARIABLE cReplace   AS CHARACTER NO-UNDO.
             
-        cCompany   = oJsonIdent:GetCharacter('company'  ).
-        cUser_Name = oJsonIdent:GetCharacter('user_name').
-        cReplace   = SUBSTITUTE('&1_', cFileName).
-        cSortField = REPLACE(cSortField, cReplace, '').
-        
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata
-                WHERE userdata.user_name   = cUser_Name
-                AND   userdata.company     = cCompany
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'sortField'
-                AND   userdata.section     = cFileName 
-                AND   userdata.key_type    = '' NO-ERROR.
+    cCompany   = oJsonIdent:GetCharacter('company'  ).
+    cUser_Name = oJsonIdent:GetCharacter('user_name').
+    cReplace   = SUBSTITUTE('&1_', cFileName).
+    cSortField = REPLACE(cSortField, cReplace, '').
+        
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
+        FIND userdata
+            WHERE userdata.user_name   = cUser_Name
+            AND   userdata.company     = cCompany
+            AND   userdata.branch      = '0000'
+            AND   userdata.record_type = 'sortField'
+            AND   userdata.section     = cFileName 
+            AND   userdata.key_type    = '' NO-ERROR.
               
-            IF NOT AVAILABLE userdata THEN 
-            DO:
-                CREATE  userdata.
-                ASSIGN 
-                    userdata.user_name   = cUser_Name
-                    userdata.company     = cCompany
-                    userdata.branch      = '0000'
-                    userdata.record_type = 'sortField'
-                    userdata.section     = cFileName 
-                    userdata.key_type    = '' NO-ERROR.
-            END.
-            ASSIGN  
-                userdata.cfield_1 = cSortfield
-                userdata.cfield_2 = cDirection.
-            RELEASE userdata.
-            LEAVE.
+        IF NOT AVAILABLE userdata THEN 
+        DO:
+            CREATE  userdata.
+            ASSIGN 
+                userdata.user_name   = cUser_Name
+                userdata.company     = cCompany
+                userdata.branch      = '0000'
+                userdata.record_type = 'sortField'
+                userdata.section     = cFileName 
+                userdata.key_type    = '' NO-ERROR.
         END.
+        ASSIGN  
+            userdata.cfield_1 = cSortfield
+            userdata.cfield_2 = cDirection.
+        RELEASE userdata.
+        LEAVE.
+    END.
 
-        RETURN.
+    RETURN.
 
-    END METHOD.
+END METHOD.
 
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
 
-    METHOD PUBLIC VOID writeStartcWhere(
-        INPUT  oJsonIdent  AS JsonObject,
-        INPUT  cFileName   AS CHARACTER ,
-        INPUT  cWhere      AS CHARACTER 
-        ):
+METHOD PUBLIC VOID writeStartcWhere(
+    INPUT  oJsonIdent  AS JsonObject,
+    INPUT  cFileName   AS CHARACTER ,
+    INPUT  cWhere      AS CHARACTER 
+    ):
         
-        REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
-            FIND userdata
-                WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                AND   userdata.company     = oJsonIdent:GetCharacter('company')
-                AND   userdata.branch      = '0000'
-                AND   userdata.record_type = 'where'
-                AND   userdata.section     = cFileName 
-                AND   userdata.key_type    = 'start' NO-ERROR.
+    REPEAT TRANSACTION ON ERROR UNDO, LEAVE:  
+        FIND userdata
+            WHERE userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+            AND   userdata.company     = oJsonIdent:GetCharacter('company')
+            AND   userdata.branch      = '0000'
+            AND   userdata.record_type = 'where'
+            AND   userdata.section     = cFileName 
+            AND   userdata.key_type    = 'start' NO-ERROR.
               
-            IF NOT AVAILABLE userdata THEN 
-            DO:
-                CREATE  userdata.
-                ASSIGN 
-                    userdata.user_name   = oJsonIdent:GetCharacter('user_name')
-                    userdata.company     = oJsonIdent:GetCharacter('company')
-                    userdata.branch      = '0000'
-                    userdata.record_type = 'where'
-                    userdata.section     = cFileName 
-                    userdata.key_type    = 'start' NO-ERROR.
-            END.
-            ASSIGN  
-                userdata.cfield_1 = cWhere.
-            RELEASE userdata.
-            LEAVE.
+        IF NOT AVAILABLE userdata THEN 
+        DO:
+            CREATE  userdata.
+            ASSIGN 
+                userdata.user_name   = oJsonIdent:GetCharacter('user_name')
+                userdata.company     = oJsonIdent:GetCharacter('company')
+                userdata.branch      = '0000'
+                userdata.record_type = 'where'
+                userdata.section     = cFileName 
+                userdata.key_type    = 'start' NO-ERROR.
         END.
-
-        RETURN.
-
-    END METHOD.
-
-    /*------------------------------------------------------------------------------
-     Purpose:
-     Notes:
-    ------------------------------------------------------------------------------*/
-    DESTRUCTOR PUBLIC utilitiesHandler ( ):
-    /*    MESSAGE 'Destructor utilitiesHandler '.*/
-    /*    DELETE OBJECT hQuery NO-ERROR.         */
-    /*    DELETE OBJECT hBuffer NO-ERROR.        */
-    END DESTRUCTOR.
+        ASSIGN  
+            userdata.cfield_1 = cWhere.
+        RELEASE userdata.
+        LEAVE.
+    END.
+
+    RETURN.
+
+END METHOD.
+
+/*------------------------------------------------------------------------------
+ Purpose:
+ Notes:
+------------------------------------------------------------------------------*/
+DESTRUCTOR PUBLIC utilitiesHandler ( ):
+/*    MESSAGE 'Destructor utilitiesHandler '.*/
+/*    DELETE OBJECT hQuery NO-ERROR.         */
+/*    DELETE OBJECT hBuffer NO-ERROR.        */
+END DESTRUCTOR.
 
 END CLASS.

Some files were not shown because too many files changed in this diff