VinceCoder
3/25/2019 - 4:29 PM

CALCOLO COSTI MATERIALE - CK11N

La seguente BAPI effettua il calcolo dei costi su materiali. Inoltre è possibile trovare all'interno del codice, anche la BAPI per effettuare l'esplosione dei costi sui materiali.

 DATA: ls_matnr        LIKE LINE OF s_matnr,
          ls_var          LIKE LINE OF s_var,
          lv_klvar        TYPE keko-klvar,
          lv_matnr        TYPE mara-matnr,
          lv_werks        TYPE marc-werks,
          lv_losgr        TYPE keko-losgr,
          lv_tvers        TYPE keko-tvers,
          lv_stlan        TYPE cki64a-stlan,
          lv_stalt        TYPE cki64a-stalt,
          lv_plnty        TYPE cki64a-plnty,
          lv_plnnr        TYPE cki64a-plnnr,
          lv_plnal        TYPE cki64a-plnal,
          lv_kadat        TYPE cki64a-kadat,
          lv_bidat        TYPE cki64a-bidat,
          lv_aldat        TYPE cki64a-aldat,
          lv_bwdat        TYPE cki64a-bwdat,
          lv_uebid        TYPE cki64a-uebid,
          lv_kalnr_ba     TYPE cki64a-kalnr_ba,
          lv_kalsm        TYPE keko-kalsm,
          lv_s_dunkel     TYPE c,
          lv_s_update     TYPE c,
          lv_s_no_commit  TYPE c,
          lv_s_repetitive TYPE c,
          lv_s_sngl_lock  TYPE c,
          lv_u_kalsm      TYPE xfeld,
          lv_f_keko_exp   TYPE keko,
          lt_keph_exp     TYPE STANDARD TABLE OF keph,
          ls_keph_exp     LIKE LINE OF lt_keph_exp,
          ls_keko         TYPE keko,
          lv_ok           TYPE i,
          lv_ko           TYPE i,
          lt_newline      TYPE REF TO data.

    DATA: lv_referenceobject      TYPE bapicostre-ref_object,
          lv_costingnumber        TYPE bapicostre-cstg_num,
          lv_costingtype          TYPE bapicostre-cstg_type,
          lv_costingdate          TYPE bapicostre-cstg_date,
          lv_costingversion       TYPE bapicostre-version,
          lv_valuationvariant     TYPE bapicostre-vltn_vrnt,
          lv_enteredmanually      TYPE bapicostre-enter_man,
          lv_cost_component_view  TYPE bapicostes-view,
          lv_explosion_depth      TYPE bapicostes-explosion_depth,
          lv_lot_size             TYPE bapicostes-lotsize,
          lv_explode_kf_too       TYPE xfeld,
          lv_explosion_incomplete TYPE bapicostes-explosion_incp,
          lv_return               TYPE bapireturn,
          lt_explosion_list       TYPE STANDARD TABLE OF bapiexplosionlist,
          ls_explosion_list       TYPE bapiexplosionlist.

    FIELD-SYMBOLS: <matnr>   TYPE any,
                   <var>     TYPE any,
                   <var_old> TYPE any,
                   <var_new> TYPE any.

    CALL METHOD create_fieldcat( ).

    REFRESH: lt_keph_exp, lt_explosion_list.

    CLEAR: ls_keko.

    LOOP AT s_var INTO ls_var.

      LOOP AT s_matnr INTO ls_matnr.

        lv_klvar = ls_var-low.
        lv_matnr = ls_matnr-low.
        lv_werks = p_werks.
        lv_kadat = p_kadat.
        lv_bidat = p_bidat.
        lv_aldat = p_aldat.
        lv_bwdat = p_bwdat.
        lv_tvers = p_tvers.
        lv_losgr = p_losgr.

        "Effettuo il calcolo del materiale in input (la BAPI effettua la chiamata in background (s_dunkel = abap_true) della trans. CK11N
        CALL FUNCTION 'CK_F_MATERIAL_CALC'
          EXPORTING
            klvar          = lv_klvar
            matnr          = lv_matnr
            werks          = lv_werks
            losgr          = lv_losgr
            tvers          = lv_tvers
            kadat          = lv_kadat
            bidat          = lv_bidat
            aldat          = lv_aldat
            bwdat          = lv_bwdat
            s_dunkel       = abap_true
            s_no_commit    = abap_true
          IMPORTING
            f_keko_exp     = ls_keko
          TABLES
            t_keph_exp     = lt_keph_exp
          EXCEPTIONS
            wrong_call     = 1
            keph_not_found = 2
            locked         = 3
            OTHERS         = 4.

        IF sy-subrc IS INITIAL.

          "Effettuo l'esplosione dei costi sul materiale in input
          lv_referenceobject     = ls_keko-bzobj.
          lv_costingnumber       = ls_keko-kalnr.
          lv_costingtype         = ls_keko-kalka.
          lv_costingdate         = ls_keko-kadky.
          lv_costingversion      = ls_keko-tvers.
          lv_valuationvariant    = ls_keko-bwvar.
          lv_enteredmanually     = ls_keko-kkzma.
          lv_cost_component_view = '1'.


          CALL FUNCTION 'BAPI_COSTESTIMATE_GETEXPLOSION'
            EXPORTING
              referenceobject      = lv_referenceobject
              costingnumber        = lv_costingnumber
              costingtype          = lv_costingtype
              costingdate          = lv_costingdate
              costingversion       = lv_costingversion
              valuationvariant     = lv_valuationvariant
              enteredmanually      = lv_enteredmanually
              cost_component_view  = lv_cost_component_view
            IMPORTING
              explosion_incomplete = lv_explosion_incomplete
              return               = lv_return
            TABLES
              explosion_list       = lt_explosion_list.


          IF lt_explosion_list IS NOT INITIAL.

            LOOP AT lt_explosion_list INTO ls_explosion_list.

              CLEAR: lv_klvar, lv_matnr, lv_werks, lv_kadat, lv_bidat, lv_aldat, lv_bwdat, lv_tvers, lv_losgr.

              "Ri-effettuo il calcolo costi sui materiale figli
              lv_klvar = ls_explosion_list-costing_variant.
              lv_matnr = ls_explosion_list-material.
              lv_werks = ls_explosion_list-plant.
              lv_kadat = p_kadat.
              lv_bidat = p_bidat.
              lv_aldat = p_aldat.
              lv_bwdat = ls_explosion_list-vltn_date.
              lv_tvers = ls_explosion_list-version.
              lv_losgr = ls_explosion_list-lotsize.

              CALL FUNCTION 'CK_F_MATERIAL_CALC'
                EXPORTING
                  klvar          = lv_klvar
                  matnr          = lv_matnr
                  werks          = lv_werks
                  losgr          = lv_losgr
                  tvers          = lv_tvers
                  kadat          = lv_kadat
                  bidat          = lv_bidat
                  aldat          = lv_aldat
                  bwdat          = lv_bwdat
                  s_dunkel       = abap_true
                  s_no_commit    = abap_true
                IMPORTING
                  f_keko_exp     = ls_keko
                TABLES
                  t_keph_exp     = lt_keph_exp
                EXCEPTIONS
                  wrong_call     = 1
                  keph_not_found = 2
                  locked         = 3
                  OTHERS         = 4.

              "Controllo se il calcolo ha restituito errori (KA = Calcolato senza errori / KF = calcolato con errori)
              IF ls_keko-feh_sta EQ 'KA'.

                ADD 1 TO lv_ok.

              ELSEIF ls_keko-feh_sta EQ 'KF'.

                ADD 1 TO lv_ko.

              ENDIF.

              CLEAR: ls_keko.

            ENDLOOP.

          ENDIF.