获取包含多个表中的字段的查找

时间:2015-01-07 22:34:59

标签: axapta lookup microsoft-dynamics dynamics-ax-2012

我有3张桌子Ram,Sam,Dun

Ram Table有字段

RAMItemCode RamItemDescription RamItemStatus(活动/非活动)Recid

R1 Rest1 Active RRec1

R2 Rest2 Inactive RRec2

R3 Rest3 Active RRec3

Sam Table有字段

SamItem SamStatus Recid

s1 Active srec1

s2 Active srec2

S3 Inactive srec3

Dun Table有3个字段

Sam Ram状态

Srec1 RRec1有效 - (由于s1和r1均处于活动状态,因此处于活动状态)

Srec1 RRec2无效(由于s1处于活动状态且r2处于非活动状态,因此处于非活动状态)

Srec2 RRec1有效(因为S2,R1都有效)

Srec2 RRec3有效(因为S2和R3都有效)

如果两者在Sam字段中都处于活动状态,而表Dun中的Ram字段则只有状态将在Dun表状态字段中处于活动状态。否则,如果Sam或Ram中的其中一个处于非活动状态,它将始终处于非活动状态。 - 规则

如果我在Ram表或SAm表中更改状态,相应的字段状态也将根据Dun表中的​​规则进行更改。

现在我有两个字段

山姆 -

拉姆 -

以未绑定控件的形式。

我正在从SAM Table查找Sam字段。现在我从Sam master的查找中选择了Sam field。 现在在第二个字段ram中我需要查找RamItemCode,它与第一个字段中选择的sam和DUN Table中的状态有关。

Dun Table有3个字段

Sam Ram状态

Srec1 RRec1有效 - (由于s1和r1均处于活动状态,因此处于活动状态)

Srec1 RRec2无效(由于s1处于活动状态且r2处于非活动状态,因此处于非活动状态)

Srec2 RRec1有效(因为S2,R1都有效)

Srec2 RRec3有效(因为S2和R3都有效)

例如:如果我在表单的第一个字段中选择S1。 Ram查找应包含R1,R2,如上表所示.Srec1具有RRec1,RRec2与状态为Active和Inactive相关。所以我需要在查找RAMItemCOde中显示RRec1,RRec2以及状态(来自DUn表的状态)如下所示。 山姆:S1

Ram:R1活跃

   R2  Inactive.

多数民众赞成我的情景。你能帮我么。提前致谢。希望这很清楚。如果需要更多信息,请告诉我。感谢。

2 个答案:

答案 0 :(得分:1)

首先让我重新解释一下您的问题,以确保我理解:表RamSam具有由表Dun定义的n:m关系。在第一次查找中,您可以从表Sam中选择一个值。您的第二次查找现在应该显示表Ram中的所有可能值以及表Dun中的状态字段。所以基本上你想在一个表(Dun)上进行查找,但返回值应该来自另一个表(Ram)。

您可以使用第二个查找字段的表单控件的查找方法中的以下代码来实现此目的。但首先你需要下载并导入Ivan Kashperuk的xpo,它将为你提供新的课程SysMultiTableLookup。您还应将第一个查找控件(在我的代码中名为AutoDeclaration)的属性SamLookup设置为"是"。现在您可以编写以下代码:

public void lookup()
{
    Sam                  sam;
    Query                query = new Query();
    QueryBuildDataSource qbds;
    QueryBuildRange      queryBuildRange;
    SysTableLookup       sysTableLookup;
    SysMultiTableLookup  sysMultiTableLookup;

    // retrieve the RecId of the Ram record selected in the first lookup
    select firstOnly RecId from sam where sam.ItemCode == samLookup.valueStr();

    // build the query on the relation table Dun joined to the Sam table and filtered
    // to the records available for the selected Ram record
    qbds = query.addDataSource(tableNum(Dun));
    qbds.addRange(fieldNum(Dun, Sam)).value(queryValue(sam.RecId));
    qbds = qbds.addDataSource(tableNum(Ram));
    qbds.relations(true);

    // Build the lookup
    sysMultiTableLookup = SysMultiTableLookup::newParameters(this, query);
    sysMultiTableLookup.addLookupfield(fieldNum(Dun, Status));
    sysMultiTableLookup.addLookupField(fieldNum(Ram, ItemCode), 2, true); // 2 for second data source of query, true to use this field as return value of lookup

    sysMultiTableLookup.performFormLookup();
}

Example xpo

答案 1 :(得分:0)

有很多方法可以做到这一点,虽然我发现这里最简单的方法是多桌看起来的链接:

  1. 多表的单表查找: Mutli Table Lookup - Single Table Lookup with Multiple Table

  2. 多表查找多表: Multi Table Lookup - Multiple Table Lookup With Multiple Table

  3. 希望你觉得它很有用:)