martedì 13 dicembre 2016

Mapping dinamico da Excel a BAPI per creazione cespiti

*----------------------------------------------------------------------*
* FORM MAPPING_AND_BAPI                                                *
*----------------------------------------------------------------------*
FORM mapping_and_bapi.

  FIELD-SYMBOLS: <lf_tabella> TYPE table,
                 <lf_riga>    TYPE any,
                 <lf_campo>   TYPE any.

  DATA: ls_anlu             TYPE anlu,
        ls_item             TYPE soi_generic_item,
        lv_tf               TYPE string,
        lv_tfx              TYPE string,
        lv_field            TYPE string,
        lv_dtype            TYPE c,
        lv_area             TYPE bf_afabe_d,
        lt_exception_list   TYPE TABLE OF rsexc,
        lt_export_parameter TYPE TABLE OF rsexp,
        lt_import_parameter TYPE TABLE OF rsimp,
        lt_tables_parameter TYPE TABLE OF rstbl,
        ls_tables_parameter TYPE rstbl.

*import
  DATA: ls_key                  TYPE bapi1022_key,
        lv_createsubnumber      TYPE xsubno,
        ls_generaldata          TYPE bapi1022_feglg001,
        ls_generaldatax         TYPE bapi1022_feglg001x,
        ls_inventory            TYPE bapi1022_feglg011,
        ls_inventoryx           TYPE bapi1022_feglg011x,
        ls_postinginformation   TYPE bapi1022_feglg002,
        ls_postinginformationx  TYPE bapi1022_feglg002x,
        ls_timedependentdata    TYPE bapi1022_feglg003,
        ls_timedependentdatax   TYPE bapi1022_feglg003x,
        ls_allocations          TYPE bapi1022_feglg004,
        ls_allocationsx         TYPE bapi1022_feglg004x,
        ls_origin               TYPE bapi1022_feglg009,
        ls_originx              TYPE bapi1022_feglg009x,
        ls_investacctassignmnt  TYPE bapi1022_feglg010,
        ls_investacctassignmntx TYPE bapi1022_feglg010x.
*export
  DATA: lv_companycode  TYPE bapi1022_1-comp_code,
        lv_asset        TYPE bapi1022_1-assetmaino,
        lv_subnumber    TYPE bapi1022_1-assetsubno,
        ls_assetcreated TYPE bapi1022_reference.
*tables
  DATA: lt_depreciationareas  TYPE TABLE OF bapi1022_dep_areas,
        ls_depreciationareas  TYPE bapi1022_dep_areas,
        lt_depreciationareasx TYPE TABLE OF bapi1022_dep_areasx,
        ls_depreciationareasx TYPE bapi1022_dep_areasx,
        lt_cumulatedvalues    TYPE TABLE OF bapi1022_cumval,
        ls_cumulatedvalues    TYPE bapi1022_cumval,
        lt_return             TYPE TABLE OF bapiret2,
        ls_return             TYPE bapiret2.

  CALL FUNCTION 'FUNCTION_IMPORT_INTERFACE'
    EXPORTING
      funcname           = 'BAPI_FIXEDASSET_OVRTAKE_CREATE'
    TABLES
      exception_list     = lt_exception_list
      export_parameter   = lt_export_parameter
      import_parameter   = lt_import_parameter
      tables_parameter   = lt_tables_parameter
    EXCEPTIONS
      error_message      = 1
      function_not_found = 2
      invalid_name       = 3
      OTHERS             = 4.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  LOOP AT gt_data INTO gs_data.
    READ TABLE gt_head INTO ls_item WITH KEY row = '1'
                                             column = gs_data-column.
    READ TABLE lt_tables_parameter
          INTO ls_tables_parameter
      WITH KEY parameter = ls_item-value.
    IF sy-subrc <> 0.
*exporting
      IF ls_item-value = 'CREATESUBNUMBER'.
        lv_tf = 'LV_CREATESUBNUMBER'.
      ELSE.
        CONCATENATE 'LS_' ls_item-value INTO lv_tf.
        CONCATENATE 'LS_' ls_item-value 'X' INTO lv_tfx.
        READ TABLE gt_head INTO ls_item WITH KEY row = '2'
                                                 column = gs_data-column.
        CONCATENATE lv_tf '-' ls_item-value INTO lv_tf.
        IF ls_item-value = 'PLATE_NO'.
          CONCATENATE lv_tfx '-' 'LICENSE_PLATE_NO' INTO lv_tfx.
        ELSEIF ls_item-value = 'ORIG_ACQ_YR'.
          CONCATENATE lv_tfx '-' 'ORIG_ACQ_YEAR' INTO lv_tfx.
        ELSE.
          CONCATENATE lv_tfx '-' ls_item-value INTO lv_tfx.
        ENDIF.
      ENDIF.
      IF lv_tf = 'LS_ORIGIN-ORIG_ACQ_YR'.
        IF gs_data-value IS NOT INITIAL.
          ls_origin-orig_acq_yr = gs_data-value+6(4).
        ENDIF.
      ELSEIF lv_tf = 'LS_ORIGIN-PURCH_NEW'.
        IF gs_data-value = 'X'.
          CLEAR ls_origin-purch_new.
        ELSE.
          ls_origin-purch_new = 'X'.
        ENDIF.
      ELSE.
        ASSIGN (lv_tf) TO <lf_campo>.
        IF <lf_campo> IS ASSIGNED.
          DESCRIBE FIELD <lf_campo> TYPE lv_dtype.
          CASE lv_dtype.
            WHEN 'D'.
              CONCATENATE gs_data-value+6(4)
                          gs_data-value+3(2)
                          gs_data-value+0(2)
                     INTO <lf_campo>.
            WHEN 'P'.
              TRANSLATE gs_data-value USING ',.'.
              <lf_campo> = gs_data-value.
            WHEN OTHERS.
              <lf_campo> = gs_data-value.
          ENDCASE.
          UNASSIGN <lf_campo>.
        ENDIF.
      ENDIF.
      ASSIGN (lv_tfx) TO <lf_campo>.
      IF <lf_campo> IS ASSIGNED.
        <lf_campo> = 'X'.
        UNASSIGN <lf_campo>.
      ENDIF.
    ELSE.
*tables
      CONCATENATE 'LT_' ls_item-value INTO lv_tf.
      CONCATENATE 'LT_' ls_item-value 'X' INTO lv_tfx.
      ASSIGN (lv_tf) TO <lf_tabella>.
      READ TABLE gt_head INTO ls_item WITH KEY row = '2'
                                               column = gs_data-column.
      lv_area = ls_item-value(2).
      SHIFT ls_item-value BY 3 PLACES.
      lv_field = 'AREA'.
      READ TABLE <lf_tabella> ASSIGNING <lf_riga>
        WITH KEY (lv_field) = lv_area.
      IF sy-subrc <> 0.
        APPEND INITIAL LINE TO <lf_tabella> ASSIGNING <lf_riga>.
        ASSIGN COMPONENT lv_field OF STRUCTURE <lf_riga> TO <lf_campo>.
        IF <lf_campo> IS ASSIGNED.
          <lf_campo> = lv_area.
          UNASSIGN <lf_campo>.
        ENDIF.
        lv_field = 'FISC_YEAR'.
        ASSIGN COMPONENT lv_field OF STRUCTURE <lf_riga> TO <lf_campo>.
        IF <lf_campo> IS ASSIGNED.
          <lf_campo> = pa_fiscy.
          UNASSIGN <lf_campo>.
        ENDIF.
        lv_field = 'ACQ_VALUE'.
        ASSIGN COMPONENT lv_field OF STRUCTURE <lf_riga> TO <lf_campo>.
        IF <lf_campo> IS ASSIGNED.
          TRANSLATE gs_data-value USING ',.'.
          <lf_campo> = gs_data-value.
          UNASSIGN <lf_campo>.
        ENDIF.
        UNASSIGN: <lf_tabella>, <lf_riga>, <lf_campo>.
        ASSIGN (lv_tfx) TO <lf_tabella>.
        IF <lf_tabella> IS ASSIGNED.
          APPEND INITIAL LINE TO <lf_tabella> ASSIGNING <lf_riga>.
          ASSIGN COMPONENT ls_item-value OF STRUCTURE <lf_riga> TO <lf_campo>.
          <lf_campo> = lv_area.
          UNASSIGN: <lf_tabella>, <lf_riga>, <lf_campo>.
        ENDIF.
      ELSE.
        ASSIGN COMPONENT ls_item-value OF STRUCTURE <lf_riga> TO <lf_campo>.
        IF <lf_campo> IS ASSIGNED.
          DESCRIBE FIELD <lf_campo> TYPE lv_dtype.
          CASE lv_dtype.
            WHEN 'D'.
              CONCATENATE gs_data-value+6(4)
                          gs_data-value+3(2)
                          gs_data-value+0(2)
                     INTO <lf_campo>.
            WHEN 'P'.
              TRANSLATE gs_data-value USING ',.'.
              <lf_campo> = gs_data-value.
            WHEN OTHERS.
              <lf_campo> = gs_data-value.
          ENDCASE.
          UNASSIGN: <lf_tabella>, <lf_riga>, <lf_campo>.
        ENDIF.
        ASSIGN (lv_tfx) TO <lf_tabella>.
        IF <lf_tabella> IS ASSIGNED.
          lv_field = 'AREA'.
          READ TABLE <lf_tabella> ASSIGNING <lf_riga>
            WITH KEY (lv_field) = lv_area.
          ASSIGN COMPONENT ls_item-value OF STRUCTURE <lf_riga> TO <lf_campo>.
          IF <lf_campo> IS ASSIGNED.
            <lf_campo> = 'X'.
            UNASSIGN: <lf_tabella>, <lf_riga>, <lf_campo>.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
    AT END OF row.
      LOOP AT lt_depreciationareas
         INTO ls_depreciationareas WHERE deactivate = 'X'.
        DELETE lt_cumulatedvalues WHERE area = ls_depreciationareas-area.
      ENDLOOP.
*elimino se presenti le area da copiare
      LOOP AT so_aree.
        READ TABLE lt_depreciationareas
              INTO ls_depreciationareas
          WITH KEY area = so_aree-high.
        IF sy-subrc = 0.
          DELETE TABLE lt_depreciationareas FROM ls_depreciationareas.
          READ TABLE lt_depreciationareasx
                INTO ls_depreciationareasx
            WITH KEY area = so_aree-high.
          DELETE TABLE lt_depreciationareasx FROM ls_depreciationareasx.
        ENDIF.
        READ TABLE lt_cumulatedvalues
              INTO ls_cumulatedvalues
          WITH KEY area = so_aree-high.
        IF sy-subrc = 0.
          DELETE TABLE lt_cumulatedvalues FROM ls_cumulatedvalues.
        ENDIF.
      ENDLOOP.
*copio le aree
      LOOP AT so_aree.
        READ TABLE lt_depreciationareas
              INTO ls_depreciationareas
          WITH KEY area = so_aree-low.
        IF sy-subrc = 0.
          ls_depreciationareas-area = so_aree-high.
          APPEND ls_depreciationareas TO lt_depreciationareas.
          READ TABLE lt_depreciationareasx
                INTO ls_depreciationareasx
            WITH KEY area = so_aree-low.
          ls_depreciationareasx-area = so_aree-high.
          APPEND ls_depreciationareasx TO lt_depreciationareasx.
        ENDIF.
        READ TABLE lt_cumulatedvalues
              INTO ls_cumulatedvalues
          WITH KEY area = so_aree-low.
        IF sy-subrc = 0.
          ls_cumulatedvalues-area = so_aree-high.
          APPEND ls_cumulatedvalues TO lt_cumulatedvalues.
        ENDIF.
      ENDLOOP.
      DO.
        SORT: lt_depreciationareas,
              lt_depreciationareasx,
              lt_cumulatedvalues.
        CALL FUNCTION 'BAPI_FIXEDASSET_OVRTAKE_CREATE'
          EXPORTING
            key                  = ls_key
            createsubnumber      = lv_createsubnumber
            testrun              = cb_test
            generaldata          = ls_generaldata
            generaldatax         = ls_generaldatax
            inventory            = ls_inventory
            inventoryx           = ls_inventoryx
            postinginformation   = ls_postinginformation
            postinginformationx  = ls_postinginformationx
            timedependentdata    = ls_timedependentdata
            timedependentdatax   = ls_timedependentdatax
            allocations          = ls_allocations
            allocationsx         = ls_allocationsx
            origin               = ls_origin
            originx              = ls_originx
            investacctassignmnt  = ls_investacctassignmnt
            investacctassignmntx = ls_investacctassignmntx
          IMPORTING
            companycode          = lv_companycode
            asset                = lv_asset
            subnumber            = lv_subnumber
            assetcreated         = ls_assetcreated
          TABLES
            depreciationareas    = lt_depreciationareas
            depreciationareasx   = lt_depreciationareasx
            cumulatedvalues      = lt_cumulatedvalues
            return               = lt_return.
        READ TABLE lt_return
              INTO ls_return
          WITH KEY type = 'E'
                   id = 'AY'
                   number = '221'.
        IF sy-subrc = 0.
          DELETE lt_depreciationareas WHERE deactivate = 'X'.
          DELETE lt_depreciationareasx WHERE deactivate = 'X'.
          CLEAR lt_return[].
        ELSE.
          COMMIT WORK AND WAIT.
          EXIT.
        ENDIF.
      ENDDO.
      IF lv_asset IS NOT INITIAL AND cb_test IS INITIAL.
        ls_anlu-bukrs = lv_companycode.
        ls_anlu-anln1 = lv_asset.
        ls_anlu-anln2 = lv_subnumber.
        MODIFY anlu FROM ls_anlu.
        LOOP AT lt_depreciationareas INTO ls_depreciationareas
                                     WHERE deactivate <> 'X'.
          UPDATE anlb
             SET afabg = ls_depreciationareas-odep_start_date
           WHERE bukrs = lv_companycode
             AND anln1 = lv_asset
             AND anln2 = lv_subnumber
             AND afabe = ls_depreciationareas-area
             AND bdatu = '99991231'.
        ENDLOOP.
      ENDIF.
      LOOP AT lt_return INTO ls_return.
        ls_return-row = gs_data-row.
        APPEND ls_return TO gt_return.
      ENDLOOP.
      CLEAR: ls_anlu,
             ls_key,
             lv_createsubnumber,
             ls_generaldata,
             ls_generaldatax,
             ls_inventory,
             ls_inventoryx,
             ls_postinginformation,
             ls_postinginformationx,
             ls_timedependentdata,
             ls_timedependentdatax,
             ls_allocations,
             ls_allocationsx,
             ls_origin,
             ls_originx,
             ls_investacctassignmnt,
             ls_investacctassignmntx,
             lv_companycode,
             lv_asset,
             lv_subnumber,
             ls_assetcreated,
             lt_depreciationareas[],
             ls_depreciationareas,
             lt_depreciationareasx[],
             ls_depreciationareasx,
             lt_cumulatedvalues[],
             ls_cumulatedvalues,
             lt_return[],
             ls_return.
    ENDAT.
  ENDLOOP.

ENDFORM.

*----------------------------------------------------------------------*

Nessun commento: