Description
Directly read field values from a single record in the database.
Parameters
icTableName | input | character | |
icPrepare | input | character | Progress for each statement defining what record must be read. If more than one record matches the criteria, only first record is read. |
icFieldList | input | character | Comma seperated list of field names. |
ocValueList | output | character | chr(2) seperated list of field values. |
ihClass | input | handle | |
oiReturnStatus | output | integer | Return status of the method. |
Internal usage
BLF
program code (program1/progress.p)
assign oiReturnStatus = -98
vgDebugTime = etime
vlFound = true.
create query vhQuery in widget-pool "non-persistent".
vhQuery:forward-only = yes.
create buffer vhBuffer for table icTableName in widget-pool "non-persistent".
vhQuery:set-buffers(vhBuffer).
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"
("read ":U + icTableName + chr(10) +
icPrepare + chr(10) + "FAILED":U, ?).
<M-4 run ErrorMessage
(input #T-2'Invalid database query ($1).':255(88)T-2# (icMessage),
input icPrepare (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input '' (icRowid),
input ? (ihClass)) in Progress>
assign oiReturnStatus = -3.
return.
end.
vhQuery:get-first(no-lock).
if vhQuery:query-off-end
then vlFound = no.
else do viFcCount1 = 1 to num-entries(icFieldList):
if viFcCount1 > 1 then ocValueList = ocValueList + chr(2).
if entry(viFcCount1,icFieldList) = "rowid":U
then ocValueList = ocValueList + string(vhBuffer:rowid).
else do:
vhField = ?.
vhField = vhBuffer:buffer-field(entry(viFcCount1,icFieldList)) no-error.
if vhField = ?
or vhField:buffer-value = ?
then ocValueList = ocValueList + "?":U.
else if vhField:data-type = "logical":U
then ocValueList = ocValueList + (if vhField:buffer-value = yes then "TRUE":U else "FALSE":U).
else if vhField:data-type = "date":U
then ocValueList = ocValueList + string(year(vhField:buffer-value),"9999":U)
+ string(month(vhField:buffer-value),"99":U)
+ string(day(vhField:buffer-value),"99":U).
else ocValueList = ocValueList + string(vhField:buffer-value).
end.
end.
publish "Logging.DatabaseAccess"
("read ":U + icTableName + chr(10) +
icPrepare + chr(10) +
"Record count=":U + (if vlFound then "1":U else "0":U) + chr(10) +
"time(ms)=" + string(etime - vgDebugTime), ?).
assign oiReturnStatus = (if vlFound then 0 else -4).
finally:
if vhQuery <> ?
then do:
vhQuery:query-close().
delete object vhQuery.
end.
if vhBuffer <> ?
then delete object vhBuffer.
end finally.