【问题标题】:QueryDefs Field Count not counting correctlyQueryDefs 字段计数未正确计数
【发布时间】:2020-02-15 22:22:59
【问题描述】:

我有几个交叉表查询需要计算其中的字段数。之前的工作代码没有问题。从那时起,我向交叉表添加了参数(在打开的表单上查找值),但没有其他更改。没有错误,但代码返回字段计数 = 0。 ??它事先工作得完美无缺。同样,我所做的唯一更改是将交叉表中的硬编码日期替换为表单引用,并添加了参数,以便交叉表可以是动态的。查询打开正常,没有错误,所以我很难过为什么这个改变会有所作为。

我注意到的另一件事是,在我前进到下一行之后,代码行末尾的“.Count”中的 c 更新为小写 c (.count)。我希望这仍然是一个大写字母。这是一台工作电脑,昨天它经历了很多软件更新。这可能是图书馆问题吗?

`dim n, m, p, q, a as Integer

n = db.QueryDefs("Master_Schedule_Demand_Xtab").Fields.count   
m = db.QueryDefs("Production_Schedule_Future_Xtab").Fields.count   
p = db.QueryDefs("Production_Schedule_PRIOR_Xtab").Fields.count   
q = db.QueryDefs("Supplier_Committed_Del_Xtab").Fields.count   
a = db.QueryDefs("Actual_Receipts_Xtab").Fields.count `   

没有错误,只有所有值 = 0 ??我希望这些值都大于 10 以匹配交叉表中的字段/列数。 另外 - 运行代码以获取所有查询定义的结果显示如下 - 未列出字段计数?!

`Properties of Master_Schedule_Demand_Xtab
 Name - Master_Schedule_Demand_Xtab
 DateCreated - 10/17/2019 2:49:32 PM
 LastUpdated - 10/18/2019 4:00:18 PM
 Type - 16
 SQL - PARAMETERS Forms!Main!MB51_Created DateTime;
TRANSFORM Sum(PO_List1_MstrSched.Scheduled_qty_) AS Qty
SELECT PO_List1_MstrSched.Material, "Master Schedule Demand" AS Type,
PO_List1_MstrSched.Short_text AS Material_Desc
FROM PO_List1_MstrSched
WHERE (((PO_List1_MstrSched.StatDelD)<#10/12/2020#))
GROUP BY PO_List1_MstrSched.Material, "Master Schedule Demand",
PO_List1_MstrSched.Short_text
PIVOT PO_List1_MstrSched.Week;

  Updatable - True
  Connect - [empty]
  ReturnsRecords - True
  ODBCTimeout - 60
  RecordsAffected - 0
  MaxRecords - 0
  RecordLocks - 0
  RecordsetType - 0
  Orientation - 0
  DefaultView - 2
  PublishToWeb - 1
  OrderByOn - False
  DisplayViewsOnSharePointSite - 1
  TotalsRow - False
  FilterOnLoad - False
  OrderByOnLoad - True
  HideNewField - False
  BackTint - 100
  BackShade - 100
  ThemeFontIndex - -1
  AlternateBackThemeColorIndex - -1
  AlternateBackTint - 100
  AlternateBackShade - 100
  ReadOnlyWhenDisconnected - False
  DatasheetGridlinesThemeColorIndex - -1
  DatasheetForeThemeColorIndex - -1`

【问题讨论】:

  • 不熟悉 VBA,但这里有一些建议 - (a) 如果您恢复到原始代码,它是否开始工作? (b) 您可以打印原始格式的输出与其中一个字段的新格式吗?这将帮助您找出一些差距(如果有的话)。
  • 不!我已恢复为原始格式,但仍无法捕获字段计数。它说零,我认为这是找不到它的默认值。
  • 那么也许真的没有数据或者与数据访问相关联的东西失败了。您可以尝试使用概念验证/独立程序访问数据源并首先验证数据访问。然后您可以尝试找出代码中的问题。
  • 在运行代码时,引用的表单 (Main) 是否在 FormView 中打开?控件MB51_Created 是否包含有效的日期时间值?字段的数量当然取决于该参数值。
  • 是的!表格已打开。但我什至删除了变量并恢复为硬编码过滤器,我也遇到了同样的问题。

标签: vba ms-access field crosstab


【解决方案1】:

Access 不会尝试为包含PARAMETERS 声明的交叉表QueryDef 确定Fields.Count

例如,此查询中的 WHERE 子句为 q.Options_Value 提供了 4 个不同的值 ...

TRANSFORM Count(*) AS Expr1
SELECT q.PersonName
FROM qryStep1 AS q
WHERE q.Options_Value <= 5
GROUP BY q.PersonName
PIVOT q.Options_Value;

所以QueryDef.Fields.Count 显示了 5 个(PersonName 加上不同的 Options_Value 值的 4 列)。

但是,如果我只是声明一个参数,甚至没有被 SQL 的其余部分引用...

PARAMETERS upper_limit Long;
TRANSFORM Count(*) AS Expr1
SELECT q.PersonName
FROM qryStep1 AS q
WHERE q.Options_Value <= 5
GROUP BY q.PersonName
PIVOT q.Options_Value;

Access 显然决定在涉及参数时无法知道列数。在这种情况下,QueryDef.Fields.Count 显示为零。

我建议您通过从查询中打开记录集并像这样获取记录集的Fields.Count 来获取查询的列数...

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Set db = CurrentDb
Set qdf = db.QueryDefs("YourQueryName")
Set rs = qdf.OpenRecordset
Debug.Print "Query columns: " & rs.Fields.Count

尽管您的 SQL 示例将表单引用声明为 PARAMETER,但它实际上并未在查询的其余部分中使用。但是,当您对包含表单引用的查询调用 OpenRecordset 时,Access 会将其视为您未提供值的参数。在这种情况下,请在调用 OpenRecordset 之前提供这样的值 ...

qdf.Parameters("Forms!Main!MB51_Created").Value = Forms!Main!MB51_Created.Value

【讨论】:

  • 非常感谢您提供的信息。你给了我足够的信息来开始我的研究和编辑代码。我现在明白有 2 个参数被调用(1 个用于顶级查询,一个用于被调用的查询)。我在代码中明确分配了这两个参数,然后使用下面的 Wolfgang 代码来获取字段计数。祈祷下周它仍然有效!
【解决方案2】:

您必须设置参数的值并打开一个记录集才能对字段进行计数,例如对于您的第一次查询:

With db.QueryDefs("Master_Schedule_Demand_Xtab")
    .Parameters("Forms!Main!MB51_Created") = Forms!Main!MB51_Created
    With .OpenRecordset(dbOpenDynaset, dbAppendOnly)
        n = .Fields.Count
        .Close
    End With
    .Close
End With

对于“c”:检查所有变量和常量的声明或用小写“c”编写的后期绑定属性count,并将它们更改为大写或(对于变量和常量)将它们重命名为不同的名称。

【讨论】:

  • 这成功了!谢谢!我需要明确分配 2 个参数(均用于顶级广告基础查询),然后使用您的示例,我能够获得字段计数。我以前从未使用过参数,所以这是一次学习经历。它还解释了我过去经历的“无法解释的”交叉表故障。再次感谢!
  • @AngieHudsonGallegos,很高兴听到这个消息! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多