看起来像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的想法没有我有笨重的逻辑吗?如果有人能提供帮助,我们非常感激。
答案 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中的所选行(最后一行)传输可输入字段。应该工作。