project BLF > class Persistence (Progress) > method ReadDirect

Description

Directly read field values from a single record in the database.


Parameters


icTableNameinputcharacter
icPrepareinputcharacterProgress for each statement defining what record must be read. If more than one record matches the criteria, only first record is read.
icFieldListinputcharacterComma seperated list of field names.
ocValueListoutputcharacterchr(2) seperated list of field values.
ihClassinputhandle
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


BLF
method Progress.CleanupStateOnline
method Session.ApplicationLogin


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.