En este artículo veremos como añadir campos a la VA05, esta transacción no es común como las demás porque consiste en una tabla dinámica en la cual se van cargando los datos, por lo que tendremos que asignar field symbols.
Para esto tenemos una badi a implementar para tal efecto
BADI_SDOC_WRAPPER
En ella tenemos dos métodos que deberemos implementar ambos
IF_BADI_SDOC_WRAPPER~ADAPT_RESULT_COMP
Método para añadir campos al listado
La idea es añadir cinco campos al listado
METHOD if_badi_sdoc_wrapper~adapt_result_comp.
"Añadimos el motivo de pedido el texto de posición ref última factura y la última factura
DATA: ls_result TYPE if_sdoc_select=>tcs_result_comp.
CLEAR ls_result.
"1 Motivo de Pedido => Grupo Materiales
ls_result-name = 'ZZKONDM'.
ls_result-table = space.
ls_result-field = 'TEXT20'.
ls_result-table_alias = space.
ls_result-text = 'Motivo de Pedido'.
APPEND ls_result TO ct_result_comp.
"2 Texto de la posición
ls_result-name = 'ZZSGTXT'.
ls_result-table = space.
ls_result-field = 'TEXT70'.
ls_result-table_alias = space.
ls_result-text = 'Texto Motivo'.
APPEND ls_result TO ct_result_comp.
"3 Nº Última factura
ls_result-name = 'ZZULFACT'.
ls_result-table = space.
ls_result-field = 'TEXT10'.
ls_result-table_alias = space.
ls_result-text = 'Última Factura'.
APPEND ls_result TO ct_result_comp.
"4 Ref Última factura
ls_result-name = 'ZZULREUF'.
ls_result-table = space.
ls_result-field = 'CHAR16'.
ls_result-table_alias = space.
ls_result-text = 'Ref ult Fact'.
APPEND ls_result TO ct_result_comp.
"5 MARCA
ls_result-name = 'ZZMARCA'.
ls_result-table = space.
ls_result-field = 'CHAR30'.
ls_result-table_alias = space.
ls_result-text = 'Marca'.
APPEND ls_result TO ct_result_comp.
ENDMETHOD.
IF_BADI_SDOC_WRAPPER~POST_PROCESSING
Método para la asignación de los valores de los campos añadidos
FIELD-SYMBOLS: <result> TYPE any,
<bezei> TYPE char20,
<zzsgtxt> TYPE char70,
<zzulfact> TYPE char10,
<zzulfact_o> TYPE char35,
<zzulreuf> TYPE char16,
<zzmarca> TYPE char30,
<lv_matnr> TYPE matnr,
<lv_vbeln> TYPE vbeln,
<lv_posnr> TYPE posnr.
DATA: lv_vkaus TYPE abrvw,
lv_kondm TYPE char20,
lv_sgtxt TYPE char70,
lv_marca TYPE atwtb,
lv_bstkd TYPE bstkd.
DATA: lt_tdline TYPE STANDARD TABLE OF tline,
ls_tdline TYPE tline,
lv_name TYPE tdobname,
gv_text TYPE string,
lv_ihrez TYPE ihrez.
**********************************************************************
*Primer campo ( MOTIVO DE PEDIDO ).
TRY.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE cs_result
TO <lv_vbeln> .
ASSIGN COMPONENT 'POSNR' OF STRUCTURE cs_result
TO <lv_posnr> .
IF <lv_vbeln> IS ASSIGNED AND
<lv_posnr> IS ASSIGNED.
"1 Añado la utilización por posición
SELECT SINGLE vtext FROM t178t AS a
JOIN vbap AS b ON b~kondm = a~kondm
INTO lv_kondm
WHERE b~vbeln EQ <lv_vbeln> AND
b~posnr EQ <lv_posnr> AND
a~spras = 'S'.
ENDIF.
"2 lo meto en la estructura
ASSIGN COMPONENT 'ZZKONDM' OF STRUCTURE cs_result TO <bezei>.
IF <bezei> IS ASSIGNED.
MOVE lv_kondm TO <bezei>.
ENDIF.
CATCH cx_root.
ENDTRY.
**********************************************************************
*Segundo campo ( Texto de la Posición ).
IF <lv_vbeln> IS ASSIGNED AND <lv_posnr> IS ASSIGNED.
CONCATENATE <lv_vbeln> <lv_posnr> INTO lv_name.
"1 Añado el texto de la posición del pedido.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = sy-mandt
id = 'Z001'
language = 'S'
name = lv_name
object = 'VBBP'
TABLES
lines = lt_tdline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0.
LOOP AT lt_tdline INTO ls_tdline.
CONCATENATE gv_text ls_tdline-tdline INTO gv_text SEPARATED BY space.
* p_gv_text = ls_tdline-tdline.
ENDLOOP.
ELSE.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
TRY .
"2 lo meto en la estructura
ASSIGN COMPONENT 'ZZSGTXT' OF STRUCTURE cs_result TO <zzsgtxt>.
IF <zzsgtxt> IS ASSIGNED.
MOVE gv_text TO <zzsgtxt>.
CONDENSE <zzsgtxt>.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDIF.
**********************************************************************
*Tercer campo ( ÚLTIMA FACTURA ). NOTA: Lo muevo de sitio.
TRY.
ASSIGN COMPONENT 'BSTKD' OF STRUCTURE cs_result TO <zzulfact_o>.
ASSIGN COMPONENT 'ZZULFACT' OF STRUCTURE cs_result TO <zzulfact>.
IF <zzulfact_o> IS ASSIGNED AND <zzulfact> IS ASSIGNED AND
<lv_vbeln> IS ASSIGNED AND <lv_posnr> IS ASSIGNED.
IF <zzulfact_o> IS INITIAL.
"Lo busco en VBKD
CLEAR lv_bstkd.
SELECT SINGLE bstkd INTO lv_bstkd FROM vbkd
WHERE vbeln EQ <lv_vbeln> AND
posnr EQ <lv_posnr>.
MOVE lv_bstkd TO <zzulfact>.
ELSE.
MOVE <zzulfact_o> TO <zzulfact>.
CLEAR <zzulfact_o>.
ENDIF.
ENDIF.
CATCH cx_root.
ENDTRY.
**********************************************************************
*Cuarto Campo ( REF ULTIMA FACT ).
IF <lv_vbeln> IS ASSIGNED AND <lv_posnr> IS ASSIGNED.
TRY.
ASSIGN COMPONENT 'ZZULREUF' OF STRUCTURE cs_result TO <zzulreuf>.
IF <zzulreuf> IS ASSIGNED.
CLEAR lv_ihrez.
SELECT SINGLE ihrez FROM vbkd INTO lv_ihrez
WHERE vbeln EQ <lv_vbeln> AND
posnr EQ <lv_posnr>.
MOVE lv_ihrez TO <zzulreuf>.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDIF.
**********************************************************************
*Quinto Campo ( MARCA ).
TRY.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE cs_result TO <lv_matnr>.
ASSIGN COMPONENT 'ZZMARCA' OF STRUCTURE cs_result TO <zzmarca>.
IF <lv_matnr> IS ASSIGNED AND <zzmarca> IS ASSIGNED.
CLEAR lv_marca.
SELECT SINGLE atwtb FROM zausp INTO lv_marca
WHERE matnr EQ <lv_matnr> AND
atnam EQ 'MARCAS'.
MOVE lv_marca TO <zzmarca>.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
Para esto tenemos una badi a implementar para tal efecto
BADI_SDOC_WRAPPER
En ella tenemos dos métodos que deberemos implementar ambos
IF_BADI_SDOC_WRAPPER~ADAPT_RESULT_COMP
Método para añadir campos al listado
La idea es añadir cinco campos al listado
- Motivo de pedido
- Texto de la posición del pedido
- Ultima Factura
- Referencia de la última Factura
- Marca ( Característica )
METHOD if_badi_sdoc_wrapper~adapt_result_comp.
"Añadimos el motivo de pedido el texto de posición ref última factura y la última factura
DATA: ls_result TYPE if_sdoc_select=>tcs_result_comp.
CLEAR ls_result.
"1 Motivo de Pedido => Grupo Materiales
ls_result-name = 'ZZKONDM'.
ls_result-table = space.
ls_result-field = 'TEXT20'.
ls_result-table_alias = space.
ls_result-text = 'Motivo de Pedido'.
APPEND ls_result TO ct_result_comp.
"2 Texto de la posición
ls_result-name = 'ZZSGTXT'.
ls_result-table = space.
ls_result-field = 'TEXT70'.
ls_result-table_alias = space.
ls_result-text = 'Texto Motivo'.
APPEND ls_result TO ct_result_comp.
"3 Nº Última factura
ls_result-name = 'ZZULFACT'.
ls_result-table = space.
ls_result-field = 'TEXT10'.
ls_result-table_alias = space.
ls_result-text = 'Última Factura'.
APPEND ls_result TO ct_result_comp.
"4 Ref Última factura
ls_result-name = 'ZZULREUF'.
ls_result-table = space.
ls_result-field = 'CHAR16'.
ls_result-table_alias = space.
ls_result-text = 'Ref ult Fact'.
APPEND ls_result TO ct_result_comp.
"5 MARCA
ls_result-name = 'ZZMARCA'.
ls_result-table = space.
ls_result-field = 'CHAR30'.
ls_result-table_alias = space.
ls_result-text = 'Marca'.
APPEND ls_result TO ct_result_comp.
ENDMETHOD.
IF_BADI_SDOC_WRAPPER~POST_PROCESSING
Método para la asignación de los valores de los campos añadidos
FIELD-SYMBOLS: <result> TYPE any,
<bezei> TYPE char20,
<zzsgtxt> TYPE char70,
<zzulfact> TYPE char10,
<zzulfact_o> TYPE char35,
<zzulreuf> TYPE char16,
<zzmarca> TYPE char30,
<lv_matnr> TYPE matnr,
<lv_vbeln> TYPE vbeln,
<lv_posnr> TYPE posnr.
DATA: lv_vkaus TYPE abrvw,
lv_kondm TYPE char20,
lv_sgtxt TYPE char70,
lv_marca TYPE atwtb,
lv_bstkd TYPE bstkd.
DATA: lt_tdline TYPE STANDARD TABLE OF tline,
ls_tdline TYPE tline,
lv_name TYPE tdobname,
gv_text TYPE string,
lv_ihrez TYPE ihrez.
**********************************************************************
*Primer campo ( MOTIVO DE PEDIDO ).
TRY.
ASSIGN COMPONENT 'VBELN' OF STRUCTURE cs_result
TO <lv_vbeln> .
ASSIGN COMPONENT 'POSNR' OF STRUCTURE cs_result
TO <lv_posnr> .
IF <lv_vbeln> IS ASSIGNED AND
<lv_posnr> IS ASSIGNED.
"1 Añado la utilización por posición
SELECT SINGLE vtext FROM t178t AS a
JOIN vbap AS b ON b~kondm = a~kondm
INTO lv_kondm
WHERE b~vbeln EQ <lv_vbeln> AND
b~posnr EQ <lv_posnr> AND
a~spras = 'S'.
ENDIF.
"2 lo meto en la estructura
ASSIGN COMPONENT 'ZZKONDM' OF STRUCTURE cs_result TO <bezei>.
IF <bezei> IS ASSIGNED.
MOVE lv_kondm TO <bezei>.
ENDIF.
CATCH cx_root.
ENDTRY.
**********************************************************************
*Segundo campo ( Texto de la Posición ).
IF <lv_vbeln> IS ASSIGNED AND <lv_posnr> IS ASSIGNED.
CONCATENATE <lv_vbeln> <lv_posnr> INTO lv_name.
"1 Añado el texto de la posición del pedido.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = sy-mandt
id = 'Z001'
language = 'S'
name = lv_name
object = 'VBBP'
TABLES
lines = lt_tdline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc = 0.
LOOP AT lt_tdline INTO ls_tdline.
CONCATENATE gv_text ls_tdline-tdline INTO gv_text SEPARATED BY space.
* p_gv_text = ls_tdline-tdline.
ENDLOOP.
ELSE.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
TRY .
"2 lo meto en la estructura
ASSIGN COMPONENT 'ZZSGTXT' OF STRUCTURE cs_result TO <zzsgtxt>.
IF <zzsgtxt> IS ASSIGNED.
MOVE gv_text TO <zzsgtxt>.
CONDENSE <zzsgtxt>.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDIF.
**********************************************************************
*Tercer campo ( ÚLTIMA FACTURA ). NOTA: Lo muevo de sitio.
TRY.
ASSIGN COMPONENT 'BSTKD' OF STRUCTURE cs_result TO <zzulfact_o>.
ASSIGN COMPONENT 'ZZULFACT' OF STRUCTURE cs_result TO <zzulfact>.
IF <zzulfact_o> IS ASSIGNED AND <zzulfact> IS ASSIGNED AND
<lv_vbeln> IS ASSIGNED AND <lv_posnr> IS ASSIGNED.
IF <zzulfact_o> IS INITIAL.
"Lo busco en VBKD
CLEAR lv_bstkd.
SELECT SINGLE bstkd INTO lv_bstkd FROM vbkd
WHERE vbeln EQ <lv_vbeln> AND
posnr EQ <lv_posnr>.
MOVE lv_bstkd TO <zzulfact>.
ELSE.
MOVE <zzulfact_o> TO <zzulfact>.
CLEAR <zzulfact_o>.
ENDIF.
ENDIF.
CATCH cx_root.
ENDTRY.
**********************************************************************
*Cuarto Campo ( REF ULTIMA FACT ).
IF <lv_vbeln> IS ASSIGNED AND <lv_posnr> IS ASSIGNED.
TRY.
ASSIGN COMPONENT 'ZZULREUF' OF STRUCTURE cs_result TO <zzulreuf>.
IF <zzulreuf> IS ASSIGNED.
CLEAR lv_ihrez.
SELECT SINGLE ihrez FROM vbkd INTO lv_ihrez
WHERE vbeln EQ <lv_vbeln> AND
posnr EQ <lv_posnr>.
MOVE lv_ihrez TO <zzulreuf>.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDIF.
**********************************************************************
*Quinto Campo ( MARCA ).
TRY.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE cs_result TO <lv_matnr>.
ASSIGN COMPONENT 'ZZMARCA' OF STRUCTURE cs_result TO <zzmarca>.
IF <lv_matnr> IS ASSIGNED AND <zzmarca> IS ASSIGNED.
CLEAR lv_marca.
SELECT SINGLE atwtb FROM zausp INTO lv_marca
WHERE matnr EQ <lv_matnr> AND
atnam EQ 'MARCAS'.
MOVE lv_marca TO <zzmarca>.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
Estimado Diego, gracias. Lo estoy probando en S4 HANA 1709.
ResponderEliminar¿Esto es para la lista de salida? ¿les funcionó? Estoy reviando en version de Hana pero no lo puedo implentar, dice que no existe la Badi en SE19. En se18 si la puedo verificar
ResponderEliminarMe pasa algo parecido, alguien ha conseguido implementar esa badi como comentan en el post?
ResponderEliminarGracias