MS Access запрос (MS Access зависает) - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть этот отчет, и мне нужно добавить итоги для каждого человека (красный круг) существующий отчет

новый отчет

Я не могуизмените существующий отчет, чтобы я экспортировал данные из MS SQL в MS Access и создал там новый отчет.Я работал на одного сотрудника, но у меня возникли проблемы с запросом, который был бы для нескольких сотрудников.

Этот запрос извлечения данных использует в качестве входных данных:

SELECT [TIME].[RCD_NUM], [TIME].[EMP_ID], [TIME].[PPERIOD], [TIME].[PRUN], [TIME].[TDATE], [TIME].[PC], [TIME].[RATE], [TIME].[HOURS], [TIME].[AMOUNT], [TIME].[JOB_ID], [TIME].[UPDATED], [TIME].[UPDATED_BY], [TIME].[LOG_DATE], [TIME].[ORIGINAL_REC_NUM]
FROM [TIME]
WHERE ((([TIME].[EMP_ID])=376) And (([TIME].[TDATE])<=#12/31/2006# And ([TIME].[TDATE])>=#1/1/2006#) And (([TIME].[PC])<599));

этот запрос заполняет отчет:

SELECT *
FROM TIME1
WHERE RCD_NUM = (SELECT Max(RCD_NUM) FROM [TIME1] UQ WHERE UQ.PPERIOD = [TIME1].PPERIOD AND UQ.PC = [TIME1].PC);

проблема в том, что если я удаляю EMP_ID из первого запроса, как этот

SELECT [TIME].[RCD_NUM], [TIME].[EMP_ID], [TIME].[PPERIOD], [TIME].[PRUN], [TIME].[TDATE], [TIME].[PC], [TIME].[RATE], [TIME].[HOURS], [TIME].[AMOUNT], [TIME].[JOB_ID], [TIME].[UPDATED], [TIME].[UPDATED_BY], [TIME].[LOG_DATE], [TIME].[ORIGINAL_REC_NUM]
FROM [TIME]
WHERE ((([TIME].[TDATE])<=#12/31/2006# And ([TIME].[TDATE])>=#1/1/2006#) And (([TIME].[PC])<599));

, тогда второй запрос не работает и доступ к ms блокируется при выполнении этогозапрос.

любая помощь / идея, пожалуйста?

1 Ответ

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

Предостережение : Я не буду притворяться, что знаю точную причину проблемы, но мне приходилось неоднократно рефакторинг запросов в Access, чтобы заставить их работать, даже если исходные операторы SQL полностью действительны в отношении к синтаксису и логике. Иногда мне приходилось замыкать последовательность запросов, чтобы избежать ошибок в Access. Доступ часто довольно тупой и будет просто (повторно) выполнять запросы и подзапросы в точности так, как они даны без оптимизации. В других случаях Access будет пытаться объединить запросы, выполняя некоторые внутренние оптимизации, но иногда они приводят к ошибкам. Такая простая вещь, как смена имени или переупорядочение столбцов, может быть разницей между работающим запросом и тем, который приводит к сбою или зависанию Access.


Сначала рассмотрим:

  • Можете ли вы оставить данные на SQL Server и связать их с результатами в Access (а не экспортировать / импортировать их в Access)? Даже если вам нужно или вы предпочитаете использовать Access для создания реального отчета, вы можете использовать все возможности SQL Server для запроса данных - он, вероятно, менее глючит и более эффективен.
    • Общепринятой практикой является создание хранимых процедур SQL Server, которые возвращают только те данные, которые вам нужны в Access. В Access создается сквозной запрос для извлечения данных, но все операции с данными выполняются на сервере.
  • Возможно, это просто проблема производительности, когда ограничение набора [EMP_ID] выбирает небольшое подмножество, но полная таблица достаточно велика, чтобы "заморозить" доступ.
    • Как долго вы позволяете Access оставаться замороженным, прежде чем убить процесс? Будьте терпеливы ... как много, много минут (или часов). Запустите его утром и проверьте после обеда. :) Это может в конечном итоге вернуть набор результатов. Это не означает, что оно допустимо или что другого решения не существует, но может быть полезно узнать, возвращает ли оно в конечном итоге данные.
    • Сколько существует возможных записей?
    • Правильно ли проиндексированы импортированные данные? Добавьте индексы ко всем ключевым полям и тем, которые используются в предложениях WHERE.
    • База данных находится в общем сетевом ресурсе или она локальная? Попробуйте скопировать базу данных на локальный диск.

Другие подсказки:

  • Попробуйте использовать оператор BETWEEN для дат в предложении WHERE.

Попробуйте реорганизовать «второй» запрос, выполнив объединение в предложении FROM, а не в предложении WHERE. При этом вы также можете сохранить подзапрос как именованный запрос (так же, как сохраняется [TIME1]). Независимо от того, был ли запрос сохранен или встроен в другой оператор, МОЖЕТ изменить поведение Access (см. Предостережение), даже если результаты должны быть идентичны.

Вот версия со встроенным статистическим запросом. Обратите внимание, как все ссылки на столбцы уточняются с источником. Некоторые столбцы исходного запроса не имеют псевдонима источника, префиксирующего имя столбца. Помните, предостережение ... такие придирчивые детали могут повлиять на поведение Access.

SELECT TIME1.*
FROM TIME1 INNER JOIN
  (SELECT UQ.PPERIOD, UQ.PC, Max(UQ.RCD_NUM) As Max_RCD_NUM
   FROM [TIME1] UQ
   GROUP BY UQ.PPERIOD, UQ.PC) As TIMEAGG
  ON (TIME1.PPERIOD = TIMEAGG.PPERIOD) And (TIME1.PC = TIMEAGG.PC)
    AND (TIME1.RCD_NUM = TIMEAGG.Max_RCD_NUM)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...