У меня есть этот отчет, и мне нужно добавить итоги по каждому человеку (красный кружок) существующий отчет
Я не могу изменить существующий отчет, поэтому экспортирую данные из 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 зависает при выполнении этого запроса.
любая помощь / идея, пожалуйста?
Предостережение: Я не буду делать вид, что знаю точную причину проблемы, но мне приходилось неоднократно реорганизовывать запросы в Access, чтобы заставить их работать, даже если исходные операторы SQL полностью действительны с точки зрения синтаксиса и логики. Иногда мне приходилось свертывать последовательность запросов, чтобы избежать ошибок в Access. Доступ часто бывает довольно глупым и просто (повторно) выполняет запросы и подзапросы в точности так, как указано, без оптимизации. В других случаях Access будет пытаться объединить запросы, выполнив некоторые внутренние оптимизации, но иногда они приводят к разочаровывающим ошибкам. Такая простая вещь, как изменение имени или переупорядочение столбцов, может быть разницей между работающим запросом и тем, который приводит к сбою или зависанию Access.
Сначала подумайте:
[EMP_ID]
выбирает небольшое подмножество, но полная таблица достаточно велика, чтобы «заморозить» доступ.
Другие подсказки:
Попробуйте провести рефакторинг «второго» запроса, выполнив соединение в предложении 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)
Хммм ... Я не понимаю, как запрос возвращает записи и ошибку «в предложении FROM». Если в предложении FROM есть ошибка, он вообще не должен возвращать никаких записей. Кроме того, что вы имеете в виду, что «не можете ни использовать данные, ни редактировать этот запрос»? Вы имеете в виду, что вы не можете редактировать SQL или что вы не можете редактировать данные, однажды возвращенные в таблицу? Если вы имеете в виду данные в таблице, это правильно - они не обновляются, потому что они присоединяются к агрегированному запросу, но, насколько я могу судить, это не важно, поскольку это только для отчета.
Да, он возвращает записи и одновременно показывает поверх них сообщение об ошибке. Когда я нажимаю «ОК» в сообщении об ошибке, записи исчезают (окно набора записей закрывается). Когда я открываю запрос в Edit, происходит то же самое - сообщение об ошибке, нажмите, все закрывает.
Непонятно. Я никогда не испытывал такого особенного поведения. Вы пробовали восстановить и сжать базу данных? Как я уже упоминал в ответе, попробуйте сохранить и запустить встроенный подзапрос как именованный запрос. Он работает без ошибок? Если это сработает, отредактируйте «второй» запрос, чтобы присоединиться к вновь сохраненному запросу вместо встроенного оператора.
Мне удалось составить и запустить отчет по вашему запросу, сообщений об ошибках нет. Но результаты неверны - некоторые отсутствующие сотрудники (получили 27 из 75), отсутствующие периоды оплаты, некоторые неправильные суммы для конкретных сотрудников и периодов. Выполнение встроенного подзапроса в качестве именованного запроса прошло без ошибок.
Рад, что запрос работает без ошибок, но все это выходит за рамки этого вопроса, особенно без знания многих других деталей данных. Я бы с подозрением отнесся к точности процесса экспорта / импорта. Все ли значения передаются правильно? Вы импортируете напрямую через ссылку ODBC или через текстовый файл CSV? Можете ли вы проверить все строки и столбцы по отдельности после импорта? Есть проблемы с форматированием? Я предлагаю выполнить различные запросы на проверку данных, чтобы убедиться, что все данные есть и не повреждены.
Большое спасибо за ваш вклад и помощь. Я импортировал через текстовый файл CSV. Импорт был правильным, я получил все данные в MS Access; Я могу видеть, какие записи отсутствуют или неверны в MS Access, поэтому попытаюсь найти причину / шаблон для этих недостающих / неправильных записей.
Хорошо, удачи. Но как бы то ни было, ваше утверждение снова кажется противоречивым :). Импорт правильный, но вы подразумеваете, что данные отсутствуют / неверны. Я полагаю, это означает, что значения исключаются из экспорта из SQL Server? В любом случае удачи и, если нужно, задайте еще один вопрос с новыми подробностями.
Извините за недопонимание; Я имел в виду, что импорт из MS SQL в Access был правильным, но отсутствующие / неверные данные были в отчете, который я запускал на основе вашего запроса (а не в импортированных данных). Спасибо еще раз!
Здравствуйте, большое спасибо за ваши предложения. Я бы предпочел сделать это в Access (локальном) по соображениям безопасности (по крайней мере, сейчас), поскольку я не проектировал исходную базу данных MS SQL. Когда я запускаю свой запрос, диспетчер задач показывает «Доступ не отвечает ...» Количество записей не должно быть проблемой, поскольку первый запрос выбирает только около 3500 записей. Я попробовал ваш запрос, и он выглядит многообещающим - он не зависает, дает некоторые записи, к сожалению, он также дает мне сообщение об ошибке «Синтаксическая ошибка в предложении FROM» как в параметрах Open, так и в параметрах редактирования, и я не могу ни использовать данные, ни редактировать их. запрос.