Solicitudes:
- Añadir los campos Z* a las estructuras CI_EBANDB y CI_EBANDBX
- BADI a implementar → ME_BAPI_PR_CUST, método MAP2I_EXTENSIONIN
Pedidos:
- Añadir los campos Z* a las estructuras CI_EKKODB y CI_EKKODBX o CI_EKPODB y CI_EKPODBX dependiendo de si los campos están en la cabecera o en la posición.
- BADI a implementar → ME_BAPI_PO_CUST, MAP2I_EXTENSIONIN
A continuación os detallo 2 implementaciones diferentes:
Solicitudes:
* define local data
DATA: lr_struct TYPE REF TO cl_abap_structdescr,
lt_comp TYPE cl_abap_structdescr=>component,
lf_done TYPE mmpur_bool. "conversion done
* define local field symbol
FIELD-SYMBOLS: <comp> LIKE LINE OF cl_abap_structdescr=>components.
* perform mapping only if there is at least one packed field
CHECK im_error EQ cl_mmpur_constants=>yes.
" código antiguo:
** get type for name
* lr_struct ?= cl_abap_typedescr=>describe_by_name( im_name ).
* CHECK lr_struct IS BOUND.
* LOOP AT lr_struct->components ASSIGNING <comp>.
** perform conversion...
** needes to be implemented
* lf_done = cl_mmpur_constants=>yes.
* ENDLOOP.
"código nuevo:
CALL METHOD cl_abap_container_utilities=>read_container_c
EXPORTING
im_container = im_container
IMPORTING
ex_value = ch_struc
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc = 0.
lf_done = 'X'.
ENDIF.
DATA: lr_struct TYPE REF TO cl_abap_structdescr,
lt_comp TYPE cl_abap_structdescr=>component,
lf_done TYPE mmpur_bool. "conversion done
* define local field symbol
FIELD-SYMBOLS: <comp> LIKE LINE OF cl_abap_structdescr=>components.
* perform mapping only if there is at least one packed field
CHECK im_error EQ cl_mmpur_constants=>yes.
" código antiguo:
** get type for name
* lr_struct ?= cl_abap_typedescr=>describe_by_name( im_name ).
* CHECK lr_struct IS BOUND.
* LOOP AT lr_struct->components ASSIGNING <comp>.
** perform conversion...
** needes to be implemented
* lf_done = cl_mmpur_constants=>yes.
* ENDLOOP.
"código nuevo:
CALL METHOD cl_abap_container_utilities=>read_container_c
EXPORTING
im_container = im_container
IMPORTING
ex_value = ch_struc
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc = 0.
lf_done = 'X'.
ENDIF.
* conversion has been done successful -> prevent system to do any
* conversion
CHECK lf_done EQ cl_mmpur_constants=>yes.
RAISE EXCEPTION TYPE cx_mmpur_root.
Pedidos:
DATA:
lr_struct TYPE REF TO cl_abap_structdescr,
lt_comp TYPE cl_abap_structdescr=>component,
lf_done TYPE mmpur_bool.
FIELD-SYMBOLS:
<comp> LIKE LINE OF cl_abap_structdescr=>components,
<ls_bapi_te_mepoheader> TYPE any,
<ls_bapi_te_mepopositi> TYPE any,
<field> TYPE any,
<field_info> TYPE any.
CHECK im_error EQ cl_mmpur_constants=>yes.
IF im_name EQ 'CI_EKKODB'.
ASSIGN im_container TO <ls_bapi_te_mepoheader> CASTING TYPE bapi_te_mepoheader.
* Get type for name
lr_struct ?= cl_abap_typedescr=>describe_by_name( im_name ).
CHECK lr_struct IS BOUND.
LOOP AT lr_struct->components ASSIGNING <comp>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE ch_struc TO <field>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE <ls_bapi_te_mepoheader> TO <field_info>.
<field> = <field_info>.
lf_done = cl_mmpur_constants=>yes.
ENDLOOP.
CHECK lf_done EQ cl_mmpur_constants=>yes.
* No permitir conversión estandar
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
IF im_name EQ 'CI_EKPODB'.
ASSIGN im_container TO <ls_bapi_te_mepopositi> CASTING TYPE bapi_te_mepoitem.
* Get type for name
lr_struct ?= cl_abap_typedescr=>describe_by_name( im_name ).
CHECK lr_struct IS BOUND.
LOOP AT lr_struct->components ASSIGNING <comp>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE ch_struc TO <field>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE <ls_bapi_te_mepopositi> TO <field_info>.
<field> = <field_info>.
lf_done = cl_mmpur_constants=>yes.
ENDLOOP.
CHECK lf_done EQ cl_mmpur_constants=>yes.
* Añadir posición
ASSIGN COMPONENT 'PO_ITEM' OF STRUCTURE ch_struc TO <field>.
ASSIGN COMPONENT 'PO_ITEM' OF STRUCTURE <ls_bapi_te_mepopositi> TO <field_info>.
<field> = <field_info>.
* No permitir conversión estandar
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
lr_struct TYPE REF TO cl_abap_structdescr,
lt_comp TYPE cl_abap_structdescr=>component,
lf_done TYPE mmpur_bool.
FIELD-SYMBOLS:
<comp> LIKE LINE OF cl_abap_structdescr=>components,
<ls_bapi_te_mepoheader> TYPE any,
<ls_bapi_te_mepopositi> TYPE any,
<field> TYPE any,
<field_info> TYPE any.
CHECK im_error EQ cl_mmpur_constants=>yes.
IF im_name EQ 'CI_EKKODB'.
ASSIGN im_container TO <ls_bapi_te_mepoheader> CASTING TYPE bapi_te_mepoheader.
* Get type for name
lr_struct ?= cl_abap_typedescr=>describe_by_name( im_name ).
CHECK lr_struct IS BOUND.
LOOP AT lr_struct->components ASSIGNING <comp>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE ch_struc TO <field>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE <ls_bapi_te_mepoheader> TO <field_info>.
<field> = <field_info>.
lf_done = cl_mmpur_constants=>yes.
ENDLOOP.
CHECK lf_done EQ cl_mmpur_constants=>yes.
* No permitir conversión estandar
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
IF im_name EQ 'CI_EKPODB'.
ASSIGN im_container TO <ls_bapi_te_mepopositi> CASTING TYPE bapi_te_mepoitem.
* Get type for name
lr_struct ?= cl_abap_typedescr=>describe_by_name( im_name ).
CHECK lr_struct IS BOUND.
LOOP AT lr_struct->components ASSIGNING <comp>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE ch_struc TO <field>.
ASSIGN COMPONENT <comp>-name OF STRUCTURE <ls_bapi_te_mepopositi> TO <field_info>.
<field> = <field_info>.
lf_done = cl_mmpur_constants=>yes.
ENDLOOP.
CHECK lf_done EQ cl_mmpur_constants=>yes.
* Añadir posición
ASSIGN COMPONENT 'PO_ITEM' OF STRUCTURE ch_struc TO <field>.
ASSIGN COMPONENT 'PO_ITEM' OF STRUCTURE <ls_bapi_te_mepopositi> TO <field_info>.
<field> = <field_info>.
* No permitir conversión estandar
RAISE EXCEPTION TYPE cx_mmpur_root.
ENDIF.
Una vez hecha la implementación de la BADI pasamos la tabla de la siguiente manera:
Solicitudes:
DATA:
e_itempr TYPE bapi_te_mereqitem,
e_itemprx TYPE bapi_te_mereqitemx.
e_itemprx TYPE bapi_te_mereqitemx.
FIELD-SYMBOLS: <fs_extensionin> TYPE bapiparex.
APPEND INITIAL LINE TO extensionin
ASSIGNING <fs_extensionin>.
* CLEAR: w_extensionin, e_string.
<fs_extensionin>-structure = 'BAPI_TE_MEREQITEM'.
e_itempr-preq_item = ls_pr_pos-bnfpo.
e_itempr-zzpre_asig = ls_pr_pos-zzpre_asig.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = e_itempr
IMPORTING
ex_container = <fs_extensionin>+30
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc <> 0.
* APPEND w_extensionin TO extensionin.
ENDIF.
APPEND INITIAL LINE TO extensionin
ASSIGNING <fs_extensionin>.
* CLEAR: w_extensionin.
<fs_extensionin>-structure = 'BAPI_TE_MEREQITEMX'.
e_itemprx-preq_item = ls_pr_pos-bnfpo.
e_itemprx-zzpre_asig = 'X'.
<fs_extensionin>-valuepart1 = e_itemprx.
APPEND INITIAL LINE TO extensionin
ASSIGNING <fs_extensionin>.
* CLEAR: w_extensionin, e_string.
<fs_extensionin>-structure = 'BAPI_TE_MEREQITEM'.
e_itempr-preq_item = ls_pr_pos-bnfpo.
e_itempr-zzpre_asig = ls_pr_pos-zzpre_asig.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = e_itempr
IMPORTING
ex_container = <fs_extensionin>+30
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc <> 0.
* APPEND w_extensionin TO extensionin.
ENDIF.
APPEND INITIAL LINE TO extensionin
ASSIGNING <fs_extensionin>.
* CLEAR: w_extensionin.
<fs_extensionin>-structure = 'BAPI_TE_MEREQITEMX'.
e_itemprx-preq_item = ls_pr_pos-bnfpo.
e_itemprx-zzpre_asig = 'X'.
<fs_extensionin>-valuepart1 = e_itemprx.
Pedidos:
DATA:
ls_bapi_te_meoutheader TYPE bapi_te_meoutheader,
ls_bapi_te_meoutheaderx TYPE bapi_te_meoutheaderx.
ls_bapi_te_meoutheaderx TYPE bapi_te_meoutheaderx.
w_extensionin-structure = 'BAPI_TE_MEOUTHEADER'.
CLEAR: ls_bapi_te_meoutheader.
ls_bapi_te_meoutheader-zenvio = ls_po_head-zenvio.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = ls_bapi_te_meoutheader
IMPORTING
ex_container = w_extensionin-valuepart1
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc EQ 0.
APPEND w_extensionin TO extensionin.
ENDIF.
CLEAR: w_extensionin.
w_extensionin-structure = 'BAPI_TE_MEOUTHEADERX'.
CLEAR: ls_bapi_te_meoutheaderx.
ls_bapi_te_meoutheaderx-zenvio = 'X'.
w_extensionin-valuepart1 = ls_bapi_te_meoutheaderx.
APPEND w_extensionin TO extensionin.
CLEAR: ls_bapi_te_meoutheader.
ls_bapi_te_meoutheader-zenvio = ls_po_head-zenvio.
CALL METHOD cl_abap_container_utilities=>fill_container_c
EXPORTING
im_value = ls_bapi_te_meoutheader
IMPORTING
ex_container = w_extensionin-valuepart1
EXCEPTIONS
illegal_parameter_type = 1
OTHERS = 2.
IF sy-subrc EQ 0.
APPEND w_extensionin TO extensionin.
ENDIF.
CLEAR: w_extensionin.
w_extensionin-structure = 'BAPI_TE_MEOUTHEADERX'.
CLEAR: ls_bapi_te_meoutheaderx.
ls_bapi_te_meoutheaderx-zenvio = 'X'.
w_extensionin-valuepart1 = ls_bapi_te_meoutheaderx.
APPEND w_extensionin TO extensionin.
Las estructuras CI_*DB son includes de las tablas estándares de las solicitudes y los pedidos (EKKO, EKPO Y EBAN).
Que grande! Yo buscando en ingles. Y encuentro algo en español prodigioso. Funciona 100% . Muchas Gracias Sara
ResponderEliminarLo pongo en inglés para que la gente lo vea.
It Works 100%. To solve the no read non-carácter type data( such p, currency..) in BAPIS additional customer data( EXTENSIONIN, BAPIPAREX) Please read this BLOG. Very useful.
Espectacular !!! Gracias geni@ me has salvado .
ResponderEliminarMuy apreciado tu aporte
Saludos