Acumatica - 复制最后一行

时间:2017-12-21 01:05:37

标签: acumatica

看起来像Acumatica看似简单的事情实现起来非常复杂。我想做的就是将我的网格的最后一行复制为新的。我希望用户自己保留更改,因此我的代码会将其放在缓存中。这是我到目前为止的行动:

    public PXAction<SOOrder> copyLastRow;
    [PXUIField(DisplayName = "Copy Last Row", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
    [PXLookupButton]
    public virtual IEnumerable CopyLastRow(PXAdapter adapter)
    {
        SOLine line = Base.Transactions.Select().LastOrDefault();
        int? lineNbr = 0;

        foreach(SOLine line2 in Base.Transactions.Select())            
            if (line2.LineNbr > lineNbr)
                lineNbr = line2.LineNbr;



        line.LineNbr = lineNbr + 1;
        Base.Transactions.Cache.Insert(line);           

        return adapter.Get();
    }

所以也许我的代码中没有得到或完全错误,但无论我做什么,我都会遇到错误。网格没有得到我的行刷新,我不断得到各种错误,如“此记录无法保存”或“另一个进程更新此记录”等。此外,任何关于如何生成新的lineNbr的想法没有我有笨重的逻辑吗?如果有人能提供帮助,我们非常感激。

3 个答案:

答案 0 :(得分:1)

代码应该是这样的:

public PXAction<SOOrder> copyLastRow;
[PXUIField(DisplayName = "Copy Last Row", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
[PXProcessButton]
public virtual IEnumerable CopyLastRow(PXAdapter adapter)
{
    SOLine line = Base.Transactions.Select().LastOrDefault();
    SOLine newLine = new SOLine();
    ... (copy all you need from line to newLine)
    Base.Transactions.Cache.Insert(newLine);           
    Base.Actions.PressSave();
    return adapter.Get();
} 

答案 1 :(得分:1)

如果您只想获取该行并复制所有值,则可以使用缓存副本并将lineid置零。然后在插入复制的行时,它将自动获得下一个亚麻布...在您的问题中添加示例代码...

SOLine line = Base.Transactions.Select().LastOrDefault();
var copy = (SOLine)Base.Transactions.Cache.CreateCopy(line);
copy.LineNbr = null;
Base.Transactions.Cache.Insert(copy);

如果将新字段或自定义添加到SOLine,此方法也应该是升级友好的,它们将继续被复制,而不必选择性地包括要复制的所有字段(使用CreateCopy)。

答案 2 :(得分:0)

我猜这个行号会自动生成!无论如何它不是顺序的。

我建议你创建一个新的SOline行并从同一行和Insert中的所选行(最后一行)传输可输入字段。应该工作。