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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2010, 16:39   #1  
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   #2  
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   #3  
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   #4  
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   #5  
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   #6  
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, время: 05:02.