Monday, 13 December 2021

SAP ABAP - User Exit Set Batch Characteristic Value In MIGO Goods Receipt

Customer Exit  : MBCFC004 (EXIT_SAPMM07M_004)

Set Up Customer Exit for Classification of User-Defined Characteristics

You use SAP enhancement MBCFC004 EXIT_SAPMM07M_004, which contains function module exit EXIT_SAPMM07M_004 to classify user-defined characteristics automatically during goods movements in Inventory Management.

This is only possible for characteristics which are not assigned values during quality inspection.

Requirements

    1. The class of the batch to be classified must be known.  This means that a class must be assigned either to the material or at least to one batch of this material.
    2. The exit call must be activated for the respective movement type in activity Activate batch classification during goods movements in IM using indicator 'Extended classification'.

Open tcode OMCV


Create CMOD Project :

ZBATCH






ABAP Include Program (ZXMBCU04) Source Code :
 
IF i_mseg-bwart '101'.
*-- Data Declarations
  DATA t_characters LIKE characters OCCURS WITH HEADER LINE.
  DATA t_attributes LIKE api_ch_att OCCURS WITH HEADER LINE.
  DATA t_values LIKE api_val_i OCCURS WITH HEADER LINE.
**-------------------GOODS MOVEMENT DETAILS FOR THE ORDER ENTERED----------
  t_characters[] characters[].
  t_attributes[] attributes[].
  t_values[] values[].

  LOOP AT t_characters.
    CASE t_characters-atnam.
      WHEN 'ZKONTRAK'.
*        v_year = w_aufk-zzsaisj.
        t_values-atinn t_characters-atinn.
        t_values-atnam t_characters-atnam.
        t_values-atwtb 'TEST-EXIT'.
        APPEND t_values TO values.
        CLEAR t_values.
    ENDCASE.
  ENDLOOP.
ENDIF.

Saturday, 11 December 2021

SAP ABAP - Custom Report Vendor Invoice

 1. Table Maintenance For Document Type



2. Custom Structure Display Report




3. ABAP Source Code

#Main Program

*&---------------------------------------------------------------------*
*& Report  ZVIMR001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report zvimr001.

include zvimr001_01"Class Variable Declaration
include zvimr001_02"Class Definition and Implementation

*&---------------------------------------------------------------------*
*&  INITIALIZATION
*&---------------------------------------------------------------------*
initialization.
  create object g_ref_main.
*&---------------------------------------------------------------------*
*&  AT SELECTION-SCREEN
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&  AT SELECTION-SCREEN OUTPUT
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&  AT SELECTION-SCREEN ON VALUE-REQUEST
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&  START-OF-SELECTION
*&---------------------------------------------------------------------*
start-of-selection.
  if rb01 abap_true.
    g_ref_main->get_data_summary).
  else.
    g_ref_main->get_data_details).
  endif.

*&---------------------------------------------------------------------*
*&  END-OF-SELECTION
*&---------------------------------------------------------------------*
end-of-selection.

  g_ref_main->display_alv).



#Include zvimr001_01
*&---------------------------------------------------------------------*
*&  Include           ZVIMR001_01
*&---------------------------------------------------------------------*
tables bsiklfa1ztvim004.

selection-screen begin of block sel1 with frame title text-001.
select-options :
      s_bukrs for bsik-bukrs,
      s_gjahr for bsik-gjahr,
      s_ktokk for lfa1-ktokk,
      s_lifnr for lfa1-lifnr,
      s_vgrop for ztvim004-vimgroup,
      s_waers for bsik-waers.

parameters :
      p_kdate type datum default sy-datum.
selection-screen end of block sel1.

selection-screen begin of block sel2 with frame title text-002.
selection-screen begin of line.
parametersrb01 radiobutton group rb.
selection-screen comment 3(15text-rb1.
parametersrb02 radiobutton group rb.
selection-screen comment 21(15text-rb2.
selection-screen end of line.
selection-screen end of block sel2.

class lcl_main definition deferred.
*&---------------------------------------------------------------------*
*&  Types
*&---------------------------------------------------------------------*
types :
  begin of ty_bsak,
    bukrs  type bukrs,
    belnr  type bsak-belnr,
    gjahr  type bsak-gjahr,
    buzei  type bsak-buzei,
    lifnr  type lifnr,
    zuonr  type bsak-zuonr,
    budat  type budat,
    bldat  type bldat,
    zfbdt  type bsak-zfbdt,
    dmbtr  type bsak-dmbtr,
    wrbtr  type bsak-wrbtr,
    waers  type bsak-waers,
    shkzg  type bsak-shkzg,
    sgtxt  type bsak-sgtxt,
    zterm  type bsak-zterm,
    cpudt  type bsak-cpudt,
    zoved  type i,
  end of ty_bsak.

*&---------------------------------------------------------------------*
*&  Work Areas
*&---------------------------------------------------------------------*
data :
   ls_data type zsvimr001,
   ls_data_tmp type zsvimr001,
   ls_data_summ type zsvimr001_dtl,
   ls_bsak type ty_bsak,
   ls_bsik type ty_bsak,
   ls_outp type ty_bsak,
   ls_head type ty_bsak,
   ls_ztvim003 type ztvim003.

data:
   lt_fieldcat  type slis_t_fieldcat_alv,
   lt_sort      type slis_t_sortinfo_alv,
   ls_fieldcat  type slis_fieldcat_alv,
   is_layout    type  slis_layout_alv,
   ls_sort      type slis_sortinfo_alv.

*&---------------------------------------------------------------------*
*&  Internal Tables
*&---------------------------------------------------------------------*
data :
   lt_data type table of zsvimr001,
   lt_data_tmp type table of zsvimr001,
   lt_data_summ type table of zsvimr001_dtl,
   lt_outp type table of ty_bsak,
   lt_bsak type table of ty_bsak,
   lt_bsik type table of ty_bsak,
   lt_head type table of ty_bsak,
   lt_ztvim003 type table of ztvim003.
*&---------------------------------------------------------------------*
*&  Variables
*&---------------------------------------------------------------------*
data :
   indx   type i,
   icount type i,
   idate  type i.
*&---------------------------------------------------------------------*
*&  Constants
*&---------------------------------------------------------------------*
constants:
  yes     type flag value 'X',
  no      type flag value space.
*&---------------------------------------------------------------------*
*&  Field Symbols
*&---------------------------------------------------------------------*
field-symbols:
     <fs_drseg>      type mmcr_drseg.
*&---------------------------------------------------------------------*
*& Object
*&---------------------------------------------------------------------*
datag_ref_main type ref to lcl_main.

#Include zvimr001_02

*&---------------------------------------------------------------------*
*&  Include           ZVIMR001_02
*&---------------------------------------------------------------------*
class lcl_main definition final.
  public section.
    methods:
      get_data_summary,
      get_data_details,
      display_alv.
endclass.

class lcl_main implementation.
  method get_data_summary.
    refresh lt_datalt_bsaklt_bsiklt_outplt_ztvim003lt_head.

    select from ztvim003 into table lt_ztvim003
      where lifnr in s_lifnr and ktokk in s_ktokk and vimgroup in s_vgrop.

    sort lt_ztvim003 by lifnr.

    check lt_ztvim003 is not initial.
    "BSIK
    select a~bukrs a~belnr a~gjahr a~buzei a~lifnr a~zuonr a~budat a~bldat a~zfbdt a~dmbtr a~wrbtr a~waers a~shkzg
      from bsik as left join bkpf as b
      on a~belnr b~belnr and a~gjahr b~gjahr and a~bukrs b~bukrs
      inner join ztvim007 as on a~blart c~blart
      into table lt_bsik
        for all entries in lt_ztvim003
          where a~lifnr lt_ztvim003-lifnr and
                a~bukrs in s_bukrs and a~gjahr in s_gjahr and a~waers in s_waers.

    "BSAK
*    select a~bukrs a~belnr a~gjahr a~buzei a~lifnr a~zuonr a~budat a~bldat a~zfbdt a~dmbtr a~wrbtr a~waers a~shkzg
*      from bsak as a left join bkpf as b
*      on a~belnr = b~belnr and a~gjahr = b~gjahr and a~bukrs = b~bukrs
*      into table lt_bsak
*        for all entries in lt_ztvim003
*          where a~lifnr = lt_ztvim003-lifnr and
*                a~bukrs in s_bukrs and a~gjahr in s_gjahr and a~waers in s_waers.

*    if lt_bsak is not initial.
*      append lines of lt_bsak to lt_outp.
*    endif.

    if lt_bsik is not initial.
      append lines of lt_bsik to lt_outp.
    endif.

    append lines of lt_outp to lt_head.
    sort lt_head by bukrs lifnr.
    delete adjacent duplicates from lt_head comparing bukrs lifnr.

    sort lt_outp by bukrs ascending gjahr ascending belnr ascending buzei ascending.
    delete adjacent duplicates from lt_outp comparing bukrs gjahr belnr buzei.

    sort lt_outp by bukrs lifnr.

    loop at lt_head into ls_head.
      clear ls_outp.
      read table lt_outp into ls_outp with key bukrs ls_head-bukrs lifnr ls_head-lifnr binary search.
      if sy-subrc 0.
        clear indxicount.
        indx sy-tabix.

        clear ls_datals_ztvim003.
        read table lt_ztvim003 into ls_ztvim003 with key lifnr ls_head-lifnr binary search.
        ls_data-name1    ls_ztvim003-name1.
        ls_data-vimgroup ls_ztvim003-vimgroup.
        ls_data-waers    ls_head-waers.
        ls_data-lifnr    ls_head-lifnr.
        ls_data-bukrs    ls_head-bukrs.
        select single zdesc from ztvim004 into ls_data-zdesc where vimgroup ls_ztvim003-vimgroup.

        loop at lt_outp into ls_outp from indx.
          if ls_outp-bukrs <> ls_head-bukrs or ls_outp-lifnr <> ls_head-lifnr.
            exit.
          endif.
          icount icount + 1.
          if ls_outp-shkzg 'S'.
            ls_outp-dmbtr ls_outp-dmbtr * -1.
            ls_outp-wrbtr ls_outp-wrbtr * -1.
          endif.

          ls_data-ivtotal ls_data-ivtotal + ls_outp-dmbtr.

          idate p_kdate ls_outp-zfbdt.
*          if idate < 0.
*            ls_data-ivamount1 = ls_data-ivamount1 + ls_outp-dmbtr.
*          else
          if idate >= and idate <= 30.
            ls_data-ivamount2 ls_data-ivamount2 + ls_outp-dmbtr.
          elseif idate >= 31 and idate <= 60.
            ls_data-ivamount3 ls_data-ivamount3 + ls_outp-dmbtr.
          elseif idate >= 61 and idate <= 90.
            ls_data-ivamount4 ls_data-ivamount4 + ls_outp-dmbtr.
          elseif idate >= 91 and idate <= 120.
            ls_data-ivamount5 ls_data-ivamount5 + ls_outp-dmbtr.
          elseif idate > 120.
            ls_data-ivamount6 ls_data-ivamount6 + ls_outp-dmbtr.
          endif.
*          move-corresponding ls_outp to ls_data.
*          ls_data-nourut   = icount.


          clear ls_outp.
        endloop.
        append ls_data to lt_data.
      endif.
      clear ls_head.
    endloop.

    refresh lt_data_tmp.
    append lines of lt_data to lt_data_tmp.
    sort lt_data_tmp by vimgroup.
    delete adjacent duplicates from lt_data_tmp comparing vimgroup.
    sort lt_data_tmp by vimgroup.
    loop at lt_data_tmp into ls_data_tmp.
      clear ls_dataicount.
      clear ls_data.
      loop at lt_data into ls_data where vimgroup ls_data_tmp-vimgroup.
        icount icount + 1.
        clear ls_data-nourut.
        ls_data-nourut   icount.

        modify lt_data from ls_data transporting nourut
          where vimgroup ls_data-vimgroup and lifnr ls_data-lifnr and bukrs ls_data-bukrs.
        clear ls_data.
      endloop.
    endloop.

    sort lt_data by vimgroup nourut ascending.

  endmethod.

  method get_data_details.
    refresh lt_datalt_bsaklt_bsiklt_outplt_ztvim003lt_head.

    select from ztvim003 into table lt_ztvim003
      where lifnr in s_lifnr and ktokk in s_ktokk and vimgroup in s_vgrop.

    sort lt_ztvim003 by lifnr.

    check lt_ztvim003 is not initial.
    "BSIK
    select a~bukrs a~belnr a~gjahr a~buzei a~lifnr a~zuonr a~budat a~bldat a~zfbdt a~dmbtr a~wrbtr a~waers a~shkzg
           a~sgtxt a~zterm a~cpudt
      from bsik as left join bkpf as b
      on a~belnr b~belnr and a~gjahr b~gjahr and a~bukrs b~bukrs
      inner join ztvim007 as on a~blart c~blart
      into table lt_bsik
        for all entries in lt_ztvim003
          where a~lifnr lt_ztvim003-lifnr and
                a~bukrs in s_bukrs and a~gjahr in s_gjahr and a~waers in s_waers.

    "BSAK
*    select a~bukrs a~belnr a~gjahr a~buzei a~lifnr a~zuonr a~budat a~bldat a~zfbdt a~dmbtr a~wrbtr a~waers a~shkzg
*           a~sgtxt a~zterm a~cpudt
*      from bsak as a left join bkpf as b
*      on a~belnr = b~belnr and a~gjahr = b~gjahr and a~bukrs = b~bukrs
*      into table lt_bsak
*        for all entries in lt_ztvim003
*          where a~lifnr = lt_ztvim003-lifnr and
*                a~bukrs in s_bukrs and a~gjahr in s_gjahr and a~waers in s_waers.

*    if lt_bsak is not initial.
*      append lines of lt_bsak to lt_outp.
*    endif.

    if lt_bsik is not initial.
      append lines of lt_bsik to lt_outp.
    endif.

    clear icountls_outp.
    loop at lt_outp into ls_outp.

      clear ls_ztvim003.
      read table lt_ztvim003 into ls_ztvim003 with key lifnr ls_outp-lifnr binary search.

      icount icount + 1.
      if ls_outp-shkzg 'S'.
        ls_outp-dmbtr ls_outp-dmbtr * -1.
        ls_outp-wrbtr ls_outp-wrbtr * -1.
      endif.

      clear idate.
      idate p_kdate ls_outp-zfbdt.

      clear ls_data_summ.
      move-corresponding ls_outp to ls_data_summ.
      ls_data_summ-nourut icount.
      ls_data_summ-vimgroup ls_ztvim003-vimgroup.
      ls_data_summ-name1    ls_ztvim003-name1.
      ls_data_summ-iovdue   idate.
      select single zdesc from ztvim004 into ls_data_summ-zdesc where vimgroup ls_ztvim003-vimgroup.
      ls_data_summ-lwaers 'IDR'.
      append ls_data_summ to lt_data_summ.
      clear ls_outp.
    endloop.
  endmethod.

  method display_alv.

    if rb01 abap_true.
      refresh lt_fieldcat.
      call function 'REUSE_ALV_FIELDCATALOG_MERGE'
        exporting
          i_structure_name       'ZSVIMR001'
        changing
          ct_fieldcat            lt_fieldcat
        exceptions
          inconsistent_interface 1
          program_error          2
          others                 3.

      clear ls_fieldcat.
      loop at lt_fieldcat into ls_fieldcat.
        if ls_fieldcat-fieldname 'VIMGROUP' or ls_fieldcat-fieldname 'BUKRS' or ls_fieldcat-fieldname 'LIFNR'
           or ls_fieldcat-fieldname 'ZDESC'.
          ls_fieldcat-key 'X'.
          ls_fieldcat-fix_column 'X'.

          if ls_fieldcat-fieldname 'ZDESC'.
            clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
            ls_fieldcat-seltext_s ls_fieldcat-seltext_m ls_fieldcat-seltext_l 'Vendor Group Name'.
          endif.

          if ls_fieldcat-fieldname 'VIMGROUP'.
            ls_fieldcat-no_out 'X'.
          endif.
        elseif ls_fieldcat-fieldname 'NOURUT'.
          ls_fieldcat-key 'X'.
          ls_fieldcat-fix_column 'X'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s 'No'.
        elseif ls_fieldcat-fieldname 'IVTOTAL'.
          ls_fieldcat-do_sum    'X'.
*        elseif ls_fieldcat-fieldname = 'IVAMOUNT1'.
*          clear : ls_fieldcat-seltext_l, ls_fieldcat-seltext_m, ls_fieldcat-seltext_s.
*          ls_fieldcat-seltext_s = ls_fieldcat-seltext_m = ls_fieldcat-seltext_l = 'Not Yet Due'.
*          ls_fieldcat-do_sum    = 'X'.
*          ls_fieldcat-no_out    = 'X'.
        elseif ls_fieldcat-fieldname 'IVAMOUNT2'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s '0-30 Days'.
          ls_fieldcat-do_sum    'X'.
        elseif ls_fieldcat-fieldname 'IVAMOUNT3'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s '31-60 Days'.
          ls_fieldcat-do_sum    'X'.
        elseif ls_fieldcat-fieldname 'IVAMOUNT4'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s '61-90 Days'.
          ls_fieldcat-do_sum    'X'.
        elseif ls_fieldcat-fieldname 'IVAMOUNT5'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s '91-120 Days'.
          ls_fieldcat-do_sum    'X'.
        elseif ls_fieldcat-fieldname 'IVAMOUNT6'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s '> 120 Days'.
          ls_fieldcat-do_sum    'X'.
        endif.

        modify lt_fieldcat from ls_fieldcat
          transporting key fix_column seltext_s seltext_m seltext_l do_sum no_out
            where fieldname ls_fieldcat-fieldname.

        clear ls_fieldcat.
      endloop.

      clear is_layout.
      is_layout-colwidth_optimize 'X'.
      is_layout-zebra             'X'.

      refresh lt_sort.
*    clear ls_sort.
*    ls_sort-spos = 1.
*    ls_sort-fieldname = 'VIMGROUP'.
*    ls_sort-up        = 'X'.
*    ls_sort-group     = 'UL'. "or '*'.
*    ls_sort-subtot    = 'X'.
**    ls_sort-expa      = 'X'.
*    append ls_sort to lt_sort.

      clear ls_sort.
      ls_sort-spos 2.
      ls_sort-fieldname 'ZDESC'.
      ls_sort-up        'X'.
      ls_sort-group     'UL'"or '*'.
      ls_sort-subtot    'X'.
*    ls_sort-expa      = 'X'.
      append ls_sort to lt_sort.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          is_layout     is_layout
          it_fieldcat   lt_fieldcat
          it_sort       lt_sort
        tables
          t_outtab      lt_data
        exceptions
          program_error 1
          others        2.
    else.
      refresh lt_fieldcat.
      call function 'REUSE_ALV_FIELDCATALOG_MERGE'
        exporting
          i_structure_name       'ZSVIMR001_DTL'
        changing
          ct_fieldcat            lt_fieldcat
        exceptions
          inconsistent_interface 1
          program_error          2
          others                 3.

      clear ls_fieldcat.
      loop at lt_fieldcat into ls_fieldcat.
        if ls_fieldcat-fieldname 'VIMGROUP' or ls_fieldcat-fieldname 'NAME1' or ls_fieldcat-fieldname 'LIFNR'
           or ls_fieldcat-fieldname 'ZDESC'.
          ls_fieldcat-key 'X'.
          ls_fieldcat-fix_column 'X'.

          if ls_fieldcat-fieldname 'ZDESC'.
            clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
            ls_fieldcat-seltext_s ls_fieldcat-seltext_m ls_fieldcat-seltext_l 'Vendor Group Name'.
          endif.

          if ls_fieldcat-fieldname 'VIMGROUP'.
            ls_fieldcat-no_out 'X'.
          endif.
        elseif ls_fieldcat-fieldname 'NOURUT'.
          ls_fieldcat-key 'X'.
          ls_fieldcat-fix_column 'X'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_l ls_fieldcat-seltext_m ls_fieldcat-seltext_s 'No'.
        elseif ls_fieldcat-fieldname 'DMBTR'.
          ls_fieldcat-do_sum    'X'.
        elseif ls_fieldcat-fieldname 'IOVDUE'.
          clear ls_fieldcat-seltext_lls_fieldcat-seltext_mls_fieldcat-seltext_s.
          ls_fieldcat-seltext_s ls_fieldcat-seltext_m ls_fieldcat-seltext_l 'Days Over Due'.
*          ls_fieldcat-do_sum    = 'X'.
        endif.

        modify lt_fieldcat from ls_fieldcat
          transporting key fix_column seltext_s seltext_m seltext_l do_sum no_out
            where fieldname ls_fieldcat-fieldname.

        clear ls_fieldcat.
      endloop.

      clear is_layout.
      is_layout-colwidth_optimize 'X'.
      is_layout-zebra             'X'.

*      refresh lt_sort.
*      clear ls_sort.
*      ls_sort-spos = 3.
*      ls_sort-fieldname = 'LIFNR'.
*      ls_sort-up        = 'X'.
*      ls_sort-group     = 'UL'. "or '*'.
*      ls_sort-subtot    = 'X'.
**    ls_sort-expa      = 'X'.
*      append ls_sort to lt_sort.

      call function 'REUSE_ALV_GRID_DISPLAY'
        exporting
          is_layout     is_layout
          it_fieldcat   lt_fieldcat
          it_sort       lt_sort
        tables
          t_outtab      lt_data_summ
        exceptions
          program_error 1
          others        2.
    endif.

  endmethod.
endclass.



Report output






ABAP CDS View Part 10 : Authorization & DCL untuk ABAP CDS

Authorization & DCL di ABAP CDS | Panduan Lengkap (PFCG, @AccessControl, DCL) Authorization & DCL untuk ABAP CDS — Pandua...