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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.02.2009, 15:24   #1  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
Ошибка 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);
}
Пробовал делать через QueryRun, но не разобрался, как делать выборку из датасурса формы. Датасурсом является временная таблица.

Последний раз редактировалось niktata; 19.02.2009 в 16:08. Причина: Неправильное отображение знаков комментария /* и */
Старый 19.02.2009, 15:31   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
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  
Didukh84 is offline
Didukh84
Участник
 
57 / 10 (1) +
Регистрация: 09.06.2006
Привет. А почему не заменить
while
(items)
....
next items;
на
while select items
{
...
}
__________________
Жить все веселей!.. AX3SP3CU1
Старый 19.02.2009, 16:07   #4  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
X++:
 ,  -   ...
 ,    [I]SebestCheckbox.value() != 0[/I]?
Скопировал все верно. Редактор на форуме неправильно обработал знаки комментария /* и */ я их заменил на //

X++:
[COLOR=blue][COLOR=Black].     [/COLOR]
while[/COLOR] (items)
....
next items;
 
[COLOR=blue]while[/COLOR] select items
{
  ...
}
Потому что если галочка SebestCheckbox отмечена, то одна выборка, иначе другая.
Старый 19.02.2009, 16:14   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
[QUOTE=niktata;191029]
X++:
 ,  -   ...
 ,    [I]SebestCheckbox.value() != 0[/I]?
Скопировал все верно. Редактор на форуме неправильно обработал знаки комментария /* и */ я их заменил на //

По-прежнему вижу то же самое...
А items - это что, DS на форме?
__________________
Zhirenkov Vitaly
Старый 19.02.2009, 16:32   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Вообщем, покорырялся, да - есть такая проблема именно с next.
Делайте вот как:
Обьявите локальную переменную (tmpLocal) той временной таблицы, которая у вас в датасорсе,
Сделайте ей
X++:
tmpLocal.setTmpData(items);
и далее стройте свои запросы к переменной tmpLocal.
Так всё будет нормально...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: niktata (1).
Старый 20.02.2009, 11:21   #7  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
ZVV: Я в итоге так и сделал Спасибо за подсказку! Интересно все-таки, почему next ему так не нравился. Уже не раз делал таким способом и не испытывал никаких проблем.

Вставить код так и не удается. Каждый раз теряются строки.
Изображения
 

Последний раз редактировалось niktata; 20.02.2009 в 11:25.
Старый 20.02.2009, 11:29   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от niktata Посмотреть сообщение
ZVV: Я в итоге так и сделал Спасибо за подсказку! Интересно все-таки, почему next ему так не нравился. Уже не раз делал таким способом и не испытывал никаких проблем.
Делали так именно с временной таблицей в ДС и next?

У меня в простейшём случае такая же ошибка как и вас была. Причина в том, что последний while (items) (после последнего next, точнее, который уже не должен ничего найти) всё равно возвращает Тру, а следующий next выдаёт указанную ошибку... Причём это именно когда по ДС. А вот while select отрабатывает нормально.
Примите это как фичу. И вообще делать селект по датасорсу это неправильно как-то по смыслу, в моём понимании...
__________________
Zhirenkov Vitaly
Старый 20.02.2009, 13:39   #9  
Aleksey_M is offline
Aleksey_M
Administrator
Аватар для Aleksey_M
 
520 / 355 (13) ++++++
Регистрация: 26.08.2005
Адрес: Москва
niktata
Прошу извинить, была ошибка в отображении тега xpp. Сейчас исправлено.
__________________
Был грязный плащ на нем одет,
Цилиндр черный смят в гармошку...
Старый 20.02.2009, 15:18   #10  
niktata is offline
niktata
Участник
 
17 / 10 (1) +
Регистрация: 23.07.2008
Адрес: Санкт-Петербург
ZVV: теперь все на своих местах спасибо!
Aleksey_M: ok ;-)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX: Microsoft - The Next Big ERP Innovator Blog bot DAX Blogs 2 02.04.2009 18:55
axStart: Please keep the AOT reports in Dynamics AX next release alive Blog bot DAX Blogs 2 13.12.2008 12:18
Ошибка при выполнении queryRun.next() Poleax DAX: Программирование 6 23.07.2008 18:49
ProductiveGap: Analysis: CRM Is Microsoft's Next Billion-Dollar Baby Blog bot DAX Blogs 0 28.10.2006 18:14
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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