表单中来自组合框的参数的MS Access查询不会返回任何结果

时间:2018-03-05 09:58:05

标签: vba ms-access parameters combobox

我创建了一个包含多个表和查询的MS Access数据库,但下面描述的问题是关于以下内容:

  • tEmployee 表包含员工数据,顾名思义。

  • tCases 表包含有关法庭案件的数据。

  • 每个案例只能分配给一名员工。我创建了从[tCases]![assignedTo]字段到 tEmployee 的关系。

  • fSearches 是在案例中执行搜索的表单。它包括一个从[tEmployee].[surname]填充的组合框 cEmployee 和一个执行搜索的命令按钮。

目标:要选择[fSearches]![cEmployee]中的员工,请点击按钮,然后以另一种名称​​ fResultsCases 的形式显示分配给该员工的所有案例。

这是按钮的代码,其中注释中的行是我尝试过的一些内容:

If cEmploee.ListIndex = -1 Then
     MsgBox "You have to select employee to perform search.", title:="Missing value!"
Else
     tHidden2.SetFocus
     tHidden2.Text = "assigned to " & cEmploee & "."
     DoCmd.OpenForm "fResultsCases"

     'Forms("fResultsCases").RecordSource = "SELECT * FROM tCases WHERE [tCases]![assignedTo] like [Forms]![fSearches]![cEmploee];"

     'Forms("fResultsCases").RecordSource = "SELECT * FROM tCases WHERE tCases .[assignedTo] = [Forms]![fSearches]![cEmploee];"

     Forms("fResultsCases").RecordSource = "SELECT * FROM tCases WHERE [assignedTo] = [Forms]![fSearches]![cEmploee];"

     Forms("fResultsCases").Recalc
End If

如上所述,我得到以下内容:

  • [fResultsCases]会打开,但不会返回任何案例。

  • 我尝试省略WHERE子句,[fResultsCases]按预期返回所有案例。

  • 然后,我尝试通过使用一个参数创建一个简单的查询并获得完全相同的结果来缩小范围以理解问题。

     
    SELECT tCases.[case number], tCases.subject, tCases.fromDt, tCases.toDt, 
           tCases.assignedTo, tCases.[date assigned], tCases.[date completed]
    FROM tCases
    WHERE (((tCases.assignedTo)=[Forms]![fSearches]![cEmploee]));
    

在组合框值方面,我似乎错过了关于WHERE子句的一些内容,但我无法弄明白。我是MS Access的新手。任何帮助将非常感激。

更新

cEmploee rowsource属性SELECT [tEmployee].surname FROM tEmployee ORDER BY [surname];

cEmploee绑定列属性:1

2 个答案:

答案 0 :(得分:2)

我无法重新创建您的问题,使用触发更新表单记录源的combox复制您的设置。并且因为既没有出现错误也没有出现参数输入提示,WHERE子句可能返回False(即没有匹配的记录),因此不会返回任何行。

原因可能是由于组合框 [表格]![f搜索]![cEmploee] 显示员工的姓氏但绑定到唯一ID作为Access'的默认设置。组合框(如果使用向导)。在设计视图中查看组合框属性的数据选项卡。

此隐藏绑定字段的原因是用户永远不知道记录的唯一ID但确实知道值(即名称)。因此,当他们选择识别的名称时,他们实际上是在选择相应的唯一ID。因此,请考虑相应地调整WHERE条件,其中 ID 是与组合框的绑定字段匹配的唯一表ID字段。

Forms("fResultsCases").RecordSource = "SELECT * FROM tCases WHERE [ID] = [Forms]![fSearches]![cEmploee];"

Forms("fResultsCases").Recalc
Forms("fResultsCases").Form.Requery   ' USUALLY THE RECORDSOURCE UPDATE CALL

答案 1 :(得分:0)

经过大约十天的挣扎"有了这个脑筋急转弯,我决定发布这个问题来寻求帮助。 Fortunatelly @Parfait参与了我的问题,他/她的准确言论帮助我理解了我的错误。它也帮助了我Ken Sheridan's post here。所以我发布我的答案仅供将来参考。 @Parfait,我真诚地感谢你的时间。

因此,本案中的问题主要是了解表之间的关系如何影响数据类型。如果要将 tableA textfield 连接到 tableB ,则有两种情况。如果 tableB 中的主键是数字,则 textfield 将变为数字。如果 tableB 中的主键是文本,则 textfield 仍为文本。

就我而言,这是第一个。具体而言,在创建与表[tCases]![assignedTo]的关系后,字段[tEmployee]会自动转为数字(它仍会显示姓氏,但在tEmployee中包含相应的主键)。相反,组合框[cEmploee]仍包含文本。这就是为什么这一行:

Forms("fResultsCases").RecordSource = "SELECT * FROM tCases WHERE [assignedTo] = [Forms]![fSearches]![cEmploee];"

没有回复@Parfait成功猜到的任何记录。

此时有两种可能的解决方案:

1)将姓氏设置为主键以同意组合框内容。

  • 删除[tCases]![assignedTo][tEmployee]之间的关系。
  • 将字段[tEmployee]![surname]文本)设置为表[tEmployee]中的主键。
  • [tCases]![assignedTo][tEmployee]之间建立新关系。

我没有尝试过这个解决方案,因为如果2名员工的姓氏相同,就会出现问题。所以我建议关注第二个。

2)保持相同的主键并使用它来匹配tableA中的记录和tableB中的姓氏。

要实现这一点,您必须通知访问,您希望tableA中具有ID的记录,而在tableB中,此ID对应于组合框中插入的姓氏(希望这是有意义的)。换句话说,创建两个表的记录集(联合查询)。为此,我用以下内容替换了上面提到的代码行:

Forms("fResultsCases").RecordSource = "SELECT tCases.* FROM tCases INNER JOIN tEmployee ON tCases.[assignedTo] = tEmployee.[employeeID] " & _
"WHERE tEmployee.[surname]=[Forms]![fSearches]![cEmploee] AND tCases![assignedTo]=[tEmployee]![employeeID];"

希望这可以节省其他人的时间。祝你有愉快的一天!