我被告知(并且同意)最好替换现有 querydef 中的 SQL,而不是每次查询需要更改时删除并重新定义 querydef。但我的代码似乎只能以第二种方式工作。这是我有效的代码:
Dim db As Database
Set db = CurrentDb
Dim QD As QueryDef
Dim mySql As String
mySql = ""
mySql = "TRANSFORM COUNT(tblDocs.Document) AS CountOfDocument " & _
"SELECT tblDocs.[Contractor Dept], " & _
"COUNT(tblDocs.Document) AS [Total Of Document] " & _
"FROM tblDocs " & _
"GROUP BY tblDocs.[Contractor Dept] " & _
"PIVOT tblDocs.[Engineering Status Code]"
On Error Resume Next
db.QueryDefs.Delete "qryX" 'Remove temporary query if exists
Set QD = db.CreateQueryDef("qryX", mySql) 'create temporary query
DoCmd.RunSQL "SELECT * INTO tblDocsCrossTabX FROM qryX;"
这是我无法工作的代码
Dim db As Database
Set db = CurrentDb
Dim QD As QueryDef
Dim mySql As String
mySql = " "
Set QD = db.CreateQueryDef(("qryX"), mySql)
mySql = "TRANSFORM COUNT(tblDocs.Document) AS CountOfDocument " & _
"SELECT tblDocs.[Contractor Dept], " & _
"COUNT(tblDocs.Document) AS [Total Of Document] " & _
"FROM tblDocs " & _
"GROUP BY tblDocs.[Contractor Dept] " & _
"PIVOT tblDocs.[Engineering Status Code]"
QD.SQL = mySQL 'overwrite query SQL
DoCmd.RunSQL "SELECT * INTO tblDocsCrossTabX FROM qryX;"
奇怪的是,第二个版本没有向我抛出任何错误,但它根本没有创建交叉表。
编辑:也许我还不够清楚。问题是第二组代码确实如此。不是。执行。这。 SQL。如果它执行了代码,我很乐意一遍又一遍地重写并使用相同的临时查询,但事实确实如此。不是。执行。这。 SQL..
请回答如何使第二 block 中的代码真正执行指定的SQL语句并构建所需的表。
我知道如果删除它,我必须重新进行查询。呃。
我知道如果我能让 Set 语句用所需的 sql 正确覆盖以前的 sql,我“应该”能够重新使用相同的查询。
我知道你们都想提供答案,但请回答我所提出的问题。
最佳答案
如果不删除该对象,则可以回收该对象:
' On Error Resume Next
Set QD = db.QueryDefs("qryX")
QD.SQL = mySQL
DoCmd.RunSQL "SELECT * INTO tblDocsCrossTabX FROM qryX;"
关于mysql - 如何在 QueryDef 中重新定义 SQL?我有通过删除并重新创建 QueryDef 来工作的代码,但我无法让覆盖工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272287/