Acumatica ARtran表导入唯一字段

时间:2016-08-05 14:55:10

标签: acumatica

我有一个“导入场景”,按小时计划将记录插入ARTan表。我遇到的问题是,我无法确保记录没有插入两次。我有一个名为FeeDueID的主键,AR记录只能插入一次。有没有办法在Acumatica中锁定这个,这样多个用户不会意外地插入多个记录?

有人告诉我,如果我在Acumatica“数据提供者”中选择我的唯一字段作为关键字段,则不允许插入副本。然而,这种情况并非如此。我真的在寻找一种让Acuamtica框架只允许基于用户定义的主键的AR记录的方法。我能够通过在桌面上放置一个触发器来解决这个问题。我被告知Acumatica不支持触发器。

enter image description here

其他信息:

·架构的“Key”属性仅用于帮助在导入场景的“准备”部分中识别唯一记录。关于何时使用这个标志似乎有些混乱,我们已经联系到Acumatica以帮助澄清。

·准备好记录后,数据方案的设置不会直接参与实际的导入过程

·如果当前正在处理导入方案并且执行了第二次准备,Acumatica将处理尚未标记为导入/处理的任何项目。这包括以前准备的项目。

1 个答案:

答案 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();
    }
}