Crystal Reports无法正确执行SQL查询

时间:2016-07-21 15:32:39

标签: mysql crystal-reports

我正在撰写一份报告,根据货物的承诺日期提取金属现货价格。它使用60天中西部(MW)平均值。因此,对于3月份承诺的货物,使用1月份的MW平均值。该表是用户定义的,并且有一些问题使我不能像正常那样拉动字段(loong story)。

所以我写了一个查询来比较数据库中的列标签([MONTH] [年])和承诺日期的月份和年份,并返回正确的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

我认为这与日期和格式有关,但是我把它们排除在外并且比较相符。我尝试了每个组合链接我可以(但坚持左外连接,内连接使报告返回空白)。浏览字段数据也没有。

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

2 个答案:

答案 0 :(得分:0)

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

给下面的方法一个机会。首先将查询拆分为选择一个部分,将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

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

不是在查询本身中编写where子句,而是可以在Record Selection Formula

中的水晶报表中对其进行操作
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)

在水晶中,你需要更改sytax以适应水晶语法,例如to_char可能无效。

如果您看到数据库连接本身是错误的,那么请建立正确的连接并通过粘贴整个查询来跟踪该过程

答案 1 :(得分:0)

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子句的第二行。现在工作。