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