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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2010, 14:54   #41  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Цитата:
Сообщение от Gustav Посмотреть сообщение
Роман, у меня два вопроса:
  1. Рекордсет создаете с учетом всех колонок, попадающих в область бланка? Т.е. у вас должно быть много фиктивных и немного содержательных - т.е. получается 16 содержательных где-то из 85 всего.
  2. Как вставляете новые строки? Сразу всё необходимое кол-во перед исходной 19-й строкой? Потом дополнительно еще формат этой исходной распространяете на добавленные?
  1. Рекордсет имеет поля под все столбцы, т.е. 16 значемых и 69 "резервных"
  2. Строки добавляются скопом с помощью следующей функции:
    X++:
    protected void insertRows(int _fromRow,
                    int _toRow,
                    int _fromWorkSheet = 1,
                    int _offset        = 1,
                    int _numOfCopies   = 1,
                    int _toWorkSheet   = 1)
    {
        COM         comRows,
                    comWorkSheet,
                    comRow, comRowTarget, selection;
        COMVariant  comRowVariant, selVariant;
        ;
    
        if (! _numOfCopies)
            return;
    
        if (! comDocument)
            throw error(strFmt("@DIS6401", "Excel.Application"));
    
        comRow = this.findRange(strFmt("%1:%2", _fromRow, _toRow));
        comRow.copy();
    
        comRowTarget = this.findRange(strFmt("%1:%2", _toRow+ _offset, _toRow+ _offset + _numOfCopies - 1));
        comRowTarget.select();
        comRowTarget.insert();
    
        comWorkSheet  = this.getWorkSheet(_toWorkSheet);
        comRows = comWorkSheet.cells();
        comRows = COM::createFromVariant(comRows.item(1));
        comRows.select();
        comExcelApplication.cutCopyMode(false);
    }
При копировании строк нарушается формат ячеек. Самое интересное, он нарушается только при копировании с помощью COM, так как написав тоже самое в VBA всё отлично

Последний раз редактировалось Roman N. Krivov; 06.05.2010 в 15:34.
Старый 06.05.2010, 16:17   #42  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Roman N. Krivov Посмотреть сообщение
При копировании строк нарушается формат ячеек. Самое интересное, он нарушается только при копировании с помощью COM, так как написав тоже самое в VBA всё отлично
Имеется в виду, что разъединяются объединенные ячейки? Тоже замечал такую вещь. Это бывает и в самом Excel, когда, например, вручную копируешь 1-ю строку в строки 1:5 - ячейки разваливаются и в копиях, и в оригинале, но если копировать 1-ю в 2:5 (казалось бы, конечное состояние должно быть одинаково при любом из этих способов - ан нет!) , то во всех пяти строках имеем нормальное объединение ячеек, как в оригинальной 1-й строке.

И как боретесь? В коде что-то отрабатывает или вручную? На картинке-то у вас вроде нормальный вид объединенных ячеек...
Старый 06.05.2010, 16:39   #43  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Цитата:
Сообщение от Gustav Посмотреть сообщение
И как боретесь? В коде что-то отрабатывает или вручную? На картинке-то у вас вроде нормальный вид объединенных ячеек...
Всё очень просто: у нас таблица начинается в строк 19, следовательно встаем на эту строку, копируем её ADORecordSet.RecordCount() -1 раз и вставляем данные. Т.е.:
X++:
. . .
    wkss    = comDocument.Worksheets();
    wks     = wkss.Item(cvActiveWks);
    rng     = wks.Range(_bookmark); // _bookmark = "19:19"
    this.insertRows(rng.row(), rng.row() + 1, rstAxa.RecordCount() - 1);
    cell    = rng.Offset(0,0);
    cell.CopyFromRecordset(rstAxa);
. . .
X++:
protected void insertRows(int _fromRow,
                          int _toRow,
                          int _numOfCopies)
{
    COM         comRows,
                comWorkSheet,
                comRow, comRowTarget, selection;
    COMVariant  comRowVariant, selVariant;
    ;

    if (! _numOfCopies)
        return;

    if (! comDocument)
        throw error(strFmt("@DIS6401", "Excel.Application"));

    comRow = this.findRange(strFmt("%1:%2", _fromRow, _fromRow));
    comRow.copy();

    comRowTarget = this.findRange(strFmt("%1:%2", _toRow, _toRow + _numOfCopies - 1));
    comRowTarget.select();
    comRowTarget.insert(/*#xlShiftDown*/);

    comWorkSheet  = this.getWorkSheet(cvActiveWks);
    comRows = comWorkSheet.cells();
    comRows = COM::createFromVariant(comRows.item(1));
    comRows.select();
    comExcelApplication.cutCopyMode(false);
}
При этом сохраняется объединение ячеек. Но вот проблема с форматированием остаётся.
Старый 06.05.2010, 16:47   #44  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Сейчас немного поэкспериментировал
Первый эксперимент
Суть эксперимента
Взял шаблон, добавил в него 32 строки, установил форматы ячеек и убрал из года добавление новый строк. Запустил формирование отчёта для 7строк.

Результат
В ячейках вместо чисел стоит дата, например: 03.09.1903, вместо 1342,56

Второй эксперимент

Суть эксперимента
Запустил формирование отчета без шаблона.

Результат
В ячейках вместо чисел стоит дата, например: 03.09.1903, вместо 1342,56
Изображения
 

Последний раз редактировалось Roman N. Krivov; 06.05.2010 в 16:55.
Старый 06.05.2010, 16:51   #45  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Roman N. Krivov Посмотреть сообщение
X++:
. . .
    rng     = wks.Range(_bookmark); // _bookmark = "19:19"
    this.insertRows(rng.row(), rng.row() + 1, rstAxa.RecordCount() - 1);
    cell    = rng.Offset(0,0);
    cell.CopyFromRecordset(rstAxa);
. . .
Тэк-с! А замените-ка:
X++:
    cell    = rng.Offset(0,0); // сейчас это целая строка 19
 
    cell    = rng.Resize(1,1); // а станет одиночная ячейка A19
Не полегчает ли?
Старый 06.05.2010, 17:01   #46  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Цитата:
Сообщение от Gustav Посмотреть сообщение
Тэк-с! А замените-ка:
X++:
    cell    = rng.Offset(0,0); // сейчас это целая строка 19
 
    cell    = rng.Resize(1,1); // а станет одиночная ячейка A19
Не полегчает ли?


УРА !!!! ЗА-РА-БО-ТА-ЛО !!!!
Старый 06.05.2010, 17:15   #47  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Roman N. Krivov Посмотреть сообщение
УРА !!!! ЗА-РА-БО-ТА-ЛО !!!!
Ох, ну, славно! Хотя по идее должно было работать и с полной строкой 19 (это я так... чисто эвристически делал предположение).

Всё-таки не совсем понятно, почему даже на пустом Excel происходило... Как-то у вас дата, похоже, крепко хваталась со второй колонки и не "отпускалась" до конца строки. Напоминает поведение типа anytype, когда он принимает тип первого присваивания...

А покажите цикл заполнения рекордсета? (на радостях)
Старый 07.05.2010, 09:34   #48  
Roman N. Krivov is offline
Roman N. Krivov
Участник
 
25 / 11 (1) +
Регистрация: 04.05.2010
Адрес: Мир, Россия, Московская область
Цитата:
Сообщение от Gustav Посмотреть сообщение
Ох, ну, славно! Хотя по идее должно было работать и с полной строкой 19 (это я так... чисто эвристически делал предположение).
Я тоже думал что должно работать, однако ж не работает.

Цитата:
Сообщение от Gustav Посмотреть сообщение
Всё-таки не совсем понятно, почему даже на пустом Excel происходило... Как-то у вас дата, похоже, крепко хваталась со второй колонки и не "отпускалась" до конца строки. Напоминает поведение типа anytype, когда он принимает тип первого присваивания...

А покажите цикл заполнения рекордсета? (на радостях)
X++:
    . . .     
    rstAxa.AddNew();
    for(i=1; i<=arrFields.lastIndex(); i++)
    {
        cv  = this.getValueVariant(conpeek(con, i));
        fld = flds.Item(i-1);
        fld.Value(cv);
    }
    rstAxa.Update();
    . . .
X++:
protected COMVariant getValueVariant(anytype _value)
{
    COMVariant ret;
    ;
    switch(typeof(_value))
    {
        case Types::Date :
            ret = COMVariant::createFromDateAndTime(_value, 0);
            break;
        case Types::Real :
            ret = COMVariant::createFromReal(_value);
            break;
        case Types::Integer :
            ret = COMVariant::createFromInt( _value);
            break;
        case Types::String :
        case Types::RString :
        case Types::VarString :
            ret = COMVariant::createFromStr( _value);
            break;
        default :
            callStack2infolog();
            throw error(strfmt(@"%1(): Не знаю, как преобразовать значение из типа %2 в %3",
                                funcname(), typeof(_value), classstr(COMVariant)));
    }
    return ret;
}
Старый 17.09.2010, 21:22   #49  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Извиняюсь, что поднял старую тему, просто что-то поиском не нашел ответа на вроде бы очевидный вопрос, как при экспорте в Excel через RecordSet оставить ячейки не заполненными? Ну, например, если не указана дата, то в ячейке Excel должно быть пусто, а не 00.01.1900.

Разумеется, покопавшись в справке довольно быстро нашел ответ. Но, может, еще кому пригодится.

Суть сводится к тому, что соответствующее поле RecordSet должно содержать значение NULL на момент создания новой строки. Вообще-то, по умолчанию, при создании новой строки в RecordSet, если явно не указано значение, то и предпринимается попытка присвоить значение NULL. Однако, опять же по умолчанию, поле RecordSet создается с невозможностью принимать значение NULL и, как следствие, присваивает "пустое" значение

Допустимость использования значения NULL задается 4 параметром в методе Fields.Append(). 3 параметр - это размерность поля в байтах. Есть еще 5 параметр - значение по умолчанию, но практического смысла в данном случае 5 параметр не имеет.

Тогда код будет выглядеть примерно так

X++:
static void Job_ADORecordSet2Excel_EmptyCells(Args _args)
{
    Com comRecordSet;
    Com comFields;
    Com comField;

    ComExcelDocument_RU excel;
    Com                 comRange;
    ;

    #define.adFldIsNullable(32)  // Поле может принимать значение NULL
    #define.adFldMayBeNull(64) // Из поля можно прочитать значение NULL

    comRecordSet = new COM('ADODB.Recordset');
    // формируем структуру Recordset
    // где каждое поле может принимать значение NULL
    comFields = comRecordSet.Fields();
    comFields.Append("FieldStr",    COMVariantType::VT_BSTR,    50, #adFldIsNullable + #adFldMayBeNull);
    comFields.Append("FieldReal",   COMVariantType::VT_R8,      8,  #adFldIsNullable + #adFldMayBeNull);
    // Если нужна только даты без части со временем, то следует указать значение 133
    // Такого значения нет в Base Enum с именем COMVariantType
    comFields.Append("FieldDate",   COMVariantType::VT_DATE,    8,  #adFldIsNullable + #adFldMayBeNull);

    // Открываем RecordSet для заполнения
    comRecordSet.open();

    // Формируем первую строку
    comRecordSet.AddNew();

    // Наполняем ее данными для сравнения
    comField = comFields.Item("FieldStr");
    comField.value(comVariant::createFromStr("Первая строка"));

    comField = comFields.Item("FieldReal");
    comField.value(comVariant::createFromReal(123.456));

    comField = comFields.Item("FieldDate");
    comField.value(comVariant::createFromDate(systemDateGet()));

    // Формируем вторую строку
    // В которой нет никаких данных. Ячейки будут пустыми
    comRecordSet.AddNew();

    // Формируем третью строку
    comRecordSet.AddNew();

    // Наполняем ее данными для сравнения
    comField = comFields.Item("FieldStr");
    comField.value(comVariant::createFromStr("Третья строка"));

    comField = comFields.Item("FieldReal");
    comField.value(comVariant::createFromReal(789.012));

    comField = comFields.Item("FieldDate");
    comField.value(comVariant::createFromDate(systemDateGet()+2));

    // Открываем Excel с пустым листом и сразу делаем его видимым
    excel = new ComExcelDocument_RU();
    excel.newFile("",true);

    // Определяем ячейку, откуда будет осуществляться вывод
    comRange = excel.findRange("A1");

    // Выводим данные
    comRange.CopyFromRecordset(comRecordSet);

}


Собственно, это все работает, если ничего не вводить в поле RecordSet. Но, к сожалению не нашел, а как записать в поле RecordSet значение null ? Единственный, не очень хороший вариант - это присвоение исходного (оригинального) значения, исходя из предположения, что это значение NULL

X++:
    comField = comFields.Item("FieldDate");
    comField.value(comField.OriginalValue());
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 18.09.2010, 10:59   #50  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Например, так
X++:
    ComVariant var;
...
    var = new ComVariant(COMVariantInOut::In_out, ComVariantType::VT_BOOL);
    var.variantType(ComVariantType::VT_NULL);
    comField.value(var);
...
Тип создаваемого ComVariant может быть любым. Напрямую VT_NULL в конструкторе можно задать, но создается переменная с типом VT_EMPTY. По-этому, нужен дополнительный вызов
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Владимир Максимов (2), Logger (5), Ace of Database (5), gl00mie (3).
Старый 02.03.2011, 11:44   #51  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
У меня такой вопрос возник. Вроде по теме.

После сбора данных из нескольких таблиц в ADODB.Recordset мне нужно вывести их форму на grid, чтобы потом можно было их просмотреть/редактировать в самой DAX. Как это можно сделать?
Ну естественно напрашивается вариант со временной таблицей, ну а будет ли это быстро? И как вообще ее заполнять?
Старый 02.03.2011, 13:49   #52  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от refined Посмотреть сообщение
После сбора данных из нескольких таблиц в ADODB.Recordset мне нужно вывести их форму на grid, чтобы потом можно было их просмотреть/редактировать в самой DAX. Как это можно сделать?
Если не зацикливаться на grid'е, то можно посадить на форму ActiveX OWC Spreadsheet и в нем смотреть/редактировать. Spreadsheet поддерживает метод CopyFromRecordset.
Старый 02.03.2011, 14:54   #53  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
Я об этом как раз подумал. Но я к сожалению недавно с Axapta знаком. Как вывести значение на форму? Скажем rstAxa (это сам рекордсет).
Уточню вопрос, допустим я делаю
X++:
    ExcelSheet = tabExcelSheet.addControl(formControlType::ActiveX, "ExcelSheet");
что дальше то?
Старый 02.03.2011, 15:20   #54  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от refined Посмотреть сообщение
Я об этом как раз подумал. Но я к сожалению недавно с Axapta знаком. Как вывести значение на форму? Скажем rstAxa (это сам рекордсет).
Уточню вопрос, допустим я делаю
X++:
    ExcelSheet = tabExcelSheet.addControl(formControlType::ActiveX, "ExcelSheet");
что дальше то?
Вам надо сначала посадить ActiveX на форму, а потом населить его данными (CopyFromRecordset). Как посадить этот контрол в диалоговую форму, можно примерно посмотреть здесь: Использование OWC Spreadsheet в диалоге или здесь: Табличный процессор

Но лучше помещать на нормальную форму, сохраненную в AOT (не диалог) - тогда можно будет воспользоваться его событиями. В диалоге же это не получается: События FormActiveXControl не получается использовать в диалоге
За это сообщение автора поблагодарили: refined (1).
Старый 02.03.2011, 15:31   #55  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
Да, я как раз пытаюсь через нормальную форму. Я делаю следующим образом:
X++:
  reportEngine = element.args().caller();

    super();    
    ExcelSheet = tabExcelSheet.addControl(formControlType::ActiveX, "ExcelSheet");
    ExcelSheet.widthMode(formwidth::ColumnWidth);
    ExcelSheet.heightMode(formHeight::ColumnHeight);
    ExcelSheet.CopyFromRecordset(reportEngine.recordset());
где reportEngine.recordset() это:
X++:
COM recordset()
{
    ;
    return rstAxa;
}
но почему-то вываливается ошибка Unable to call method on activeX, wait until object is fully initialized
Всё, я уже разобрался. Добавил еще строчек кода из http://axforum.info/forums/blog.php?b=26
Просто забыл код закомментировать.

Последний раз редактировалось refined; 02.03.2011 в 16:22. Причина: выполнил
Старый 02.03.2011, 16:25   #56  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
ExcelSheet это FormActiveXControl? Конечно, у него такого метода нет. Метод есть у Range. Надо перейти к нему как-то так:
X++:
    COM range;

    range = ExcelSheet.Range("A1");
    range.CopyFromRecordset(...);
Кстати, ExcelSheet у вас точно Spreadsheet? Есть в коде что-то типа такого?:
X++:
    ExcelSheet = tabExcelSheet.addControl(formControlType::ActiveX, "ExcelSheet");

    ExcelSheet.className('{0002E541-0000-0000-C000-000000000046}');     // Microsoft Office Spreadsheet 10.0
По моим ссылкам, вроде, всё это расписано...

P.S. ОК! Хорошо, что разобрались.
Старый 03.03.2011, 13:48   #57  
refined is offline
refined
Участник
 
9 / 10 (1) +
Регистрация: 18.02.2011
В итоге оказалось, что намного проще сделать вывод не сразу в эксель а просто в форму. И в ней сразу делать сводную таблицу.
Так вот у меня с ней как раз и проблема. Она не отрабатывает как Сводная. Как сделать так чтобы при перетаскивании столбцов, они *схлопывались* автоматически? т.е. осуществлялась группировка по полю (одному, двум). Ну и соответсвенно если это число то выводилась сумма?

И так, вот сам метод выполняемый на форме:
PivotTable = grpPivotTableHolder.addControl(formControlType::ActiveX, "PivotTable");
X++:
    className = CCUtil::getOfficePivotTableVersion(true);
    PivotTable.className(className);
    PivotTable.WidthMode(formwidth::ColumnWidth);
    PivotTable.HeightMode(formHeight::ColumnHeight);
    PivotTable.allowFiltering(true);
    PivotTable.AllowGrouping(true);
    PivotTable.DataSource(reportEngine.ADORecordset());
где grpPivotTableHolder собственно сама вкладка на форме.
Смысл в том чтобы не использовать временную таблицу.

Последний раз редактировалось refined; 03.03.2011 в 13:57.
Старый 12.09.2014, 17:24   #58  
Отшельник is offline
Отшельник
Участник
 
43 / 11 (1) +
Регистрация: 15.06.2011
Господа. Прошу помочь разобраться с этим ADO.
Делаю джоб (самый первый пример из этой темы). Все отрабатывает.
Пытаюсь воспользоваться этим же кодом в Классе, отчете....
во время запуска выдает ошибку на строке

rstAxa = new COM('ADODB.Recordset');

пишет "Объект "COM" не может быть создан"

Почему один и тот же код не работает в отчете, классе?



Цитата:
static void Job_TestADO_2(Args _args)
{
// ----------------------------------------------------------------------------
// ADODB.Recordset в оперативной памяти без привязки к источнику данных
// ----------------------------------------------------------------------------
EmplTable emplTable;
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 i, iMax;
// ============================================================================
// СНАЧАЛА ВЛОЖЕННАЯ ФУНКЦИЯ
// ----------------------------------------------------------------------------
// функция для задания типа поля нашего 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');
__________________
Dynamics AX 2009 SP1, Rollup 5, SQL Server 2008
Хороший ученик во всем найдет себе учителя...
Старый 12.09.2014, 19:39   #59  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Отшельник Посмотреть сообщение
Почему один и тот же код не работает в отчете, классе?
Возможно в одном случае код выполняется на клиенте, а в другом случае - на сервере. И, например, в одном месте компонент (excel) установлен, а в другом - нет.
За это сообщение автора поблагодарили: Отшельник (1).
Старый 19.09.2014, 09:46   #60  
Отшельник is offline
Отшельник
Участник
 
43 / 11 (1) +
Регистрация: 15.06.2011
S.Kuskov - Сори за молчание.
Спасибо за помощь. К вечеру уже не соображал .

Лишний раз убедился, что труд из человека делает обезьяну
__________________
Dynamics AX 2009 SP1, Rollup 5, SQL Server 2008
Хороший ученик во всем найдет себе учителя...
Теги
ado, comvariant, excel, faq, odbc, sql, интеграция, прямой доступ, формат дат, экспорт, экспорт в excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вспомогательный класс для импорта из Excel через ADO gl00mie DAX: База знаний и проекты 80 10.04.2017 10:55
gl00mie: Read Excel table via ADO Blog bot DAX Blogs 2 09.04.2010 08:32
C# and AX Development: Using ADO for interfacing AX with an external database Blog bot DAX Blogs 0 05.08.2008 05:18
casperkamal: Using ADO to read from Excel in Microsoft Dynamics Ax Blog bot DAX Blogs 2 14.05.2007 11:59

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

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

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