OPEN-SQL 查询在 abap 4 EXEC SQL 中不起作用

OPEN-SQL query doesn't work at abap 4 EXEC SQL

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

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

首先我做的是查询内部数据库,将落在alv选择范围内的值保存在一个itab中。然后我在 itab 本身中创建一个循环,对于每次迭代,我将下面显示的查询数据放入另一个 table via:

   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.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 = '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 ))

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

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.[=16= 中获得的记录一样多]

首先,我已经脱离了初始循环(我没有在问题的描述中显示,但它是托管到外部数据库的连接的地方)select 蒸汽到外部数据库,仅按我要求 alv 的日期范围 s_data-low s_data-high(以及在我需要的值 codalm 上重复的任意公共值)进行过滤,以及结果我放在一个单独的 table:


  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.

然后在循环内,我需要的是创建稍后将在循环本身中为我服务的交货编号,以及字段之间的条件,将所有行附加到新的 table我会展示。

  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.

感谢您的关注,并为糟糕的初步解释表示歉意。这是一种有点受限的语言,很难找到培训(而且现有的培训非常昂贵)。