project QadFinancials > class BResource > method ApiGetResourcesByCategory

Description

Get a list of all resources with the SOD category they are assigned to. Resources not linked to a SOD category are included with a blank SOD category code.


Parameters


tResourcesByCategoryoutputtemp-table
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program3/bresource.p)

/* ========================================================================================= */
/* Get all available resources and the linked mnd_det records                                */
/* It is possible that 1 resource has multiple occurrences in the tResourcesByCategory table */
/* It is possible that a resource has no mnd_det record linked at all                        */
/* ========================================================================================= */
<Q-9 run MenuDetailForMenuFolders (all) (Read) (NoCache)
   (input current-language, (LngCode)
    output dataset tqMenuDetailForMenuFolders) in BMfgMenu >

/* BLF-4014 workaround for the issue where operator begins 'A.' cannot be used on Oracle dataserver */
for each tqMenuDetailForMenuFolders where
         tqMenuDetailForMenuFolders.tcmnd_exec begins "A" and
         tqMenuDetailForMenuFolders.tcmnd_exec <> "A" and
         not tqMenuDetailForMenuFolders.tcmnd_exec begins "A.":
    delete tqMenuDetailForMenuFolders.
end.

<Q-66 run SelectResource (all) (Read) (NoCache)  (output dataset tqSelectResource) in BResource >

<Q-59 run MenuDetailByAll (all) (Read) (NoCache)
    (output dataset tqMenuDetailByAll) in BMfgMenu >

<Q-60 run MenuDetailTranslationInfo (all) (Read) (NoCache)
   (input current-language, (LngCode)
    output dataset tqMenuDetailTranslationInfo) in BMfgMenu >

for each tqSelectResource:
   if tqSelectResource.tcResourceURI matches '*ObjectSecurity' or
      tqSelectResource.tcResourceURI matches '*ReturnToSender'       
   then delete tqSelectResource.
end.

create tResourcesByCategory.
assign tResourcesByCategory.tcMenuNbr          = "root"
       tResourcesByCategory.tcMenuExec         = "A"
       tResourcesByCategory.tiMenuSelect       = 1
       tResourcesByCategory.tcResourceLabel    = #T-30'Secured items on menu':255(63693)T-30#
       tResourcesByCategory.tiResource_ID      = 0
       tResourcesByCategory.tcResourceURI      = ""
       tResourcesByCategory.tcResourceCategory = "".

create tResourcesByCategory.
assign tResourcesByCategory.tcMenuNbr          = "root"
       tResourcesByCategory.tcMenuExec         = "B"
       tResourcesByCategory.tiMenuSelect       = 2
       tResourcesByCategory.tcResourceLabel    = #T-67'Secured items not on menu':255(63694)T-67#
       tResourcesByCategory.tiResource_ID      = 0
       tResourcesByCategory.tcResourceURI      = ""
       tResourcesByCategory.tcResourceCategory = "".

assign viFcCount1 = 0
       viFcCount2 = 0
       vlgcg      = yes.

<Q-21 run BusComponentForAllCategory (all) (Read) (NoCache)  (output dataset tqBusComponentForAllCategory) in BBusinessComponent>

/* go through each resource - with 0,1 or multiple mnd_det records linked to it */
for each tqSelectResource where tqSelectResource.tcResourceURI <> "" by tqSelectResource.tcResourceURI:

    /* Go through all menu entries for this resource */
    assign vlMenuLinked = no.
    for each tqMenuDetailByAll where tqMenuDetailByAll.tcmnd_uri = tqSelectResource.tcResourceURI:

        assign vlMenuLinked = true.

        /* Get mnt_det for translation */
        find first tqMenuDetailTranslationInfo where
                   tqMenuDetailTranslationInfo.tcmnt_nbr    = tqMenuDetailByAll.tcmnd_nbr and
                   tqMenuDetailTranslationInfo.timnt_select = tqMenuDetailByAll.timnd_select
                   no-error.

        create tResourcesByCategory.
        assign tResourcesByCategory.tcMenuNbr          = tqMenuDetailByAll.tcmnd_nbr
               tResourcesByCategory.tcMenuExec         = tqMenuDetailByAll.tcmnd_exec
               tResourcesByCategory.tiMenuSelect       = tqMenuDetailByAll.timnd_select
               tResourcesByCategory.tcResourceLabel    = (if available tqMenuDetailTranslationInfo
                                                          then tqMenuDetailTranslationInfo.tcmnt_label
                                                          else tqMenuDetailByAll.tcmnd_label)
               tResourcesByCategory.tiResource_ID      = tqSelectResource.tiResource_ID
               tResourcesByCategory.tcResourceURI      = tqMenuDetailByAll.tcmnd_uri
               tResourcesByCategory.tcResourceCategory = tqSelectResource.tcSODCategoryCode.

        /* Place the menu structure between brackets */                                                        
        tResourcesByCategory.tcResourceLabel = tResourcesByCategory.tcResourceLabel + ' (':U + 
                                               trim (tResourcesByCategory.tcMenuNbr) + '.':U +
                                               trim (string (tResourcesByCategory.tiMenuSelect)) + ')':U.

        /* Place the menu security level between brackets */
        if tqSelectResource.tcResourceType = {&RESOURCE-TYPE-ACTIVITY}
        then tResourcesByCategory.tcResourceLabel = tResourcesByCategory.tcResourceLabel + ' [' +
                                                    trim (#T-15'Entity':255(56602)T-15#) + ']'.
        else if tqSelectResource.tcResourceType = {&RESOURCE-TYPE-MENU}
        then assign tResourcesByCategory.tcResourceLabel = tResourcesByCategory.tcResourceLabel + ' [' +
                                                           trim (#T-32'Domain':20(60834)T-32#) + ']'.

    end. /* for each tqMenuDetailByAll */

    if not vlMenuLinked
    then do :
        /* BLF-3598 : skip reports that are not in the menu. */
        if tqSelectResource.tcResourceURI begins "urn:cbf:"
        then if can-find (first tqBusComponentForAllCategory where
                                tqBusComponentForAllCategory.tcBusComponentCode = entry(1,entry(3,tqSelectResource.tcResourceURI,":"),".") and
                                tqBusComponentForAllCategory.tcBusComponentCategory = "Reports")
             then next.
            
        if tqSelectResource.tcResourceURI begins "urn:gencodegroup:"
        then do:
            if vlgcg
            then do:
                assign viFcCount1 = 0
                       viFcCount2 = viFcCount2 + 1.
                       vlgcg = no.

                create tResourcesByCategory.
                assign tResourcesByCategory.tcMenuNbr          = "B"
                       tResourcesByCategory.tcMenuExec         = "B" + string(viFcCount2)
                       tResourcesByCategory.tiMenuSelect       = viFcCount2
                       tResourcesByCategory.tcResourceLabel    = #T-14'Generalized Code Groups':40(645423447)T-14#
                       tResourcesByCategory.tiResource_ID      = 0
                       tResourcesByCategory.tcResourceURI      = ""
                       tResourcesByCategory.tcResourceCategory = "".
            end.
        end.
        else
        if vcCompNameT <> substring(tqSelectResource.tcResourceURI,1,index(tqSelectResource.tcResourceURI,'.':U) - 1,"CHARACTER":U)
        then do:
            assign viFcCount1 = 0
                   viFcCount2 = viFcCount2 + 1.
                   vcCompNameT = substring(tqSelectResource.tcResourceURI,1,index(tqSelectResource.tcResourceURI,'.':U) - 1,"CHARACTER":U).

            create tResourcesByCategory.
            assign tResourcesByCategory.tcMenuNbr          = "B"
                   tResourcesByCategory.tcMenuExec         = "B" + string(viFcCount2)
                   tResourcesByCategory.tiMenuSelect       = viFcCount2
                   tResourcesByCategory.tcResourceLabel    = substring(vcCompNameT,r-index(vcCompNameT,':':U) + 1, -1, "CHARACTER":U) /* Should be translatable ? */
                   tResourcesByCategory.tiResource_ID      = 0
                   tResourcesByCategory.tcResourceURI      = ""
                   tResourcesByCategory.tcResourceCategory = "".
        end.
        assign viFcCount1 = viFcCount1 + 1.

        create tResourcesByCategory.
        assign tResourcesByCategory.tcMenuNbr          = "B" + string(viFcCount2)
               tResourcesByCategory.tcMenuExec         = "B" + string(viFcCount2) + "." + string(viFcCount1)
               tResourcesByCategory.tiMenuSelect       = viFcCount1
               tResourcesByCategory.tcResourceLabel    = tqSelectResource.tcResourceLabel
               tResourcesByCategory.tiResource_ID      = tqSelectResource.tiResource_ID
               tResourcesByCategory.tcResourceURI      = tqSelectResource.tcResourceURI
               tResourcesByCategory.tcResourceCategory = tqSelectResource.tcSODCategoryCode.

        if tqSelectResource.tcResourceType = {&RESOURCE-TYPE-ACTIVITY}
        then tResourcesByCategory.tcResourceLabel = tResourcesByCategory.tcResourceLabel + ' [' +
                                                    trim (#T-61'Entity':255(56602)T-61#) + ']'.
        else if tqSelectResource.tcResourceType = {&RESOURCE-TYPE-MENU}
        then tResourcesByCategory.tcResourceLabel = tResourcesByCategory.tcResourceLabel + ' [' +
                                                    trim (#T-11'Domain':20(60834)T-11#) + ']'.
    end. /* if not vlMenuLinked */
end. /* for each tqSelectResource */

/* Add the Memu Folders  */
for each tqMenuDetailForMenuFolders by tqMenuDetailForMenuFolders.tiLevel descending :

    /* skip the upper root level */
    if  tqMenuDetailForMenuFolders.tcmnd_nbr = ''
    then next.

    /*take appshell menu structure*/
    if tqMenuDetailForMenuFolders.tcmnd_nbr = "0"
    then next.

    /* In case no children found, skip it */
    if not can-find (first tResourcesByCategory where
                           tResourcesByCategory.tcMenuNbr = tqMenuDetailForMenuFolders.tcmnd_exec)
    then next.
    
    create tResourcesByCategory.
    assign tResourcesByCategory.tcMenuNbr          = tqMenuDetailForMenuFolders.tcmnd_nbr
           tResourcesByCategory.tcMenuExec         = tqMenuDetailForMenuFolders.tcmnd_exec
           tResourcesByCategory.tiMenuSelect       = tqMenuDetailForMenuFolders.timnd_select
           tResourcesByCategory.tcResourceLabel    = (if tqMenuDetailForMenuFolders.tcmnt_label <> ?
                                                      and tqMenuDetailForMenuFolders.tcmnt_label <> '' 
                                                      then tqMenuDetailForMenuFolders.tcmnt_label 
                                                      else tqMenuDetailForMenuFolders.tcmnd_label)
           tResourcesByCategory.tiResource_ID      = 0
           tResourcesByCategory.tcResourceURI      = ""
           tResourcesByCategory.tcResourceCategory = "".

    /* Place the menu structure between brackets */                                                        
    if tResourcesByCategory.tcMenuExec <> 'A':U and not tResourcesByCategory.tcMenuExec begins 'A.':U 
    then  assign tResourcesByCategory.tcResourceLabel = 
            tResourcesByCategory.tcResourceLabel + ' (':U +
               (if tResourcesByCategory.tcMenuNbr = 'A':U or tResourcesByCategory.tcMenuNbr begins 'A.':U 
                then '':U 
                else (trim (tResourcesByCategory.tcMenuNbr) + '.':U)) + 
           trim (string (tResourcesByCategory.tiMenuSelect)) + 
           ')':U.

end. /*for each tqMenuDetailForMenuFolders:*/

<Q-75 assign vlFcQueryRecordsAvailable = SystSODRunning (NoCache)  () in BSystem>
if vlFcQueryRecordsAvailable
then do:
    /* not a good time to do SOD category membership maintenance, please wait for SOD to complete */
    vcSODMesg = #T-94'SOD activation is still running.':255(880158251)T-94# + " "
              + #T-83'Please wait for the activation to complete before making security changes.':255(20846867)T-83#.
    <M-80 run SetMessage
       (input  vcSODMesg (icMessage), 
        input  '' (icArguments), 
        input  '' (icFieldName), 
        input  '' (icFieldValue), 
        input  'W' (icType), 
        input  3 (iiSeverity), 
        input  '' (icRowid), 
        input  'qadfin-875566':U (icFcMsgNumber), 
        input  '' (icFcExplanation), 
        input  '' (icFcIdentification), 
        input  '' (icFcContext), 
        output viFcReturnSuper (oiReturnStatus)) in BResource>
    oiReturnStatus = 1.
end.


Sample code: how to call this method through RPCRequestService (QXtend Inbound)

define temp-table ttContext no-undo
    field propertyQualifier as character
    field propertyName as character
    field propertyValue as character
    index entityContext is primary unique
        propertyQualifier
        propertyName
    index propertyQualifier
        propertyQualifier.

define dataset dsContext for ttContext.

define variable vhContextDS as handle no-undo.
define variable vhExceptionDS as handle no-undo.
define variable vhServer as handle no-undo.
define variable vhInputDS as handle no-undo.
define variable vhInputOutputDS as handle no-undo.
define variable vhOutputDS as handle no-undo.
define variable vhParameter as handle no-undo.

/* Create context */
create ttContext.
assign ttContext.propertyName = "programName"
       ttContext.propertyValue = "BResource".
create ttContext.
assign ttContext.propertyName = "methodName"
       ttContext.propertyValue = "ApiGetResourcesByCategory".
create ttContext.
assign ttContext.propertyName = "applicationId"
       ttContext.propertyValue = "fin".
create ttContext.
assign ttContext.propertyName = "entity"
       ttContext.propertyValue = "1000".
create ttContext.
assign ttContext.propertyName = "userName"
       ttContext.propertyValue = "mfg".
create ttContext.
assign ttContext.propertyName = "password"
       ttContext.propertyValue = "".

/* Connect the AppServer */
create server vhServer.
vhServer:connect("-URL <appserver-url>").

if not vhServer:connected()
then do:
    message "Could not connect AppServer" view-as alert-box error title "Error".
    return.
end.

/* Run */
assign vhContextDS = dataset dsContext:handle.

run program/rpcrequestservice.p on vhServer
    (input-output dataset-handle vhContextDS by-reference,
           output dataset-handle vhExceptionDS,
     input        dataset-handle vhInputDS by-reference,
     input-output dataset-handle vhInputOutputDS by-reference,
           output dataset-handle vhOutputDS).

/* Handle output however you want, in this example, we dump it to xml */
if valid-handle(vhExceptionDS)
then vhExceptionDS:write-xml("file", "Exceptions.xml", true).

if valid-handle(vhOutputDS)
then vhOutputDS:write-xml("file", "Output.xml", true).

/* Cleanup */
vhServer:disconnect().
assign vhServer = ?.

if valid-handle(vhInputDS)
then delete object vhInputDS.

if valid-handle(vhOutputDS)
then delete object vhOutputDS.

if valid-handle(vhExceptionDS)
then delete object vhExceptionDS.