/*------------------------------------------------------------------------ File : queryHandler Purpose : Syntax : Description : Author(s) : walter.riechsteiner Created : Wed Jul 10 18:09:37 CEST 2024 Notes : ----------------------------------------------------------------------*/ USING Progress.Json.ObjectModel.JsonObject FROM PROPATH. USING System.Reflection.Emit.Label FROM ASSEMBLY. CLASS utilities.utilitiesHandler: DEFINE VARIABLE i1 AS INTEGER NO-UNDO. DEFINE VARIABLE i2 AS INTEGER NO-UNDO. DEFINE VARIABLE cProgramm AS CHARACTER NO-UNDO. DEFINE TEMP-TABLE ttBrowserKo LIKE browser_ko. DEFINE TEMP-TABLE ttViewerKo LIKE viewer_ko. DEFINE TEMP-TABLE ttExterneFelder NO-UNDO FIELD cTabelle AS CHARACTER FIELD hBuffer AS HANDLE FIELD cKeyFelder AS CHARACTER FIELD cWhere AS CHARACTER FIELD cFelder AS CHARACTER FIELD cDataType AS CHARACTER . /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC HANDLE createExterneFelder( INPUT ipcTabelle AS CHARACTER , INPUT ipcFeld AS CHARACTER , INPUT ipcDatatype AS CHARACTER , INPUT iphttInput AS HANDLE ): DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. DEFINE VARIABLE cKeyFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cKeyValue AS CHARACTER NO-UNDO. FIND FIRST ttExterneFelder WHERE ttExterneFelder.cTabelle = ipcTabelle NO-ERROR. DO WHILE TRUE: IF AVAILABLE ttExterneFelder THEN LEAVE. FIND AnaDat._File NO-LOCK WHERE AnaDat._File._File-name = ipcTabelle NO-ERROR. IF NOT AVAILABLE AnaDat._File THEN RETURN hBuffer. FIND FIRST AnaDat._Field NO-LOCK OF _File WHERE AnaDat._Field._Field-Name = ipcFeld NO-ERROR. IF NOT AVAILABLE AnaDat._Field THEN RETURN hBuffer. CREATE BUFFER hBuffer FOR TABLE ipcTabelle. CREATE ttExterneFelder. ASSIGN ttExterneFelder.cTabelle = ipcTabelle ttExterneFelder.hBuffer = hBuffer. FIND FIRST AnaDat._Index WHERE RECID(_Index) = _File._Prime-Index NO-LOCK. FOR EACH AnaDat._Index-Field WHERE _Index-Field._Index-Recid = RECID(_Index): FIND AnaDat._Field WHERE RECID(_Field) = _Index-Field._Field-Recid. cKeyFeld = _Field._Field-Name. cKeyValue = ''. CASE cKeyFeld: WHEN 'Firma' OR WHEN 'Mandant' THEN DO: cKeyValue = QUOTER(iphttInput::mandant). END. WHEN 'Sprcd' THEN DO: cKeyValue = iphttInput::sprcd. END. WHEN 'Benutzer' THEN DO: cKeyValue = iphttInput::benutzer. END. END CASE. IF cKeyValue <> '' THEN DO: CASE ipcDatatype: WHEN 'character' THEN cKeyValue = QUOTER(cKeyValue). END CASE. ttExterneFelder.cWhere = ttExterneFelder.cWhere + (IF cWhere = '' THEN 'WHERE ' ELSE 'AND ') + SUBSTITUTE('&1.&2 = &3':U, ipcTabelle, cKeyFeld, cKeyValue). NEXT. END. ttExterneFelder.cKeyFelder = ttExterneFelder.cKeyFelder + (IF ttExterneFelder.cKeyFelder = '' THEN '' ELSE ';') + cKeyFeld. END. IF LOOKUP(ipcFeld, ttExterneFelder.cFelder, ';') > 0 THEN NEXT. ttExterneFelder.cFelder = ttExterneFelder.cFelder + (IF ttExterneFelder.cFelder = '' THEN '' ELSE ';') + ipcFeld. ttExterneFelder.cDataType = ttExterneFelder.cDataType + (IF ttExterneFelder.cDataType = '' THEN '' ELSE ';') + ipcFeld. END. // DELETE OBJECT hBuffer NO-ERROR. RETURN hBuffer. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL createQuery( INPUT httInput AS HANDLE, INPUT httBrowserKo AS HANDLE, OUTPUT hQuery AS HANDLE, OUTPUT hBuffer AS HANDLE ). DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO INIT FALSE. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE cAnd AS CHARACTER NO-UNDO INIT 'WHERE'. DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO. DEFINE VARIABLE cSortFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cRichtung AS CHARACTER NO-UNDO. DEFINE VARIABLE iAnzRec AS INTEGER NO-UNDO. DEFINE VARIABLE iModulo AS INTEGER NO-UNDO. cTabelle = httInput::tabelle. cSortFeld = httBrowserKo::sortfeld. cRichtung = ''. IF cSortFeld <> '' THEN DO: IF NUM-ENTRIES(cSortfeld, ':') > 1 THEN DO: cRichtung = ENTRY(2, cSortfeld, ':'). cSortfeld = ENTRY(1, cSortfeld, ':'). END. IF cRichtung = '' THEN cRichtung = 'ASCENDING'. END. CREATE QUERY hQuery. CREATE BUFFER hBuffer FOR TABLE cTabelle. hQuery:SET-BUFFERS (hBuffer). IF httInput::action = 'last' THEN DO: cWhere = SUBSTITUTE('PRESELECT EACH &1 NO-LOCK ', httInput::tabelle). IF httBrowserKo::lmandant THEN DO: cWhere = cWhere + SUBSTITUTE('&1 &2.Firma = "&3" ', cAnd, httInput::tabelle, httInput::mandant). END. hQuery:QUERY-PREPARE (cWhere). hQuery:QUERY-OPEN (). iAnzRec = hQuery:NUM-RESULTS. iModulo = iAnzRec MOD httBrowserKo::pagesize. IF iModulo > 0 THEN httBrowserKo::actualpage = (iAnzRec - (iAnzRec MOD httBrowserKo::pagesize)) / httBrowserKo::pagesize. ELSE httBrowserKo::actualpage = (iAnzRec / httBrowserKo::pagesize) - 1. hQuery:QUERY-CLOSE (). END. i1 = 0. cWhere = SUBSTITUTE('FOR EACH &1 NO-LOCK ', httInput::tabelle). IF httBrowserKo::lmandant THEN DO: cWhere = cWhere + SUBSTITUTE('&1 &2.Firma = "&3" ', cAnd, httInput::tabelle, httInput::mandant). cAnd = 'AND'. END. IF cRichtung = 'ASCENDING' THEN cRichtung = ''. IF cSortFeld <> '' THEN cWhere = cWhere + ' BY ' + cSortFeld + ' ' + cRichtung. MESSAGE 'cWhere-Statement = ' cWhere. hQuery:QUERY-PREPARE (cWhere). lRetVal = TRUE. RETURN lRetVal. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL createSearchQuery( INPUT httInput AS HANDLE, INPUT httBrowserKo AS HANDLE, OUTPUT hQuery AS HANDLE, OUTPUT hBuffer AS HANDLE ). DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO INIT FALSE. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE cAnd AS CHARACTER NO-UNDO INIT 'WHERE'. DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO. DEFINE VARIABLE cSuchFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cSortfeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cRichtung AS CHARACTER NO-UNDO. DEFINE VARIABLE iAnzRec AS INTEGER NO-UNDO. DEFINE VARIABLE lcWortIndex AS LONGCHAR NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE iFelder AS INTEGER NO-UNDO. DEFINE VARIABLE iFound AS INTEGER NO-UNDO. DEFINE VARIABLE cInhalt AS CHARACTER NO-UNDO. DEFINE VARIABLE rRecid AS RECID NO-UNDO. DEFINE VARIABLE httTemp AS HANDLE NO-UNDO. DEFINE VARIABLE hbTabelle AS HANDLE NO-UNDO. DEFINE VARIABLE hqTabelle AS HANDLE NO-UNDO. DEFINE VARIABLE hFeld AS HANDLE NO-UNDO. DEFINE VARIABLE hWortIndex AS HANDLE NO-UNDO. DEFINE VARIABLE hSuchFeld AS HANDLE NO-UNDO. DEFINE VARIABLE cFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE hFeldTabelle AS HANDLE NO-UNDO EXTENT 10. DEFINE VARIABLE cInhaltTabelle AS CHARACTER NO-UNDO EXTENT 10. DEFINE VARIABLE cString AS CHARACTER NO-UNDO. DEFINE VARIABLE ix AS INTEGER NO-UNDO. DEFINE VARIABLE iy AS INTEGER NO-UNDO. DEFINE VARIABLE lQuoter AS LOGICAL NO-UNDO. cTabelle = httInput::tabelle. cSuchFeld = httInput::suchfeld. cSortfeld = httBrowserKo::sortfeld. cRichtung = ''. IF cSortFeld <> '' THEN DO: IF NUM-ENTRIES(cSortfeld, ':') > 1 THEN DO: cRichtung = ENTRY(2, cSortfeld, ':'). cSortfeld = ENTRY(1, cSortfeld, ':'). END. IF cRichtung = '' THEN cRichtung = 'ASCENDING'. END. MESSAGE 'Suchfeld = ' cSuchfeld ' Sortfeld = ' cSortfeld ' Richtung = ' cRichtung. CREATE TEMP-TABLE httTemp. httTemp:CREATE-LIKE (cTabelle). httTemp:ADD-NEW-FIELD ('ident', 'CHARACTER'). httTemp:TEMP-TABLE-PREPARE('ttTemp'). hBuffer = httTemp:DEFAULT-BUFFER-HANDLE. CREATE QUERY hqTabelle. CREATE BUFFER hbTabelle FOR TABLE cTabelle. hqTabelle:SET-BUFFERS ( hbTabelle ). hWortIndex = hbTabelle:BUFFER-FIELD('WortIndex') NO-ERROR. iFelder = NUM-ENTRIES(cSuchFeld, ' '). ASSIGN hFeldTabelle = ? cInhaltTabelle = '' ix = 0. IF NUM-ENTRIES(cSuchfeld, '=') > 1 THEN DO: DO ii = 1 TO NUM-ENTRIES(cSuchfeld, ' '): cString = ENTRY(ii, cSuchFeld, ' '). IF NUM-ENTRIES(cString, '=') > 1 THEN DO: cFeld = ENTRY(1, cString, '='). hSuchFeld = hbTabelle:BUFFER-FIELD(cFeld) NO-ERROR. IF NOT VALID-HANDLE(hSuchFeld) THEN NEXT. ix = ix + 1. hFeldTabelle [ix] = hSuchFeld. cInhaltTabelle[ix] = ENTRY(2, cString, '='). NEXT. END. IF NOT VALID-HANDLE(hSuchfeld) THEN NEXT. cInhaltTabelle[ix] = cInhaltTabelle[ix] + ',' + cString. END. END. cWhere = SUBSTITUTE('PRESELECT EACH &1 NO-LOCK ', cTabelle). IF httBrowserKo::lmandant THEN DO: cWhere = cWhere + SUBSTITUTE('&1 &2.Firma = "&3" ', cAnd, cTabelle, httInput::mandant). cAnd = 'AND'. END. MESSAGE 'cWhere beim Suchen ' cWhere. hqTabelle:QUERY-PREPARE (cWhere). hqTabelle:QUERY-OPEN (). NEXTDATENSATZ: DO WHILE TRUE: hqTabelle:GET-NEXT() NO-ERROR. IF hqTabelle:QUERY-OFF-END THEN LEAVE. lcwortindex = ''. rRecid = hbTabelle:RECID. DO WHILE ix > 0: MESSAGE 'Suchen mit bestimmtenm feldern' ix. iFound = 0. DO ii = 1 TO ix: hFeld = hFeldTabelle [ii]. cSuchfeld = cInhaltTabelle[ii]. cInhalt = hFeld:BUFFER-VALUE(0) NO-ERROR. IF ERROR-STATUS:ERROR THEN NEXT. IF cInhalt = ? THEN NEXT. DO iy = 1 TO NUM-ENTRIES(cSuchFeld, ','): cString = ENTRY(iy, cSuchFeld, ','). MESSAGE 'Kommt der Wert ' cString 'in' cInhalt 'vor?'. IF LOOKUP(cString, cInhalt, ' ') = 0 THEN NEXT. iFound = iFound + 1. LEAVE. END. END. IF iFound < ix THEN NEXT NEXTDATENSATZ. LEAVE. END. DO WHILE ix = 0: iFound = 0. IF VALID-HANDLE(hWortIndex) THEN DO: lcWortIndex = hWortIndex:BUFFER-VALUE(0). END. ELSE DO: DO ii = 1 TO hbTabelle:NUM-FIELDS: hFeld = hbTabelle:BUFFER-FIELD(ii). IF hFeld:EXTENT > 0 THEN NEXT. cInhalt = getBufferFieldValue(INPUT hFeld, OUTPUT lQuoter). IF cInhalt = '' THEN NEXT. lcWortIndex = lcWortIndex + (IF lcWortindex = '' THEN '' ELSE ' ') + cInhalt. END. END. DO ii = 1 TO iFelder: cInhalt = ENTRY(ii, cSuchfeld, ' '). IF INDEX(lcWortIndex, cInhalt) = 0 THEN NEXT. iFound = iFound + 1. END. IF iFound < iFelder THEN NEXT NEXTDATENSATZ. LEAVE. END. hBuffer:BUFFER-CREATE (). hBuffer:BUFFER-COPY (hbTabelle). hBuffer::ident = TRIM(STRING(rRecid,'>>>>>>>>9')). END. hqTabelle:QUERY-CLOSE (). DELETE OBJECT hqTabelle. CREATE QUERY hQuery. hQuery:SET-BUFFERS ( hBuffer ). cWhere = SUBSTITUTE('FOR EACH ttTemp NO-LOCK '). IF cRichtung = 'ASCENDING' THEN cRichtung = ''. IF cSortFeld <> '' THEN cWhere = cWhere + ' BY ' + cSortFeld + ' ' + cRichtung. hQuery:QUERY-PREPARE (cWhere). lRetVal = TRUE. RETURN lRetVal. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID createTemptableBrowser( INPUT httInput AS HANDLE, INPUT httBrowserKo AS HANDLE, OUTPUT httBrowser AS HANDLE ): DEFINE VARIABLE cFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cLabel AS CHARACTER NO-UNDO. DEFINE VARIABLE httTable AS HANDLE NO-UNDO. DEFINE VARIABLE hFremdBuff AS HANDLE NO-UNDO. EMPTY TEMP-TABLE ttExterneFelder. DEFINE BUFFER bbrowser_ze FOR browser_ze. FIND FIRST browser_ze NO-LOCK WHERE browser_ze.mandant = httInput::mandant AND browser_ze.benutzer = httInput::benutzer AND browser_ze.program = httInput::programm NO-ERROR. IF NOT AVAILABLE browser_ze THEN DO: FIND FIRST browser_ze NO-LOCK WHERE browser_ze.mandant = httInput::mandant AND browser_ze.benutzer = 'admin' AND browser_ze.program = httInput::programm NO-ERROR. END. IF NOT AVAILABLE browser_ze THEN RETURN. REPEAT TRANSACTION ON ERROR UNDO, LEAVE: IF browser_ze.benutzer <> 'admin' THEN LEAVE. IF httInput::benutzer = 'admin' THEN LEAVE. FOR EACH browser_ze NO-LOCK WHERE browser_ze.mandant = httInput::mandant AND browser_ze.benutzer = 'admin' AND browser_ze.program = httInput::programm: CREATE bbrowser_ze. BUFFER-COPY browser_ze EXCEPT browser_ze.benutzer TO bbrowser_ze ASSIGN bbrowser_ze.benutzer = httInput::benutzer. RELEASE bbrowser_ze. END. LEAVE. END. CREATE TEMP-TABLE httTable. httTable:SERIALIZE-NAME = 'browser'. httTable:ADD-NEW-FIELD ('ident', 'CHARACTER'). httTable:ADD-NEW-FIELD ('sel' , 'CHARACTER'). FOR EACH browser_ze NO-LOCK WHERE browser_ze.mandant = httInput::mandant AND browser_ze.benutzer = httInput::benutzer AND browser_ze.program = httInput::programm BY browser_ze.prior: httTable:ADD-NEW-FIELD (browser_ze.feld, 'CHARACTER'). IF browser_ze.tabelle <> httInput::tabelle THEN DO: hFremdBuff = createExterneFelder ( INPUT browser_ze.tabelle, INPUT browser_ze.feld, INPUT browser_ze.feldtype, INPUT httInput ). END. END. httTable:TEMP-TABLE-PREPARE ('ttBrowser'). httBrowser = httTable:DEFAULT-BUFFER-HANDLE. httBrowser:BUFFER-CREATE (). DO i1 = 1 TO httBrowser:NUM-FIELDS: IF i1 = 1 THEN DO: httBrowser:BUFFER-FIELD(i1):BUFFER-VALUE = 'ident'. NEXT. END. IF i1 = 2 THEN DO: httBrowser:BUFFER-FIELD(i1):BUFFER-VALUE = 'sel'. NEXT. END. cFeld = httBrowser:BUFFER-FIELD(i1):NAME. FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.benutzer = httInput::benutzer AND labeltexte.program = httInput::program AND labeltexte.tabelle = httInput::tabelle AND labeltexte.feld = cFeld AND labeltexte.sprcd = httInput::sprcd NO-ERROR. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.program = httInput::program AND labeltexte.tabelle = httInput::tabelle AND labeltexte.feld = cFeld AND labeltexte.sprcd = httInput::sprcd NO-ERROR. END. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.tabelle = httInput::tabelle AND labeltexte.feld = cFeld AND labeltexte.sprcd = httInput::sprcd NO-ERROR. END. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.feld = cFeld AND labeltexte.sprcd = httInput::sprcd NO-ERROR. END. cLabel = (IF AVAILABLE labeltexte THEN labeltexte.headlabel ELSE cFeld). httBrowser:BUFFER-FIELD(i1):buffer-VALUE(0) = cLabel + '/@/' + labeltexte.ausrichtung. END. RETURN. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID createTemptableViewer( INPUT httInput AS HANDLE, INPUT httViewerKo AS HANDLE, OUTPUT httViewer AS HANDLE ): DEFINE VARIABLE cFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cLabel AS CHARACTER NO-UNDO. DEFINE VARIABLE httTable AS HANDLE NO-UNDO. DEFINE VARIABLE cTabelle AS CHARACTER NO-UNDO. DEFINE VARIABLE hBufTabelle AS HANDLE NO-UNDO. DEFINE BUFFER bviewer_ze FOR viewer_ze. FIND FIRST viewer_ze NO-LOCK WHERE viewer_ze.mandant = httInput::mandant AND viewer_ze.benutzer = httInput::benutzer AND viewer_ze.program = httInput::programm AND viewer_ze.tabelle = httInput::tabelle NO-ERROR. IF NOT AVAILABLE viewer_ze THEN DO: FIND FIRST viewer_ze NO-LOCK WHERE viewer_ze.mandant = httInput::mandant AND viewer_ze.benutzer = 'admin' AND viewer_ze.program = httInput::programm AND viewer_ze.tabelle = httInput::tabelle NO-ERROR. END. IF NOT AVAILABLE viewer_ze THEN RETURN. cTabelle = viewer_ze.tabelle. REPEAT TRANSACTION ON ERROR UNDO, LEAVE: IF viewer_ze.benutzer <> 'admin' THEN LEAVE. IF httInput::benutzer = 'admin' THEN LEAVE. FOR EACH viewer_ze NO-LOCK WHERE viewer_ze.mandant = httInput::mandant AND viewer_ze.benutzer = 'admin' AND viewer_ze.program = httInput::programm AND viewer_ze.tabelle = httInput::tabelle: CREATE bviewer_ze. BUFFER-COPY viewer_ze EXCEPT viewer_ze.benutzer TO bviewer_ze ASSIGN bviewer_ze.benutzer = httInput::benutzer. RELEASE bviewer_ze. END. LEAVE. END. CREATE BUFFER hBufTabelle FOR TABLE cTabelle. CREATE TEMP-TABLE httTable. httTable:SERIALIZE-NAME = 'viewerdaten'. FOR EACH viewer_ze NO-LOCK WHERE viewer_ze.mandant = httInput::mandant AND viewer_ze.benutzer = httInput::benutzer AND viewer_ze.program = httInput::programm AND viewer_ze.tabelle = httInput::tabelle BY viewer_ze.prior: IF viewer_ze.addFieldTabelle = '' AND NOT viewer_ze.feld BEGINS 'DUMMY' AND NOT viewer_ze.feld BEGINS 'ident' THEN httTable:ADD-LIKE-FIELD (viewer_ze.feld, hBufTabelle:BUFFER-FIELD(viewer_ze.feld)). ELSE httTable:ADD-NEW-FIELD (viewer_ze.feld, 'CHARACTER'). /* MESSAGE viewer_ze.feld ' hinzugefügt'.*/ END. httTable:TEMP-TABLE-PREPARE (cTabelle). httViewer = httTable:DEFAULT-BUFFER-HANDLE. DELETE OBJECT hBufTabelle. RETURN. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC INTEGER fillBrowserTT( INPUT httBrowserKo AS HANDLE, INPUT hQuery AS HANDLE, INPUT hbttInput AS HANDLE, INPUT-OUTPUT httBrowser AS HANDLE ): DEFINE VARIABLE hbQuery AS HANDLE NO-UNDO. DEFINE VARIABLE hFeld AS HANDLE NO-UNDO. DEFINE VARIABLE hFeldRecid AS HANDLE NO-UNDO. DEFINE VARIABLE cFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE cInhalt AS CHARACTER NO-UNDO. DEFINE VARIABLE iAnzRec AS INTEGER NO-UNDO. DEFINE VARIABLE iSkip AS INTEGER NO-UNDO. DEFINE VARIABLE iPageSize AS INTEGER NO-UNDO. hQuery:QUERY-OPEN (). iSkip = httBrowserKo::actualpage * httBrowserKo::pagesize. hQuery:REPOSITION-FORWARD (iSkip). MESSAGE 'anzahl records skip = ' iSkip. iAnzRec = 0. hbQuery = hQuery:GET-BUFFER-HANDLE (). hFeldRecid = hbQuery:BUFFER-FIELD('ident') NO-ERROR. iPageSize = (IF hbttInput::suchfeld = '' THEN httBrowserKo::pagesize ELSE 100). DO i1 = 1 TO iPageSize: hQuery:GET-NEXT() NO-ERROR. IF hQuery:QUERY-OFF-END THEN LEAVE. httBrowser:BUFFER-CREATE (). IF hbttInput::action = 'search' AND i1 = 1 THEN hbttInput::ident = TRIM(STRING(INT64(hbQuery::ident),'>>>>>>>>>9')). IF VALID-HANDLE(hFeldRecid) THEN httBrowser::ident = TRIM(STRING(INT64(hbQuery::ident),'>>>>>>>>>9')). ELSE httBrowser::Ident = TRIM(STRING(hbQuery:RECID)). IF httBrowser::ident = hbttInput::ident THEN httBrowser::sel = 'TRUE'. DO i2 = 3 TO httBrowser:NUM-FIELDS: cFeld = httBrowser:BUFFER-FIELD(i2):NAME. hFeld = hbQuery :BUFFER-FIELD(cFeld) NO-ERROR. IF NOT VALID-HANDLE(hFeld) OR ERROR-STATUS:ERROR THEN DO: cInhalt = getFieldValueExtern(INPUT cFeld, INPUT hbttInput, INPUT httBrowser ). httBrowser:BUFFER-FIELD(i2):BUFFER-VALUE = cInhalt. NEXT. END. CASE hFeld:DATA-TYPE: WHEN 'INTEGER' OR WHEN 'INT64' THEN cInhalt = TRIM(STRING(INTEGER(hFeld:BUFFER-VALUE(0)),'->>>,>>>,>>9')). WHEN 'DECIMAL' THEN cInhalt = TRIM(STRING(DECIMAL(hFeld:BUFFER-VALUE(0)),'->>>,>>>,>>9.99<<<')). WHEN 'DATE' THEN cInhalt = STRING(DATE(hFeld:BUFFER-VALUE(0)),'99.99.9999'). OTHERWISE cInhalt = hFeld:BUFFER-VALUE(0). END CASE. httBrowser:BUFFER-FIELD(i2):BUFFER-VALUE = cInhalt. END. iAnzRec = iAnzRec + 1. END. RETURN iAnzRec. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL getBrowserKopf( INPUT httInput AS HANDLE, OUTPUT httBrowserKo AS HANDLE ): MESSAGE 'getBrowserKopf mit ' httInput::mandant '/' httInput::benutzer '/' httInput::programm '/' httInput::tabelle. FIND FIRST browser_ko NO-LOCK WHERE browser_ko.mandant = httInput::mandant AND browser_ko.benutzer = httInput::benutzer AND browser_ko.program = httInput::programm AND browser_ko.tabelle = httInput::tabelle NO-ERROR. IF NOT AVAILABLE browser_ko THEN DO: FIND FIRST browser_ko NO-LOCK WHERE browser_ko.mandant = httInput::mandant AND browser_ko.benutzer = 'admin' AND browser_ko.program = httInput::programm AND browser_ko.tabelle = httInput::tabelle NO-ERROR. END. IF NOT AVAILABLE browser_ko THEN RETURN FALSE. httBrowserKo = TEMP-TABLE ttBrowserKo:DEFAULT-BUFFER-HANDLE. httBrowserKo:EMPTY-TEMP-TABLE (). httBrowserKo:BUFFER-CREATE (). httBrowserKo:BUFFER-COPY(BUFFER browser_ko:HANDLE). RELEASE browser_ko. RETURN TRUE. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC CHARACTER getBufferFieldValue( INPUT iphFeld AS HANDLE, OUTPUT oplQuoter AS LOGICAL ): DEFINE VARIABLE cFeldInhalt AS CHARACTER NO-UNDO. cFeldInhalt = ''. oplQuoter = FALSE. CASE iphFeld:DATA-TYPE: WHEN 'CHARACTER' THEN ASSIGN cFeldInhalt = iphFeld:BUFFER-VALUE(0) oplQuoter = TRUE. WHEN 'DECIMAL' OR WHEN 'INTEGER' THEN cFeldInhalt = TRIM(STRING(INTEGER(iphFeld:BUFFER-VALUE),'>>>>>>>>9')). WHEN 'DATE' THEN cFeldInhalt = STRING(DATE(iphFeld:BUFFER-VALUE),'99.99.9999'). OTHERWISE cFeldInhalt = iphFeld:BUFFER-VALUE. END CASE. IF cFeldInhalt = ? THEN cFeldInhalt = ''. RETURN cFeldInhalt. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID getErrorMessage( INPUT cFehlerNo AS CHARACTER, INPUT iSprcd AS INTEGER, INPUT cParam AS CHARACTER, OUTPUT cMessage AS LONGCHAR ): DEFINE VARIABLE lcJsonString AS CHARACTER NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE iNo AS INTEGER NO-UNDO. DEFINE VARIABLE cString AS CHARACTER NO-UNDO. DEFINE VARIABLE cParameter AS CHARACTER NO-UNDO EXTENT 5. cParam = REPLACE(cParam, ',', ';'). DO ii = 1 TO NUM-ENTRIES(cParam, ';'): cParameter[ii] = ENTRY(ii, cParam, ';'). IF ii = 5 THEN LEAVE. END. lcJsonString = '"ERROR": "(&1) : &2"'. cFehlerNo = REPLACE(cFehlerNo, ',', ';'). DO ii = 1 TO NUM-ENTRIES(cFehlerNo, ';'): iNo = INTEGER(ENTRY(ii, cFehlerNo, ';')). FIND Femeld NO-LOCK WHERE Femeld.Fenr = iNo AND Femeld.Sprcd = iSprcd NO-ERROR. IF NOT AVAILABLE Femeld THEN DO: FIND FIRST Femeld NO-LOCK WHERE Femeld.Fenr = iNo NO-ERROR. END. IF NOT AVAILABLE Femeld THEN DO: cString = cString + (IF cString = '' THEN '' ELSE ' ') + 'Systemfehler, Administrator benachrichtigen !'. END. ELSE DO: cString = cString + (IF cString = '' THEN '' ELSE ' ') + Femeld.FeText. END. END. MESSAGE cString '-' cParam. cString = SUBSTITUTE(cString, cParameter[01], cParameter[02], cParameter[03], cParameter[04], cParameter[05]). MESSAGE cString. lcJsonString = CHR(123) + SUBSTITUTE(lcJsonString, cFehlerNo, cString) + CHR(125). cMessage = lcJsonString. RETURN. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL getField( INPUT httInput AS HANDLE, INPUT cTabelle AS CHARACTER, INPUT cTabFeld AS CHARACTER, INPUT cKeyFelder AS CHARACTER, INPUT cKeyValues AS CHARACTER, INPUT hTabelle AS HANDLE, OUTPUT cInhalt AS CHARACTER ): DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. DEFINE VARIABLE hFeldBuffer AS HANDLE NO-UNDO. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE cFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE hFeld AS HANDLE NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE cString AS CHARACTER NO-UNDO. DEFINE VARIABLE cWert AS CHARACTER NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. CREATE BUFFER hBuffer FOR TABLE cTabelle. cKeyFelder = REPLACE(cKeyFelder, ',', ';'). cKeyValues = REPLACE(cKeyValues, ',', ';'). cString = ''. DO ii = 1 TO NUM-ENTRIES(cKeyFelder, ';'): cString = cString + (IF cString = '' THEN '' ELSE ' AND ') + ENTRY(ii, cKeyFelder, ';') + ' = &1 '. cFeld = ENTRY(ii, cKeyFelder, ';'). hFeldBuffer = hBuffer:BUFFER-FIELD(cFeld). IF ENTRY(ii, cKeyValues, ';') BEGINS '@' THEN DO: cFeld = TRIM(SUBSTRING(ENTRY(ii, cKeyValues, ';'),02)). hFeld = hTabelle:BUFFER-FIELD(cFeld) NO-ERROR. IF NOT VALID-HANDLE(hFeld) THEN hFeld = httInput:BUFFER-FIELD(cFeld) NO-ERROR. cWert = hFeld:BUFFER-VALUE(0). END. ELSE cWert = TRIM(ENTRY(ii, cKeyValues, ';')). CASE hFeldBuffer:DATA-TYPE: WHEN 'character' OR WHEN 'date' THEN cString = SUBSTITUTE(cString, QUOTER(cWert) ). OTHERWISE cString = SUBSTITUTE(cString, cWert ). END CASE. END. cWhere = SUBSTITUTE('WHERE &1 ', cString). MESSAGE cWhere. lRetVal = hBuffer:FIND-UNIQUE (cWhere, NO-LOCK). MESSAGE lRetVal. hFeld = hBuffer:BUFFER-FIELD(cTabFeld). cInhalt = hFeld:BUFFER-VALUE(0). MESSAGE cInhalt. RETURN TRUE. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC CHARACTER getFieldValueExtern( INPUT ipcFeld AS CHARACTER, INPUT iphttInput AS HANDLE, INPUT iphttBrowser AS HANDLE ): DEFINE VARIABLE cFeldInhalt AS CHARACTER NO-UNDO INIT ''. DEFINE VARIABLE cWhere AS CHARACTER NO-UNDO. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO. DEFINE VARIABLE cKeyValue AS CHARACTER NO-UNDO. DEFINE VARIABLE cKeyFeld AS CHARACTER NO-UNDO. DEFINE VARIABLE lRetVal AS LOGICAL NO-UNDO. DEFINE VARIABLE ii AS INTEGER NO-UNDO. DEFINE VARIABLE hFeld AS HANDLE NO-UNDO. FIND FIRST ttExterneFelder NO-LOCK WHERE LOOKUP(ipcFeld, ttExterneFelder.cFelder, ';') > 0 NO-ERROR. IF NOT AVAILABLE ttExterneFelder THEN RETURN cFeldInhalt. hBuffer = ttExterneFelder.hBuffer. cWhere = ttExterneFelder.cWhere. DO ii = 1 TO NUM-ENTRIES(ttExterneFelder.cKeyFelder, ';'): cKeyFeld = ENTRY(ii, ttExterneFelder.cKeyFelder, ';'). hFeld = iphttBrowser:BUFFER-FIELD(cKeyFeld) NO-ERROR. CASE hFeld:DATA-TYPE: WHEN 'INTEGER' OR WHEN 'INT64' THEN cKeyValue = TRIM(STRING(INTEGER(hFeld:BUFFER-VALUE(0)),'->>>>>>>>9')). WHEN 'DECIMAL' THEN cKeyValue = TRIM(STRING(DECIMAL(hFeld:BUFFER-VALUE(0)),'->>>>>>>>9.99<<<')). WHEN 'DATE' THEN cKeyValue = STRING(DATE(hFeld:BUFFER-VALUE(0)),'99.99.9999'). OTHERWISE cKeyValue = QUOTER(hFeld:BUFFER-VALUE(0)). END CASE. cWhere = cWhere + (IF cWhere = '' THEN ' WHERE ' ELSE ' AND ') + SUBSTITUTE('&1.&2 = &3 ':U, ttExterneFelder.cTabelle, cKeyFeld, cKeyValue). END. lRetVal = hBuffer:FIND-FIRST (cWhere) NO-ERROR. IF lRetVal THEN cFeldInhalt = hBuffer:BUFFER-FIELD(ipcFeld):BUFFER-VALUE(0). RETURN cFeldInhalt. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC CHARACTER getHeader( INPUT httInput AS HANDLE ): DEFINE VARIABLE cHeader AS CHARACTER NO-UNDO. FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.benutzer = httInput::benutzer AND labeltexte.program = httInput::programm AND labeltexte.feld = 'KOPF' AND labeltexte.sprcd = INTEGER(httInput::sprcd) NO-ERROR. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.program = httInput::programm AND labeltexte.feld = 'KOPF' AND labeltexte.sprcd = INTEGER(httInput::sprcd) NO-ERROR. END. cHeader = (IF AVAILABLE labeltexte THEN labeltexte.sidelabel ELSE httInput::programm). RETURN cHeader. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC CHARACTER getLabel( INPUT iprRecid AS RECID, INPUT ipcArt AS CHARACTER, INPUT ipiSprcd AS INTEGER ): DEFINE VARIABLE cLabel AS CHARACTER NO-UNDO. DEFINE BUFFER bviewer_ze FOR viewer_ze. FIND bviewer_ze NO-LOCK WHERE RECID(bviewer_ze) = iprRecid. IF ipiSprcd = 0 OR ipiSprcd > 10 THEN ipiSprcd = 1. FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = bviewer_ze.mandant AND labeltexte.benutzer = bviewer_ze.benutzer AND labeltexte.program = bviewer_ze.program AND labeltexte.tabelle = bviewer_ze.tabelle AND labeltexte.feld = bviewer_ze.feld AND labeltexte.sprcd = ipiSprcd NO-ERROR. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = bviewer_ze.mandant AND labeltexte.program = bviewer_ze.program AND labeltexte.tabelle = bviewer_ze.tabelle AND labeltexte.feld = bviewer_ze.feld AND labeltexte.sprcd = ipiSprcd NO-ERROR. END. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = bviewer_ze.mandant AND labeltexte.tabelle = bviewer_ze.tabelle AND labeltexte.feld = bviewer_ze.feld AND labeltexte.sprcd = ipiSprcd NO-ERROR. END. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = bviewer_ze.mandant AND labeltexte.feld = bviewer_ze.feld AND labeltexte.sprcd = ipiSprcd NO-ERROR. END. CASE ipcArt: WHEN 'side' THEN cLabel = (IF AVAILABLE labeltexte THEN labeltexte.sidelabel ELSE bviewer_ze.feld). WHEN 'head' THEN cLabel = (IF AVAILABLE labeltexte THEN labeltexte.headlabel ELSE bviewer_ze.feld). END CASE. RETURN cLabel. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC CHARACTER getPrimaryIndexFields( INPUT ipcTabelle AS CHARACTER ): DEFINE VARIABLE cFields AS CHARACTER NO-UNDO. FIND AnaDat._File NO-LOCK WHERE AnaDat._File._File-Name = ipcTabelle. FIND AnaDat._Index NO-LOCK WHERE RECID(AnaDat._Index) = AnaDat._File._Prime-Index. FOR EACH AnaDat._Index-Field OF AnaDat._Index, FIRST AnaDat._Field NO-LOCK WHERE RECID(AnaDat._Field) = AnaDat._Index-Field._FIeld-Recid: cFields = cFields + (IF cFields = '' THEN '' ELSE ',') + AnaDat._Field._Field-Name. END. RETURN cFields. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC CHARACTER getTitle( INPUT httInput AS HANDLE ): DEFINE VARIABLE cTitel AS CHARACTER NO-UNDO. FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.benutzer = httInput::benutzer AND labeltexte.program = httInput::programm AND labeltexte.feld = 'TITEL' AND labeltexte.sprcd = INTEGER(httInput::sprcd) NO-ERROR. IF NOT AVAILABLE labeltexte THEN DO: FIND FIRST labeltexte NO-LOCK WHERE labeltexte.mandant = httInput::mandant AND labeltexte.program = httInput::programm AND labeltexte.feld = 'TITEL' AND labeltexte.sprcd = INTEGER(httInput::sprcd) NO-ERROR. END. cTitel = (IF AVAILABLE labeltexte THEN labeltexte.sidelabel ELSE cProgramm). RETURN cTitel. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ 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 cTabelle AS CHARACTER 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. jsonttTemp = NEW JsonObject(). jsonttTemp = oJsonObject:GetJsonObject('ttTemp'). lRetVal = hbttTemp:READ-JSON ('JsonObject', jsonttTemp). hbttTemp:FIND-FIRST (). hbttTemp:WRITE-JSON('longchar', lcJsonString, FALSE). MESSAGE 'Daten zweiter Buffer -> ' STRING(lcJsonString). lRetVal = TRUE. RETURN lRetVal. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID setSortField( INPUT cSortfeld AS CHARACTER, INPUT-OUTPUT httBrowserKo AS HANDLE ): DO WHILE TRUE: IF httBrowserKo::sortfeld = '' THEN DO: httBrowserKo::sortfeld = cSortfeld + ':ASCENDING'. LEAVE. END. /* ASCENDING / DESCENDING Kehren */ IF LOOKUP(cSortfeld, httBrowserKo::sortfeld, ':') > 0 THEN DO: IF ENTRY(2, httBrowserKo::sortfeld, ':') = 'ASCENDING' THEN DO: ENTRY(2, httBrowserKo::sortfeld, ':') = 'DESCENDING'. LEAVE. END. ELSE DO: ENTRY(2, httBrowserKo::sortfeld, ':') = 'ASCENDING'. LEAVE. END. END. httBrowserKo::sortfeld = cSortfeld + ':ASCENDING'. LEAVE. END. updateBrowserKo( INPUT httBrowserKo ). RETURN. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL startBrowserKopf ( INPUT httInput AS HANDLE, OUTPUT httBrowserKo AS HANDLE ): DEFINE VARIABLE rRecid AS RECID NO-UNDO. DEFINE BUFFER bbrowser_ko FOR browser_ko. FIND FIRST browser_ko NO-LOCK WHERE browser_ko.mandant = httInput::mandant AND browser_ko.benutzer = httInput::benutzer AND browser_ko.program = httInput::programm AND browser_ko.tabelle = httInput::tabelle NO-ERROR. IF NOT AVAILABLE browser_ko THEN DO: FIND FIRST browser_ko NO-LOCK WHERE browser_ko.mandant = httInput::mandant AND browser_ko.benutzer = 'admin' AND browser_ko.program = httInput::programm AND browser_ko.tabelle = httInput::tabelle NO-ERROR. END. IF NOT AVAILABLE browser_ko THEN RETURN FALSE. rRecid = RECID(browser_ko). REPEAT TRANSACTION: FIND browser_ko WHERE RECID(browser_ko) = rRecid. IF browser_ko.benutzer = 'admin' THEN DO: CREATE bbrowser_ko. BUFFER-COPY browser_ko EXCEPT browser_ko.benutzer TO bbrowser_ko ASSIGN bbrowser_ko.benutzer = httInput::benutzer. rRecid = RECID(bbrowser_ko). FIND browser_ko WHERE RECID(browser_ko) = rRecid. END. ASSIGN browser_ko.actualpage = 0 browser_ko.lastrecid = 0. RELEASE browser_ko. LEAVE. END. FIND browser_ko NO-LOCK WHERE RECID(browser_ko) = rRecid. httBrowserKo = TEMP-TABLE ttBrowserKo:DEFAULT-BUFFER-HANDLE. httBrowserKo:EMPTY-TEMP-TABLE (). httBrowserKo:BUFFER-CREATE (). httBrowserKo:BUFFER-COPY(BUFFER browser_ko:HANDLE). RELEASE browser_ko. RETURN TRUE. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC LOGICAL startViewerKopf( INPUT httInput AS HANDLE, OUTPUT httViewerKo AS HANDLE ): DEFINE VARIABLE rRecid AS RECID NO-UNDO. DEFINE BUFFER bviewer_ko FOR viewer_ko. FIND FIRST viewer_ko NO-LOCK WHERE viewer_ko.mandant = httInput::mandant AND viewer_ko.benutzer = httInput::benutzer AND viewer_ko.program = httInput::programm AND viewer_ko.tabelle = httInput::tabelle NO-ERROR. IF NOT AVAILABLE viewer_ko THEN DO: FIND FIRST viewer_ko NO-LOCK WHERE viewer_ko.mandant = httInput::mandant AND viewer_ko.benutzer = 'admin' AND viewer_ko.program = httInput::programm AND viewer_ko.tabelle = httInput::tabelle NO-ERROR. END. IF NOT AVAILABLE viewer_ko THEN RETURN FALSE. rRecid = RECID(viewer_ko). REPEAT TRANSACTION: FIND viewer_ko WHERE RECID(viewer_ko) = rRecid. IF viewer_ko.benutzer = 'admin' THEN DO: CREATE bviewer_ko. BUFFER-COPY viewer_ko EXCEPT viewer_ko.benutzer TO bviewer_ko ASSIGN bviewer_ko.benutzer = httInput::benutzer. rRecid = RECID(bviewer_ko). FIND viewer_ko WHERE RECID(viewer_ko) = rRecid. END. RELEASE viewer_ko. LEAVE. END. FIND viewer_ko WHERE RECID(viewer_ko) = rRecid. httviewerKo = TEMP-TABLE ttviewerKo:DEFAULT-BUFFER-HANDLE. httviewerKo:EMPTY-TEMP-TABLE (). httviewerKo:BUFFER-CREATE (). httviewerKo:BUFFER-COPY(BUFFER viewer_ko:HANDLE). RELEASE viewer_ko. RETURN TRUE. END METHOD. /*------------------------------------------------------------------------------ Purpose: Notes: ------------------------------------------------------------------------------*/ METHOD PUBLIC VOID updateBrowserKo( INPUT httBrowserKo AS HANDLE ): DEFINE VARIABLE hBrowserKo AS HANDLE NO-UNDO. hBrowserKo = BUFFER browser_ko:HANDLE. REPEAT TRANSACTION ON ERROR UNDO, LEAVE: FIND browser_ko EXCLUSIVE-LOCK WHERE browser_ko.mandant = httBrowserKo::mandant AND browser_ko.benutzer = httBrowserKo::benutzer AND browser_ko.program = httBrowserKo::program AND browser_ko.tabelle = httBrowserKo::tabelle NO-ERROR. IF NOT AVAILABLE browser_ko THEN LEAVE. DO i1 = 1 TO httBrowserKo:NUM-FIELDS: IF httBrowserKo:BUFFER-FIELD(i1):BUFFER-VALUE(0) = hBrowserKo:BUFFER-FIELD(i1):BUFFER-VALUE(0) THEN NEXT. hBrowserKo:BUFFER-FIELD(i1):BUFFER-VALUE(0) = httBrowserKo:BUFFER-FIELD(i1):BUFFER-VALUE(0). END. RELEASE browser_ko. 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.