【问题标题】:BIRT Designer select statment inside CASE THENCASE WHEN 中的 BIRT Designer 选择语句
【发布时间】:2021-04-18 12:28:17
【问题描述】:

我在 BIRT Designer 4.3.1 中遇到问题,我的脚本中有 SQL 查询。

sqlText = " SELECT MXZINVTRANS.ORGID, MXZINVTRANS.ITEMSETID, MXZINVTRANS.SITEID, MXZINVTRANS.TRANSDATE, MXZINVTRANS.STORELOC, MXZINVTRANS.STORELOC_DESCRIPTION,  "
+ "         MXZINVTRANS.ACTUALDATE, MXZINVTRANS.TOSTORELOC, MXZINVTRANS.MAXTAB, MXZINVTRANS.TRANSGROUP, MXZINVTRANS.DOCUMENT,  "
+ "         MXZINVTRANS.REFDOC, MXZINVTRANS.ITEMNUM, MXZINVTRANS.CONDITIONCODE, MXZINVTRANS.ITEM_DESCRIPTION, MXZINVTRANS.COMMODITYGROUP,  "
+ "         MXZINVTRANS.COMMODITYGROUP_DESCRIPTION, MXZINVTRANS.ISSUEUNIT, MXZINVTRANS.TRANSTYPE, MXZINVTRANS.TRANSTYPE_DESCRIPTION, MXZINVTRANS.QUANTITY,  "
+ "         MXZINVTRANS.MAXIMOQUANTITY, MXZINVTRANS.UNITCOST, MXZINVTRANS.LINECOST, MXZINVTRANS.FINPER, MXZINVTRANS.CURBALBEFORE,  "
+ "         MXZINVTRANS.CURBALAFTER, MXZINVTRANS.COSTCENTER, MXZINVTRANS.COSTCENTER2, MXZINVTRANS.SAPUNITCOST, MXZINVTRANS.SAPPRICEUNIT,  "
+ "         MXZINVTRANS.SAPLINECOST, MXZINVTRANS.SAPTRANSID, "
//+ "            (case MXZINVTRANS.TRANSTYPE  "
//+ "              WHEN 'RECEIPT' THEN 'Prejem' "
//+ "              WHEN 'RETURN' THEN 'Vrač. na skl.' "
//+ "              WHEN 'ISSUE' THEN 'TOREK' "
//+ "              WHEN 'TRANSFER' THEN 'Izd. med skl.' "
//+ "              WHEN 'INSERTITEM' THEN 'Insertitem_??' "
//+ "              WHEN 'VOIDRECEIPT' THEN 'Voidreceipt_??' "
//+ "              WHEN 'SHIPTRANSFER' THEN 'shiptransfer_??' "
//+ "              WHEN 'SHIPCANCEL' THEN 'shipcancel_??' "
//+ "              WHEN 'SHIPRECEIPT' THEN 'shipreceipts_??' "
//+ "           end) as tip_trans,  "
+ "          (case MXZINVTRANS.TRANSTYPE_DESCRIPTION  "
+ "             WHEN 'Prejem pošiljke'  THEN (select description from locations where locations.location=MXZINVTRANS.tostoreloc and locations.siteid=MXZINVTRANS.SITEID) "
+ "             WHEN 'Prenos pošiljke'  THEN (select description from locations where locations.location=MXZINVTRANS.tostoreloc and locations.siteid=MXZINVTRANS.SITEID) "
+ "             WHEN 'Ident prejema'    THEN (select distinct VENDOR from PO where PO.PONUM=left(MXZINVTRANS.REFDOC, LOCATE('-',MXZINVTRANS.REFDOC)-1)) "
//+ "               WHEN 'Ident vračila' THEN (select distinct NAME from COMPANIES where COMPANIES.COMPANY=(select distinct VENDOR from PO where PO.PONUM=left(MXZINVTRANS.REFDOC, LOCATE('-',MXZINVTRANS.REFDOC)-1) and PO.SITEID=MXZINVTRANS.SITEID)) "
+ "             end) as opis_storeloc  "
//+ " (select description from locations where locations.location=MXZINVTRANS.tostoreloc and locations.siteid=MXZINVTRANS.SITEID) as opis_storeloc "

+ " FROM MXZINVTRANS "
// Include the Maximo where clause
//+ " where " + params["where"]

//+ " and invbalances.itemnum = '2000049451' "
//+ " and invbalances.itemnum like '2000000%' "
+ " where 1=1 "

+ " and(( trunc(MXZINVTRANS.TRANSDATE) ) <=  TO_DATE ('" + params["datum_do"] + "','YYYY-MM-DD') and ( trunc(MXZINVTRANS.TRANSDATE) ) >=  TO_DATE ('" + params["datum_od"] + "','YYYY-MM-DD'))"

+ storeroomwhere
+ blagskupinawhere
+ itemwhere
+ tipwhere


//+ " and invbalances.itemnum ='2000049451' "
//+ " and  siteid='6000'"
//+ " order by po.ponum " 
;

maximoDataSet.setQuery(sqlText);

这可能是主要问题:

+ " WHEN 'Ident prejema'    THEN (select distinct VENDOR from PO where PO.PONUM=left(MXZINVTRANS.REFDOC, LOCATE('-',MXZINVTRANS.REFDOC)-1)) "

首先要解释一下,REFFODC 的值类似于 4500038258-R2-120,使用 LEFT,我得到这个数字 4500038258,我在表 PO 中查看了它,其中等于 PONUM,然后我打印 VENDOR 作为数字 114263 例如.

问题就在这里,这里我有错误,但如果我直接写 MXZINVTRANS.REFDOC 编号 4500038258 则没有错误。另外,如果只打印 REFDOC 值的这个子字符串,我会在报告中得到正确的子字符串并且没有错误,那么问题可能就在这里?

Screen

【问题讨论】:

  • 您应该将实际的错误消息添加到您的问题中。此外,我不知道这在 DB2 中是否可行,但是使用 Oracle,您可以跟踪会话或网络流量。这将向您显示确切的查询文本。您还可以将生成的 SQL 语句转储到文本文件中。我很确定生成的语句或绑定变量有问题。

标签: sql database select db2 birt


【解决方案1】:

假设您已经转储了生成的 SQL 语句并在 BIRT 之外成功对其进行了测试,请记住,对于每个数据集参数,您都需要在语句中出现相应的绑定变量。

例如,如果您的数据集有 两个 数据集参数,则您恰好需要 两个 绑定变量(语法取决于 DB,JDBC 标准 ? 应该适用于每个数据库。

如果这些数字不匹配,则会导致错误。

【讨论】:

    【解决方案2】:

    我解决了一些问题。它的工作,但我有以下问题:

    + " case " 
    + " WHEN MXZINVTRANS.TOSTORELOC IS NULL "
    
        + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Izdaja' "
            + " THEN case WHEN MXZINVTRANS.DOCUMENT LIKE '%-%' "
                + " THEN left(MXZINVTRANS.DOCUMENT, LOCATE('-',MXZINVTRANS.DOCUMENT)-1) "
                + " ELSE MXZINVTRANS.DOCUMENT "
            + " END "
        + " END "
    
        + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Ident prejema' "
            + " THEN (select distinct VENDOR from PO where PO.PONUM=MXZINVTRANS.DOCUMENT) "
        + " END "
        
    + " ELSE "
    + " MXZINVTRANS.TOSTORELOC "
    + " END "
    + " AS TOSTORELOC"
    
    

    当我这样使用它时会出现错误,当我只使用蓝色圆圈中的代码而没有红色圆圈中的代码时。

    + " case " 
    + " WHEN MXZINVTRANS.TOSTORELOC IS NULL "
    
        + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Izdaja' "
            + " THEN case WHEN MXZINVTRANS.DOCUMENT LIKE '%-%' "
                + " THEN left(MXZINVTRANS.DOCUMENT, LOCATE('-',MXZINVTRANS.DOCUMENT)-1) "
                + " ELSE MXZINVTRANS.DOCUMENT "
            + " END "
        + " END "
        
    + " ELSE "
    + " MXZINVTRANS.TOSTORELOC "
    + " END "
    + " AS TOSTORELOC"
    

    如果我使用红色圆圈中的代码而没有蓝色圆圈中的代码也可以。

    + " case " 
    + " WHEN MXZINVTRANS.TOSTORELOC IS NULL "
        + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Ident prejema' "
            + " THEN (select distinct VENDOR from PO where PO.PONUM=MXZINVTRANS.DOCUMENT) "
        + " END "
        
    + " ELSE "
    + " MXZINVTRANS.TOSTORELOC "
    + " END "
    + " AS TOSTORELOC"
    

    有什么建议为什么不一起工作?

    【讨论】:

      【解决方案3】:

      我在 SQuirrel 中尝试过,但我不明白为什么会出现这种语法错误?

      这不起作用:

      + " (case WHEN MXZINVTRANS.TOSTORELOC IS NULL "
      
      
          + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Ident prejema' "
              + " THEN (select distinct VENDOR from PO where PO.PONUM=MXZINVTRANS.DOCUMENT) "
          + " END "
          
          + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Ident vračila' "
              + " THEN (select distinct VENDOR from PO where PO.PONUM=MXZINVTRANS.DOCUMENT) "
          + " END "
          
          
      + " ELSE "
      + " MXZINVTRANS.TOSTORELOC "
      + " END) "
      + " AS TOSTORELOC"
      

      这是有效的:

      + " (case WHEN MXZINVTRANS.TOSTORELOC IS NULL "
      
      
          + " THEN case WHEN MXZINVTRANS.TRANSTYPE_DESCRIPTION='Ident prejema' OR MXZINVTRANS.TRANSTYPE_DESCRIPTION='Ident vračila' "
              + " THEN (select distinct VENDOR from PO where PO.PONUM=MXZINVTRANS.DOCUMENT) "
          + " END "
          
          
      + " ELSE "
      + " MXZINVTRANS.TOSTORELOC "
      + " END) "
      + " AS TOSTORELOC"
      

      【讨论】:

        猜你喜欢
        • 2021-02-05
        • 2015-02-11
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 2016-07-08
        相关资源
        最近更新 更多