【问题标题】:Need help correcting my SQL for a crosstab query需要帮助更正我的 SQL 以进行交叉表查询
【发布时间】:2019-03-02 10:47:50
【问题描述】:

我正在使用以下代码将交叉表查询导出到 Excel。

我试过Set rs1 = CurrentDb.OpenRecordset("qry_Comparison_Bulk") 但我总是得到错误:参数太少。预期为 19。该查询中存储了 19 个参数。我的下一个想法是在 VBA 中重新创建 SQL。现在我收到错误:交叉表列标题过多(424)。 424 是我的数据库中的项目总数,所以我认为过滤器无法正常工作。

Set rs1 = CurrentDb.OpenRecordset("TRANSFORM Sum(tbl_Formulas.Input) AS SumOfInput " _
& "SELECT tbl_Formulas.BillType, tbl_Formulas.RawMaterial " _
& "FROM tbl_Formulas " _
& "WHERE (tbl_Formulas.BillType)='" & [Forms]![frm_BulkComparison_Select]![bill1] & "' Or (tbl_Formulas.BillType)='" & [Forms]! [frm_BulkComparison_Select]![bill2] & "' Or (tbl_Formulas.BillType)='" & [Forms]![frm_BulkComparison_Select]![bill3] & "' AND (tbl_Formulas.Item)='" &[Forms]![frm_BulkComparison_Select]![Item 1] & "' Or " _ 
& "(tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 2] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 3] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 4] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 5] & "' Or " _
& "(tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 6] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 7] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 8] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 9] & "' Or " _
& "(tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 10] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 11] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 12] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 13] & "' Or " _
& "(tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 14] & "' Or (tbl_Formulas.Item)='" & [Forms]![frm_BulkComparison_Select]![Item 15] & "' AND (tbl_Formulas.BP)='" & [Forms]![frm_BulkComparison_Select]![BP] & "' " _
& "GROUP BY tbl_Formulas.BillType, tbl_Formulas.RawMaterial " _
& "PIVOT tbl_Formulas.Item;")

有 '" & ... & "' 分隔符以避免使用参数,因为每个字段的值都是文本。

此外,我的表单设置了 15 个“Item”文本框、3 个“BillType”文本框和 1 个“BP”文本框

【问题讨论】:

    标签: sql ms-access vba ms-access-2016


    【解决方案1】:

    我猜你的 qry_Comparison_Bulk 查询引用了像这样的表单控件tbl_Formulas.BillType=[Forms]![frm_BulkComparison_Select]![bill1]

    当从 Access 查询设计器运行时,查询可以工作。问题在于,当您尝试使用带有OpenRecordset 的命名查询时,这些控件中的每一个都被视为您尚未为其提供值的参数。

    所以提供值...

    Dim qdf As DAO.QueryDef
    Dim prm As DAO.Parameter
    Dim rs As DAO.Recordset
    Set qdf = CurrentDb.QueryDefs("qry_Comparison_Bulk")
    For Each prm In qdf.Parameters
        prm.Value = Eval(prm.Name)
    Next
    Set rs = qdf.OpenRecordset()
    

    prm.Name 将是 Access 将其解释为参数名称的内容 ... 就像 [Forms]![frm_BulkComparison_Select]![bill1] ... 所以 Eval(prm.Name) 等同于 Eval([Forms]![frm_BulkComparison_Select]![bill1]) ... 并返回该控件的值 ...然后分配给prm.Value

    【讨论】:

    • 不客气。如果是我,我也会修改查询以使用IN() 而不是[Field]=this OR [Field]=that OR [Field]= ... 等等。像这样的东西:FROM tbl_Formulas AS f WHERE f.BillType IN ([Forms]![frm_BulkComparison_Select]![bill1], [Forms]![frm_BulkComparison_Select]![bill2], [Forms]![frm_BulkComparison_Select]![bill3])
    • 我可以做出改变。感谢您的建议。
    【解决方案2】:

    我认为您的第一种方法可能会更好:您只需在获取记录集之前在查询中设置参数:

    Public Sub ProcessQuery()
        Dim db As DAO.Database, qdf As DAO.QueryDef, rs As DAO.Recordset
    
        Set db = CurrentDb
        Set qdf = db.QueryDefs("qry_Comparison_Bulk")
    
        ' set parameters
        qdf.Parameters(1).value = [Forms]![frm_BulkComparison_Select]![Item 1]
    
        Set rs1 = qdf.OpenRecordset
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 2011-09-19
      • 2022-07-29
      • 2011-04-03
      • 2011-05-29
      • 1970-01-01
      • 2013-06-19
      相关资源
      最近更新 更多