我正在撰写一份报告,根据货物的承诺日期提取金属现货价格。它使用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
我认为这与日期和格式有关,但是我把它们排除在外并且比较相符。我尝试了每个组合链接我可以(但坚持左外连接,内连接使报告返回空白)。浏览字段数据也没有。
任何想法都值得赞赏。我茫然......
答案 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子句的第二行。现在工作。