1
Programación ABAP / Modificar BADI para una BAPI
« en: 13 de Mayo de 2016, 10:58:30 am »
Buenas !!
Estoy empezando con ABAP y tengo un poco de lio con esto que os voy a mostrar.
Tengo un programa donde subo un txt y me lo tiene que validar. Salen unas claves contables por defecto y yo las cambio por otras. Para ello tengo una BADI. Y luego llamo a la BAPI... Me han mandado un mail con lo que tengo que hacer pero... he modificado la badi y he llamado a la bapi... y ahí me he quedado.... no se seguir. Os comparto el mail y por si me puede ayudar.
Yo lo que hice es cambiar las claves propuestas (01/21/31)… por claves que no afectarán al volumen de negocio mediante la BADI es la siguiente: BADI_ACC_DOCUMENT, implementación: IF_EX_ACC_DOCUMENT, método change.
El código es el siguiente:
METHOD if_ex_acc_document~change.
DATA: ls_extension TYPE bapiparex,
ls_accit TYPE accit.
CLEAR: ls_extension.
* Modificamos las claves contables según las que obtuvimos a través del importe.
LOOP AT c_extension2 INTO ls_extension.
IF ls_extension-structure = 'BSCHLD'.
CLEAR: ls_accit.
READ TABLE c_accit INTO ls_accit WITH KEY posnr = ls_extension-valuepart1.
IF sy-subrc = 0.
ls_accit-bschl = ls_extension-valuepart2.
ENDIF.
MODIFY c_accit FROM ls_accit INDEX sy-tabix TRANSPORTING bschl.
ENDIF.
ENDLOOP.
LOOP AT c_extension2 INTO ls_extension.
IF ls_extension-structure = 'BSCHLK'.
CLEAR: ls_accit.
READ TABLE c_accit INTO ls_accit WITH KEY posnr = ls_extension-valuepart1.
IF sy-subrc = 0.
ls_accit-bschl = ls_extension-valuepart2.
ENDIF.
MODIFY c_accit FROM ls_accit INDEX sy-tabix TRANSPORTING bschl.
ENDIF.
ENDLOOP.
ENDMETHOD.
Los valuespart 1 y valuespart2 te los has de llevar en el programa que llame a la BAPI en la tabla de esta misma extensión2.
Este es el código para rellenar la tabla extension2 (en mi caso contra la tabla interna it_ext2).
* En el caso de clientes.
LOOP AT it_accountreceivable WHERE sp_gl_ind IS INITIAL.
gs_ext2-structure = 'BSCHLD'.
gs_ext2-valuepart1 = it_accountreceivable-itemno_acc.
LOOP AT it_currencyamount WHERE itemno_acc EQ gs_ext2-valuepart1.
IF it_currencyamount-amt_doccur > 0.
gs_ext2-valuepart2 = '04'.
ELSE.
gs_ext2-valuepart2 = '14'.
ENDIF.
ENDLOOP.
APPEND gs_ext2 TO it_ext2.
ENDLOOP.
Y esta la forma de llamar la BAPI:
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = gd_documentheader
customercpd = gd_customercpd
contractheader = gd_fica_hd
IMPORTING
obj_type = l_type
obj_key = l_key
obj_sys = l_sys
TABLES
accountgl = it_accountgl[]
accountreceivable = it_accountreceivable[]
accountpayable = it_accountpayable[]
accounttax = it_accounttax[]
currencyamount = it_currencyamount[]
criteria = it_criteria[]
valuefield = it_valuefield[]
extension1 = it_ext[]
return = it_return[]
paymentcard = it_paymentcard[]
contractitem = it_fica_it[]
extension2 = it_ext2[]
realestate = it_re[].
En tu caso, deberás cambiar el 04, por lo que desees, 05,15 etc.
Qué pasos debo de seguir?
Gracias
Un saludo,
Estoy empezando con ABAP y tengo un poco de lio con esto que os voy a mostrar.
Tengo un programa donde subo un txt y me lo tiene que validar. Salen unas claves contables por defecto y yo las cambio por otras. Para ello tengo una BADI. Y luego llamo a la BAPI... Me han mandado un mail con lo que tengo que hacer pero... he modificado la badi y he llamado a la bapi... y ahí me he quedado.... no se seguir. Os comparto el mail y por si me puede ayudar.
Yo lo que hice es cambiar las claves propuestas (01/21/31)… por claves que no afectarán al volumen de negocio mediante la BADI es la siguiente: BADI_ACC_DOCUMENT, implementación: IF_EX_ACC_DOCUMENT, método change.
El código es el siguiente:
METHOD if_ex_acc_document~change.
DATA: ls_extension TYPE bapiparex,
ls_accit TYPE accit.
CLEAR: ls_extension.
* Modificamos las claves contables según las que obtuvimos a través del importe.
LOOP AT c_extension2 INTO ls_extension.
IF ls_extension-structure = 'BSCHLD'.
CLEAR: ls_accit.
READ TABLE c_accit INTO ls_accit WITH KEY posnr = ls_extension-valuepart1.
IF sy-subrc = 0.
ls_accit-bschl = ls_extension-valuepart2.
ENDIF.
MODIFY c_accit FROM ls_accit INDEX sy-tabix TRANSPORTING bschl.
ENDIF.
ENDLOOP.
LOOP AT c_extension2 INTO ls_extension.
IF ls_extension-structure = 'BSCHLK'.
CLEAR: ls_accit.
READ TABLE c_accit INTO ls_accit WITH KEY posnr = ls_extension-valuepart1.
IF sy-subrc = 0.
ls_accit-bschl = ls_extension-valuepart2.
ENDIF.
MODIFY c_accit FROM ls_accit INDEX sy-tabix TRANSPORTING bschl.
ENDIF.
ENDLOOP.
ENDMETHOD.
Los valuespart 1 y valuespart2 te los has de llevar en el programa que llame a la BAPI en la tabla de esta misma extensión2.
Este es el código para rellenar la tabla extension2 (en mi caso contra la tabla interna it_ext2).
* En el caso de clientes.
LOOP AT it_accountreceivable WHERE sp_gl_ind IS INITIAL.
gs_ext2-structure = 'BSCHLD'.
gs_ext2-valuepart1 = it_accountreceivable-itemno_acc.
LOOP AT it_currencyamount WHERE itemno_acc EQ gs_ext2-valuepart1.
IF it_currencyamount-amt_doccur > 0.
gs_ext2-valuepart2 = '04'.
ELSE.
gs_ext2-valuepart2 = '14'.
ENDIF.
ENDLOOP.
APPEND gs_ext2 TO it_ext2.
ENDLOOP.
Y esta la forma de llamar la BAPI:
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = gd_documentheader
customercpd = gd_customercpd
contractheader = gd_fica_hd
IMPORTING
obj_type = l_type
obj_key = l_key
obj_sys = l_sys
TABLES
accountgl = it_accountgl[]
accountreceivable = it_accountreceivable[]
accountpayable = it_accountpayable[]
accounttax = it_accounttax[]
currencyamount = it_currencyamount[]
criteria = it_criteria[]
valuefield = it_valuefield[]
extension1 = it_ext[]
return = it_return[]
paymentcard = it_paymentcard[]
contractitem = it_fica_it[]
extension2 = it_ext2[]
realestate = it_re[].
En tu caso, deberás cambiar el 04, por lo que desees, 05,15 etc.
Qué pasos debo de seguir?
Gracias
Un saludo,