首页 > 解决方案 > QueryDefs 字段计数未正确计数

问题描述

我有几个交叉表查询需要计算其中的字段数。以前的工作代码没有问题。从那时起,我向交叉表添加了参数(在打开的表单上查找值),但没有其他更改。没有错误,但代码返回字段计数 = 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`

标签: vbams-accessfieldcrosstab

解决方案


Access 不会尝试确定包含声明 Fields.Count的交叉表。QueryDefPARAMETERS

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

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

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

推荐阅读