AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.03.2011, 18:19   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как реализован пункт меню "Экспорт в Excel" ax2009
Собственно, сабж. Есть ли возможность посмотреть реализацию кода пункта меню: Файл \ "Экспорт в Excel" в формах ax2009 или весь этот код зашит в ядре?
Старый 23.03.2011, 18:21   #2  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Сначала ядром с помощью класса SysGridToExcelStatusInterop происходит формирование списка того, что должно быть выгружено согласно отображению на гриде. Затем сформированные данные помещаются в буфер обмена (при этом бекапится то, что в нем было до этого). Далее класс SysGridExportToExcel выгружает данные в Эксель, а ядро Аксапты восстанавливает исходное содержимое в буфере обмена.
За это сообщение автора поблагодарили: Владимир Максимов (1).
Старый 23.03.2011, 18:34   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Спасибо. Что-то я сам не нашел...
Старый 23.03.2011, 22:07   #4  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
К сожалению, и в этом штатном функционале не обошлось без кривизны: клинт падает при попытке выгрузки большого объема данных (либо много строк, либо много полей).

Я бы подумал про выгрузку через ADO.
Старый 25.03.2011, 10:31   #5  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
через ADO это примерно как?
у меня вот как раз с этим и возникают проблемы. После формирования ADOrecordset и запись его на форму в виде pivottable стандартная выгрузка в ексель отваливается. Причем уже в самом екселе, пишет ошибку в логе:

Ошибка XML в "Сводная таблица"
Причина: Пропущен тег
Действие: Прерывание текущей группы XML
Файл: C:\Users\fNovikov\AppData\Local\Temp\PivotTable31565_cachedata.xml
Группа: PivotCache
Тег: row

с чем это может быть связанно?
Старый 25.03.2011, 10:42   #6  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Вы предлагаете участникам форума догадаться как конкретно вы реализовали выгрузку "ADOrecordset и запись его на форму в виде pivottable"?
__________________
Ivanhoe as is..
Старый 25.03.2011, 11:35   #7  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
просто думал что проблема не в самом рекордсете а в той памяти которую он занимает.

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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от refined Посмотреть сообщение
через ADO это примерно как?
...
Примерно так:
X++:
recordset.MoveFirst();
excelDoc.copyFromRecordSet(recordset.recordSet(), 'A2:A2');
excelDoc.visible(true);
, где copyFromRecordSet:
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  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
Стандартный вывод то можно настроить, тем более просто значения, а не сводную таблицу.
А вот как сводную экспортировать после сбора ее на форме через adorecordset, делается проблемой.
Так что думаю мой вопрос всё еще открыт.
Теги
ax2009, экспорт в excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
не работает "открыть использованный пункт меню" propeller DAX: Программирование 4 14.01.2010 14:59
"Классическое" главное меню в 4.0... glibs DAX: База знаний и проекты 3 11.04.2007 09:58
Проект "Движок отчётов с поддержкой Excel" Alks DAX: База знаний и проекты 6 07.01.2005 02:53
Экспорт в Excel - поле формата "Дата" Ned DAX: Программирование 15 25.04.2003 10:01
Работа с главным меню в Axapta Alexey DAX: Программирование 0 04.01.2002 23:31

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:58.