【问题标题】:Running combination of multiple normal and crosstab queries in access through VBA通过 VBA 在访问中运行多个普通查询和交叉表查询的组合
【发布时间】:2016-01-30 05:18:07
【问题描述】:

我想在 Access 中同时运行多个交叉表和普通查询。为此,我从#Albert D. Kallal here 提供的答案中获得了帮助

想法是将多个查询存储在一个由分隔符分隔的文本文件中,并通过 VBA 解析和执行它们。使用这种技术,我能够成功运行多个正常查询。但是,当我尝试运行包含交叉表查询时,我收到以下错误消息框弹出。

运行时错误“3000”: 保留错误(-3002);没有针对此错误的消息。

以下是我的代码和数据的可重现版本。

Sub SqlScripts()

   Dim vSql       As Variant
   Dim vSqls      As Variant
   Dim vList      As Variant
   Dim vLists     As Variant
   Dim strSql     As String
   Dim strList    As String
   Dim intF       As Integer
   Dim intL       As Integer
   Dim TableName  As String
   Dim QueryFile  As String
   Dim TableList  As String

   QueryFile = "C:\Staffing_queries.sql"
   TableList = "C:\staffing_tables.txt"        

   intF = FreeFile()
   Open QueryFile For Input As #intF

   intL = FreeFile()
   Open TableList For Input As #intL

   strSql = Input(LOF(intF), #intF)
   strList = Input(LOF(intL), #intL)
   Close intF
   Close intL

   vSql = Split(strSql, ";")
   vList = Split(strList, ";")

     For Each vLists In vList
        TableName = "" & vLists

        If TableExists(TableName) Then
            CurrentDb.TableDefs.Delete TableName
            Debug.Print TableName & " Deleted"
        End If
    Next

'   On Error Resume Next

   For Each vSqls In vSql
        If vSqls <> "" Then
            Debug.Print vSqls
            CurrentDb.Execute vSqls
        End If
   Next

End Sub

Function TableExists(TableName As String) As Boolean
    On Error Resume Next
    Dim strName As String
    strName = CurrentDb.TableDefs(TableName).Name
    TableExists = (Err.Number = 0)
End Function

Staffing_queries.sql 的内容(一个交叉表和一个普通查询)

TRANSFORM Sum(Compens_Data.GRS_YTD) AS SumOfGRS_YTD
SELECT Compens_Data.EMPLID
INTO Test_spot_bonus
FROM Compens_Data
WHERE ((Compens_Data.EARNINGS_DESCRIPTION)="Spot Bonus") 
GROUP BY Compens_Data.EMPLID
PIVOT Compens_Data.BALANCE_YEAR;

SELECT EMPLID, BALANCE_YEAR, 
Sum(IIF(EARNINGS_DESCRIPTION="Spot Bonus",GRS_YTD,0)) as SPOT_BONUS,
Sum(IIF(EARNINGS_DESCRIPTION="Incentive Compensation",GRS_YTD,0)) as Incentive_Comp,
Sum(IIF(EARNINGS_DESCRIPTION="STIC Target",GRS_YTD,0)) as STIC_TRGT
INTO Benefits_Data_Temp
FROM Compens_Data
GROUP BY EMPLID, BALANCE_YEAR
;

Staffing_table.txt 的内容(VBA 代码用于删除现有表)

Test_spot_bonus;Benefits_Data_Temp;

数据示例(找不到任何附加非图像文件的选项)

EMPLID  BALANCE_YEAR    EARNINGS_DESCRIPTION    GRS_YTD
A1  2013    Incentive Compensation  4,926.67
A1  2013    STIC Target 5,108.00
A1  2014    Incentive Compensation  6,230.00
A1  2014    STIC Target 5,394.67
A1  2014    Spot Bonus  720
A1  2015    Incentive Compensation  6,946.67
A2  2013    Incentive Compensation  7,663.33
A2  2013    STIC Target 9,652.67
A2  2014    Incentive Compensation  12,652.00
A2  2014    STIC Target 9,813.33
A2  2015    Incentive Compensation  12,083.33
A3  2013    Incentive Compensation  8,505.33
A3  2013    STIC Target 11,465.33
A3  2014    Incentive Compensation  13,240.00
A3  2014    STIC Target 11,415.33
A3  2015    Incentive Compensation  12,790.00

【问题讨论】:

    标签: sql ms-access vba crosstab


    【解决方案1】:

    该错误与 VBA 代码无关,您根本无法直接将交叉表查询与表创建查询结合起来。

    TRANSFORM ... SELECT ... INTO ... FROM ... 
    

    从 Access 查询窗口运行时提供相同的 Reserved error(-3002)

    您需要创建一个 querydef,将其 .SQL 设置为 TRANSFORM 查询,然后将此查询用作 SELECT INTO 的基础:

    SELECT * INTO Test_spot_bonus FROM MyCrosstabQuery
    

    【讨论】:

    • 谢谢安德烈,虽然我应该搜索和学习(我会这样做),你能告诉我如何创建一个 querydef。我从未使用过访问中的对象。
    • 参见例如here。您必须在For Each vSqls In vSql 循环中创建一个 If-Then 子句:如果 vSqls 包含“TRANSFORM”,则创建或编辑一个带有常量名称的 querydef 而不是执行 Sql,然后在下一个 vSqls 中使用该查询名称作为SELECT INTO。
    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 2015-05-21
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2014-11-03
    • 2021-09-24
    • 2012-08-26
    相关资源
    最近更新 更多