在一个文本字段中基于具有多个条件的表单进行查询

时间:2019-07-01 14:35:37

标签: ms-access

我现在还很陌生,我正在研究一个数据库来管理几种产品的物料清单(BOM)。我想创建一个表单,用户可以在其中输入组件名称列表,以查看这些组件的使用位置。

基于一个单词运行查询很简单,但是我很难将其扩展到一个以上的单词。 我希望用户输入用新行分隔的组件,如下所示:

<value>

如果我按原样使用文本字段,则查询将找不到任何内容,因为它将文本字段作为一个整体而不是逐行显示。

我试图将文本字段处理到ListBox中,因为我认为它将像数组一样处理,但是它没有"Item1";"Item2";"Item3",因此不会返回任何搜索结果。

我的下一个尝试是使用第二个文本字段,在那里我可以将信息格式化为in格式,以便可以在in ("Item1";"Item2";"Item3")语句中使用它。

如果我直接输入:

HelpText

在查询条件中,它将按预期运行,但是,如果我尝试像这样引用"Item1";"Item2";"Item3"(其中包含:In ([Forms]![Search_mult_component]![HelpText])

("Item1";"Item2";"Item3")

然后我没有结果。我也尝试过格式化文本以包括括号,例如android:usesCleartextTraffic

正如我所提到的,我只是开始了解Access,因此我不确定这是否是一个好习惯,还是不确定是否试图通过一种稍微不同的方法以简单的方式完成某些事情。

谢谢您的支持!

3 个答案:

答案 0 :(得分:0)

不能。就像表名和字段名一样,在查询运行之前,必须存在IN语句的值字符串。

您唯一的选择是动态编写SQL字符串,例如,创建一个传递SQL的临时查询。

答案 1 :(得分:0)

使用列表框表示选择标准是一种很好的方法,因为它将允许用户选择并操纵多个项目作为不同的元素,而不必担心定界符等问题。

但是,我建议不要使用列表框来填充基础表,而不是尝试访问列表框的 value ,然后可以将其连接到查询中的相关字段,导致自动过滤结果,而无需使用where子句。

答案 2 :(得分:0)

在@Lee Mac提供火花之后,我设法解决了问题! 我创建了一个表TempTable来存储输入值,以后我可以在查询中使用该表。不过仍然需要一些代码!
在表单中,我使用了一个文本框,其中包含问题中定义的多行数据和一个用于运行查询的按钮。因此,步骤在文本框本身和按钮之间有些分开。
文本框为AfterUpdate事件提供了以下代码:

Private Sub search_text_AfterUpdate()
Dim TempTable As DAO.Recordset
Dim i As Integer
Dim allNums() As String

' ======= Open table =======
Set TempTable = CurrentDb.OpenRecordset("SELECT * FROM [TempTable]")

' ======= Clear table =======
DoCmd.SetWarnings False                 'Disable warnings. If not disabled the user will be prompted to confirm the delete
DoCmd.RunSQL "DELETE * FROM TempTable"  'SQL statement used to delete all entries from a table
DoCmd.SetWarnings True                  'Enable warnings

' ======= Process multiline text =======
allNums = Split(search_text.Value, vbNewLine)                       'Split the multiline text

For i = LBound(allNums) To UBound(allNums)                          'process line by line
      If (StrComp(Trim(allNums(i)), "", vbTextCompare) > 0) Then    'Check if current text is empty string
          TempTable.AddNew                                          'Add new Record to table
          TempTable![ToSearch] = (Trim(allNums(i)))                 'Fill in the text, trim whitespaces
          TempTable.Update                                          'Update Table. Seems to be necessary for changes to take effect
      End If
Next i

' ======= Clean up and close table =======
TempTable.Close                                                     'Close the table

Set TempTable = Nothing                                             'No idea why this is needed :D

' ======= Refresh table =======
'DoCmd.SelectObject acTable, "TempTable"
'DoCmd.Requery
'DoCmd.GoToRecord acDataTable, "TempTable", acLast

End Sub

此代码负责清除表TempTable并用新输入填充它。 TempTable有两列IDToSearch,其中ID是表的主键,ToSearch将使用文本框的输入进行填充。我在测试过程中看到,当删除表中的条目时,新项在添加时仍将收到新密钥,这让我感到担心,因为密钥有时会用完。这是将来的问题,但是如果您对此有任何建议(例如,从桌子上拔出钥匙或东西),请告诉我。
用户在文本字段上单击Enter后,代码将运行,但需要表格的Requery才能生效!这包含在Button宏中:
首先,选择表对象,然后运行重新查询。之后,我关闭表并打开实际的查询,还需要重新查询以显示正确的更新值。
使用此解决方案,我不必去深入研究SQL就能做我打算做的事情。
一如既往,我感谢您的评论!