我有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.
多数民众赞成我的情景。你能帮我么。提前致谢。希望这很清楚。如果需要更多信息,请告诉我。感谢。
答案 0 :(得分:1)
首先让我重新解释一下您的问题,以确保我理解:表Ram
和Sam
具有由表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();
}
答案 1 :(得分:0)
有很多方法可以做到这一点,虽然我发现这里最简单的方法是多桌看起来的链接:
多表的单表查找: Mutli Table Lookup - Single Table Lookup with Multiple Table
多表查找多表: Multi Table Lookup - Multiple Table Lookup With Multiple Table
希望你觉得它很有用:)