Как получить список непустых запросов? - PullRequest
0 голосов
/ 24 сентября 2018

В MS Access у меня есть 1 таблица, которая ежедневно обновляется через внешний файл и 50 запросов (с именами 01_query, 02_query ... 50_query), все с одинаковыми столбцами и логикой, но с разными фильтрами.Некоторые возвращают результат, другие пустые.

Как получить список (используя другой запрос) с именами пустых запросов?

Я нашел способ получить список всех имен запросов с помощью этого кода

SELECT MSysObjects.Name
FROM MsysObjects
WHERE (Left$([Name],1)<>"~") AND (MSysObjects.Type)=5
ORDER BY MSysObjects.Name

, но я не могу понять, как отфильтровать "пустые" запросы.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Если вам абсолютно необходимо иметь решение Access SQL для составления списка, рассмотрите что-то отличное от UNION из 50 источников данных.Доступ не позволяет вам UNION неограниченное количество источников данных, но я не помню, что это за предел.И даже если это позволит вам UNION 50, я все равно не буду этого делать.

Я протестировал этот в Access 2010, и он дает результат, который, я думаю, вы ищете.Поскольку вы продемонстрировали, что у вас есть разрешение на чтение для MsysObjects, оно также должно работать для вас.

SELECT
    sub.Name
FROM
    (
        SELECT
            m.Name,
            IIf(
                m.Name ALike '[0-9][0-9][_]query' AND m.Type=5,
                DCount('*', m.Name),
                0
               ) AS non_empty_target_query
        FROM MsysObjects AS m
    ) AS sub
WHERE sub.non_empty_target_query=True
ORDER BY sub.Name;

Выражение IIf() является ключом к этому запросу.Говоря по-человечески, он говорит, что если объект является запросом, а его имя начинается с 2 цифр, за которыми следует знак подчеркивания, за которым следует «запрос», возвращает количество строк из этого запроса;в противном случае просто верните ноль.

Затем родительский запрос отфильтровывает те строки, где non_empty_target_query равен нулю (False), оставляя только строки, содержащие имена ваших «непустых» запросов.

0 голосов
/ 24 сентября 2018

Предполагая, что все ваши запросы имеют одинаковый формат, вам на самом деле ничего не нужно делать с MSysObjects.Вы можете просто сделать простой цикл (в VBA):

Public Sub GetNonEmptyQueries()
   Dim db As DAO.Database, qdf As DAO.QueryDef
   Dim rs As DAO.Recordset
   Dim queryName As String
   Dim i As Integer

   Set db = CurrentDb

   For i = 1 To 50
      queryName = format(i, "00") & "_query"
      Set qdf = db.QueryDefs(format(i, "00") & "_query")
      Set rs = qdf.OpenRecordset

      If rs.recordCount > 0 Then
         ' do whatever you need to do with the query name here
         Debug.Print qdf.Name
      End If
   Next i
End Sub

Если вы не хотите использовать VBA, можно написать запрос, который UNION s COUNT(*) всех ваших запросов,Примерно так:

SELECT "01_query" AS QueryName,  Count(*) AS [Count] FROM 01_query HAVING COUNT(*) > 0
UNION
SELECT "02_query",  COUNT(*) FROM 02_query HAVING count(*) > 0
...
UNION
SELECT "50_query", COUNT(*) FROM 50_query HAVING COUNT(*) > 0

Конечно, вам придется добавлять все запросы вручную, что будет довольно утомительно.Я думаю, что время, которое вы потратите на написание такого запроса, может быть лучше потрачено на чтение VBA, поэтому вы можете использовать первый вариант.:) * * 1010

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...