使用SQL在查询中引用表单上的字段

时间:2014-02-19 13:26:28

标签: sql ms-access ms-access-2007

我有一个Access 2007数据库,它将是包含多个产品的物料清单的住房表。在主窗体上,我希望用户能够选择其中一种产品 - 好的,简单的。现在,我想要在从下拉列表中选择产品后按下按钮后运行两个查询。第一个查询是一个简单的删除查询,用于删除表中的所有信息。第二个查询是我遇到SQL语法问题的地方。我希望将静态表中的信息附加到删除查询刚删除所有内容的表中。

现在,每个包含每种产品物料清单的表都标有产品名称。所以我希望下拉列表(combo0)成为SQL字符串中FROM子句中表名的引用点。代码如下:

INSERT INTO tblTempSassyInfo (Concat, TableName, AddressName, PartNumber, [L/R], FeederSize, QtyPerBoard, SASSYname, RawBoard)
SELECT TableName & AddressName & PartNumber, TableName, AddressName, PartNumber, [L/R], FeederSize, QtyPerBoard, SassyName, RawBoard
FROM [FORMS]![DASHBOARD]![Combo0];

因此,您可以看到我尝试在表单下拉列表中引用产品名称作为表名称。如果可能,请告诉我。

5 个答案:

答案 0 :(得分:1)

“...我正在尝试在表单下拉列表中引用产品名称作为表名。如果可能,请告诉我。”

Access SQL无法实现。

db引擎只能接受实际的表名---它不能引用表单控件来查找表名,也不接受任何其他类型的参数来获取表名。

您可以更改查询以包含组合的值作为表名,然后在更新事件后从组合中重写SQL。

"SELECT * FROM [" & [FORMS]![DASHBOARD]![Combo0] & "]"

类似的方法可以让Access满意。但它可能不适合您的应用程序。

答案 1 :(得分:1)

因此,用户基本上希望运行2个查询。 DELETE * FROM Table查询和Append查询。用户想要通过使用Combobox知道要用于Append查询的表(可能只是我的假设/解释)。话虽如此,为什么不使用以下内容:

If IsNull(Me.[Combo0].Value) Then
    MsgBox "Please select something."
    Me.[Combo0].SetFocus
    Cancel = True
Else
   Select Case Me.Form!Combo0
       Case 1
           DoCmd.OpenQuery "DeleteMaterialsTableData" 'Query to delete appropriate table data dependent on Combobox selection'
           DoCmd.OpenQuery "QueryNameMaterial1" 'Append records to appropriate table dependent on Combo0 selection'
       Case 2
           DoCmd.OpenQuery "DeleteMaterialsTableData" 'Query to delete appropriate table data dependent on Combobox selection'
           DoCmd.OpenQuery "QueryNameMaterial2" 'Append records to appropriate table dependent on Combo0 selection'

这只是试图使用用户的组合框值来确定运行查询的表,而不是用户尝试将Combobox的值用作表名。

答案 2 :(得分:1)

您按下按钮即可执行此操作。这意味着某些VBA代码在场景后面运行(按钮的Click事件)。在这种情况下,答案是肯定的。

Dim strSQL as String
Dim strSQL2 as String

strSQL = "DELETE * FROM tblTempSassyInfo;"
DoCmd.RunSQL (strSQL)

strSQL2 = "INSERT INTO tblTempSassyInfo (Concat, TableName, AddressName, PartNumber, [L/R], FeederSize, QtyPerBoard, SASSYname, RawBoard)
SELECT TableName & AddressName & PartNumber, TableName, AddressName, PartNumber, [L/R], FeederSize, QtyPerBoard, SassyName, RawBoard
FROM " & [FORMS]![DASHBOARD]![Combo0].SelectedValue & ";"
DoCmd.RunSQL (strSQL2)

你可能需要调整一下,但它应该让你非常接近。

你可能需要使用[FORMS]![DASHBOARD]![Combo0] .Columns(0)或Columns(1)代替,我不记得......

答案 3 :(得分:0)

如上所述;访问(以及任何品牌数据库)肯定可以添加和删除查询。

问题在于设计。特别: FROM [FORMS]![DASHBOARD]![Combo0];

From子句必须是记录集(表),而不是对表单上的控件的调用。

我的建议是首先建立一个具有您想要追加的正确数据的Select查询。用名字保存。你需要先做到这一点。

完成后 - 然后创建一个使用保存的Select查询作为其起始记录集的追加查询。

然后,您只需要在按钮点击事件后面使用vba触发追加查询(选择查询将自动运行): Docmd.OpenQuery“追加查询名称”

答案 4 :(得分:-1)

根据我的经验,这在MS Access 2010中可以100%实现。我没有使用2007年,但MS表示有可能(见下面的链接)。我在几个数据库中使用参数化查询。

PARAMETERS  [forms].[dash].[dt_val] DateTime; 
SELECT a.F3 AS AdEnt, [forms].[dash].[dt_val] AS Expr1...

我发现重要的是使用用户将与之交互的表单并将日期设置为" DateTime"在参数内。以下是来自Microsoft的视频,其中显示了如何应用于2007年。

Use Parameters in MS Access Queries

此外,如果要执行删除或追加,请将其另存为查询,然后在执行docmd.runquery的表单上放置一个按钮,以获取该已保存的删除/追加查询的名称。