icQueryName | input | character | |
icPrepare | input | character | For each statement for reading the data, excluding the no-lock option (this is implied automatically), excluding break by (not allowed, only normal by is allowed). |
icTables | input | character | Comma seperated list of all database tables in the for each statement. |
olEof | output | logical | yes = no record found no = exactly one record found ? = more than one record found |
oiReturnStatus | output | integer | Return status of the method. |
assign vgDebugTime = etime viTables = num-entries(icTables). /* ================================================================================= */ /* Create a progress dynamic query to read the database */ /* ================================================================================= */ create query vhQuery in widget-pool "non-persistent". vhQuery:forward-only = yes. do viFcCount1 = 1 to viTables: vcBufferName = entry(viFcCount1,icTables). vhBuffer[viFcCount1] = ?. if vcBufferName matches "*1" then do: <M-8 run GetQBuffer (input vcBufferName (icBufferName), input vhQuery:unique-id (iiQueryID), output vhBuffer[viFcCount1] (ohBufferHandle)) in Progress> end. if vhBuffer[viFcCount1] = ? then do: /* These buffers will not be cached */ create buffer vhBuffer[viFcCount1] for table substring(vcBufferName,1,length(vcBufferName,"CHARACTER":U) - 1,"CHARACTER":U) buffer-name vcBufferName in widget-pool "non-persistent". vlBufferCreated[viFcCount1] = yes. end. vhQuery:add-buffer(vhBuffer[viFcCount1]). end. assign vlFcOk = vhQuery:query-prepare (icPrepare) no-error. if vlFcOk then assign vlFcOk = vhQuery:query-open() no-error. if not vlFcOk then do: publish "Logging.DatabaseAccess" ("query ":U + icQueryName + chr(10) + "read ":U + icTables + chr(10) + icPrepare + chr(10) + "FAILED":U, ?). <M-10 run ErrorMessage (input #T-1'Invalid database query ($1).':255(88)T-1# (icMessage), input icPrepare (icArguments), input '' (icFieldName), input '' (icFieldValue), input '' (icRowid), input ? (ihClass)) in Progress> assign oiReturnStatus = -3. return. end. if vlProgress then do viFcCount1 = 1 to vhQuery:num-buffers: assign vcIndexInfo = vcIndexInfo + chr(10) + "Index : ":U + vhQuery:index-information(viFcCount1). end. assign olEof = vhQuery:get-first (no-lock). if olEof then assign olEof = not vhBuffer[1]:available. else assign olEof = yes. if olEof = no then do: vhQuery:get-next (no-lock). if vhBuffer[1]:available then assign olEof = ?. end. publish "Logging.DatabaseAccess" ("query ":U + icQueryName + chr(10) + "read ":U + icTables + chr(10) + icPrepare + vcIndexInfo + chr(10) + "found=":U + (if olEof then "none":U else if olEof = no then "one":U else "multiple":U) + chr(10) + "time(ms)=":U + string(etime - vgDebugTime), ?). finally: if vhQuery <> ? then do: viFcCount2 = vhQuery:unique-id. vhQuery:query-close(). delete object vhQuery. do viFcCount1 = 1 to viTables: if vlBufferCreated[viFcCount1] then delete object vhBuffer[viFcCount1]. else do: <M-95 run ReleaseQBuffer (input entry(viFcCount1,icTables) (icBufferName), input viFcCount2 (iiQueryID)) in Progress> end. end. end. end finally.