Crystal Reports子查询

时间:2010-01-14 16:23:20

标签: oracle crystal-reports

我需要创建一个引用多个表的报表,包括一个表,它是订单的逐行详细信息。在订单上,我们有包,唯一的方法来确定包是否具有某种状态是分析它的组件成员的状态。发票明细按顺序存储,每行的行号和项目级别。带有itemlevel的条目> 1是紧接在它们之前的套件的一部分。所以,例如:

Invoiceiid | Lineno | LevelNo | SKU
----------------------------------------------------
10192      | 1      | 1       | K-PACKAGE
10192      | 2      | 2       | SCREEN
10192      | 3      | 2       | CABLE
10192      | 4      | 1       | LCD PROJECTOR

在此示例中,SCREEN和CABLE是K-PACKAGE的一部分,而LCD PROJECTOR则不是。

我根据组件的状态修改这些包的状态。就我的目的而言,平均状态正常。我将下面包含的命令作为我正在使用的SQL查询的较小版本(较大的版本只是处理多个子项的强力方法)。该命令在数据库专家,编辑命令屏幕中被接受,但实际上尝试预览报告返回

“数据库连接器错误:'HY000:[Oracle] [ODBC] [Ora] ORA-01427:单行子查询返回多行[数据库供应商代码:1427]'”

当它真正开始尝试提取结果时。

这是我用来尝试找到问题的简短SQL查询。现在,我只是展示利润中心,试着看看是不是问题。

select ih.billdate, ih.invoiceid, ih.profitcenter, co.contractid, il.action,
(
      case il.status
            when 15 then
            (
                  case when (((select il2.itemlevel from invoiceline il2 where il2.invoiceiid = il.invoiceiid and il2.lineno = (il.lineno + 1)) = 1) or ((select count(il2.itemlevel) from invoiceline il2 where il2.invoiceiid = il.invoiceiid and il2.lineno = (il.lineno + 1)) = 0))
                        then 15
                  when (((select max(il2.lineno) from invoiceline il2 where il2.invoiceiid = il.invoiceiid) <= (il.lineno + 2)))
                        then (select il5.status from invoiceline il5 where il5.invoiceiid = il.invoiceiid and il5.lineno = (il.lineno + 1))
                  else
                        15
                  end
            )
            else
                  il.status
      end
      ) as "Status",
il.amount, il.discountamount, im.revenuegroup, im.subrentalexpense, im.discountgroup, im.subrentglcode, im.sellglcode from invoicehead ih inner join contract co on ih.contractiid = co.contractiid left outer join invoiceline il on ih.invoiceiid = il.invoiceiid inner join invmaster im on il.inviid = im.invi

如果我改变

then (select il5.status from invoiceline il5 where il5.invoiceiid = il.invoiceiid and il5.lineno = (il.lineno + 1))

只提供一个严格的数字(例如15),报告预览没有问题。

只是在传递中解决问题:主包项和组件之间没有其他引用(至少我找不到),也不能更改数据库模式。一切都必须在Crystal Reports中。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

好像你有相同的记录(Invoiceiid,Lineno),你可以查看下面的查询:

SELECT invoiceiid, lineno, COUNT(*)
  FROM invoiceline
 GROUP BY invoiceiid, lineno
HAVING COUNT(*) > 1

如果是这种情况,我建议您更正数据,然后在(Invoiceiid,Lineno)上添加UNIQUE CONSTRAINT

更新

@Michael:在回复您的评论时:如果您无法更正数据,则必须在遇到重复时决定该怎么做。例如,您可以修改子查询il2il5,以便他们返回最多一行,例如将SELECT il2.itemlevel替换为SELECT MAX(il2.itemlevel)

您还可以使用分析来读取下一行的值(它将比子查询更有效):

SELECT ih.billdate, ih.invoiceid, ih.profitcenter, co.contractid, il.action,
       (CASE il.status
          WHEN 15 THEN
           (CASE
              WHEN LEAD(il2.itemlevel) OVER(PARTITION BY invoiceiid ORDER BY lineno) IS NULL THEN
               15
              WHEN MAX(il2.lineno) OVER(PARTITION BY invoiceiid) <= il.lineno + 2 THEN
               LEAD(il5.status) OVER(PARTITION BY invoiceiid ORDER BY lineno)
              ELSE
               15
           END)
          ELSE
           il.status
       END) AS "Status", il.amount, il.discountamount, im.revenuegroup, im.subrentalexpense, im.discountgroup,
       im.subrentglcode, im.sellglcode
  FROM invoicehead ih
 INNER JOIN contract co ON ih.contractiid = co.contractiid
  LEFT OUTER JOIN invoiceline il ON ih.invoiceiid = il.invoiceiid
 INNER JOIN invmaster im ON il.inviid = im.invi

答案 1 :(得分:0)

感谢文森特......事实证明,出现这种情况有两个不同的原因。一个是我确实有重复的条目,因为文森特指出,我能够修复它们。

另一个问题是我假设NULL值转到0(在这种情况下他们没有)并且我的边界没有正确设置。调整我的异常条件后,我能够使代码正常工作。非常感谢!