问题描述
我是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.
感谢对错误的初始解释的关注和关注。这是一种有限的语言,很难找到培训(而且存在的培训非常昂贵)。