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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2010, 14:54   #1  
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   #2  
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   #3  
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   #4  
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   #5  
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   #6  
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   #7  
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   #8  
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;
}
Теги
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, время: 03:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.