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

Axapta 获取包含多个表中的字段的查找,axapta,lookup,microsoft-dynamics,dynamics-ax-2012,Axapta,Lookup,Microsoft Dynamics,Dynamics Ax 2012,我有三张桌子,拉姆,萨姆,邓 Ram表有字段 RAMItemCode RamItemDescription RamItemStatus(活动/非活动)Recid R1 Rest1活动RRec1 R2 Rest2非活动RRec2 R3 Rest3活动RRec3 Sam表有字段 SamItem SamStatus Recid s1激活srec1 s2活动srec2 S3非活动srec3 Dun表有3个字段 Sam Ram状态 Srec1 RRec1激活-(由于s1和r1都处于激活状态,因此此为激活状

我有三张桌子,拉姆,萨姆,邓

Ram表有字段

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

R1 Rest1活动RRec1

R2 Rest2非活动RRec2

R3 Rest3活动RRec3

Sam表有字段

SamItem SamStatus Recid

s1激活srec1

s2活动srec2

S3非活动srec3

Dun表有3个字段

Sam Ram状态

Srec1 RRec1激活-(由于s1和r1都处于激活状态,因此此为激活状态)

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

Srec2 RRec1激活(因为S2和R1都激活)

Srec2 RRec3激活(因为S2和R3都激活)

如果Sam字段和Ram字段在表Dun中都处于活动状态,则只有状态在Dun表状态字段中处于活动状态。否则,如果Sam或Ram中至少有一个处于非活动状态,则它将始终处于非活动状态。-统治

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

现在我有两个字段

山姆-

Ram-

在未绑定控件的窗体中

我正在从Sam表中查找Sam字段。现在,我从Sam master的查找中选择Sam字段。 现在在第二个字段ram中,我需要查找RamItemCode,它与第一个字段中选择的sam和DUN表中的status相关

Dun表有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与激活和非激活状态相关。所以我需要在查找代码中显示RRec1、RRec2以及状态(来自DUn表的状态),如下所示。 山姆:S1

Ram:R1激活

   R2  Inactive.

这就是我的设想。你能帮帮我吗。提前谢谢。希望这足够清楚。如果需要更多信息,请告诉我。谢谢。

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

可以使用第二个查找字段的表单控件的查找方法中的以下代码实现这一点。但首先,您需要下载并导入Ivan Kashperuk的xpo,它将为您提供新类。您还应该将第一个查找控件(在我的代码中名为
SamLookup
)的属性
AutoDeclaration
设置为“Yes”。现在,您可以编写以下代码:

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

尽管我发现了一种最简单的方法,但有很多方法可以做到这一点,这里是多表外观的链接:

  • 具有多个表的单表查找:

  • 具有多个表的多表查找:


  • 希望您觉得它有用:)

    通过
    tab3
    您的意思是
    rel
    ?这没有意义:tab2中的一个字段可以包含tab1中的多个记录。另外,第二个项目符号“现在在…”不清楚。也许您可以给出一个带有一些实际数据的示例,以使您的需求更容易理解?您好,当我导入SysMultitablelookup代码时,它给了我一个错误,即addlookupmethod参数\u标签应具有默认值。所以我把它做成了addLookupMethod(xxx,xxx,_label=“”)。正如你所说,我添加了代码,但当我点击查找时,它并没有打开。samlookup.valueStr()值是我们在第一次查找时选择的服务的recid。我没有得到任何查询。下拉菜单没打开,你能帮我吗。谢谢。@Raas:很抱歉耽搁了,我的VM在实现示例时遇到了一些问题。我将这个示例作为xpo附加到我的答案中,请看一看,并将其与您自己的实现进行比较。如果这对你没有帮助,也许你可以上传一个你的实现的xpo,这样我就可以看一看。另外,看看下面问题的答案,他们建议用一种观点来解决这个问题:嗨,当然,我会在今天或明天给你更多的澄清。我仍然无法解决这个问题。请在这些链接中添加简短的说明,以防它们死亡。