|  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, делается проблемой. Так что думаю мой вопрос всё еще открыт. | 
|  |