Mostrando entradas con la etiqueta CI_EKKODB. Mostrar todas las entradas
Mostrando entradas con la etiqueta CI_EKKODB. 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).