我被告知(并同意)最好替换现有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..
请回答如何使第二个块中的代码实际执行指定的SQL语句并构建所需的表。
我知道如果我删除了一个查询,我必须重新生成它。是啊。我知道,如果我能让Set语句正确地用所需的sql覆盖以前的sql,那么我“应该”能够重用相同的查询。
我知道你们都想提供一个答案,但请让它成为我提出的问题的答案。
发布于 2019-12-11 01:11:36
如果您不删除该对象,则可以将其回收:
' On Error Resume Next
Set QD = db.QueryDefs("qryX")
QD.SQL = mySQL
DoCmd.RunSQL "SELECT * INTO tblDocsCrossTabX FROM qryX;"发布于 2019-12-11 18:23:45
如果可以使用子查询,则可以使用临时查询,而不是麻烦地检查QueryDef是否已经存在,只需组合SELECT和INSERT- QueryDef来使用临时QueryDef
不幸的是,您不能在子查询中使用Transform,因此这段代码会导致Runtime-Error 3129 Invalid SQL statement。
Sql = "SELECT * INTO tblDocsCrossTabX FROM (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])"
With CurrentDb.CreateQueryDef(vbNullString) 'or db.CreateQueryDef("") creates a not named and therefore temporary QueryDef
.SQL = Sql
.Execute dbFailOnError
End With发布于 2019-12-14 05:51:27
解决了。
在第一段代码中,当我删除并重新创建查询时,字符串querydef包含一个有效的SQL语句,因此,当我使用SET完全重新创建mySql时,Access可以将它赋给querydef。具体来说,
mySql = "Transform..."在此之前
Set QD = db.CreateQueryDef("qryX", mySql)在第二组代码中,当使用set命令时,字符串mySql只包含一个空格,因为“”不是有效的SQL语句,Set命令甚至不会被执行,QueryDef QD甚至也不会被创建。
具体地说,第二个代码中的错误是因为
mySql = " " 'NOT a valid SQL Statement在尝试创建queryDef之前出现
Set QD = db.CreateQueryDef(("qryX"), mySql) 'QD never gets created because mySql is not valid SQL防止以后分配有效的SQL语句,因此不会创建表。
https://stackoverflow.com/questions/59272287
复制相似问题