martes, 23 de agosto de 2016

Problema con los datos de tipo "PACKED" en extensionin

Todo aquel que haya usado la tabla extensionin para crear / modificar un pedido o solicitud puede encontrarse con el problema de que SAP no admite tipos como CURRENCY. A continuación explicaré la implementación para las bapis de creación y solicitud de pedidos pero es aplicable para otras BAPIS que utilicen este método para actualizar los campos Z* de las tablas estándar.

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
  DATAlr_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_nameim_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_nameim_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.
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.
Pedidos:
DATA:
    ls_bapi_te_meoutheader   TYPE bapi_te_meoutheader,
    ls_bapi_te_meoutheaderx  TYPE bapi_te_meoutheaderx.

w_extensionin-structure 'BAPI_TE_MEOUTHEADER'.
        CLEARls_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.

        CLEARw_extensionin.
        w_extensionin-structure 'BAPI_TE_MEOUTHEADERX'.
        CLEARls_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).

2 comentarios:

  1. Que grande! Yo buscando en ingles. Y encuentro algo en español prodigioso. Funciona 100% . Muchas Gracias Sara

    Lo 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.

    ResponderEliminar
  2. Espectacular !!! Gracias geni@ me has salvado .
    Muy apreciado tu aporte
    Saludos

    ResponderEliminar