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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.09.2006, 16:20   #1  
demon46 is offline
demon46
Участник
 
78 / 12 (1) ++
Регистрация: 26.06.2006
Как работать с EXCEL файлами
Доброго времени суток Коллеги!
Помогите пожалуйста в следующем вопросе. Я собираюсь вывести все имеющиеся таблицы и их описание в файл EXCEL. Первую часть я выполнил, а вот со второй никак не могу справиться.
void CreateListTables()
{
Dictionary dictionary = new Dictionary();
DictTable dictTable;
int i;
str NameTab;
for (i=1; i<=dictionary.tableCnt();i++)
{
dictTable = new DictTable(dictionary.tableCnt2Id(i));
NameTab = dictTable.label();
}
}
Огромное спасибо.
Старый 11.09.2006, 16:30   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от demon46 Посмотреть сообщение
Я собираюсь вывести все имеющиеся таблицы и их описание в файл EXCEL
Держите всё сразу
Код:
static void KKu_Job_006_printTablesAndFields2(Args _args)
{
    Dictionary      dictionary      = new Dictionary();
    TableId         refTableId;
    FieldId         refFieldId;
    DictTable       dictTable;
    DictField       dictField;
    DictEnum        dictEnum;
    DictType        dictEDType;
    int             i, j;
    str strDictTableName;
    str strDictTableLabel;
    str strDictTableNameSQL;
 
    COM rstAxa;    // ADO: Recordset
    COM flds, fld; // ADO: Fields, Field
    COM xlApp;            // Excel.Application
    COM wbks, wbk;        // Workbooks, Workbook
    COM wkss, wks;        // Worksheets, Worksheet
    COM rng, cell, rngCR; // все Range
    COM font;             // Range.Font
    COM entCol;           // Range.EntireColumn
    COM actWin;           // Excel.Application.ActiveWindow
    int iMax; //i
 
// ============================================================================
    // СНАЧАЛА ВЛОЖЕННАЯ ФУНКЦИЯ
// ----------------------------------------------------------------------------
    // функция задает тип поля нашего Recordset-а в оперативной памяти
    // в данном демо-джобе используется для наглядности
    // для простоты используем всего 3 типа данных: число, строка и дата
    int adoTypeToExcel(str _type)
    {
        switch (_type)
        {
        // используются значения констант перечисления DateTypeEnum из топика TypeProperty (ADO)
        // (см. справку по ADO в файле ADO210.CHM - можно поискать на своем компе
            case 'num' : return   5; // adDouble
            case 'str' : return   8; // adBSTR
            case 'date': return 133; // adDBDate
        }
        return 8;
    }
// ============================================================================
    // ТЕПЕРЬ ОСНОВНОЙ ПРОЦЕСС
    // Recordset создается в оперативной памяти - без Connection!
    rstAxa = new COM('ADODB.Recordset');
    // формируем структуру нашего Recordset-а в "мозгах"
    flds = rstAxa.Fields();
    flds.Append('TableId'      , adoTypeToExcel('num' ));
    flds.Append('TableName'    , adoTypeToExcel('str' ));
    flds.Append('TableNameSQL' , adoTypeToExcel('str' ));
    flds.Append('TableLabel'   , adoTypeToExcel('str' ));
    flds.Append('FieldId'      , adoTypeToExcel('num' ));
    flds.Append('FieldName'    , adoTypeToExcel('str' ));
    flds.Append('FieldNameSQL' , adoTypeToExcel('str' ));
    flds.Append('FieldLabel'   , adoTypeToExcel('str' ));
    flds.Append('FieldBaseType'   , adoTypeToExcel('num' ));
    flds.Append('FieldBaseTypeTxt', adoTypeToExcel('str' ));
    flds.Append('FieldStringLen'  , adoTypeToExcel('num' ));
    flds.Append('FieldEnumId'  , adoTypeToExcel('num' ));
    flds.Append('FieldEnumName'  , adoTypeToExcel('str' ));
    flds.Append('FieldEnumLabel'  , adoTypeToExcel('str' ));
    flds.Append('FieldEDTypeId'  , adoTypeToExcel('num' ));
    flds.Append('FieldEDTypeName'  , adoTypeToExcel('str' ));
    flds.Append('FieldEDTypeLabel'  , adoTypeToExcel('str' ));
    // и наконец открываем его
    rstAxa.Open();
// ----------------------------------------------------------------------------
    startLengthyOperation();
    for (i=1; i<= dictionary.tableCnt(); i++)
    {
        refTableId   = dictionary.tableCnt2Id(i);
        dictTable = new DictTable(refTableId);
        strDictTableName    = dictTable.name();
        strDictTableNameSQL = dictTable.name(DbBackend::SQL);
        strDictTableLabel   = dictTable.label();
        for (j=1; j<= dictTable.fieldCnt(); j++)
        {
           refFieldId = dictTable.fieldCnt2Id(j);
           dictField = new DictField(refTableId, refFieldId);
        rstAxa.AddNew();
            fld = flds.Item('TableId'      ); fld.Value(refTableId          );
            fld = flds.Item('TableName'    ); fld.Value(strDictTableName    );
            fld = flds.Item('TableNameSQL' ); fld.Value(strDictTableNameSQL );
            fld = flds.Item('TableLabel'   ); fld.Value(strDictTableLabel   );
            fld = flds.Item('FieldId'      ); fld.Value(refFieldId                     );
            fld = flds.Item('FieldName'    ); fld.Value(dictField.name()               );
            fld = flds.Item('FieldNameSQL' ); fld.Value(dictField.name(DbBackend::SQL) );
            fld = flds.Item('FieldLabel'   ); fld.Value(dictField.label()              );
            fld = flds.Item('FieldBaseType'    ); fld.Value(dictField.baseType()             );
            fld = flds.Item('FieldBaseTypeTxt' ); fld.Value(enum2str(dictField.baseType()) );
            fld = flds.Item('FieldStringLen'   ); fld.Value(dictField.stringLen()            );
            fld = flds.Item('FieldEnumId'   ); fld.Value(dictField.enumId()            );
            if (dictField.enumId() != 0)
            {
                dictEnum = new DictEnum(dictField.enumId());
                fld = flds.Item('FieldEnumName'   );  fld.Value(dictEnum.name());
                fld = flds.Item('FieldEnumLabel'  );  fld.Value(dictEnum.label());
            }
            fld = flds.Item('FieldEDTypeId'   ); fld.Value(dictField.typeId());
            if (dictField.typeId() != 0)
            {
                dictEDType = new DictType(dictField.typeId());
                fld = flds.Item('FieldEDTypeName'   );  fld.Value(dictEDType.name());
                fld = flds.Item('FieldEDTypeLabel'  );  fld.Value(dictEDType.label());
            }
        rstAxa.Update();
        }
    }
    // к этому моменту в оперативной памяти сформирована НАША таблица
// ----------------------------------------------------------------------------
    // готовим новую рабочую книгу Excel для приема данных из Axapta:
    xlApp = new COM('Excel.Application');
    wbks = xlApp.Workbooks();
    wbk  = wbks.Add();
    wkss = wbk.Worksheets();
    wks  = wkss.Item(1);
    //wks.Name('AdoTestSheet');
    rng  = wks.Range('A1');
// ----------------------------------------------------------------------------
    // выводим строку имен полей (1-я строка листа Excel)
    flds = rstAxa.Fields();
    iMax = flds.Count() - 1;
    for (i = 0; i <= iMax; i += 1)
    {
        fld = flds.Item(i);
        cell = rng.Offset(0, i);
        cell.Value2(fld.Name());
    }
    rngCR = rng.CurrentRegion();
    font = rngCR.Font();
    font.Bold(true); // делаем выведенные заголовки жирным шрифтом
// ----------------------------------------------------------------------------
    // выводим данные, начиная со 2-й строки листа Excel
    cell = rng.Offset(1, 0);
    cell.CopyFromRecordset(rstAxa);
// ----------------------------------------------------------------------------
    // подгоняем ширину столбцов Excel
    rngCR = rng.CurrentRegion();
    entCol = rngCR.EntireColumn();
    entCol.AutoFit();
    // замораживаем строку заголовков Excel
    cell.Select();
    actWin = xlApp.ActiveWindow();
    actWin.FreezePanes(true);
// ----------------------------------------------------------------------------
    xlApp.Visible(true);
    rstAxa.Close();
}
Время работы - пара минут.

2 demon46:

Для знакомства со способами вывода в Excel, как справедливо замечает ниже Yprit, смотрите тему, которую он указывает. Там масса вариантов экспорта, причем с количественной оценкой скорости. Но там далеко не все способы, которые существуют на Форуме, поэтому воспользуйтесь также функцией поиска.

Способ экспорта, который я привел здесь в джобе, скалькирован по джобу Job_TestADO_2 из темы Поговорим об ADO. Этот способ не участвовал в "коллективном эксперименте" по причине моей лени, но я всё тешу себя мыслью, что он там тоже появится.

Так уж получилось, что у меня сегодня был под рукой этот "рояль в кустах". Думаю, все так или иначе проходят через получение и изучение подобной информации о таблицах и полях.

Последний раз редактировалось Gustav; 11.09.2006 в 18:42.
За это сообщение автора поблагодарили: kashperuk (3), demon46 (1).
Старый 11.09.2006, 16:30   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Посмотрите report - SysTableDefinition - там выгружается все инфа о таблице(цах).

Или вас интересует именно выгрузка в Excel?
если да, то поищите на форуме по этому слову - здесь очень много примеров с использованием различных технологий.
Старый 11.09.2006, 16:31   #5  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
может устроит просто вывод в текстовый файл с tab разделителем?
Например так:
Код:
TextBuffer tb = TextBuffer(); 
;

tb.AppendText(strfmt("%1\t%2\t%3\n", id, Name, Desc));
tb.toFile("c:\\output.txt");
Старый 12.09.2006, 12:44   #6  
demon46 is offline
demon46
Участник
 
78 / 12 (1) ++
Регистрация: 26.06.2006
Громадное спасибо всем. Получилось.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Работа с файлами Excel Arahnid DAX: Программирование 2 02.09.2007 00:06
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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