OPEN-SQL查询不适用于Abap 4 EXEC SQL

问题描述

我是ABAP的新手(我正在R / 3上使用ABAP4),我的代码有些不了解的地方。

我的代码用于显示通过外部数据库输入的机票与sap内的发票价格之间的价格不同,以了解经济损失以及在哪些机票中误用了产品价格。事实是,在ALV中,当我使用特定的发票编号进行过滤时,它对我的​​过滤效果很好,而且日期范围也很短。但是程序一直在无限思考

首先,我要做的是查询内部数据库并将保存在alv的选择范围内的值保存在itab中。然后,在itab本身中进行循环,对于每次迭代,我将通过以下方式将显示给您的查询数据放在另一个表中:

   IF itab-importe_total <> itab-kzwi5.
     APPEND itab TO result_itab.
   ENDIF.

这是连接内部的代码:

    EXEC SQL.

      OPEN dbcur for

      SELECT C.COD_ALBARAN,P.LINEA,P.CODART,P.CANTIDAD,P.DESCUENTO,P.PRECIO,P.PRECIO_TOTAL,P.IMPORTE,P.IMPORTE_TOTAL,P.FECHA
      FROM [cm].[D_CLIE_ALBARANES_CAB_TBL] AS C
      LEFT JOIN [cm].[D_CLIE_ALBARANES_DET_TBL] AS P ON C.ID_CLIE_ALBARAN = P.ID_CLIE_ALBARAN
      WHERE (C.ID_TIPO_DOCUMENTO = :itab-tipo_documento) AND (C.COD_ALBARAN = :itab-num_tiquet) AND (P.LINEA = :posicio)

    ENDEXEC.

    DO.
      EXEC SQL.
        FETCH NEXT dbcur INTO   :wa_con-codalb,:wa_con-linia,:wa_con-codart,:wa_con-cantid,:wa_con-desc,:wa_con-precio,:wa_con-precio_total,:wa_con-importe,:wa_con-importe_total

      ENDEXEC.

      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        itab-linia = wa_con-linia.
        itab-codart = wa_con-codart.
        itab-cantid = wa_con-cantid.
        itab-desc = wa_con-desc.
        itab-precio = wa_con-precio.
        itab-precio_total = wa_con-precio_total.
        itab-importe = wa_con-importe.
        itab-importe_total = wa_con-importe_total.

        MODIFY itab .

      ENDIF.

    ENDDO.

    EXEC SQL.
      CLOSE dbcur
    ENDEXEC.

如果我在服务器上执行此查询以更改where值(因为每次迭代都会更改内部变量)

SELECT C.COD_ALBARAN,P.FECHA
FROM [cm].[D_CLIE_ALBARANES_CAB_TBL] AS C
LEFT JOIN [cm].[D_CLIE_ALBARANES_DET_TBL] AS P ON C.ID_CLIE_ALBARAN = P.ID_CLIE_ALBARAN
WHERE (C.ID_TIPO_DOCUMENTO = '1') AND (C.COD_ALBARAN = '2020/13GI10/00009742') AND (P.LINEA = '1')

我得到以下输出:

COD_ALBARAN LINEA   CODART  CANTIDAD    DESCUENTO   PRECIO  PRECIO_TOTAL    IMPORTE IMPORTE_TOTAL   FECHA
2020/13GI10/00009742    1   769109000   1.000   -57.55  5.7438  6.9500  9.050   10.950  2020-08-26 00:00:00.000

为防止发生任何日期错误转换,我删除了日期条件

 AND (CONVERT(date,P.FECHA) >=  BETWEEN :s_data-low AND s_data-high ))

这是我在其中获取数据的表的声明:

DATA: BEGIN OF wa_con,codalb(20)," Ex: 2020/13gi10/00000439
    linia LIKE vbrp-posnr," Linia - ex: 1,2,[3]
    codart LIKE vbrp-matnr," Codi d'article per CMZ
    cantid LIKE vbrp-fkimg," Quantitat
    precio LIKE vbrp-netwr," Preu
    precio_total LIKE vbrp-netwr," Preu final
    desc LIKE vbrp-netwr," Descompte
    importe LIKE vbrp-netwr," Import
    importe_total LIKE vbrp-netwr," Import total
    fecha LIKE vbrk-fkdat," Data
END OF wa_con.

这是我的itab:

DATA: BEGIN OF itab OCCURS 0,vbeln LIKE vbrk-vbeln," Número de factura
    fkdat LIKE vbrk-fkdat," Data
    spart LIKE vbrk-spart," Sector
    posnr LIKE vbrp-posnr," Posició de la factura
    matnr LIKE vbrp-matnr," Referencia / codi del material
    kunrg LIKE vbrk-kunrg," Client
    arktx LIKE vbrp-arktx," Descripció de la gestió / Per defecte nom material
    fkimg LIKE vbrp-fkimg," Quantitat unitaria facturada
    bukrs LIKE vbrk-bukrs," Organització - Ha de ser 10 13 o 16 per brico
    netwr LIKE vbrp-netwr," Valor net de la factura
    kzwi1 LIKE vbrp-kzwi1," Subtotal
    kzwi5 LIKE vbrp-kzwi5," Subtotal / Preu final
    kzwi6 LIKE vbrp-kzwi6," Subtotal
    vkorg LIKE vbrk-vkorg," Organització form 13gi
    mwsbp LIKE vbrp-mwsbp," IVA
    xblnr(20)," Referencia tiquet
    tipo_documento(1)," tipo document cmz  1= carrec / 3= abonament
    num_tiquet(20) TYPE c," referencia tiquet cmz
    linia LIKE vbrp-posnr," CM posició
    codart LIKE vbrp-matnr," CM codi article
    cantid LIKE vbrp-fkimg," CM quantitat facturada
    desc LIKE vbrp-netwr," CM descompte
    precio LIKE vbrp-netwr," CM preu
    precio_total LIKE vbrp-netwr," CM preu total
    importe LIKE vbrp-netwr," CM import
    importe_total LIKE vbrp-netwr," CM import total
 END OF itab.

有什么建议吗?

解决方法

正如我所说,我的问题是该程序从未完成执行,是因为它执行的18k记录的查询次数是在第一个SELECT中获得的记录的次数。

首先,我退出了初始循环(在问题描述中没有显示,但是托管了与外部db的连接所在的位置),select蒸蒸到了外部数据库,仅进行过滤按日期s_data-low s_data-high的范围(以及它在我需要的codalm值上重复的任意一个共同值)求助,然后将结果放入一个单独的表格:


  DATA con_name LIKE dbcon-con_name.

  CLEAR wa_sap.

  IF sy-sysid = 'FEP'.
    con_name = 'CMZ'.
  ELSE.
    con_name = 'CMZTEST'.
  ENDIF.

  EXEC SQL.
    connect to :con_name
  ENDEXEC.

** Select a la db de cmz per imputar pre cada iteració del loop les dades de cada referència a la seva línia
  EXEC SQL.

    OPEN dbcur for

    SELECT C.COD_ALBARAN,P.LINEA,P.CODART,P.CANTIDAD,P.DESCUENTO,P.PRECIO,P.PRECIO_TOTAL,P.IMPORTE,P.IMPORTE_TOTAL,C.ID_TIPO_DOCUMENTO
    FROM [cmz].[D_CLIE_ALBARANES_CAB_TBL] AS C
    INNER JOIN [cmz].[D_CLIE_ALBARANES_DET_TBL] AS P ON C.ID_CLIE_ALBARAN = P.ID_CLIE_ALBARAN
    WHERE (P.FECHA BETWEEN :s_data-low AND :s_data-high) AND (C.CODALM = :codalm)

  ENDEXEC.


  DO.

    EXEC SQL.
      FETCH NEXT dbcur INTO     :wa_cmz-codalb,:wa_cmz-linia,:wa_cmz-codart,:wa_cmz-cantid,:wa_cmz-desc,:wa_cmz-precio,:wa_cmz-precio_total,:wa_cmz-importe,:wa_cmz-importe_total,:wa_cmz-tipo_documento
    ENDEXEC.

    IF sy-subrc <> 0.
      EXIT.
    ELSE.
      APPEND wa_cmz TO it_cmz.

    ENDIF.

  ENDDO.

  EXEC SQL.
    CLOSE dbcur
  ENDEXEC.

然后在循环中,我需要做的是创建传递号,该传递号将在循环本身中为我服务,并在字段之间提供条件,将所有行附加到我将显示的新表中。 / p>

  LOOP AT it_sap INTO wa_sap.

    wa_sap-tipo_documento = wa_sap-xblnr+2(1). " Linea

    tiquet = wa_sap-xblnr+9(7).
    anycreacio = wa_sap-fkdat+0(4).

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' " 
      EXPORTING
        input  = tiquet
      IMPORTING
        output = tiquet.

    CONCATENATE anycreacio '/' wa_sap-vkorg wa_sap-xblnr+7(2) '/' tiquet INTO wa_sap-codalb. " Creació del tiquet

    "CLEAR posicio.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        input  = wa_sap-posnr
      IMPORTING
        output = posicio.

    READ TABLE it_cmz INTO wa_cmz
    WITH KEY codalb = wa_sap-codalb
             tipo_documento = wa_sap-tipo_documento.

    IF sy-subrc = 0.
      wa_sap-importe_total = wa_cmz-importe_total.
      wa_sap-importe = wa_cmz-importe.
      wa_sap-precio = wa_cmz-precio.
      wa_sap-precio_total = wa_cmz-precio_total.
      wa_sap-desc = wa_cmz-desc.
      wa_sap-cantid = wa_cmz-cantid.

      MODIFY it_sap FROM wa_sap.

      IF wa_sap-importe_total <> wa_sap-kzwi5. 
        APPEND wa_sap TO it_resultats.
      ENDIF.

    ENDIF.

  ENDLOOP.

感谢对错误的初始解释的关注和关注。这是一种有限的语言,很难找到培训(而且存在的培训非常昂贵)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...