【问题标题】:Access SQL "Where" Clause for Textbox on Form访问表单上文本框的 SQL“Where”子句
【发布时间】:2020-07-07 18:28:42
【问题描述】:

我正在修改其他人开发的 VBA 代码,并且在表单上添加“Where”子句时遇到了困难。由于我是 SQL 新手,我感谢任何帮助。

我有一个表tbl_FC_Data,其中包含显示零件需求预测的数据行。它有超过 43k 条记录。每条记录都是针对特定公司 (Company_Code) 的 Part_Number 的预测,即 Date_of_Forecast 提供的预测。下面是一个包含数据样本的表格。

Part_Number     Data_Month  Qty     Company_Code  Date_of_FC
AN565B8H4       1/1/2020    35      WAL2         12/11/2019
AN565B8H4       2/1/2020    1095    WAL2         12/11/2019
02-14-202-11    12/1/2019   20      D17          12/4/2019
02-14-202-11    1/1/2020    10      D17          12/4/2019
02-14-202-11    5/1/2020    1       D17          12/4/2019
02-14-202-11    6/1/2020    1       D17          12/4/2019
435W2151-49A    7/1/2020    40      API1         6/16/2020
02-14-202-11    6/1/2020    50      EAIL1        6/1/2020
02-14-202-11    7/1/2020    1       EAIL1        6/1/2020
02-14-202-11    1/1/2020    50      CZS1         12/19/2019
02-14-202-11    1/1/2020    50      CZS1         1/30/2020

Access 表单包含两个列表框,第一个列出表中所有数据的公司 (lstCriteriaCompany),第二个包含表中所有记录的预测日期列表 (lstCriteriaDate_Of_Fc)公司。

列出表中所有预测日期的现有 VBA/SQL 代码是:

Me.lstCriteriaDate_Of_Fc.RowSource = "SELECT '#' & Format(D.Date_of_FC,'yyyy-mm-dd') & '#' AS IN_LIST_VALUE, " & _
                                               "Format(D.Date_of_FC,'mm/dd/yyyy') AS DATE_OF_FORECAST " & _
                                               "FROM (SELECT DISTINCT tbl_FC_Data.Date_of_FC FROM tbl_FC_Data) AS D"

它会生成以下预测日期列表:

12/4/2019
12/11/2019
12/19/2019
1/30/2020
6/1/2020
6/16/2020

我的目标是,当用户点击第一个文本框中的公司时,On Click 代码 (Me.lstCriteriaDate_Of_Fc.RowSource = ...) 在第一个文本框中显示与所选公司相关的预测列表.例如,如果选择 CZS1,那么列出预测的文本框将更改为:

12/19/2019
1/30/2020

这里是我添加Where 子句的地方。它返回零记录而不是我预期的两条记录。执行代码时会弹出一个对话框,询问D.Company_Code 的参数值。

Me.lstCriteriaDate_Of_Fc.RowSource = "SELECT '#' & Format(D.Date_of_FC,'yyyy-mm-dd') & '#' AS IN_LIST_VALUE, " & _
                                               "Format(D.Date_of_FC,'mm/dd/yyyy') AS DATE_OF_FORECAST " & _
                                               "FROM (SELECT DISTINCT tbl_FC_Data.Date_of_FC FROM tbl_FC_Data) AS D " & _
                                               "Where D.Company_Code= '" & Me.lstCriteriaCompany.Column(0) & "'"

我也尝试了HAVING tbl_FC_Data.Company_Code = Me.lstCriteriaCompany.Value,但出现 SQL 错误。

感谢您提供的任何 SQL 帮助。

【问题讨论】:

  • 你说“两个文本框”和“第一个文本框”,是指“列表”而不是文本吗?
  • 是的,它是一个列表框。对不起@June7

标签: sql vba ms-access


【解决方案1】:

引用列表框选择与其他数据控件有很大不同。通过按索引引用列来提取所选项目的所需值,即使值在索引 0 的第一列中也是如此。

Me.lstCriteriaCompany.Column(0)

将此引用连接到 SQL 字符串。

【讨论】:

  • 实际上我必须从lstCriteriaCompany 列表框中提取Company_Code。因此我的WHERE 子句使用字符串变量。
  • 通过索引引用您想要的任何列。
  • @June17 我可以使用Me.lstCriteriaCompany.Column(0) 访问Company_Code。当我将Where (D.Company_Code = Me.lstCriteriaCompany.Column(0)) 添加到 RowSource 代码的末尾时,我得到零记录,而不是上面示例中我期望的两条记录。
  • 连接变量。对表单控件的引用是一个变量。 Company_Code 在哪一列? "Where D.Company_Code ='" & Me.lstCriteriaCompany.Column(x) & "'"
  • 当我添加 Where 子句时,我得到零记录返回。我已将代码添加到上面的问题陈述中。
【解决方案2】:

我发现Where 子句需要成为SELECT DISTINCT 子句的一部分。这是有效的代码:

Me.lstCriteriaDate_Of_Fc.RowSource = "SELECT '#' & Format(tbl_FC_Data.Date_of_FC,'yyyy-mm-dd') & '#' AS IN_LIST_VALUE, " & _
                                               "Format(tbl_FC_Data.Date_of_FC,'mm/dd/yyyy') AS DATE_OF_FORECAST " & _
                                               "FROM (SELECT DISTINCT tbl_FC_Data.Date_of_FC FROM tbl_FC_Data " & _
                                               "Where tbl_FC_Data.Company_Code = " & Me.lstCriteriaCompany.Column(0) & ");"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2017-07-22
    • 2013-04-06
    相关资源
    最近更新 更多