|
19.02.2009, 15:24 | #1 |
Участник
|
Ошибка while next
Добрый день! Делаю выгрузку в excel одного отчета. Код вылетает на next items с ошибкой: "Ошибка времени выполнения: В данном контексте команду NEXT выполнить нельзя. Возможные причины: буфер инициализирован на сервере, не вызван запрос SELECT, SELECT вызван, но строк не найдено, или данные переданы с помощью метода DATA. Ошибка, как я понял, вылетает на последней строке. Таблица items не пустая.
Код прилагается: X++: void clicked() { Query query; QueryBuildDataSource qbds; QueryRun qr; ELT_BomItemsExplodeCalcTKP ds; //===Variables (for Excel export)=============================// comExcelDocument_RU excelDoc; ParseBuffer text; Str buffer; int i; //===changeKeyBoard================================================// void changeKeyBoardLanguageRussia() // Перевод раскладки клавиатуры на русский язык (символы в буфере обмена) { dll dll = new dll("user32"); dllFunction dllFunction = new dllFunction(dll, "LoadKeyboardLayoutA"); #define.KLF_ACTIVATE(1) ; dllFunction.arg(ExtTypes::String, ExtTypes::DWord); dllFunction.returns(ExtTypes::DWord); dllFunction.call("00000419", #KLF_ACTIVATE); // - русский язык //dllFunction.call("00000409", #KLF_ACTIVATE); // - англ. язык } //=================================================================// ; super(); buffer = ""; text = new ParseBuffer(""); changeKeyBoardLanguageRussia(); excelDoc = new comExcelDocument_RU(); excelDoc.newFile(#ReportTemplatePath_RU + 'ELT_BomCalcTKP.xlt',false); // query = new Query(items_DS.query()); // qbds = query.dataSourceNo(1); // qbds.addSortField(FieldNum(ELT_BomItemsExplodeCalcTKP, RecId)); // qbds.orderMode(OrderMode::OrderBy); // qr = new QueryRun(query); if (SebestCheckbox.value() == 0) select items order by RecID ASC where items.RecId; else select items order by RecID ASC where items.ItemType == ItemType::BOM || items.StopExplode == NoYes::Yes; while (items) //while (qr.next()) { //ds = qr.getNo(1); buffer = items.ItemId + '\t' + items.ItemName + '\t' + num2str(items.BOMQty,4,2,2,0) + '\t' + items.UnitID + '\t' + num2str(items.PurchPrice,4,2,2,0) + '\t' + items.PurchCurrencyCode + '\t' + num2str(items.CurrAmount,4,2,2,0) + '\t'; //items.CurrAmountCode + '\t'; switch (items.PurchCurrencyCode) { case 'RUR' : buffer += "=G" + int2Str(2+i) + '\t'; break; case 'EUR' : buffer += "=G" + int2Str(2+i)+'*$N$1' + '\t'; break; case 'USD' : buffer += "=G" + int2Str(2+i)+'*$N$2' + '\t'; break; } buffer += int2str(items.LevelBom) + '\t' + items.BomItemId + '\t' + date2str(items.TransDate,123,2,2,2,2,2) + '\n'; text.appendText(buffer); i++; next items; } if(buffer == "") text.appendText("Ошибка! \n"); excelDoc.insertText("A2", text,1); text.setText(num2str(Euro,4,2,2,0)); excelDoc.insertText("N1", text,1); text.setText(num2str(USD,4,2,2,0)); excelDoc.insertText("N2", text,1); excelDoc.visible(true); } Последний раз редактировалось niktata; 19.02.2009 в 16:08. Причина: Неправильное отображение знаков комментария /* и */ |
|
19.02.2009, 15:31 | #2 |
MCITP
|
Цитата:
X++: if (SebestCheckbox.value() == 0) select items order by RecID ASC where items.RecId; order by RecID where items.ItemType == ItemType:: || items.StopExplode == NoYes::Yes; А вообще, ну а если SebestCheckbox.value() != 0? То откуда по вашему должен делаться next()? не хватает операторных скобок после X++: if (SebestCheckbox.value() == 0)
__________________
Zhirenkov Vitaly |
|
19.02.2009, 15:34 | #3 |
Участник
|
Привет. А почему не заменить
while (items) .... next items; на while select items { ... }
__________________
Жить все веселей!.. AX3SP3CU1 |
|
19.02.2009, 16:07 | #4 |
Участник
|
X++: , - ... , [I]SebestCheckbox.value() != 0[/I]? X++: [COLOR=blue][COLOR=Black]. [/COLOR] while[/COLOR] (items) .... next items; [COLOR=blue]while[/COLOR] select items { ... } |
|
19.02.2009, 16:14 | #5 |
MCITP
|
[QUOTE=niktata;191029]
X++: , - ... , [I]SebestCheckbox.value() != 0[/I]? По-прежнему вижу то же самое... А items - это что, DS на форме?
__________________
Zhirenkov Vitaly |
|
19.02.2009, 16:32 | #6 |
MCITP
|
Вообщем, покорырялся, да - есть такая проблема именно с next.
Делайте вот как: Обьявите локальную переменную (tmpLocal) той временной таблицы, которая у вас в датасорсе, Сделайте ей X++: tmpLocal.setTmpData(items); Так всё будет нормально...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: niktata (1). |
20.02.2009, 11:21 | #7 |
Участник
|
ZVV: Я в итоге так и сделал Спасибо за подсказку! Интересно все-таки, почему next ему так не нравился. Уже не раз делал таким способом и не испытывал никаких проблем.
Вставить код так и не удается. Каждый раз теряются строки. Последний раз редактировалось niktata; 20.02.2009 в 11:25. |
|
20.02.2009, 11:29 | #8 |
MCITP
|
Цитата:
У меня в простейшём случае такая же ошибка как и вас была. Причина в том, что последний while (items) (после последнего next, точнее, который уже не должен ничего найти) всё равно возвращает Тру, а следующий next выдаёт указанную ошибку... Причём это именно когда по ДС. А вот while select отрабатывает нормально. Примите это как фичу. И вообще делать селект по датасорсу это неправильно как-то по смыслу, в моём понимании...
__________________
Zhirenkov Vitaly |
|
20.02.2009, 13:39 | #9 |
Administrator
|
niktata
Прошу извинить, была ошибка в отображении тега xpp. Сейчас исправлено.
__________________
Был грязный плащ на нем одет, Цилиндр черный смят в гармошку... |
|
20.02.2009, 15:18 | #10 |
Участник
|
ZVV: теперь все на своих местах спасибо!
Aleksey_M: ok ;-) |
|