Отчёты в Excel
Добрый день!
Имеется Аксапта 2.5, необходимо отчёты по основным средствам вывести в Excel.
Я перекрываю метод main класса RAssetStandardReportDialog следующим образом (пример приведён для отчёта RassetListing):
<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]private[/color] [color=:blue]static[/color] [color=:blue]void[/color] main(Args _args)
{
…
;
reportDialog.setReportName(_args.parm());
[color=:blue]if[/color] (reportDialog.prompt())
{
dlg = reportDialog.progressDlg(); [color=:green]// Create process dialog
[/color]
excel = [color=:blue]new[/color] ComExcelDocument_RU();
excel.newFile([color=:red]"d:\\template.xlt"[/color], [color=:blue]false[/color]);
excel.InsertValue(ComExcelDocument_RU::numToNameCell(1, 1),
reportDialog.assetStandard()
);
qr = reportDialog.queryRun();
[color=:blue]if[/color] (qr.prompt())
{
[color=:blue]while[/color] (qr.[color=:blue]next[/color]())
{
rassetTable = qr.GetNo(1);
[color=:green]// вручную получаю значения, которые рассчитываются в отчёте
[/color] rassetSumTrans = RAssetSumCalc_Trans::newAssetPeriod
(rassetTable.AccountNum, reportDialog.assetStandard());
AssetGroup = RAssetStandards::find(rAssetTable.AccountNum,
reportDialog.assetStandard()).AssetGroup;
currencyCode = RAssetStandards::find(rAssetTable.AccountNum,
reportDialog.assetStandard()).currencyCode;
[color=:green]// вывожу информацию по строке в Excel
[/color] excel.InsertValue(ComExcelDocument_RU::numToNameCell(1, i + 2),
rassetTable.AssetGroup);
…
excel.InsertValue(ComExcelDocument_RU::numToNameCell(7, i + 2),
num2str(rassetSumTrans.netBookValue(), 10, 2, 1, 3));
i++;
dlg.incCount(); [color=:green]// Force progress bar to its end
[/color] }
}
excel.Visible([color=:blue]true[/color]);
excel.finalize();
}
}</div>
Всё работает… но остаётся ощущение неправильности и нарушения идеологии.
Возникает ряд вопросов:
1) Существуют ли другие, более элегантные способы получения желаемых отчётов в Excel’е?
2) У отчёта RassetListing есть методы assetStandard, assetGroup (RassetListing->Designs->AutoDesignSpecs->RassetTable_1), assetNetBookValue и пр. Я пока не нашёл способа добраться до них, в связи с чем мне приходится их рассчитывать в методе main класса-потомка от RAssetStandardReportDialog. Каким образом их можно брать напрямую из отчёта?
3) Полный путь к шаблону я указываю явно (excel.newFile("d:\\template.xlt", false)), это пойдёт только на этапе тестирования. Существует ли функция, возвращающая абсолютный путь к Application\Share\Include? В принципе, труда не составит написать таблицу и форму, подобную CustParameters и задавать путь там – но такой способ решения этого вопроса неоправданно сложен.
--
С уважением,
Павел Протасов.
|