我有一个“导入场景”,按小时计划将记录插入ARTan表。我遇到的问题是,我无法确保记录没有插入两次。我有一个名为FeeDueID的主键,AR记录只能插入一次。有没有办法在Acumatica中锁定这个,这样多个用户不会意外地插入多个记录?
有人告诉我,如果我在Acumatica“数据提供者”中选择我的唯一字段作为关键字段,则不允许插入副本。然而,这种情况并非如此。我真的在寻找一种让Acuamtica框架只允许基于用户定义的主键的AR记录的方法。我能够通过在桌面上放置一个触发器来解决这个问题。我被告知Acumatica不支持触发器。
其他信息:
·架构的“Key”属性仅用于帮助在导入场景的“准备”部分中识别唯一记录。关于何时使用这个标志似乎有些混乱,我们已经联系到Acumatica以帮助澄清。
·准备好记录后,数据方案的设置不会直接参与实际的导入过程
·如果当前正在处理导入方案并且执行了第二次准备,Acumatica将处理尚未标记为导入/处理的任何项目。这包括以前准备的项目。
答案 0 :(得分:0)
通过触发器跳过记录是不正确的,因为您在文档上会有错误的总计。
如果您可以使用触发器处理它,那么假设系统会自动跳过此项而没有任何消息,我认为您没问题?
如果是,此自定义可能对您有用。它会检查数据库中的类似记录并删除它。如果有不同的要求,您可以更改此代码并抛出错误或进行不同的选择。
请注意,这取决于可能影响性能的数据大小。我强烈建议您在列上创建自定义索引。
public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>
{
public delegate void PersistDelegate();
[PXOverride]
public void Persist(PersistDelegate baseMethod)
{
if (Base.IsImport)
{
PXView _view = new PXView(Base, false, BqlCommand.CreateInstance(typeof(Select<ARTran, Where<ARTranExt.usrCustomKey, Equal<Required<ARTranExt.usrCustomKey>>>>)));
//Checking Unique Value
foreach (ARTran tran in Base.Transactions.Select())
{
ARTranExt ext = Base.Transactions.Cache.GetExtension<ARTranExt>(tran);
String search = ext.UsrCustomKey;
if (search != null)
{
int startRow = 0, maxRows = 2, totalRows = 0;
List<object> records = _view.Select(null, new[] { search }, null, null, null, null, ref startRow, maxRows, ref totalRows);
bool found = false;
foreach (ARTran record in records)
{
if (found) // if it's not the same record
{
Base.Transactions.Delete(record);
}
found = true;
}
}
}
}
baseMethod();
}
}