Mostrando entradas con la etiqueta M887. Mostrar todas las entradas
Mostrando entradas con la etiqueta M887. Mostrar todas las entradas

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

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'.
        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).