vba - 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`
解决方案
Access 不会尝试确定包含声明 Fields.Count
的交叉表。QueryDef
PARAMETERS
例如,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
推荐阅读
- python - 有没有办法设置 python 套接字,以便服务器仅在客户端要求更新值时发送?
- python - 如何使用预先确定的输入运行 python 文件
- excel - 使用循环创建结构 - VBA
- r - 错误:将现有 Git Bash 项目与 Git 链接。Windows 10. GNU Bash,版本 4.4.23(1) - 发布
- java - HashMap cant be initialized with loop? Initialize HashMap from textfile
- php - Nginx 在访问我的站点时遇到 502 网关错误
- python - Plotly:如何更改三元图的色阶限制?
- reactjs - 本地存储阵列被新条目 useState 覆盖 - React
- reactjs - 通过过滤每个 JSON 对象创建可定制的反应表
- nodemailer - 使用 G Suite OAuth2 使用 Nodemailer 发送群组电子邮件地址