Почему этот отчет Access редактирует базовый запрос? - PullRequest
0 голосов
/ 08 января 2019

У меня странная проблема с отчетом Access. А именно, когда отчет используется, он редактирует код исходного запроса и разбивает запрос. Основной запрос начинается как:

select b.Cont_staff, b.tot_success, c.tot_fail
from
(select Cont_staff, count(Cont_staff) as tot_success
from
    (SELECT Cont_date, Cont_result, Cont_staff
    FROM dbo_UIH_contacts
    where dbo_UIH_contacts.Cont_result = 'Successful')
group by Cont_staff) as b
left join 
(select Cont_staff, count(Cont_staff) as tot_fail
from
    (SELECT Cont_date, Cont_result, Cont_staff
    FROM dbo_UIH_contacts
    where dbo_UIH_contacts.Cont_result = 'Unsuccessful') 
group by Cont_staff) as c
on b.cont_staff = c.cont_staff

Отчет очень прост, по одному полю для каждого из Cont_staff, tot_success и tot_fail в Подробности отчета. В заголовке отчета есть статические метки.

Запрос выполняется правильно при первом создании, а отчет запускается правильно при первом его открытии. Но если вы закроете отчет и снова откроете его, он изменит код запроса на следующий:

SELECT b.Cont_staff, b.tot_success, c.tot_fail
FROM 
    (SELECT Cont_staff, count(Cont_staff) AS tot_success 
    FROM 
    [SELECT Cont_date, Cont_result, Cont_staff FROM dbo_UIH_contacts where dbo_UIH_contacts].[Cont_result = 'Successful'] 
    AS [%$##@_Alias] 
GROUP BY Cont_staff)  AS b 
LEFT JOIN 
    (SELECT Cont_staff, count(Cont_staff) AS tot_fail 
    FROM 
    [SELECT Cont_date, Cont_result, Cont_staff FROM dbo_UIH_contacts where dbo_UIH_contacts].[Cont_result = 'Unsuccessful'] 
    AS [%$##@_Alias] 
GROUP BY Cont_staff)  AS c 
ON b.cont_staff = c.cont_staff

В Access это одна текстовая строка без разрывов строк. Измененная часть находится там, где она заключает в скобки суб-выбор и вставку [%$##@_Alias].

Обновление

Похоже, что проблема не связана с отчетом, то же самое происходит при установке формы для использования запроса.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Хотя я не определил точную причину перезаписи кода, проблема не возникнет, если я разделю запрос на два объекта запроса Access. Похоже, что Access не может обработать этот трехуровневый запрос.

Сначала создайте этот запрос (с кодом фильтрации даты, который был следующим шагом для запроса в вопросе). Давайте назовем это qry_Conts_by_dt:

SELECT 
    dbo_UIH_contacts.Cont_key
    , dbo_UIH_contacts.Cont_date
    , dbo_UIH_contacts.Cont_result
    , dbo_UIH_contacts.Cont_staff
FROM dbo_UIH_contacts 
WHERE 
    (((dbo_UIH_contacts.Cont_date)>=[Forms]![frm_Cont_status_by_coord]![bx_start_dt] 
    And (dbo_UIH_contacts.Cont_date)<=[Forms]![frm_Cont_status_by_coord]![bx_end_dt])
;

Затем обратитесь к первому запросу:

SELECT b.Cont_staff, b.tot_success, c.tot_fail
FROM 
    (SELECT Cont_staff, count(Cont_staff) as tot_success
    FROM  qry_Conts_by_dt
    WHERE qry_Conts_by_dt.Cont_result = 'Successful'
    GROUP BY Cont_staff)  AS b 
LEFT JOIN 
    (SELECT Cont_staff, count(Cont_staff) as tot_fail
    FROM  qry_Conts_by_dt
    WHERE qry_Conts_by_dt.Cont_result = 'Unsuccessful' 
    GROUP BY Cont_staff)  AS c ON b.cont_staff = c.cont_staff;

И используйте второй запрос в качестве источника записи для отчета (или формы по этому вопросу).

0 голосов
/ 08 января 2019

Попробуйте использовать псевдонимы для самых внутренних запросов.

select b.Cont_staff, b.tot_success, c.tot_fail
from (select Cont_staff, count(Cont_staff) as tot_success
      from (SELECT Cont_date, Cont_result, Cont_staff
            FROM dbo_UIH_contacts
            where dbo_UIH_contacts.Cont_result = 'Successful') AS Q1
      group by Cont_staff) as b
left join 
     (select Cont_staff, count(Cont_staff) as tot_fail
      from (SELECT Cont_date, Cont_result, Cont_staff
            FROM dbo_UIH_contacts
            where dbo_UIH_contacts.Cont_result = 'Unsuccessful') AS Q2 
      group by Cont_staff) as c
on b.cont_staff = c.cont_staff;

На самом деле, не уверен, что вам даже нужны самые сокровенные запросы; попробовать:

select b.Cont_staff, b.tot_success, c.tot_fail
from (select Cont_staff, count(*) as tot_success
      FROM dbo_UIH_contacts
      where dbo_UIH_contacts.Cont_result = 'Successful'
      group by Cont_staff) as b
left join 
     (select Cont_staff, count(*) as tot_fail FROM dbo_UIH_contacts
      where dbo_UIH_contacts.Cont_result = 'Unsuccessful')
      group by Cont_staff) as c
on b.cont_staff = c.cont_staff;

Или, может быть, кросс-таблица:

TRANSFORM Count(ContDate) AS CountOfContDate
SELECT Cont_Staff
FROM dbo_UIH_contacts
GROUP BY Cont_Staff
PIVOT Cont_result IN ("Successful", "Unsuccessful");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...