Как проверить, что следующий оператор может быть использован? - PullRequest
0 голосов
/ 30 мая 2018

Вопросы для любой версии Axapta:

  1. Как проверить, что оператор «следующий» может использоваться с записью?
  2. Как отключить отладчик для недопустимого оператора «следующий»?

Спасибо.


Код для воспроизведения:

static void Job13(Args _args)
{
    CustTrans   ct1;
    CustTrans   ct2;

    // let's assume that method 'one' search a record
    select ct1; // where ct1.AccountNum == 'someAccount'
    ct2.data(ct1.data());

    // contract postcondition
    Debug::assert(ct1.RecId != 0);
    Debug::assert(ct2.RecId == ct1.RecId);

    //////////////////////////////////

    // let's assume that method 'two' accepts a custTrans record as parameter
    Debug::assert(ct2.RecId != 0);
    try
    {
        // Questions:
        // 1. How to check that 'next' can be used?
        // 2. How to suppress a debugger?
        next ct2;
    }
    catch
    {
        Warning('catch it!');
    }
}

+ пара скриншотов, созданных после запуска задания в ax2009.

Debugger

infolog after debugger

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Согласно статье MSDN :

Оператор выбора выбирает только одну запись или поле.Чтобы получить дополнительные записи, вы можете использовать следующую инструкцию.Следующий оператор выбирает следующую запись в таблице. Если вы используете next без предшествующей команды select, возникает ошибка. Не используйте next с параметром firstOnly find.Если вам необходимо пройти через несколько записей, более целесообразно использовать оператор while select.

Вы использовали команду next с ct2 безПредыдущая команда выбора (которую вы использовали с ct1 ).

Обновление: Использование if (ct1.found()) next ct1; может помочь вам избежать непредвиденных ошибок.

0 голосов
/ 30 мая 2018

Проблема в том, что вы ct2.data(ct1.data());, и это (d) часть вашего сообщения об ошибке.Похоже, AX просто не может справиться с этим сценарием.Я согласен с комментарием @ FH-Inway о том, что вам, вероятно, следует использовать while select ct1 {} вместо next.

Ниже это более четко показано:

static void Job5(Args _args)
{
    SalesTable      salesTable;
    SalesTable      salesTable2;

    select salesTable where salesTable.SalesId == 'SO-001351';

    while (salesTable)
    {
        info(salesTable.SalesId);

        next salesTable;
    }

    info("Above has no issue");

    select salesTable where salesTable.SalesId == 'SO-001351';
    salesTable2.data(salesTable);

    while (salesTable2)
    {
        info(salesTable2.SalesId);

        next salesTable2;
    }

    info("Above fails");
}
...