For one project I needed to create standard runnable class which calls SSRS report in a while loop. The question was how to work with the printer/destination settings.
Solution:
1. Create your runnable class "YourController" from which you will control calls of your report "YourReport".
2. Create your printer setup class "YourPrinterSetup".
class YourPrinterSetup extends RunBase
{
Map mapPrinterSettings;
YourController baseClass;
Args args;
#define.CurrentVersion(1)
#localmacro.CurrentList
mapPrinterSettings
#endmacro
}
void new(Args _args)
{
;
mapPrinterSettings = new Map(Types::Enum, Types::Container);
Args = _args;
}
public container pack()
{
return [#CurrentVersion, [#CurrentList, mapPrinterSettings.pack()]];
}
public boolean unpack(container _packedClass)
{
Version version;
container packedPrinterSettings, packedOutPaymRecordList, packedValues;
version = RunBase::getVersion(_packedClass);
switch (version)
{
case(#CurrentVersion) :
[version, packedValues] = _packedClass;
[#currentList, packedPrinterSettings] = packedValues;
break;
default :
return false;
}
if (packedPrinterSettings)
{
// Recreate the object from the packed values.
mapPrinterSettings = Map::create(packedPrinterSettings);
}
else
{
mapPrinterSettings = new Map(Types::Enum, Types::Container);
}
return true;
}
static void main(Args _args)
{
YourPrinterSetup printSetup = new YourPrinterSetup(_args);
printSetup.run();
}
updatePrinterSettings is used to store chosen settings.
public void updatePrinterSettings(container _printerSettings)
{
mapPrinterSettings.insert("1", _printerSettings);
baseClass.setPrinterSettings(_printerSettings);
}
In run method the standard SRSPrintDestinationSettings class is called.
void run()
{
SrsPrintDestinationSettings printSettings;
FormRun printSettingForm;
boolean ok = true;
Object caller = args.caller();
baseClass = caller.runbase();
printSettings = new SrsPrintDestinationSettings();
printSettings.unpack(this.getPrinterSettings());
printSettings.fromPage(1);
printSettings.toPage(99999999);
args.caller(printSettings);
args.name(formstr(SRSPrintDestinationSettingsForm));
printSettingForm = classfactory.formRunClass(args);
printSettingForm.init();
printSettingForm.run();
printSettingForm.wait(true);
ok = printSettingForm.closedOk();
if (ok)
{
this.updatePrinterSettings(printSettings.pack());
}
}
3. Create Menu item "YourPrinterSetupMenuItem" of type Action. Object type Class, Object "YourPrinterSetup" class.
4. Add "YourPrinterSetupMenuItem" to the dialog of your "YourController" class. Something like this:
dialog.addMenuItemButton(MenuItemType::Action, "YourPrinterSetup", DialogMenuItemGroup::CurrentGrp);
5. Don't forget to implement setPrinterSettings method to your "YourController" class. It is used to pass chosen printer settings to "YourController".
public void setPrinterSettings(container _settings)
{
printerSettings = _settings;
printDestinationSettings = new SRSPrintDestinationSettings();
if (conlen(printerSettings) > 0)
{
printDestinationSettings.unpack(printerSettings);
dialogReportDestination.value(strFmt("%1", printDestinationSettings.printMediumType()));
}
}
6. Pass printer settings to your "YourReport". Use it in that place where you call the report. See example below.
public class YourController extends RunBaseBatch
{
container printerSettings;
}
public void run()
{
SrsReportRunController srsReportRunCont;
SRSPrintDestinationSettings printDestinationSettings;
printDestinationSettings = new SRSPrintDestinationSettings();
if (conlen(printerSettings) > 0)
{
printDestinationSettings.unpack(printerSettings);
}
srsReportRunCont = new SrsReportRunController();
srsReportRunCont.parmReportName('YourReport.Report');
srsReportRunCont.parmReportContract().parmPrintSettings(printDestinationSettings);
}
Hope it will help someone.
Mind that you can modify SrsPrintDestinationSettingsForm to enable/disable possibilities.
No comments:
Post a Comment