如何检查下一个操作符可以使用?

时间:2018-05-30 11:08:49

标签: axapta

任何Axapta版本的问题:

  1. 如何检查'next'运算符是否可以与记录一起使用?
  2. 如何在不可接受的'next'运算符上抑制调试器?
  3. 感谢。

    重现代码:

    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 :(得分:3)

问题在于您的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");
}

答案 1 :(得分:2)

根据MSDN article

  

select语句仅提取一个记录或字段。获取   附加记录,您可以使用下一个语句。下一个声明   获取表中的下一条记录。 如果您使用下一个没有   在select命令之前,发生错误。不要使用next   firstOnly找到选项。如果你需要遍历一些记录,那就好了   更适合使用while select语句。

您已使用下一步命令与 ct2 ,而不使用选择命令(您与 ct1 一起使用)。

更新:使用if (ct1.found()) next ct1;可以帮助您避免意外错误。