project BLF > class Database Component > method ReadTable

Description

Read field values of a specific record in one of the class temp-tables.
(Used from referential integrity)


Parameters


icTableNameinputcharacterclass temp-table name
icQueryinputcharacterread statement
icFieldNamesinputcharacterComma seperated list of table field names
ilConvertToDisplayFormatinputlogicalOnly relevant for decimal or date fields
ocFieldValuesoutputcharacterchr(3) seperated list of the field values (if a record is found)
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


BLF
method database.ApiGetIdentification
method BDocumentLink.ApiDumpDocuments
method Session.GetWorkAssistantObjects

QadFinancials
method BCInvoice.PostSaveLegalDocumentGetLDId


program code (program1/database.p)

if oiReturnStatus = 0
then oiReturnStatus = -98.

assign viFields = num-entries(icFieldNames).

if not icTableName begins "t_o":U
then return.

<M-2 run DataDescription
   (input  '' (icRowids), 
    input  '' (icPkey), 
    input  '' (icObjectIds), 
    input  vcFcComponentName begins 'BCustom[' (ilAllTables), 
    output viFcReturnSuper (oiReturnStatus)) in database>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

find first tFcDynRel where
           tFcDynRel.tcFcTo   = substring(icTableName,4,-1,"CHARACTER":U) no-error.
if not available tFcDynRel
then return.

create query vhQuery in widget-pool "non-persistent".
vhQuery:forward-only = yes.
vhQuery:set-buffers(tFcDynRel.thFcBuffer).
assign vlFcOk = vhQuery:query-prepare (icQuery).
if vlFcOk
then assign vlFcOk = vhQuery:query-open().

if vlFcOk = no
then do:
    delete object vhQuery.
    assign oiReturnStatus = -3.
    <M-5 run SetMessage (input  'Invalid query : ':U + icQuery (icMessage), 
                     input  '' (icArguments), 
                     input  '' (icFieldName), 
                     input  '' (icFieldValue), 
                     input  'S':U (icType), 
                     input  3 (iiSeverity), 
                     input  '' (icRowid), 
                     input  'BLF-315':U (icFcMsgNumber), 
                     input  '' (icFcExplanation), 
                     input  '' (icFcIdentification), 
                     input  '' (icFcContext), 
                     output viFcReturnSuper (oiReturnStatus)) in database>
    return.
end.

vhQuery:get-first().
if not vhQuery:query-off-end
then do viFcCount1 = 1 to viFields:
    if viFcCount1 > 1
    then assign ocFieldValues = ocFieldValues + chr(3).
    assign vhField = ?.
    assign vhField = tFcDynRel.thFcBuffer:buffer-field(entry(viFcCount1,icFieldNames)) no-error.
    if vhField <> ?
    then do:
        if vhField:data-type = "logical":U
        then assign vcValue = (if vhField:buffer-value = yes
                               then "TRUE":U
                               else if vhField:buffer-value = no
                                    then "FALSE":U
                                    else "?":U).
        else if vhField:data-type = "date":U
        then do:
            assign vtemp = date (vhField:buffer-value).
            if ilConvertToDisplayFormat
            then assign vcValue = <M-3 DisplayDate (input  vtemp (itDate)) in database>.
            else assign vcValue = string(year(vtemp),"9999":U)
                                + string(month(vtemp),"99":U)
                                + string(day(vtemp),"99":U).
        end.
        else if vhField:data-type = "decimal":U
             and ilConvertToDisplayFormat
             then assign vcValue = <M-4 DisplayDecimal (input  decimal (vhField:buffer-value) (idDecimal), 
                     input  vhField:format (icFormat)) in database>.
             else assign vcValue = string(vhField:buffer-value).
        assign ocFieldValues = ocFieldValues + (if vcValue = ? then "?":U else vcValue).
    end.
end.

vhQuery:query-close().
delete object vhQuery.

if oiReturnStatus = -98
then oiReturnStatus = 0.