Счетчик полей QueryDefs не считается правильно - PullRequest
1 голос
/ 19 октября 2019

У меня есть несколько кросс-таблиц, в которых нужно подсчитать количество полей. Ранее работавший код не имел проблем. С тех пор я добавил параметры (поиск значений в открытой форме) в кросс-таблицу, но никаких других изменений. Ошибок нет, но код возвращает число полей = 0. ?? Это работало безупречно заранее. Опять же, единственное изменение, которое я сделал, - это заменить жестко закодированную дату в кросс-таблице ссылкой на форму и добавил параметр, чтобы кросс-таблица могла быть динамической. Запрос открывается нормально без ошибок, поэтому я озадачен, почему это изменение будет иметь значение.

Еще одна вещь, которую я заметил, это то, что буква c в «.Count» в конце строки кода обновляется до строчной буквы 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`

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

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плюс 4 столбца для различных Options_Value значений).

Однако, если я просто объявлю параметр, на который даже ссылка не ссылается в оставшейся части 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
, укажите это значение
0 голосов
/ 19 октября 2019

Вам нужно будет установить значение параметра и открыть набор записей, чтобы иметь возможность подсчитывать поля, например, для первого запроса:

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': проверкавсе объявления переменных и констант или свойства с поздней привязкой count , написанные строчными буквами «c», и их изменение на прописные или (для переменных и констант) переименование их на что-то другое.

...