Добрый день! Делаю выгрузку в 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);
}
Пробовал делать через QueryRun, но не разобрался, как делать выборку из датасурса формы. Датасурсом является временная таблица.