Axapta 如何在ax 2009中控制临时表上的重复行?

Axapta 如何在ax 2009中控制临时表上的重复行?,axapta,dynamics-ax-2009,x++,Axapta,Dynamics Ax 2009,X++,我在while select查询中将记录插入临时表。我需要控制,如果我之前添加了记录,是否可能?只需在调用插入过程之前通过检查记录即可 //Build query above while (qr.next()) { SourceTable = qr.get(tablenum(SourceTable)); select DestTable where DestTable.Field1 == SourceTable.Field1; //Replace with cr

我在while select查询中将记录插入临时表。我需要控制,如果我之前添加了记录,是否可能?

只需在调用插入过程之前通过检查记录即可

//Build query above
while (qr.next())
{
    SourceTable = qr.get(tablenum(SourceTable));

    select DestTable
        where DestTable.Field1 == SourceTable.Field1; //Replace with criteria that determines if records are the same

    if (!DestTable)
    {
        DestTable.Field1 = SourceTable.Field1;
        DestTable.Field2 = SourceTable.Field2;
        DestTable.Field3 = SourceTable.Field3;
        DestTable.Insert();
    }

}

//Once processing is finished
if (element.prompt())
{
    while select DestTable            
    {
        element.send(DestTable);
    }
}
else
{
    return false;
}

基本上,尝试选择与插入内容匹配的记录。如果未返回任何记录,则将其插入。否则它只会转到下一条记录。

只需在调用插入进程之前通过检查记录即可

//Build query above
while (qr.next())
{
    SourceTable = qr.get(tablenum(SourceTable));

    select DestTable
        where DestTable.Field1 == SourceTable.Field1; //Replace with criteria that determines if records are the same

    if (!DestTable)
    {
        DestTable.Field1 = SourceTable.Field1;
        DestTable.Field2 = SourceTable.Field2;
        DestTable.Field3 = SourceTable.Field3;
        DestTable.Insert();
    }

}

//Once processing is finished
if (element.prompt())
{
    while select DestTable            
    {
        element.send(DestTable);
    }
}
else
{
    return false;
}

基本上,尝试选择与插入内容匹配的记录。如果未返回任何记录,则将其插入。否则它只会转到下一条记录。

如果您有一个唯一的索引:


如果您有唯一的索引,则:


在同一类型的第二个缓冲区上使用setTmpData方法

例如:

SomeTable someTable;
TmpTable  tmpTable;
TmpTable  tmpTableCheck;

// Use tmpTable as primary data set, and tmpTableCheck to check for duplicates
while select someTable
{
     tmpTable.initFromSomeTable(someTable);

     // Check if key is already used.
     tmpTableCheck.setTmpData(tmpTable);
     select firstOnly tmpTableCheck
         where tmpTableCheck.Key == tmpTable.Key;

     // Only insert record in tmpTable if the key has not been used before.
     if (! tmpTableCheck)
     {
          tmpTable.insert();
     }
 }

在同一类型的第二个缓冲区上使用setTmpData方法

例如:

SomeTable someTable;
TmpTable  tmpTable;
TmpTable  tmpTableCheck;

// Use tmpTable as primary data set, and tmpTableCheck to check for duplicates
while select someTable
{
     tmpTable.initFromSomeTable(someTable);

     // Check if key is already used.
     tmpTableCheck.setTmpData(tmpTable);
     select firstOnly tmpTableCheck
         where tmpTableCheck.Key == tmpTable.Key;

     // Only insert record in tmpTable if the key has not been used before.
     if (! tmpTableCheck)
     {
          tmpTable.insert();
     }
 }

问题是,;此查询无法捕获记录。选择DestTable,其中DestTable.Field1==SourceTable.Field1//替换为确定记录是否相同的条件}对于使用临时数据源的报表,我使用类似的方法,其中数据是从一个或多个源编译的。在我的例子中,我使用它作为一个开关来确定是否需要插入(新记录)或更新(现有记录)。在我的应用程序中,这确实有效。您是否有循环的代码片段,以便我们可以查看实际应用程序;此查询无法捕获记录。选择DestTable,其中DestTable.Field1==SourceTable.Field1//替换为确定记录是否相同的条件}对于使用临时数据源的报表,我使用类似的方法,其中数据是从一个或多个源编译的。在我的例子中,我使用它作为一个开关来确定是否需要插入(新记录)或更新(现有记录)。在我的应用程序中,这确实有效。您是否有循环的代码片段,以便我们可以查看实际应用程序?此//检查键是否已被使用。设置tmpdata(tmpTable);帮了我很多忙,谢谢。这个//检查钥匙是否已经用过了。设置tmpdata(tmpTable);帮了我很多忙,谢谢。