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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из 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, время: 02:52.