Let's say we want to run our report from the previous post not from a Reports menu but directly from the Sales order form. We will use MultiSelectionHelper and its magic method createQueryRanges for this goal.
First of all we need to allow multiple selection for the menu item and place it as a button on the form.
Also we need to slightly change the report controller, so that it could receive the selected records and add an appropriate range to the query before execution.
public static void main(Args _args) { ItemSalesPriceAndBarcodeController controller = new ItemSalesPriceAndBarcodeController(); controller.parmReportName(ssrsReportStr(SalesPriceAndBarcodeReport, Report)); controller.parmArgs(_args); controller.parmShowDialog(true); // if it comes from the form, do not load the saved value if (_args && _args.dataset() == (tablenum(SalesTable))) { controller.parmLoadFromSysLastValue(false); } controller.startOperation(); } /// <summary> /// Executes before the report prompts and calls the method to set the ranges to the query. /// </summary> public void prePromptModifyContract() { this.setRanges(this.getFirstQuery()); } /// <summary> /// Sets the report query ranges based on the caller. /// </summary> /// <param name="_query"> /// The hold the <c>Query</c> object of the report. /// </param> public void setRanges(Query _query) { QueryBuildDataSource qbds; QueryBuildRange qbr; SalesTable salesTable; FormDataSource salesTable_ds; FormRun caller; MultiSelectionHelper helper; if (this.parmArgs() && this.parmArgs().dataset() == (tablenum(salesTable))) { salesTable = this.parmArgs().record(); salesTable_ds = salesTable.dataSource(); caller = this.parmArgs().caller(); //This method will help to get only the marked records from the Grid helper = MultiSelectionHelper::createFromCaller(caller); qbds = _query.dataSourceTable(tablenum(salesTable)); //Create the Query to filter using itemId helper.createQueryRanges(qbds, fieldStr(salesTable, SalesId)); } else { qbds = _query.dataSourceTable(tablenum(salesTable)); qbr = qbds.addRange(fieldNum(salesTable, SalesId)); } }
If user selected certain orders to print from the form, we do not need to restore previously saved parameters.
Feel free to download the full project here.
Feel free to download the full project here.
No comments:
Post a Comment