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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.12.2014, 13:35   #1  
at5454 is offline
at5454
Участник
 
61 / 10 (1) +
Регистрация: 29.05.2014
Метод CopyFromRecordset вываливает ошибку при большм количестве строчек
Axapta 4.0
Здравствуйте! Если рекордсет содержит меньше 40000 строчек (примерно плюс-минус) то экспорт в эксель проходит успешно. Если же строчек больше то пишет ошибку "com метод CopyFromRecordset с неверным числом параметров"
И! Эта ошибка вылазит только на терминалах и еще на одном компе.
Везде эксель 2007. Статью про особенности работы com методов в терминальных режимах прочел.Переписывать экспорт на ComExcelDocument_RU() не хотелось бы. Пробовал так: comCell.CopyFromRecordset(recordSet,maxrow,maxcol);
Не помогло.
Можно ли просто разбить полученный рекордсет на части и скормить по частям методу CopyFromRecordset?


while select sum (qty) from tmpTable

group by ItemName, CatId, Brand, Amount
where tmpTable.ItemName == 'СЪЕМНИК'
{
i++;
recordSet.AddNew();
field = fields.Item('id' ); field.Value(i);
field = fields.Item('name' ); field.Value(tmpTable.ItemName);
field = fields.Item('cat' ); field.Value(tmpTable.CatId);
field = fields.Item('brand' ); field.Value(tmpTable.Brand);
field = fields.Item('price' ); field.Value(tmpTable.Amount);
recordSet.Update();
// comCell.CopyFromRecordset(recordSet);
//if (i>2000) { break; }
}

comCell.CopyFromRecordset(recordSet);
Старый 23.12.2014, 14:21   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Выгрузка частями - не проблема. Но ошибка о не верном количестве параметров в методе COM напрямую с количеством строк в RecordSet не связана. Как следствие, эта ошибка может повториться на любой произвольной команде при работе с Excel и при любом количестве строк в RecordSet.

Кроме модификации класса ComExcelDocument_RU() есть еще "локальное" решение. Организовать выгрузку в отдельном потоке (thread). В этом случае надо будет просто в вашем классе выгрузки в Excel создать дополнительный метод и организовать специфический вызов этого метода из main, после prompt(). Поищите по форуму была тема по потокам. Там буквально десяток строк кода надо в этом методе написать
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: at5454 (1).
Старый 23.12.2014, 14:46   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Схема работы с потоками описана здесь

Ошибка времени выполнения в ComExcelDocument_RU.findRange()

А практически, получается нечто вроде такого дополнения к твоему классу

X++:
// Обработка параметров, переданных через пункт меню
public Boolean initArgs(Args args)
{
    Boolean ret = true;
    ;

    if (! args || ! args.record() || args.dataset() != tablenum(MyTable))
    {
        global::error('Не указан или указан не корректный буфер таблицы-источника');
    }
    else
    {
        myTable = args.record();
    }   

    return ret;
}


// Статический метод, вызываемый в отдельном потоке
static void runReport(Thread _thread)
{
    container       	packedArgs;
    MyClassReport	report;
    Args                args = new Args();

    packedArgs = _thread.getInputParm();
    args.setupArgs('', conpeek(packedArgs, 1), conpeek(packedArgs, 2));
    args.record(conpeek(packedArgs, 3));

    report = new MyClassReport();
    report.initArgs(args);		// Передача Args из метода main
    report.run();

    _thread.setOutputParm(infolog.copy(1,infolog.num()));
}


public static void main(Args args)
{
    Thread 		thread;
    MyClassReport   	report;
    ;

    report = new MyClassReport();

    if (report.initArgs(args))
    {
        if (report.prompt())
        {
//            report.run();
	// Организация отдельного потока. Можно оформить как еще один статический метод класса
            thread = new Thread();
            thread.setInputParm([args.parmEnumType(),
                                 args.parmEnum(),
                                 args.record()]);
            thread.removeOnComplete(true);
            thread.run(classnum(MyClassReport), staticmethodstr(MyClassReport, runReport));
            thread.waitUntilSignaled();
            infolog.import(thread.getOutputParm());
        }
    }
}
Тут есть некоторая проблема в передаче параметров, введенных пользователем. Ведь в методе runReport() экземпляр класса создается заново. Решить эту проблему можно двумя способами:

1. Использовать методы pack/unpack для передачи переменных, указанных пользователем
2. Дополнить контейнер, передаваемый через thread.setInputParm() нужным количеством значений.

Т.е. на этапе отладки класса можешь работать "как обычно", а когда класс будет готов и отлажен, "обернуть" его вызов в отдельный поток.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
.CopyFromRecordset(Data, MaxRows, MaxColumns) Varmen DAX: Программирование 13 15.06.2012 20:29
DAX 2009,5.0.1000.52 SP1 в таблице smmBusRelTable отсутствует метод convert2Customer Murlin DAX: Программирование 8 11.11.2009 16:23
Дисплей метод таблицы который вызывается из ГРИДА 3oppo DAX: Программирование 10 23.05.2006 06:47
display метод с параметром Андре DAX: Программирование 5 11.01.2006 19:04
Передача массива VARIANTов в Automation метод Maximin DAX: Программирование 0 09.10.2002 19:31

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

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

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