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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.03.2007, 11:13   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Сводная таблица из Axapta
Dynamics AX 3.0 SP3 (1951.3730) RUS, Office 2003

Понадобилось вывести в Excel сводную таблицу. Поискал по форуму готовый кусок кода, но, к сожалению и удивлению, не нашел ни одного.
Поэтому выкладываю этот самый кусок, возможно кому-то сэкономит время в дальнейшем.

Метод добавил в стандартный русский класс ComExcelDocument_RU, старался комментировать, но ничего сложного, ессно, в нем нет.
X++:
//_bookMark can be in Letter or RC format (A6:C10 or R6C1:R10C3)
//_destBookmark - only in RC format, as far as I can tell
//containers hold the string names of all fields - should match those used in the worksheet with actual data
#define.xlDatabase(1)
#define.xlPivotTableVersion10(1)
#define.PivotTableName("PivotTable")
void buildPivotTable(BookMark _sourceBookMark, container _columnFields, container _rowFields, container _dataFields,
                    int _sourceWorkSheet = 1, BookMark _destBookMark = "", int _destWorkSheet = 1)
{
    COM         comWorkBook, comWorkSheet;
    COM         comPivotCaches, comPviotCache;
    COM         comPivotTable, comPivotField;
    COM         comCommandBars, comCommandBar;
    int         iPivotField;
    BookMark    destBookMark;
    ;

    comWorkBook = m_comApplication.activeWorkBook();
    comWorkSheet = this.getWorkSheet(_sourceWorkSheet);

    comPivotCaches = comWorkBook.PivotCaches();
    //xlDatabase means data is in the active workbook
    comPviotCache = comPivotCaches.Add(#xlDatabase, strFmt("%1!%2", comWorkSheet.name(), _sourceBookMark));
    //CreatePivotTable(str Destination (ex. [Книга1].Лист2!R3A1), str Data location, int pivotTableVersion)
    //Empty String as destination means a new WorkSheet will be created
    if (_destBookMark)
    {
        comWorkSheet = this.getWorkSheet(_destWorkSheet);
        destBookMark = strFmt("%1!%2", comWorkSheet.name(), _destBookMark);
    }
    comPivotTable = comPviotCache.CreatePivotTable(destBookMark, strFmt("%1%2", #PivotTableName, _sourceWorkSheet), #xlPivotTableVersion10);

    for (iPivotField = 1; iPivotField <= conlen(_columnFields); iPivotField++)
    {
        comPivotField = comPivotTable.PivotFields(conPeek(_columnFields, iPivotField));
        comPivotField.Orientation(2); //xlColumnField
        comPivotField.Position(iPivotField);
    }
    for (iPivotField = 1; iPivotField <= conlen(_rowFields); iPivotField++)
    {
        comPivotField = comPivotTable.PivotFields(conPeek(_rowFields, iPivotField));
        comPivotField.Orientation(1); //xlRowField
        comPivotField.Position(iPivotField);
    }

    for (iPivotField = 1; iPivotField <= conLen(_dataFields); iPivotField++)
    {
        //AddDataField(PivotField object [, shown name, type of aggregate function ])
        //xlSum = -4157 is default
        comPivotTable.AddDataField(comPivotTable.PivotFields(conPeek(_dataFields, iPivotField)));
    }
    //Hide the PivotTable FieldList
    comWorkBook.ShowPivotTableFieldList(false);

    //Hide the PivotTable CommandBar
    comCommandBars = m_comApplication.CommandBars();
    comCommandBar = comCommandBars.item(#PivotTableName);
    comCommandBar.visible(false);
}
Пример использования:
X++:
static void tutorial_BuildPivotTable(Args _args)
{
    ComExcelDocument_RU excel = new ComExcelDocument_RU();
    ;
    
    excel.newFile();
    excel.insertValue("A1", "Family Name");
    excel.insertValue("B1", "First Name");
    excel.insertValue("C1", "Spendings");
    excel.insertValue("D1", "Earnings");

    excel.insertValue("A2", "Kashperuk");
    excel.insertValue("B2", "Ivan");
    excel.insertValue("C2", 1000);
    excel.insertValue("D2", 1800);

    excel.insertValue("A3", "Zhdanova");
    excel.insertValue("B3", "Valeriia");
    excel.insertValue("C3", 3010);
    excel.insertValue("D3", 3000);

    excel.insertValue("A4", "Kashperuk");
    excel.insertValue("B4", "Tanya");
    excel.insertValue("C4", 4050);
    excel.insertValue("D4", 550);

    excel.buildPivotTable("A1:D4", ["Family Name"], ["First Name"], ["Spendings", "Earnings"]);

    excel.visible(true);
}
За это сообщение автора поблагодарили: LEX (1), MikeR (1).
Старый 15.03.2007, 13:28   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
...к сожалению и удивлению, не нашел ни одного...
Это, вероятно, потому, что люди, пользующие сводную таблицу, обычно умеют ее строить самостоятельно.
А людей, не умеющих пользовать сводную таблицу, не сильно спасет тот факт, что сводная таблица "явится" к ним из самой(!) Аксапты
Старый 15.03.2007, 13:40   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Gustav Посмотреть сообщение
Это, вероятно, потому, что люди, пользующие сводную таблицу, обычно умеют ее строить самостоятельно.
А людей, не умеющих пользовать сводную таблицу, не сильно спасет тот факт, что сводная таблица "явится" к ним из самой(!) Аксапты

Да, хорошее предположение.
Наши пользователи, получается, как всегда отличились.
Старый 15.03.2007, 15:24   #4  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от kashperuk Посмотреть сообщение

Да, хорошее предположение.
Наши пользователи, получается, как всегда отличились.
Есть еще краше предположение: выгрузить в сводную таблицу "сырые" данные, т.е. без формирования строк в excel можно, но как объяснить пользователю, что при попытке сильно развернуть данные (с уходом за 65 тысяч), Excel его посылает за тридевять земель
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 15.03.2007, 16:53   #5  
longson is offline
longson
Участник
 
231 / 49 (2) +++
Регистрация: 12.12.2006
Адрес: Москва
А почему не использовать стандартное средство в самой Axapta ? Сначала пусть Axapta обрабатывает куб, после этого можно выгрузить полученную таблицу в Excel (есть такая кнопка на форме вывода)
Старый 20.03.2007, 09:06   #6  
Def is offline
Def
Участник
 
50 / 32 (2) +++
Регистрация: 28.09.2005
Есть еще один простой вариант
Создаете форму кладете туда ActiveX OWC11 к примеру
при определнных условиях задаете объекту CommandText и ConnectionString
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Excel, сводная таблица, проблемы с pivotItem bagyr DAX: Программирование 2 16.05.2007 09:27
Сводная таблица xconsul DAX: Функционал 10 31.01.2007 15:26
Copyof Сводная таблица xconsul DAX: Программирование 0 19.05.2004 13:49
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:44.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.