Axapta 背景色行

Axapta 背景色行,axapta,dynamics-ax-2012,x++,Axapta,Dynamics Ax 2012,X++,我在表单的数据源上创建了一个display方法来检查某个字段是否匹配,如果有两个相同的值,那么表单中的特定行应该有一个背景色 下面代码的问题是表单中的所有行都被赋予了背景色,如果只有一行记录匹配也是如此 我做错了什么 public void displayOption(Common _record, FormRowDisplayOption _options) { SalesLine salesLineLocal; ; salesLin

我在表单的数据源上创建了一个display方法来检查某个字段是否匹配,如果有两个相同的值,那么表单中的特定行应该有一个背景色

下面代码的问题是表单中的所有行都被赋予了背景色,如果只有一行记录匹配也是如此

我做错了什么

public void displayOption(Common _record, FormRowDisplayOption _options)
    {
        SalesLine  salesLineLocal;
        ;

        salesLineLocal = _record;

         while select salesLineLocal
            where salesLineLocal.SerialId == salesLine.SerialId

        if(salesLineLocal.RecId != SalesLine.RecId)
        {
                _options.backColor(Winapi::RGB2int(251,181,251));

        }
    }

按以下方式修改您的方法,这将正常工作:

public void displayOption(Common _record, FormRowDisplayOption _options)
{
    SalesLine  salesLineCurrent;
    SalesLine  salesLineLocal;
    ;

    salesLineCurrent = _record;

    select firstOnly RecId from salesLineLocal
        where salesLineLocal.SerialId == salesLineCurrent.SerialId
           && salesLineLocal.RecId    != salesLineCurrent.RecId;

    if (salesLineLocal.RecId)
    {
        _options.backColor(Winapi::RGB2int(251,181,251));
    }

    super(_record, _options);
}
但是,如果您想改进它,您可以在表级别移动验证逻辑。在
SalesLine
表创建方法中

public boolean hasDupplicate()
{
    SalesLine  salesLine;
    ;

    select firstOnly RecId from salesLine
        where salesLine.SerialId == this.SerialId
           && salesLine.RecId    != this.RecId;

    return salesLine.RecId != 0
}
然后您的
displayOption
方法如下所示

public void displayOption(Common _record, FormRowDisplayOption _options)
{
    SalesLine  salesLineLocal;
    ;

    salesLineLocal = _record;

    if (salesLineLocal.hasDupplicate())
    {
        _options.backColor(Winapi::RGB2int(251,181,251));
    }

    super(_record, _options);
}

按以下方式修改您的方法,这将正常工作:

public void displayOption(Common _record, FormRowDisplayOption _options)
{
    SalesLine  salesLineCurrent;
    SalesLine  salesLineLocal;
    ;

    salesLineCurrent = _record;

    select firstOnly RecId from salesLineLocal
        where salesLineLocal.SerialId == salesLineCurrent.SerialId
           && salesLineLocal.RecId    != salesLineCurrent.RecId;

    if (salesLineLocal.RecId)
    {
        _options.backColor(Winapi::RGB2int(251,181,251));
    }

    super(_record, _options);
}
但是,如果您想改进它,您可以在表级别移动验证逻辑。在
SalesLine
表创建方法中

public boolean hasDupplicate()
{
    SalesLine  salesLine;
    ;

    select firstOnly RecId from salesLine
        where salesLine.SerialId == this.SerialId
           && salesLine.RecId    != this.RecId;

    return salesLine.RecId != 0
}
然后您的
displayOption
方法如下所示

public void displayOption(Common _record, FormRowDisplayOption _options)
{
    SalesLine  salesLineLocal;
    ;

    salesLineLocal = _record;

    if (salesLineLocal.hasDupplicate())
    {
        _options.backColor(Winapi::RGB2int(251,181,251));
    }

    super(_record, _options);
}

谢谢你清晰的回答,阿利雅克桑德!它工作完美!我只将select FIRSTRONLY RecId更改为select FIRSTRONLY SerialId,因此它不选择空的序列id行。再次感谢。谢谢你清晰的回答,阿利亚克桑德!它工作完美!我只将select FIRSTRONLY RecId更改为select FIRSTRONLY SerialId,因此它不选择空的序列id行。再次感谢。