project BLF > class Database Component > method CheckValidationExceptionList

Description

Evaluate updates in the class temp-tables.
If updates other than to fields listed in vcValidationExceptionList are found return true, otherwise return false.


Parameters


ilValidateInputDatainputlogicalWhen true, evaluate the input data (= tables with prefix t_s).
When false, evaluate the business data (= tables with prefix t_o).
olDoValidationoutputlogical


Internal usage


BLF
method database.ValidateBC
method database.ValidateUI


program code (program1/database.p)

define variable oireturnstatus as integer no-undo.

if vcValidationExceptionList = ""
then olDoValidation = yes.
else do:
    <M-1 run DataDescription
       (input  '' (icRowids), 
        input  '' (icPkey), 
        input  '' (icObjectIds), 
        input  yes (ilAllTables), 
        output viFcReturnSuper (oiReturnStatus)) in database>
    
    for each tFcDynRel on error undo, throw:
    
        /* ================================================================= */
        /* Look for create or delete. If found, always validate.             */
        /* ================================================================= */
        if ilValidateInputData
        then do:
            tFcDynRel.thFcSBuffer:find-unique("where tc_Status = 'N' or tc_Status = 'D'") no-error.
            olDoValidation = (tFcDynRel.thFcSBuffer:available or tFcDynRel.thFcSBuffer:ambiguous).
        end.
        else do:
            tFcDynRel.thFcBuffer:find-unique("where tc_Status = 'N' or tc_Status = 'D'") no-error.
            olDoValidation = (tFcDynRel.thFcBuffer:available or tFcDynRel.thFcBuffer:ambiguous).
        end.
        if olDoValidation
        then return.
    
        /* ================================================================= */
        /* Evaluate updates field by field.                                  */
        /* ================================================================= */
        viFieldNum = tFcDynRel.thFcSBuffer:num-fields.
        create query vhQuery in widget-pool "non-persistent".
        vhQuery:forward-only = yes.
        if ilValidateInputData
        then vhQuery:set-buffers (tFcDynRel.thFcSBuffer,tFcDynRel.thFcIBuffer).
        else vhQuery:set-buffers (tFcDynRel.thFcBuffer,tFcDynRel.thFcIBuffer).
        if ilValidateInputData
        then vhQuery:query-prepare ("for each " + tFcDynRel.thFcSBuffer:name
                                    + " where " + tFcDynRel.thFcSBuffer:name + ".tc_Status = 'C'"
                                    + ", each " + tFcDynRel.thFcIBuffer:name
                                    + " where " + tFcDynRel.thFcIBuffer:name + ".tc_Rowid"
                                    + " = "     + tFcDynRel.thFcSBuffer:name + ".tc_Rowid").
        else vhQuery:query-prepare ("for each " + tFcDynRel.thFcBuffer:name
                                    + " where " + tFcDynRel.thFcBuffer:name  + ".tc_Status = 'C'"
                                    + ", each " + tFcDynRel.thFcIBuffer:name
                                    + " where " + tFcDynRel.thFcIBuffer:name + ".tc_Rowid"
                                    + " = "     + tFcDynRel.thFcBuffer:name  + ".tc_Rowid").
        vhQuery:query-open().
        vhQuery:get-first().
        do while not vhQuery:query-off-end:
            do viFieldCount = 1 to viFieldNum:
                if ilValidateInputData
                then vhSOField = tFcDynRel.thFcSBuffer:buffer-field(viFieldCount).
                else vhSOField = tFcDynRel.thFcBuffer:buffer-field(viFieldCount).
                /* Some fields should always be ignored for evaluation */
                if not (vhSOField:name = "tc_Rowid" or
                        vhSOField:name = "tc_ParentRowid" or
                        vhSOField:name = "tc_Status" or
                        vhSOField:name begins "LastModified" or
                        vhSOField:name begins "CustomShort" or
                        vhSOField:name begins "CustomCombo" or
                        vhSOField:name begins "CustomLong" or
                        vhSOField:name begins "CustomNote" or
                        vhSOField:name begins "CustomDate" or
                        vhSOField:name begins "CustomInteger" or
                        vhSOField:name begins "CustomDate")
                then if not can-do (vcValidationExceptionList, "t" + tFcDynRel.tcFcTo + "." + vhSOField:name)
                then if vhSOField:buffer-value <> tFcDynRel.thFcIBuffer:buffer-field(viFieldCount):buffer-value
                then do:
                    olDoValidation = yes.
                    vhQuery:query-close().
                    delete object vhQuery.
                    return.
                end.
            end.
            vhQuery:get-next().
        end.
        vhQuery:query-close().
        delete object vhQuery.
    end.
end.

finally:
    if olDoValidation
    and viTransactionID <> 0
    then do:
        /* open transaction and leave it open for re-use */
        <I-40 {bFcOpenInstance
             &CLASS           = "Transaction"}>
    end.
end finally.