我有一个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];
因此,您可以看到我尝试在表单下拉列表中引用产品名称作为表名称。如果可能,请告诉我。
答案 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的表单上放置一个按钮,以获取该已保存的删除/追加查询的名称。