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
iiCurrentRoleID | input | integer | |
icStoredSearchName | input | character | name |
icLookupReference | input | character | LookupReference |
iiRowsToRetrieve | input | integer | RowsToRetrieve |
icSortColumn | input | character | SortColumn |
ilFilterPanelsMinimized | input | logical | FilterPanelsMinimized |
ilFreezeFirstColumn | input | logical | FreezeFirstColumn |
ilUseGridLayout | input | logical | use grid lay-out |
ilCompanyDependent | input | logical | |
ilAutoApplyFilter | input | logical | |
iiAccessLevel | input | integer | |
icLayoutXML | input | character | grid lay-out in XML format |
tFilterFields | input | temp-table | Filter fields |
tResultFields | input | temp-table | Result fields |
oiReturnStatus | output | integer | Return 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.