23.03.2011, 18:19 | #1 |
Участник
|
Как реализован пункт меню "Экспорт в Excel" ax2009
Собственно, сабж. Есть ли возможность посмотреть реализацию кода пункта меню: Файл \ "Экспорт в Excel" в формах ax2009 или весь этот код зашит в ядре?
|
|
23.03.2011, 18:21 | #2 |
Axapta
|
Сначала ядром с помощью класса SysGridToExcelStatusInterop происходит формирование списка того, что должно быть выгружено согласно отображению на гриде. Затем сформированные данные помещаются в буфер обмена (при этом бекапится то, что в нем было до этого). Далее класс SysGridExportToExcel выгружает данные в Эксель, а ядро Аксапты восстанавливает исходное содержимое в буфере обмена.
|
|
|
За это сообщение автора поблагодарили: Владимир Максимов (1). |
23.03.2011, 18:34 | #3 |
Участник
|
Спасибо. Что-то я сам не нашел...
|
|
23.03.2011, 22:07 | #4 |
Боец
|
К сожалению, и в этом штатном функционале не обошлось без кривизны: клинт падает при попытке выгрузки большого объема данных (либо много строк, либо много полей).
Я бы подумал про выгрузку через ADO. |
|
25.03.2011, 10:31 | #5 |
Участник
|
через ADO это примерно как?
у меня вот как раз с этим и возникают проблемы. После формирования ADOrecordset и запись его на форму в виде pivottable стандартная выгрузка в ексель отваливается. Причем уже в самом екселе, пишет ошибку в логе: Ошибка XML в "Сводная таблица" Причина: Пропущен тег Действие: Прерывание текущей группы XML Файл: C:\Users\fNovikov\AppData\Local\Temp\PivotTable31565_cachedata.xml Группа: PivotCache Тег: row с чем это может быть связанно? |
|
25.03.2011, 10:42 | #6 |
Участник
|
Вы предлагаете участникам форума догадаться как конкретно вы реализовали выгрузку "ADOrecordset и запись его на форму в виде pivottable"?
__________________
Ivanhoe as is.. |
|
25.03.2011, 11:35 | #7 |
Участник
|
просто думал что проблема не в самом рекордсете а в той памяти которую он занимает.
AdoRecordset собрал из таблиц: X++: ADOfields = ADORecordset.Fields(); ADOfields.Append(#RContractCode , #adVarChar, 20); ADOfields.Append(#RContractAccount , #adVarChar, 20); ADOfields.Append(#Dimension1 , #adVarChar, 64); ADOfields.Append(#Dimension2 , #adVarChar, 64); ADOfields.Append(#BudgetAmount , #adDouble); while(qr.next()) { custTrans = qr.get(tableNum(CustTrans)); ADORecordset.AddNew(); ADOfield = ADOfields.Item(#RContractCode); ADOfield.Value(COMVariant::createFromStr(CustTrans.AccountNum));//+RContractTypes::find(rContractPartnerType::Cust)); ADOfield = ADOfields.Item(#RContractAccount); ADOfield.Value(COMVariant::createFromStr(CustTrans.RContractAccount)); ADOfield = ADOfields.Item(#Dimension1); ADOfield.Value(COMVariant::createFromStr(CustTrans.Dimension[1]+' '+dimensions::find(SysDimension::Department, CustTrans.Dimension[1]).Description)); ADOfield = ADOfields.Item(#Dimension2); ADOfield.Value(COMVariant::createFromStr(CustTrans.Dimension[2]+' '+dimensions::find(SysDimension::Center, CustTrans.Dimension[2]).Description)); ADOfield = ADOfields.Item(#BudgetAmount); ADOfield.Value(COMVariant::createFromReal(CustTrans.AmountMST)); ADORecordset.Update();} X++: PivotTable = grpPivotTableHolder.addControl(formControlType::ActiveX, "PivotTable"); PivotTable.className(xPivotTableManager::getClassId(xPivotTableVersion::OfficePivotTable11)); PivotTable.DataSource(reportEngine.ADORecordset()); ptConstants = pivotTable.Constants(); pivotTableView = pivotTable.ActiveView(); avFieldSets = pivotTableView.FieldSets(); COM::createFromObject(pivotTable.ActiveData()).HideDetails(); COM::createFromObject(pivotTableView.TitleBar()).Visible(false); this.processFieldSet(pivotTableView.RowAxis(), #Dimension1); this.processFieldSet(pivotTableView.RowAxis(), #Dimension2); this.processFieldSet(pivotTableView.DataAxis(), #BudgetAmount); pivotTotal = pivotTableView.AddTotal("Сумма", pivotField, ptConstants.plFunctionSum()); COM::createFromObject(pivotTableView.DataAxis()).InsertTotal(pivotTotal); |
|
25.03.2011, 12:34 | #8 |
Боец
|
Примерно так:
X++: recordset.MoveFirst(); excelDoc.copyFromRecordSet(recordset.recordSet(), 'A2:A2'); excelDoc.visible(true); X++: void copyFromRecordSet(COM _rs, MSOfficeBookMark_RU _bookMark, int _workSheet = 1) { COM comRange; ; comRange = this.findRange(_bookMark, _worksheet); if(comRange) comRange.CopyFromRecordset(_rs); } - подумать как красиво затолкнтуть в recordset весь грид. - форматирование листа экселя как в стандарте. Честно говоря, я детально не продумывал это. Возможно, появятся нюансы. Но идея в общем такая. Основной момент - то , что в recordset можно пропихнуть в разы больший объем, а вот через clipboard клиент валится, что очень всех огорчило. А может лечится как-то, кто знает? |
|
|
За это сообщение автора поблагодарили: Kabardian (4). |
25.03.2011, 14:44 | #9 |
Участник
|
Стандартный вывод то можно настроить, тем более просто значения, а не сводную таблицу.
А вот как сводную экспортировать после сбора ее на форме через adorecordset, делается проблемой. Так что думаю мой вопрос всё еще открыт. |
|