2013-01-06 67 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