【问题标题】:Oracle returns rows- Crystal reports doesn'tOracle 返回行 - Crystal 报表不返回
【发布时间】:2013-01-08 14:01:48
【问题描述】:

我有一个在 Oracle 中创建的视图。它返回行,但是当我通过 Crystal Reports 使用它时,我没有得到任何行。我已在视图后面的查询中将其缩小到此 CT​​E:

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 查询数据,而不会被后面的内容所困扰观点?!)

【问题讨论】:

    标签: sql crystal-reports oracle11g


    【解决方案1】:

    不知道为什么,但我将 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
    

    我仍然很想知道为什么视图后面的查询会影响 Crystal Reports!

    【讨论】:

      【解决方案2】:

      在您的第一个查询中,这一行:-

      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 提供第二个参数来显式设置日期格式。

      Crystal Reports 是否报告了 ORA 错误,例如 ORA-01861: literal does not match format string

      【讨论】:

      • 它不会简化为那样,因为这不会动态地拉动当前财政年度,而这正是该声明所实现的。不,任何地方都没有错误。这两条语句在查询表时返回相同的结果;只是 Crystal Reports 认为它​​在第一条语句中返回了 0 行。
      • 我知道它会根据 sysdate 有所不同。关键是TO_DATE 没有第二个参数,这使得它取决于会话级别的设置,这些设置可能会因您的连接方式而异。
      • 对了,明白了!那么这确实很有意义。我不明白的是为什么我仍然可以在一个程序中从视图中选择数据,但不能在另一个程序中选择数据?我原以为视图背后的日期格式取决于 oracle 服务器,而不是应用程序设置(因为它是一个视图,我希望这部分对应用程序是透明的?)
      • 搜索 NLS_TERRITORY 和 NLS_DATE_FORMAT
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多