project BLF > class BStoredSearch > method apiSaveStoredSearch

Description

Save a stored search.
This method is used for saving stored searches manually created by end-users, as well as saving last used settings created automatically when closing a browse (if corresponding system setting is active).
Note: when a last used setting is saved for user 'facdef' this setting will automatically be converted to a factory default.


Parameters


iiCurrentRoleIDinputinteger
icStoredSearchNameinputcharactername
icLookupReferenceinputcharacterLookupReference
iiRowsToRetrieveinputintegerRowsToRetrieve
icSortColumninputcharacterSortColumn
ilFilterPanelsMinimizedinputlogicalFilterPanelsMinimized
ilFreezeFirstColumninputlogicalFreezeFirstColumn
ilUseGridLayoutinputlogicaluse grid lay-out
ilCompanyDependentinputlogical
ilAutoApplyFilterinputlogical
iiAccessLevelinputinteger
icLayoutXMLinputcharactergrid lay-out in XML format
tFilterFieldsinputtemp-tableFilter fields
tResultFieldsinputtemp-tableResult fields
oiReturnStatusoutputintegerReturn status of the method.


Internal usage


unused


program code (program3/bstoredsearch.p)

if oiReturnStatus = 0
then oiReturnStatus = -98.

/* ================================================================================== */
/* If user is FacDef, then change the name of the stored search to FactoryDefault and */
/* put the ilShared-flag to true.                                                     */
/* ================================================================================== */
if  vcUserLogin = "FacDef":U
and icStoredSearchName begins "LASTUSED_"
then assign icStoredSearchName = {&STOREDSEARCH-FACTORY-DEFAULT}
            iiAccessLevel      = {&CONTROLPROPERTYLAYERTYPE-SYSTEM}.

if icStoredSearchName begins "LASTUSED_":U 
then assign iiAccessLevel     = {&CONTROLPROPERTYLAYERTYPE-USER}.

if icStoredSearchName = {&STOREDSEARCH-FACTORY-DEFAULT-TR}
then icStoredSearchName = {&STOREDSEARCH-FACTORY-DEFAULT}.
if icStoredSearchName = {&STOREDSEARCH-CUSTOMER-DEFAULT-TR}
then icStoredSearchName = {&STOREDSEARCH-CUSTOMER-DEFAULT}.
                                                                                   
if icStoredSearchName = {&STOREDSEARCH-FACTORY-DEFAULT}
and vcUserLogin <> "mfg":U
and vcUserLogin <> "FacDef":U
then do:
    <M-9 run SetMessage
          (input  #T-11'You are not allowed to create factory defaults.':100(436)t-11# (icMessage), 
           input  '' (icArguments), 
           input  '' (icFieldName), 
           input  '' (icFieldValue), 
           input  'E':U (icType), 
           input  3 (iiSeverity), 
           input  '' (icRowid), 
           input  'BLF-211':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
    assign oiReturnStatus = -1.
    return.
end.

<Q-1 run StoredSearchPrim (all)  (Read)  (NoCache)  (input 0, (StoredSearchID) 
                           input icStoredSearchName, (Name) 
                           input icLookupReference, (LookupReference) 
                           input 0, (UsrId) 
                           input 0, (CompanyId)
                           output dataset tqStoredSearchPrim) in BStoredSearch >

if vcUserLogin <> "facdef"
and can-find (first tqStoredSearchPrim where
                    tqStoredSearchPrim.tiUsr_ID = 0 and
                    tqStoredSearchPrim.tcLastModifiedUser <> vcUserLogin)
then do:
    <M-13 run SetMessage (input  #T-13'This stored search was created by another user.':100(6582)T-13# (icMessage), 
                      input  '' (icArguments), 
                      input  'tStoredSearch.StoredSearchName':U (icFieldName), 
                      input  icStoredSearchName (icFieldValue), 
                      input  'E':U (icType), 
                      input  3 (iiSeverity), 
                      input  '' (icRowid), 
                      input  'BLF-212':U (icFcMsgNumber), 
                      input  '' (icFcExplanation), 
                      input  '' (icFcIdentification), 
                      input  '' (icFcContext), 
                      output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
    assign oiReturnStatus = -1.
    return.
end.

if (iiAccessLevel <> {&CONTROLPROPERTYLAYERTYPE-USER} and
    can-find (first tqStoredSearchPrim where
                    tqStoredSearchPrim.tiUsr_ID <> viUsrId and
                    tqStoredSearchPrim.tiUsr_ID <> 0))
or  can-find (first tqStoredSearchPrim where
                    tqStoredSearchPrim.tiRole_ID <> iiCurrentRoleID and
                    tqStoredSearchPrim.tiRole_ID <> 0)
then do:
    <M-8 run SetMessage
          (input  #T-12'A stored search already exists with this name.':100(437)t-12# (icMessage), 
           input  '' (icArguments), 
           input  'tStoredSearch.StoredSearchName':U (icFieldName), 
           input  icStoredSearchName (icFieldValue), 
           input  'E':U (icType), 
           input  3 (iiSeverity), 
           input  '' (icRowid), 
           input  'BLF-210':U (icFcMsgNumber), 
           input  '' (icFcExplanation), 
           input  '' (icFcIdentification), 
           input  '' (icFcContext), 
           output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
    assign oiReturnStatus = -1.
    return.
end.

find first tqStoredSearchPrim where
    (tqStoredSearchPrim.tiUsr_ID = viUsrId or
     tqStoredSearchPrim.tiUsr_ID = 0) no-error.
if available tqStoredSearchPrim
then do:
    <M-2 run DataLoad (input  '' (icRowids), 
                   input  string (tqStoredSearchPrim.tiStoredSearch_ID) (icPkeys), 
                   input  '' (icObjectIds), 
                   input  '' (icFreeform), 
                   input  no (ilKeepPrevious), 
                   output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
    if viFcReturnSuper <> 0
    then oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper < 0
    then return.

    find first tStoredSearch where
               tStoredSearch.StoredSearchName = icStoredSearchName no-error.
    if not available tStoredSearch
    then return.
    
    assign tStoredSearch.tc_Status = "C":U.
    
    for each tSSearchFilterField:
        assign tSSearchFilterField.tc_Status = "D":U.
    end.
    
    for each tSSearchResultField:
        assign tSSearchResultField.tc_Status = "D":U.
    end.
end.
else do:
    <M-3 run DataNew (output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
    if viFcReturnSuper <> 0
    then oiReturnStatus = viFcReturnSuper.
    if viFcReturnSuper < 0
    then return.
end.

assign tStoredSearch.StoredSearchFilterMinimize = ilFilterPanelsMinimized
       tStoredSearch.StoredSearchFreezeFirstCol  = ilFreezeFirstColumn
       tStoredSearch.StoredSearchUseGridLayout   = ilUseGridLayout
       tStoredSearch.StoredSearchLookupRef = icLookupReference
       tStoredSearch.StoredSearchName            = icStoredSearchName
       tStoredSearch.StoredSearchRowsToRetrieve  = iiRowsToRetrieve
       tStoredSearch.StoredSearchSortColumn      = icSortColumn
       tStoredSearch.StoredSearchLayoutXML       = icLayoutXML
       tStoredSearch.StoredSearchAutoApply       = ilAutoApplyFilter
       tStoredSearch.Company_ID                  = (if ilCompanyDependent then viCompanyId else 0)

       tStoredSearch.Usr_ID                      = (if iiAccessLevel = {&CONTROLPROPERTYLAYERTYPE-USER}
                                                    then viUsrId
                                                    else 0)
       tStoredSearch.Role_ID                     = (if iiAccessLevel = {&CONTROLPROPERTYLAYERTYPE-ROLE}
                                                    then iiCurrentRoleID
                                                    else 0).

assign viFFCount = 0.
for each tFilterFields break by tFilterFields.tcBusinessFieldName:

    assign viFFCount = viFFCount + 1.
    if last-of(tFilterFields.tcBusinessFieldName)
    then do:
        for each tSSearchFilterField where
                 tSSearchFilterField.SSearchFilterFieldBusField = tFilterFields.tcBusinessFieldName:
            accumulate tSSearchFilterField.SSearchFilterFieldBusField (count).
        end.
        if viFFCount = 1 and (accum count tSSearchFilterField.SSearchFilterFieldBusField) <= 1
        then do:
            /* If there is only one tFilterField record for one filter business field, then
               the corresponding tSSearchFilterField record just can be marked as "Changed", or
               a new one can be created */
            find first tSSearchFilterField where
                       tSSearchFilterField.SSearchFilterFieldBusField = tFilterFields.tcBusinessFieldName no-error.
            if available tSSearchFilterField
            then assign tSSearchFilterField.tc_Status = "C":U.
            else do:
                <M-4 run AddDetailLine (input  'SSearchFilterField':U (icTable), 
                                input  tStoredSearch.tc_Rowid (icParentRowid), 
                                output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
                if viFcReturnSuper <> 0
                then oiReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then return.
            end.
            
            assign tSSearchFilterField.SSearchFilterFieldBusField  = tFilterFields.tcBusinessFieldName
                   tSSearchFilterField.SSearchFilterFieldIniVal1   = tFilterFields.tcInitialValue
                   tSSearchFilterField.SSearchFilterFieldIniVal2   = tFilterFields.tcSecondInitialValue
                   tSSearchFilterField.SSearchFilterFieldIsRange   = tFilterFields.tlIsRange
                   tSSearchFilterField.SSearchFilterFieldOperator  = tFilterFields.tcOperator
                   tSSearchFilterField.SSearchFilterFieldIsVisibl  = tFilterFields.tlIsVisible
                   tSSearchFilterField.SSearchFilterFieldSequence  = tFilterFields.tiSequence.
        end.
        else do:
            /* If there are more than one tFilterField record for one filter business field, then
               the corresponding tSSearchFilterField records are put to "D" and new
               records are created  */
            for each tSSearchFilterField where
                     tSSearchFilterField.SSearchFilterFieldBusField = tFilterFields.tcBusinessFieldName:
                assign tSSearchFilterField.tc_Status = "D":U.
            end.
            for each bFilterFields where 
                     bFilterFields.tcBusinessFieldName = tFilterFields.tcBusinessFieldName :
                <M-15 run AddDetailLine (input  'SSearchFilterField':U (icTable), 
                                input  tStoredSearch.tc_Rowid (icParentRowid), 
                                output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
                if viFcReturnSuper <> 0
                then oiReturnStatus = viFcReturnSuper.
                if viFcReturnSuper < 0
                then return.
                assign tSSearchFilterField.SSearchFilterFieldBusField  = bFilterFields.tcBusinessFieldName
                       tSSearchFilterField.SSearchFilterFieldIniVal1   = bFilterFields.tcInitialValue
                       tSSearchFilterField.SSearchFilterFieldIniVal2   = bFilterFields.tcSecondInitialValue
                       tSSearchFilterField.SSearchFilterFieldIsRange   = bFilterFields.tlIsRange
                       tSSearchFilterField.SSearchFilterFieldOperator  = bFilterFields.tcOperator
                       tSSearchFilterField.SSearchFilterFieldIsVisibl  = bFilterFields.tlIsVisible
                       tSSearchFilterField.SSearchFilterFieldSequence  = bFilterFields.tiSequence.

            end.
        end.
        assign viFFCount = 0.
    end.
end.

for each tResultFields:

    find first tSSearchResultField where
               tSSearchResultField.SSearchResultFieldBusField = tResultFields.tcBusinessFieldName no-error.
    if available tSSearchResultField
    then assign tSSearchResultField.tc_Status = "C":U.
    else do:
        <M-5 run AddDetailLine (input  'SSearchResultField':U (icTable), 
                        input  tStoredSearch.tc_Rowid (icParentRowid), 
                        output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
        if viFcReturnSuper <> 0
        then oiReturnStatus = viFcReturnSuper.
        if viFcReturnSuper < 0
        then return.
    end.
    
    assign tSSearchResultField.SSearchResultFieldBusField  = tResultFields.tcBusinessFieldName
           tSSearchResultField.SSearchResultFieldColSize   = tResultFields.tiColumnSize
           tSSearchResultField.SSearchResultFieldIsVisibl = tResultFields.tlIsVisible
           tSSearchResultField.SSearchResultFieldAggregat = tResultFields.tcAggregate
           tSSearchResultField.SSearchResultFieldGroupSeq  = tResultFields.tiGroupSeq
           tSSearchResultField.SSearchResultFieldSequence  = tResultFields.tiSequence
           tSSearchResultField.SSearchResultFieldCBF = tResultFields.tcCBF.
end.

<M-6 run ValidateBC (output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

<M-14 run AdditionalUpdates (output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

<M-7 run DataSave (output viFcReturnSuper (oiReturnStatus)) in BStoredSearch>
if viFcReturnSuper <> 0
then oiReturnStatus = viFcReturnSuper.
if viFcReturnSuper < 0
then return.

if oiReturnStatus = -98
then oiReturnStatus = 0.


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 = "BStoredSearch".
create ttContext.
assign ttContext.propertyName = "methodName"
       ttContext.propertyValue = "apiSaveStoredSearch".
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 = "".

/* Create input dataset */
create dataset vhInputDS.
vhInputDS:read-xmlschema("file", "xml/bstoredsearch.apisavestoredsearch.i.xsd", ?).
vhParameter = vhInputDS:get-buffer-handle("tParameterI").
vhParameter:buffer-create().
assign vhParameter::iiCurrentRoleID = <parameter value>
       vhParameter::icStoredSearchName = <parameter value>
       vhParameter::icLookupReference = <parameter value>
       vhParameter::iiRowsToRetrieve = <parameter value>
       vhParameter::icSortColumn = <parameter value>
       vhParameter::ilFilterPanelsMinimized = <parameter value>
       vhParameter::ilFreezeFirstColumn = <parameter value>
       vhParameter::ilUseGridLayout = <parameter value>
       vhParameter::ilCompanyDependent = <parameter value>
       vhParameter::ilAutoApplyFilter = <parameter value>
       vhParameter::iiAccessLevel = <parameter value>
       vhParameter::icLayoutXML = <parameter value>.

vhParameter = vhInputDS:get-buffer-handle("tFilterFields").
vhParameter:buffer-create().
assign vhParameter::<field-name-1> = <field-value-1>
       vhParameter::<field-name-2> = <field-value-2>
       ...

vhParameter = vhInputDS:get-buffer-handle("tResultFields").
vhParameter:buffer-create().
assign vhParameter::<field-name-1> = <field-value-1>
       vhParameter::<field-name-2> = <field-value-2>
       ...

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