23.12.2014, 13:35 | #1 |
Участник
|
Метод 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 |
Участник
|
Выгрузка частями - не проблема. Но ошибка о не верном количестве параметров в методе COM напрямую с количеством строк в RecordSet не связана. Как следствие, эта ошибка может повториться на любой произвольной команде при работе с Excel и при любом количестве строк в RecordSet.
Кроме модификации класса ComExcelDocument_RU() есть еще "локальное" решение. Организовать выгрузку в отдельном потоке (thread). В этом случае надо будет просто в вашем классе выгрузки в Excel создать дополнительный метод и организовать специфический вызов этого метода из main, после prompt(). Поищите по форуму была тема по потокам. Там буквально десяток строк кода надо в этом методе написать
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: at5454 (1). |
23.12.2014, 14:46 | #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()); } } } 1. Использовать методы pack/unpack для передачи переменных, указанных пользователем 2. Дополнить контейнер, передаваемый через thread.setInputParm() нужным количеством значений. Т.е. на этапе отладки класса можешь работать "как обычно", а когда класс будет готов и отлажен, "обернуть" его вызов в отдельный поток.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|