我问了一个类似于此前的问题(How to use RecId as a foreign key in a form),但是想在更复杂的情况下进一步探讨它。
当您设置索引并允许重复项设置为no时,替换键很有用,但它们似乎根本不适用于多字段索引或者允许重复项设置为yes。
是否可以通过编程方式在不使用替换密钥的情况下使用已翻译的值替换网格中的外键?我尝试编写一个显示方法来覆盖字段,但是产生了一些奇怪的行为 - 字段在网格中移动,并且显示方法不知道要使用哪一行,因此整个列中的所有值都是相同的。
表A:Bob:1,Sally:1,Sue:3 表B:1:苹果,2:苹果,3:橙子 “人民”与他们最喜欢的“食物”相关联,食物RecId,在人民表中引用。假设其他列中有其他数据使这些记录唯一,因此无法合并“1:Apples”和“2:Apples”。
似乎应该有一种方法来编写显示方法来覆盖网格中的字段值。有什么建议?示例代码?
由于
答案 0 :(得分:4)
首先,代理FK替换确实(或至少应该)使用复合键(例如,{名字,姓氏})。
其次,您声明“其他列中的附加数据”使这些记录成为唯一的...那么为什么这些列不与食物名称组合以形成备用键?数据模型似乎不正确(或者至少某些元数据不符合您所声明的条件)
第三,可以选择任何字段组作为参考组控件上的ReplacementFieldGroup。仅此一项就可以让你基本上做任何你想做的事。也就是说,我强烈建议您尽可能使用备用密钥作为替换字段组,因为代理FK替换的语义。
流程:
1)用户在参考组中键入一个值。
2)用户的标签输出。
3)用户输入的值用于在相关表中查找记录。
4a)如果用户输入的值被唯一地映射到选择记录的记录,否则,
4b)如果用户键入的值不唯一,则会显示查询以允许用户选择他们“意味着”的记录。请注意,查找必须提供一组唯一可识别的记录,以便用户知道要选择的记录(如果记录在查找中看起来都相同,那么他们就不知道他们应该选择什么。)< / p>
5)成功解决键入的值后,记录将在源表单上重新设置。
鉴于此流程,很明显如果表上没有唯一索引(键),则步骤3-5将被破坏。 (如果记录无法唯一标识(假设您不想向用户显示RecId),用户应该如何指定对记录的唯一引用?)
在您决定仍希望使用非唯一索引作为替换字段组的特殊情况下,必须实现resolveReference和lookupReference,以便为用户提供独特的解析/查找体验(处理上述流程中的步骤3-5)。注意:此常见用例是希望有效地消除非选择性字段在参考组中的显示,而是让某些外部上下文或模式隐式设置该值。例如,如果备用键是{Size,Color},则可能使“Color”成为全局表单上下文 - 可能是让用户在表单顶部选择一种颜色 - 并且只允许用户输入Size参考组...然后可以通过resolveReference和lookupReference覆盖隐式添加颜色。