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
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.