好的,我知道这个问题已经有了答案但是,我似乎无法让它运作起来!所以我需要帮助。
这是查找代码:
PH_Stat: DLookUp("[Assumption_Soil_Nutrients_Status]![Status]","Assumption_Soil_Nutrients_Status","Nutrient = 'PH' And [Assumption_Soil_Nutrients_Status]![Placement] = " & [Supportive_Soil_Analysis]![Placement] & " And " & [Supportive_Soil_Analysis]![PH] & " >= [Assumption_Soil_Nutrients_Status]![Min] And " & [Supportive_Soil_Analysis]![PH] & " < [Assumption_Soil_Nutrients_Status]![Max]")
这里的主要思想是根据此表在[Status]列中查找值:
Nutrient Status Placement Min Max
PH H IR 5.5 6.5
PH H PC 5.5 6.5
PH L IR 3.8 4
PH L PC 3.8 4
PH M IR 4.2 5.5
PH M PC 4.2 5.5
PH ML IR 4 4.2
PH ML PC 4 4.2
PH VH IR 6.5 1000
PH VH PC 6.5 1000
PH VL IR 3.5 3.8
PH VL PC 3.5 3.8
PH XL IR 0 3.5
PH XL PC 0 3.5
CEC H IR 18 20
...
这是Supportive_Soil_Analysis表上的记录:
Sub_Block Tahun Placement PH CEC
K13 2009 IR 4.7 5.1
任何人都可以帮忙指出我的错误吗?提前谢谢。
答案 0 :(得分:2)
我认为这里有一些问题:
您的“域名”(使用DLookup
术语)涵盖了两个表,DLookup
假设一个 - 如果有多个源表,则需要先构建查询并使用对于域名。
DLookup
返回一个值(比如说)填充一个文本框,但是你当前的代码似乎是想要返回一组值来(例如)填充一个列表框。如果您的意图是使用表单中所选记录的计算值填充文本框,则标准需要包含要匹配的主键值。
正如您所报告的那样,目前尚不清楚这两个表是否确实具有主键。 为了获得有意义的答案,我假设Supportive_Soil_Analysis
有一个名为AnalysisID
的自动编号字段作为主键。
目前还不清楚当Supportive_Soil_Analysis
中有多个记录PH
和Min
内有Max
时,您想要做什么某个Placement
。例如,您想要返回多行吗?或者也许你只想要一个匹配,如果有必要,选择一个具有最高PH
的匹配?为简单起见,我将假设前者。
把事情放在一起,我认为您需要创建一个新查询,立即进入SQL视图,并输入如下代码:
SELECT Supportive_Soil_Analysis.AnalysisID, Assumption_Soil_Nutrients_Status.Status
FROM Assumption_Soil_Nutrients_Status INNER JOIN Supportive_Soil_Analysis
ON (Assumption_Soil_Nutrients_Status.Placement = Supportive_Soil_Analysis.Placement)
AND (Assumption_Soil_Nutrients_Status.PH >= Supportive_Soil_Analysis.[Min]
AND (Assumption_Soil_Nutrients_Status.PH <= Supportive_Soil_Analysis.[Max])
WHERE Assumption_Soil_Nutrients_Status.Nutrient = 'PH';
我在您的原始代码中使用了<=
而不是<
,因为Min
包含Max
排他性对我来说没有意义,尽管你知道你的数据。也就是说,如果有大量数据,那么在进行连接之前,Nutrient
进行过滤可能会更好。这可以使用第二个嵌套的SELECT语句来完成:
SELECT Supportive_Soil_Analysis.AnalysisID, Details.Status
FROM (SELECT Status, Placement, [Min], [Max]
FROM Assumption_Soil_Nutrients_Status
WHERE Nutrient = 'PH') AS Details INNER JOIN Supportive_Soil_Analysis
ON (Details.Placement = Supportive_Soil_Analysis.Placement)
AND (Details.PH >= Supportive_Soil_Analysis.[Min])
AND (Details.PH <= Supportive_Soil_Analysis.[Max]);
在任何一种情况下,请将查询保存为(例如)Supportive_Soil_Analysis_Status
;然后,文本框的控件来源为=DLookup('Status', 'Supportive_Soil_Analysis_Status', 'AnalysisID=' & AnalysisID
。就个人而言,我宁愿避免DLookup
并将表单设置在另一个查询的顶部,该查询聚合了所有显示的数据:
SELECT Supportive_Soil_Analysis.*, Supportive_Soil_Analysis_Status.Status
FROM Supportive_Soil_Analysis INNER JOIN Supportive_Soil_Analysis_Status
ON Supportive_Soil_Analysis.AnalysisID = Supportive_Soil_Analysis_Status.AnalysisID;
在这种情况下,表单的记录来源将成为您保存第二个查询的内容,而文本框的控制来源只是Status
。
答案 1 :(得分:0)
好吧,不管怎么说......几天后再给它一次,我找到了答案。对于任何挣扎于类似问题的人来说,关键在于在字符串变量之间添加一个撇号(是的,它显而易见,我没有注意到它)。
修复后,这是怎么回事:
PH_Stat: DLookUp("Status","Assumption_Soil_Nutrients_Status","Nutrient = 'PH' And [Assumption_Soil_Nutrients_Status]![Placement] = '" [Placement] & "' And " & [PH] & " >= [Assumption_Soil_Nutrients_Status]![Min] And " & [PH] & " < [Assumption_Soil_Nutrients_Status]![Max]")
由于DLookUp只能使用1个域名(感谢Chris指出这一点),我们需要在查询中创建[PH] ad [Placement]列。