Цитата:
Сообщение от
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. Этот способ не участвовал в "коллективном эксперименте" по причине моей лени, но я всё тешу себя мыслью, что он там тоже появится.
Так уж получилось, что у меня сегодня был под рукой этот "рояль в кустах". Думаю, все так или иначе проходят через получение и изучение подобной информации о таблицах и полях.