DLookUp用于比较一个表到另一个表的参数

时间:2014-02-22 02:18:37

标签: ms-access ms-access-2010

好的,我知道这个问题已经有了答案但是,我似乎无法让它运作起来!所以我需要帮助。

这是查找代码:

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

任何人都可以帮忙指出我的错误吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

我认为这里有一些问题:

  1. 您的“域名”(使用DLookup术语)涵盖了两个表,DLookup假设一个 - 如果有多个源表,则需要先构建查询并使用对于域名。

  2. DLookup返回一个值(比如说)填充一个文本框,但是你当前的代码似乎是想要返回一组值来(例如)填充一个列表框。如果您的意图是使用表单中所选记录的计算值填充文本框,则标准需要包含要匹配的主键值。

  3. 正如您所报告的那样,目前尚不清楚这两个表是否确实具有主键。 为了获得有意义的答案,我假设Supportive_Soil_Analysis有一个名为AnalysisID的自动编号字段作为主键。

  4. 目前还不清楚当Supportive_Soil_Analysis中有多个记录PHMin内有Max时,您想要做什么某个Placement。例如,您想要返回多行吗?或者也许你只想要一个匹配,如果有必要,选择一个具有最高PH的匹配?为简单起见,我将假设前者。

  5. 把事情放在一起,我认为您需要创建一个新查询,立即进入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]列。