【问题标题】:Crystal Reports doesn't execute SQL query properlyCrystal Reports 无法正确执行 SQL 查询
【发布时间】:2016-07-29 05:30:21
【问题描述】:

我正在写一份报告,以根据承诺的发货日期拉动金属现货价格。它使用 60 天中西部 (MW) 平均值。因此,对于 3 月份承诺的装运,使用 1 月份的 MW 平均值。该表是用户定义的,有一些问题使我无法像往常一样拉动该字段(长篇大论)。

所以我写了一个查询,将数据库中的列标签([MONTH] [YEAR])与承诺日期的月份和年份进行比较,并返回正确的 MW 平均值。它在 Oracle 的 SQL Developer 中运行正常,但在 Crystal 中运行不正确,返回同月的 MW 平均值(或根本不运行)。以下供参考。 (我知道这有点笨拙)

select ap.invoice_Date indate, 
ap.invoice_no as invno,
ap.vendor_id,
apd.po_detail_id as podid, 
por.promise_date as pd,
dat.parent_id as vendid, 
dat.ud_cols_id as cols, 
col.col_label label, 
dat.cuser as ingot
from ud_data dat
inner join ud_cols col
on dat.ud_cols_id = col.id
inner join apinvoice ap
on ap.vendor_id = dat.parent_id
inner join apinvoice_detail apd
on ap.id = apd.apinvoice_id
inner join po_detail pod
on apd.po_detail_id = pod.id
inner join po_releases por
on pod.id = por.po_detail_id
where trim(TO_CHAR(add_months(por.promise_date, -2), 'MONTH'))= upper(substr(COL.col_label, 1, length(col_label)-5)) 
and substr(por.promise_date, -2, 2) = substr(col.col_label, -2, 2)
and ud_cols_id in (94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 146)
order by ap.invoice_Date

我认为这与日期和格式有关,但我将它们分开并且比较匹配。我尝试了所有可能的链接组合(但坚持使用左外连接,内连接使报告返回空白)。浏览字段数据也没有。

任何想法都值得赞赏。我很茫然..

【问题讨论】:

  • 您将查询放在哪里?是吗?
  • 在我花时间寻找解决方案之前...你没有回答红人的问题。
  • @reds 我不确定我是否理解您的要求。我将它作为命令添加到表列表中。在 vendor_id 上链接到 AP 发票上的供应商 ID。
  • @CoSpringsGuy 所以我看到了。我现在已经回答了。如果我理解错了,也许你能澄清一下?
  • 因为查询在 Oracle 应用程序中运行良好,所以很难说。 oracle 应用程序是否使用与 Crystal 相同的 odbc 设置?

标签: mysql crystal-reports


【解决方案1】:

实际上,一旦它在数据库上工作,它应该在水晶中工作,但如果它不工作,那么你可以改变一下如何形成水晶报告,因为数据存在于数据库中并且它工作得很好。

给下面的方法一个机会。首先将查询拆分为一个部分,将 where 子句作为一个部分

select ap.invoice_Date indate, 
ap.invoice_no as invno,
ap.vendor_id,
apd.po_detail_id as podid, 
por.promise_date as pd,
dat.parent_id as vendid, 
dat.ud_cols_id as cols, 
col.col_label label, 
dat.cuser as ingot
from ud_data dat
inner join ud_cols col
on dat.ud_cols_id = col.id
inner join apinvoice ap
on ap.vendor_id = dat.parent_id
inner join apinvoice_detail apd
on ap.id = apd.apinvoice_id
inner join po_detail pod
on apd.po_detail_id = pod.id
inner join po_releases por
on pod.id = por.po_detail_id

现在只是上面的选择查询与水晶报表中的连接并运行报表并查看是否可以获取数据......如果您无法获取数据,那么数据库连接存在问题,就像您可能指向错误一样水晶报表中的数据库。

您可以在 Record Selection Formula 的水晶报告中操作它,而不是在查询本身中编写 where 子句

where trim(TO_CHAR(add_months(por.promise_date, -2), 'MONTH'))= upper(substr(COL.col_label, 1, length(col_label)-5)) 
and substr(por.promise_date, -2, 2) = substr(col.col_label, -2, 2)
and ud_cols_id in (94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 146)

在水晶中,您需要更改语法以适应水晶语法,例如 to_char 可能不起作用。

如果您发现数据库连接本身是错误的,则建立正确的连接并通过粘贴整个查询来遵循该过程

【讨论】:

  • 感谢您的贡献!我没有想过将 where 子句放入 Crystal 中。我想我想通了。我认为这是承诺日期的 substr()。
【解决方案2】:
select ap.invoice_Date indate, 
ap.invoice_no as invno,
ap.vendor_id,
apd.po_detail_id as podid, 
por.promise_date as pd,
dat.parent_id as vendid, 
dat.ud_cols_id as cols, 
col.col_label label, 
dat.cuser as ingot
from ud_data dat
inner join ud_cols col
on dat.ud_cols_id = col.id
inner join apinvoice ap
on ap.vendor_id = dat.parent_id
inner join apinvoice_detail apd
on ap.id = apd.apinvoice_id
inner join po_detail pod
on apd.po_detail_id = pod.id
inner join po_releases por
on pod.id = por.po_detail_id
where trim(upper(TO_CHAR(add_months(por.promise_date, -2), 'MON')))= upper(substr(COL.col_label, 1, 3)) 
and trim(to_char(por.promise_date, 'YY')) = substr(col.col_label, -2, 2)
and ud_cols_id in (94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 146)
order by por.promise_date

我更改了 where 子句的第二行。现在工作。

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多