2013-01-06 124 views
0

我有一个在Oracle中创建的视图。它返回行,但是当我通过Crystal Reports使用它时,我没有行。我已经收窄,这CTE在视图背后的查询:Oracle返回行 - Crystal报告不包含

WITH PERIODS AS (
    SELECT 
    ROWNUM-13 RN, 
    TO_DATE('01-JUL-' || TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE),-6), 'YYYY')) AS FISCAL_YEAR_START, 
    ADD_MONTHS(TO_DATE('01-JUL-' || TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE),-6), 'YYYY')), ROWNUM-13) AS MONTH 
    FROM 
    DUAL 
    CONNECT BY 
    ROWNUM <= 24 
) 

这是很奇怪的,因为如果我用下面的替换此CTE,它的工作原理(这第二个查询是原始报表有什么,但由于寻找财政年度的逻辑问题,它必须改变)。

WITH PERIODS AS (
    SELECT 
    ROWNUM-13 RN, 
    ADD_MONTHS(TRUNC(sysdate,'yyyy'),6) AS FISCAL_YEAR_START, 
    TRUNC(ADD_MONTHS(ADD_MONTHS(TRUNC(sysdate,'yyyy'),6), ROWNUM-13),'MONTH') MONTH 
    FROM 
    DUAL 
    CONNECT BY 
    ROWNUM <= 24 
) 

任何想法为什么第二个CTE导致Crystal报告不拉任何记录?这两个查询肯定都有返回的行,只是Crystal Reports不喜欢第一个查询(尽管我不明白为什么,因为我会认为Crystal只是简单地向Oracle查询数据,而不会被后面的内容困扰视图?!)

回答

0

不知道为什么,但我改变了CTE以下和它的工作:

SELECT 
    ROWNUM-13 RN, 
    ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,6),'YYYY'),-6) AS FISCAL_YEAR_START, 
    ADD_MONTHS(ADD_MONTHS(TRUNC(ADD_MONTHS(SYSDATE,6),'YYYY'),-6), ROWNUM-13) MONTH 
    FROM 
    DUAL 
    CONNECT BY 
    ROWNUM <= 24 

我还是真的想知道为什么后面视图查询正在影响水晶报表!

0

在第一个查询这一行: -

TO_DATE('01-JUL-' || TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE),-6), 'YYYY')) AS FISCAL_YEAR_START 

将下降简化为: -

TO_DATE('01-JUL-2012') 

Oracle将使用默认的日期格式做转换。

当您通过Crystal Reports进行连接时,设置方式可能不同。通过向TO_DATE提供第二个参数来明确设置日期格式是更好的做法。

水晶报表是否报告了一个ORA错误,例如可能是ORA-01861: literal does not match format string

+0

这不会简化到这一点,因为这不会动态拉动当前的财政年度,而这正是该声明实现的目标。不,任何地方都没有错误。这两个语句在查询表时返回相同的结果;只是Crystal Reports认为它返回第一个语句的0行。 – Lock

+0

我知道它会根据sysdate而有所不同。问题在于你没有第二个参数给'TO_DATE',这使得它取决于会话级别的设置,这取决于你的连接方式。 –

+0

哦,对了,得到了!那确实很合理。我不明白的是为什么我可以从一个程序中选择数据,但不是另一个?我会认为视图背后的日期格式取决于oracle服务器,而不是应用程序设置(因为它是一个视图,我希望这部分对应用程序是透明的) – Lock