project QadFinancials > class BBudget > method CheckBudgetFDSwithWBSID

Description

This method will verify wether a certain combination of a WBS-ID and 8 FDS elements are in contradiction or not


Parameters


iiBudgetWBSIDinputintegerBudgetWBSID
icGlCodeinputcharacterGLCode
icDivisionCodeinputcharacterSub-Account Code
icCostCentreCodeinputcharacterCostCentreCode
icProjectCodeinputcharacterProjectCode
iiSafStructIDinputintegerSafStructID
iiSafConcept1IDinputintegerSafConcept1ID
iiSafConcept2IDinputintegerSafConcept2ID
iiSafConcept3IDinputintegerSafConcept3ID
iiSafConcept4IDinputintegerSafConcept4ID
iiSafConcept5IDinputintegerSafConcept5ID
icSaf1CodeinputcharacterSaf1Code
icSaf2CodeinputcharacterSaf2Code
icSaf3CodeinputcharacterSaf3Code
icSaf4CodeinputcharacterSaf4Code
icSaf5CodeinputcharacterSaf5Code
icRestrictedBusComponentCodeinputcharacterRestrictedBusComponentCode; Code of the business-component that will be used to restrict the selectable nodes.
Only used in case RestrictedBusComponentID is not filled
iiRestrictedBusComponentIDinputintegerRestrictedBusComponentID; ID of the business-component that will be used to restrict the selectable nodes.
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program9/bbudget.p)

assign viErrorStatus   = 0
       oiReturnStatus  = -98.

/* check the input parameters, is safconcept is filled safcode must be filled to */
if iiRestrictedBusComponentID = ? then assign iiRestrictedBusComponentID = 0.
if icRestrictedBusComponentCode = ? then assign icRestrictedBusComponentCode = "":U.
if icCostCentreCode = ? then assign icCostCentreCode = "":U.
if icProjectCode = ? then assign icProjectCode = "":U.
if (iiSafConcept1ID <> 0 and iiSafConcept1ID <> ? and (icSaf1Code = "":U or icSaf1Code = ?)) or
   (iiSafConcept2ID <> 0 and iiSafConcept2ID <> ? and (icSaf2Code = "":U or icSaf2Code = ?)) or
   (iiSafConcept3ID <> 0 and iiSafConcept3ID <> ? and (icSaf3Code = "":U or icSaf3Code = ?)) or
   (iiSafConcept4ID <> 0 and iiSafConcept4ID <> ? and (icSaf4Code = "":U or icSaf4Code = ?)) or
   (iiSafConcept5ID <> 0 and iiSafConcept5ID <> ? and (icSaf5Code = "":U or icSaf5Code = ?)) or

   (icSaf1Code <> "":U and icSaf1Code <> ? and (iiSafConcept1ID = 0 or iiSafConcept1ID = ?)) or
   (icSaf2Code <> "":U and icSaf2Code <> ? and (iiSafConcept2ID = 0 or iiSafConcept2ID = ?)) or
   (icSaf3Code <> "":U and icSaf3Code <> ? and (iiSafConcept3ID = 0 or iiSafConcept3ID = ?)) or
   (icSaf4Code <> "":U and icSaf4Code <> ? and (iiSafConcept4ID = 0 or iiSafConcept4ID = ?)) or
   (icSaf5Code <> "":U and icSaf5Code <> ? and (iiSafConcept5ID = 0 or iiSafConcept5ID = ?)) or
    
    iiBudgetWBSID = 0 or iiBudgetWBSID = ?
then do:
    assign oiReturnStatus = -1
           vcMessage      = trim(#T-19'The COA fields cannot be checked for this budget WBS.':200(674)t-19#).
    <M-11 run SetMessage (input  vcMessage (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  3 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QADFIN-2123':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BBudget>
    return.
end.

/* get the deepest level of the saf usage */
if icSaf5Code <> "":U and icSaf5Code <> ?
then assign viCounter = 5.
else if icSaf4Code <> "":U and icSaf4Code <> ?
     then assign viCounter = 4.
     else if icSaf3Code <> "":U and icSaf3Code <> ?
          then assign viCounter = 3.  
          else if icSaf2Code <> "":U and icSaf2Code <> ?
               then assign viCounter = 2.  
               else if icSaf1Code <> "":U and icSaf1Code <> ?
                    then assign viCounter = 1.  
                    else assign viCounter = 0.

/* Start queries */
<Q-16 run BudgetWBSByAll (Start) in BBudget >
 
/* Only check the FDS elements in his own tree, and only up */
assign vlDeepestBudgetWBSNode = true.
do while iiBudgetWBSId  <> 0 and
         iiBudgetWBSId  <> ? and
         viErrorStatus  >= 0 and
         (oiReturnStatus >= 0 or
          oiReturnStatus  = -98) :

    /* find the WBS, the first time it's the lowest wbs code , depending on input param */
    /* all the other times the WBSID is filled with the wbsid of the parent             */
    <Q-2 run BudgetWBSByAll (all) (Read) (NoCache)
          (input ?, (BudgetID)
           input iiBudgetWBSID, (BudgetWBSID)
           input '':U, (BudgetWBSCode)
           input ?, (ParentBudgetWBSID)
           input '':U, (BudgetFDSType)
           input ?, (SafStructureID)
           input ?, (SafConceptID)
           input ?, (BudgetFDSID)
           output dataset tqBudgetWBSByAll) in BBudget >
    find first tqBudgetWBSByAll no-lock no-error.
    if not available tqBudgetWBSByAll
    then do:
        assign oiReturnStatus = -1
               vcMessage      = trim(#T-20'Internal error: the budget WBS is missing.':200(675)t-20#) + chr(10) +
                                trim(substitute('BudgetWBSID: &1':U, iiBudgetWBSID)).
        <M-9 run SetMessage (input  vcMessage (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  3 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QADFIN-2124':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BBudget>
        leave.
    end.
    
    /* Check the BusComponent for the deepest wbs-node in case a value was passed for it */
    if vlDeepestBudgetWBSNode = true and 
       (iiRestrictedBusComponentID   <> 0 or
        icRestrictedBusComponentCode <> "":U)
    then do:
        if iiRestrictedBusComponentID = 0
        then do :
            <Q-15 run BusComponentByLabelCodeID (all) (Read) (NoCache)
               (input ?, (BusComponentID)
                input icRestrictedBusComponentCode, (BusComponentCode)
                input ?, (BusComponentLabel)
                output dataset tqBusComponentByLabelCodeID) in BBusinessComponent >
            find first tqBusComponentByLabelCodeID where 
                       tqBusComponentByLabelCodeID.tcBusComponentCode = icRestrictedBusComponentCode
                       no-lock no-error.
            if available tqBusComponentByLabelCodeID
            then assign iiRestrictedBusComponentID = tqBusComponentByLabelCodeID.tiBusComponent_ID.
        end. /* if iiRestrictedBusComponentID = 0 */
        <Q-13 run BudgetWBSBusComponentByIDs (all) (Read) (NoCache)
          (input ?, (BudgetID)
           input tqBudgetWBSByAll.tiBudgetWBS_ID, (BudgetWBSID)
           input ?, (BusComponentID)
           output dataset tqBudgetWBSBusComponentByIDs) in BBudget >
        if can-find (first tqBudgetWBSBusComponentByIDs where
                           tqBudgetWBSBusComponentByIDs.tiBudgetWBS_ID = tqBudgetWBSByAll.tiBudgetWBS_ID) and 
           not can-find (tqBudgetWBSBusComponentByIDs where
                         tqBudgetWBSBusComponentByIDs.tiBudgetWBS_ID    = tqBudgetWBSByAll.tiBudgetWBS_ID and 
                         tqBudgetWBSBusComponentByIDs.tiBusComponent_ID = iiRestrictedBusComponentID)
         then do:
            assign oiReturnStatus = -1
                   vcMessage      = trim(substitute(#T-21'The budget WBS node (&1) was restricted to a limited set of classes, but no class for the current transaction was included.':255(676)T-21#,tqBudgetWBSByAll.tcBudgetWBSCode)) + chr(10) + 
                                    trim(substitute(#T-22'Budget WBS ID: &1.':255(677)T-22#,string(tqBudgetWBSByAll.tiBudgetWBS_ID))) + chr(10) + 
                                    trim(substitute(#T-23'Component ID/code: &1/&2.':255(678)T-23#,string(iiRestrictedBusComponentID),icRestrictedBusComponentCode)).
            <M-14 run SetMessage (input  vcMessage (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  3 (iiSeverity),
                     input  '':U (icRowid),
                     input  'QADFIN-2298':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BBudget>
            leave.
        end. /* if can-find */
    end. /* if vlDeepestBudgetWBSNode = true and */
    
    /* Hold settings for the next cycle */
    assign iiBudgetWBSId          = tqBudgetWBSByAll.tiParentBudgetWBS_ID
           vlDeepestBudgetWBSNode = false.

    /* the actual check on blanco's and the global assign of the specific code to fds code*/
    case tqBudgetWBSByAll.tcBudgetFDSType:
      when {&BUDGETFDSTYPE-GL}
        then do:
            if icGlCode = "":U or icGlCode = ?
            then assign viErrorStatus = -2.
            else assign vcFDSCode      = icGlCode.
        end.
      when {&BUDGETFDSTYPE-DIVISION}
        then do:
            if icDivisionCode = "":U or icDivisionCode = ?
            then assign viErrorStatus = -3.
            else assign vcFDSCode      = icDivisionCode.
        end.
      when {&BUDGETFDSTYPE-PROJECT}
        then do:
            if icProjectCode = "":U
            then assign viErrorStatus = -4.
            else assign vcFDSCode      = icProjectCode.
        end.
      when {&BUDGETFDSTYPE-COSTCENTRE}
        then do:
            if icCostCentreCode = "":U
            then assign viErrorStatus = -5.
            else assign vcFDSCode      = icCostCentreCode.
        end.
      when {&BUDGETFDSTYPE-SAF}
        then do:
            if iiSafStructID <> tqBudgetWBSByAll.tiSafStructure_ID
            then assign viErrorStatus = -6.
            /**** !!!!!!!!!! pay attention to check if we use the correct saf for test, start from
                             bottom note and lowest saf !!!!!!! */
            if (viCounter = 5 and iiSafConcept5ID <> tqBudgetWBSByAll.tiSafConcept_ID) 
            then assign viErrorStatus = -75.
            else if (viCounter = 4 and iiSafConcept4ID <> tqBudgetWBSByAll.tiSafConcept_ID) 
                 then assign viErrorStatus = -74.
                 else if (viCounter = 3 and iiSafConcept3ID <> tqBudgetWBSByAll.tiSafConcept_ID) 
                      then assign viErrorStatus = -73.
                      else if (viCounter = 2 and iiSafConcept2ID <> tqBudgetWBSByAll.tiSafConcept_ID) 
                           then assign viErrorStatus = -72.
                           else if (viCounter = 1 and iiSafConcept1ID <> tqBudgetWBSByAll.tiSafConcept_ID) 
                                then assign viErrorStatus = -71.
            
            if viCounter = 5 and (icSaf5Code = "":U or icSaf5Code = ?)
            then assign viErrorStatus = -85.
            else if viCounter = 4 and (icSaf4Code = "":U or icSaf4Code = ?)
                 then assign viErrorStatus = -84.
                 else if viCounter = 3 and (icSaf3Code = "":U or icSaf3Code = ?)
                      then assign viErrorStatus = -83.
                      else if viCounter = 2 and (icSaf2Code = "":U or icSaf2Code = ?)
                           then assign viErrorStatus = -82.
                           else if viCounter = 1 and (icSaf1Code = "":U or icSaf1Code = ?) 
                                then assign viErrorStatus = -81.

            if viErrorStatus = 0
            then do:
                if viCounter = 5
                then assign vcFDSCode      = icSaf5Code
                            viSafConceptID = iiSafConcept5ID.
                else if viCounter = 4
                     then assign vcFDSCode      = icSaf4Code
                                 viSafConceptID = iiSafConcept4ID.
                     else if viCounter = 3
                          then assign vcFDSCode      = icSaf3Code
                                      viSafConceptID = iiSafConcept3ID.
                          else if viCounter = 2
                               then assign vcFDSCode      = icSaf2Code
                                           viSafConceptID = iiSafConcept2ID.
                               else if viCounter = 1
                                    then assign vcFDSCode      = icSaf1Code
                                                viSafConceptID = iiSafConcept1ID.
                                    else assign vcFDSCode      = "":U
                                                viSafConceptID = 0.
            end. /* oiret = o */
        end. /* FDS type SAF */
    end case.
 
    if viErrorStatus < 0 
    then leave.

    /* ============================================================================================ */
    /* check the WBSCode with the inputparamter (option code, from-to, list. Pay attention with "*" */
    /* ============================================================================================ */
    assign vlFDSStatus = false.
    if tqBudgetWBSByAll.tcBudgetWBSFDSCode <> "":U and
       tqBudgetWBSByAll.tcBudgetWBSFDSCode <> ?
    then do:
        if index(tqBudgetWBSByAll.tcBudgetWBSFDSCode,"*":U) <> 0
        then do:
            /* Matches WBS Code with "*" */
            if vcFDSCode matches tqBudgetWBSByAll.tcBudgetWBSFDSCode 
            then assign vlFDSStatus = true.
        end.
        else do:
            /* equals no "*" */ 
            if vcFDSCode = tqBudgetWBSByAll.tcBudgetWBSFDSCode 
            then assign vlFDSStatus = true.
        end.
    end. /* code */
    /* code range */
    else do:
        if tqBudgetWBSByAll.tcBudgetWBSFDSFromCode <> "":U and 
           tqBudgetWBSByAll.tcBudgetWBSFDSFromCode <> ?    and 
           tqBudgetWBSByAll.tcBudgetWBSFDSToCode   <> "":U and 
           tqBudgetWBSByAll.tcBudgetWBSFDSToCode   <> ?    
        then do: 
            if (tqBudgetWBSByAll.tcBudgetWBSFDSFromCode >= vcFDSCode and
                tqBudgetWBSByAll.tcBudgetWBSFDSToCode   <= vcFDSCode)      
            then assign vlFDSStatus = true.
        end.
        /* code list */
        else do:
            if tqBudgetWBSByAll.tcBudgetWBSFDSList <> "":U and 
               tqBudgetWBSByAll.tcBudgetWBSFDSList <> ?   
            then do:
                if lookup(vcFDSCode,tqBudgetWBSByAll.tcBudgetWBSFDSList) <> 0 
                then assign vlFDSStatus = true.
            end.
            else do:
                /* check the budgetgroup with the correct type */
                case tqBudgetWBSByAll.tcBudgetFDSType:
                            
                    when {&BUDGETFDSTYPE-SAF}
                    then do: 
                        /* take care, take the correct safconcept !!!!! */
                         <Q-3 run SafBySSOthers (all) (Read) (NoCache)
          (input ?, (FromSafCode)
           input ?, (ToSafCode)
           input ?, (SafConceptCode)
           input viSafConceptID, (SafConceptID)
           input ?, (MatchingSafCode)
           input ?, (SafCode)
           input tqBudgetWBSByAll.tiBudgetGroup_ID, (BudgetGroupID)
           output dataset tqSafBySSOthers) in BSaf >
                        find first tqSafBySSOthers no-error.
                        if available tqSafBySSOthers
                        then assign vlFDSStatus = true.
                    end. /* SAF */
                    when {&BUDGETFDSTYPE-GL}
                    then do:
                        <Q-4 run GLBySSOthers (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input ?, (FromGLCode)
           input ?, (ToGLCode)
           input ?, (GLSharedSetID)
           input ?, (MatchingGLCode)
           input vcFDSCode, (GLCode)
           input tqBudgetWBSByAll.tiBudgetGroup_ID, (BudgetGroupID)
           output dataset tqGLBySSOthers) in BGL >
                        find first tqGLBySSOthers no-error.
                        if available tqGLBySSOthers
                        then assign vlFDSStatus = true.
                    end. /* GL */
                    when {&BUDGETFDSTYPE-DIVISION}
                    then do:
                        <Q-5 run DivisionBySSOthers (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input ?, (DivisionSharedSetID)
           input ?, (FromDivisionCode)
           input ?, (ToDivisionCode)
           input ?, (MatchingDivisionCode)
           input vcFDSCode, (DivisionCode)
           input tqBudgetWBSByAll.tiBudgetGroup_ID, (BudgetGroupID)
           output dataset tqDivisionBySSOthers) in BDivision >
                        find first tqDivisionBySSOthers no-error.
                        if available tqDivisionBySSOthers
                        then assign vlFDSStatus = true.
                    end. /* Div */
                    when {&BUDGETFDSTYPE-PROJECT}
                    then do:
                        <Q-6 run ProjectBySSOthers (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input ?, (ProjectSharedSetID)
           input ?, (FromProjectCode)
           input ?, (ToProjectCode)
           input ?, (MatchingProjectCode)
           input vcFDSCode, (ProjectCode)
           input tqBudgetWBSByAll.tiBudgetGroup_ID, (BudgetGroupID)
           output dataset tqProjectBySSOthers) in BProject >
                        find first tqProjectBySSOthers no-error.
                        if available tqProjectBySSOthers
                        then assign vlFDSStatus = true.
                    end. /* Proj */
                    when {&BUDGETFDSTYPE-COSTCENTRE}
                    then do:
                        <Q-7 run CostCentreBySSOthers (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input ?, (CostCentreSharedSetID)
           input ?, (FromCostCentreCode)
           input ?, (ToCostCentreCode)
           input ?, (MatchingCostCentreCode)
           input vcFDSCode, (CostCentreCode)
           input tqBudgetWBSByAll.tiBudgetGroup_ID, (BudgetGroupID)
           output dataset tqCostCentreBySSOthers) in BCostCentre >
                        find first tqCostCentreBySSOthers no-error.
                        if available tqCostCentreBySSOthers
                        then assign vlFDSStatus = true.
                    end. /* CC */
                end case.
            end.
        end. /* code list */
    end. /* code range */
    if vlFDSStatus = false
    then do:
        case tqBudgetWBSByAll.tcBudgetFDSType:
          when {&BUDGETFDSTYPE-GL}         then assign viErrorStatus = -2.
          when {&BUDGETFDSTYPE-DIVISION}   then assign viErrorStatus = -3.
          when {&BUDGETFDSTYPE-PROJECT}    then assign viErrorStatus = -4.
          when {&BUDGETFDSTYPE-COSTCENTRE} then assign viErrorStatus = -5.
          when {&BUDGETFDSTYPE-SAF}     
             then do:
                 if viCounter = 1 then assign viErrorStatus = -81.
                 if viCounter = 2 then assign viErrorStatus = -82.
                 if viCounter = 3 then assign viErrorStatus = -83.
                 if viCounter = 4 then assign viErrorStatus = -84.
                 if viCounter = 5 then assign viErrorStatus = -85.
             end.
        end case.
    end.
    
    if tqBudgetWBSByAll.tcBudgetFDSType = {&BUDGETFDSTYPE-SAF} 
    then assign viCounter = viCounter - 1.
end. /*do while parent filled */

/* Check for major errors in the loop */
if oiReturnStatus < 0 and 
   oiReturnStatus <> -98
then return.   

if icCostCentreCode <> "":U
then do:
    <Q-45 run CostCentrePrim (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input ?, (CostCentreID)
           input icCostCentreCode, (CostCentreCode)
           output dataset tqCostCentrePrim) in BCostCentre >
    find first tqCostCentrePrim no-error.
    assign viCostCentreID = if available tqCostCentrePrim
                            then tqCostCentrePrim.tiCostCentre_ID
                            else 0.
end.
if icProjectCode <> "":U
then do:
    <Q-46 run ProjectPrim (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input ?, (ProjectID)
           input icProjectCode, (ProjectCode)
           output dataset tqProjectPrim) in BProject >
    find first tqProjectPrim no-error.
    assign viProjectID = if available tqProjectPrim
                         then tqProjectPrim.tiProject_ID
                         else 0.
end.
/* check project / costcentre for project/costcentre budgets */
<Q-12 run BudgetByProjectCostCentre (all) (Read) (NoCache)
          (input viCompanyId, (CompanyId)
           input if viCostCentreID = 0 or viCostCentreID = ? then icCostCentreCode else '':U, (CostCentreCode)
           input viCostCentreID, (CostCentreID)
           input if viProjectID = 0 or viProjectID = ? then icProjectCode else '':U, (ProjectCode)
           input viProjectID, (ProjectID)
           input ?, (RowidToSkip)
           input ?, (BudgetStatus)
           output dataset tqBudgetByProjectCostCentre) in BBudget >
find first tqBudgetByProjectCostCentre 
           no-lock no-error.
if available tqBudgetByProjectCostCentre
then do:
    if tqBudgetByProjectCostCentre.tcProjectCode <> "":U and 
       tqBudgetByProjectCostCentre.tcProjectCode <> ?    and
       tqBudgetByProjectCostCentre.tcProjectCode <> icProjectCode
    then assign viErrorStatus = -40.
    if tqBudgetByProjectCostCentre.tcCostCentreCode <> "":U and 
       tqBudgetByProjectCostCentre.tcCostCentreCode <> ?    and
       tqBudgetByProjectCostCentre.tcCostCentreCode <> icCostCentreCode
    then assign viErrorStatus = -50.
end.

if viErrorStatus < -1
then do:
    case viErrorStatus:
        when -2  then assign vcFDSType = #T-24'GL':3(679)T-24#.
        when -3  then assign vcFDSType = #T-25'Sub-Account':16(680)T-25#.
        when -4  then assign vcFDSType = #T-26'Project':9(681)t-26#.
        when -5  then assign vcFDSType = #T-27'Cost Center':19(682)T-27#.
        when -6  then assign vcFDSType = #T-28'SAF Structure':15(683)T-28#.
        when -40 then assign vcFDSType = #T-29'Project':9(681)t-29#.
        when -50 then assign vcFDSType = #T-30'Cost Center':19(682)T-30#.
        when -71 then assign vcFDSType = #T-31'SAF Concept 1':15(684)T-31#.
        when -72 then assign vcFDSType = #T-32'SAF Concept 2':15(685)T-32#.
        when -73 then assign vcFDSType = #T-33'SAF Concept 3':15(686)T-33#.
        when -74 then assign vcFDSType = #T-34'SAF Concept 4':15(687)T-34#.
        when -75 then assign vcFDSType = #T-35'SAF Concept 5':15(688)T-35#.
        when -81 then assign vcFDSType = #T-36'SAF Code 1':10(689)T-36#.
        when -82 then assign vcFDSType = #T-37'SAF Code 2':10(690)T-37#.
        when -83 then assign vcFDSType = #T-38'SAF Code 3':10(691)T-38#.
        when -84 then assign vcFDSType = #T-39'SAF Code 4':10(692)T-39#.
        when -85 then assign vcFDSType = #T-40'SAF Code 5':10(693)T-40#.
    end case.
    assign vcMessage = trim(substitute(#T-41'The &1 does not match the COA of WBS code &2.':255(694)T-41#,trim(vcFDSType),trim((if available tqBudgetWBSByAll then tqBudgetWBSByAll.tcBudgetWBSCode else "?":U)))).
    if available tqBudgetWBSByAll and 
       ((viErrorStatus > -5  and viErrorStatus < -2 ) or
        (viErrorStatus > -85 and viErrorStatus < -80))
    then if tqBudgetWBSByAll.tcBudgetWBSFDSFromCode <> "":U and 
            tqBudgetWBSByAll.tcBudgetWBSFDSFromCode <> ?    and 
            tqBudgetWBSByAll.tcBudgetWBSFDSToCode   <> ?
         then assign vcMessage = vcMessage + chr(10) + trim(substitute(#T-42'Valid range: &1 - &2.':255(695)T-42#,tqBudgetWBSByAll.tcBudgetWBSFDSFromCode,tqBudgetWBSByAll.tcBudgetWBSFDSToCode)).
         else if tqBudgetWBSByAll.tcBudgetWBSFDSList <> "":U and 
                 tqBudgetWBSByAll.tcBudgetWBSFDSList <> ?
              then assign vcMessage = vcMessage + chr(10) + trim(substitute(#T-43'Valid list: &1.':255(696)T-43#,tqBudgetWBSByAll.tcBudgetWBSFDSList)).
              else if tqBudgetWBSByAll.tcBudgetWBSFDSCode <> "":U and 
                      tqBudgetWBSByAll.tcBudgetWBSFDSCode <> ?
                   then assign vcMessage = vcMessage + chr(10) + trim(substitute(#T-44'Valid code(s): &1.':255(697)T-44#,tqBudgetWBSByAll.tcBudgetWBSFDSCode)).
    <M-8 run SetMessage (input  vcMessage (icMessage),
                     input  '':U (icArguments),
                     input  '':U (icFieldName),
                     input  '':U (icFieldValue),
                     input  'E':U (icType),
                     input  3 (iiSeverity),
                     input  ? (icRowid),
                     input  'QADFIN-2120':U (icFcMsgNumber),
                     input  '' (icFcExplanation),
                     input  '' (icFcIdentification),
                     input  '' (icFcContext),
                     output viFcReturnSuper (oiReturnStatus)) in BBudget>
    assign oiReturnStatus = -1.
end.

/* Stop queries */
<Q-18 run BudgetWBSByAll (Stop) in BBudget >
empty temp-table tqBudgetByProjectCostCentre.
empty temp-table tqBudgetWBSByAll.

/* Set ReturnStatus = OK */
if oiReturnStatus = -98
then assign oiReturnStatus = 0.