【问题标题】:Why does this Access report edit the underlying query?为什么此 Access 报表编辑基础查询?
【发布时间】:2019-01-09 06:51:43
【问题描述】:

我对 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

报表非常简单,报表Detail中Cont_stafftot_successtot_fail各有一个字段。报表Header中有静态标签。

查询在首次创建时正确运行,报表在首次打开时正确运行。但是如果您关闭报表并重新打开它,它会将查询代码更改为:

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]

更新

问题似乎与报表无关,在设置表单以使用查询时也会发生同样的情况。

【问题讨论】:

  • 它将查询代码更改为这个 ...查询在哪里更改?您是否在报表设计中从记录源中检索此 SQL?如果保存的查询现在发生更改,这将非常有趣,因为它是一个缓存的、已编译的对象,由引擎提供最佳执行计划!

标签: sql ms-access


【解决方案1】:

尝试对最里面的查询使用别名。

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");

【讨论】:

  • 我最初在最里面的查询上做了别名,发布的版本是第二稿,删除了这些别名以尝试清理它。最里面的查询在那里是因为我将按日期范围进行子设置(我是关于在代码中断时添加该代码),否则你会认为它们是不必要的。
【解决方案2】:

虽然我没有确定代码覆盖的确切原因,但如果我将查询拆分为两个 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;

并使用第二个查询作为报告的记录源(或表单)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2013-06-18
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多