避免在MS Dynamics AX中将重复数据插入表中

时间:2014-03-12 17:58:48

标签: axapta x++ microsoft-dynamics ax

我有一个自定义表格,我将数据插入其中。我不希望重复的数据结束,所以我创建了一个由20个字段组成的唯一索引,我希望它是唯一的。正如预期的那样,当我运行我的工作来插入数据时,它当然会失败并告诉我它正在尝试插入重复记录并在那里停止工作。如果我把它包裹起来,整个事情都会失败。

我的问题是,我怎样才能使作业仍然继续,只是阻止重复插入?请注意,就像我上面提到的那样,我有20个字段组成了密钥,写一些检查现有记录并且数据匹配所有20个字段的东西很麻烦。

3 个答案:

答案 0 :(得分:2)

我找到了它,保留了表上的唯一索引,我将它包装在try catch中,显然它有自己的Exception类型,而不仅仅是insert():

try
{
    customTable.insert();
}
catch (Exception::DuplicateKeyException)
{
    //clears the last infolog message, which is created by trying to insert a duplicate
    infolog.clear(Global::infologLine() - 1);
}

答案 1 :(得分:1)

为什么不实现验证写入方法并避免插入重复项?

if (table.validateWrite())
   table.insert();
else
   log

答案 2 :(得分:0)

伙计,我不会将此管理委托给异常控制。如果它只在一个Job中,那没关系,但是如果你计划在其他点管理记录,我们警告说如果你使用嵌套的try-catch块,控件将转到最外层 try-catch阻止,避免内部的。好吧,有两三个例外没有(检查编程手册,我现在不记得它们,它们与DDBB记录阻塞等有关)。

我会在表中创建一个静态Exists方法,并且在为性能目的时仅选择recid时要小心。是的,在选择中编写20个字段是一件痛苦的事情,但是你会做到这一点,并且从长远来看,这是最好和可维护的重点。

public MyTable exists(Type1 _field1, Type2 _field2...)
{
    boolean ret = false
    if (_field1 && _field2 && ...) //mandatory fields
    {
        ret = (select firstonly RecId from MyTable 
                where MyTable.Field1 == _field1
                   && MyTable.Field2 == _field2 ...).Recid != 0; 
    }

    return ret;
}

一般情况下我不会在insert()或update()中使用此方法,除非有充分的理由(在这种情况下,如果性能很关键,设置AllowDuplicates ==是有意思的,请注意, '手动管理重复项 - 小心使用doupdates / doinserts或外部插入/更新)。我会在你的工作或其他地方使用这种方法在插入/更新之前检查重复项。