[SAP ABAP] - Transaction Flow PO-Invoice

*&---------------------------------------------------------------------*
*& Report  Z
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zmm_po_inv_trans_flow.



TABLES : ekko, ekpo, mseg, mkpf, ekbe.

TYPES BEGIN OF ty_ekko,
          ebeln LIKE ekko-ebeln,
          waers LIKE ekko-waers,
          bedat LIKE ekko-bedat,
          bstyp LIKE ekko-bstyp,

          ekorg LIKE ekko-ekorg,
          ekgrp LIKE ekko-ekgrp,
          bsart LIKE ekko-bsart,
          lifnr LIKE ekko-lifnr,

        END OF ty_ekko.

TYPES BEGIN OF ty_ekpo,
          ebeln LIKE ekpo-ebeln,
          ebelp LIKE ekpo-ebelp,
          matnr LIKE ekpo-matnr,
          txz01 LIKE ekpo-txz01,
          pstyp LIKE ekpo-pstyp,

          werks LIKE ekpo-werks,
          menge LIKE ekpo-menge,
          meins LIKE ekpo-meins,
          waers LIKE ekko-waers,
          bedat LIKE ekko-bedat,

        END OF ty_ekpo.

TYPES BEGIN OF ty_rseg,
          belnr LIKE rseg-belnr,
          gjahr LIKE rseg-gjahr,
          buzei LIKE rseg-buzei,
          lfbnr LIKE rseg-lfbnr,
          lfgja LIKE rseg-lfgja,
          lfpos LIKE rseg-lfpos,
          shkzg LIKE rseg-shkzg,  " Added by Baskoro 16/09/2014
        END OF ty_rseg.

TYPES BEGIN OF ty_ekbe,
          ebeln LIKE ekbe-ebeln,
          ebelp LIKE ekbe-ebelp,
          vgabe LIKE ekbe-vgabe,
          gjahr LIKE ekbe-gjahr,
          belnr LIKE ekbe-belnr,
          buzei LIKE ekbe-buzei,
          budat LIKE ekbe-budat,
          menge LIKE ekbe-menge,
          wrbtr LIKE ekbe-wrbtr,

          lfgja LIKE ekbe-lfgja,
          lfbnr LIKE ekbe-lfbnr,
          lfpos LIKE ekbe-lfpos,
          shkzg LIKE ekbe-shkzg,  " Added by Baskoro 16/09/2014
        END OF ty_ekbe.

TYPES BEGIN OF ty_mseg,
          mblnr LIKE mseg-mblnr,
          mjahr LIKE mseg-mjahr,
          zeile LIKE mseg-zeile,
          lfbja LIKE mseg-lfbja,
          lfbnr LIKE mseg-lfbnr,
          lfpos LIKE mseg-lfpos,
          shkzg LIKE mseg-shkzg,  " Added by Baskoro 16/09/2014
        END OF ty_mseg.

TYPES BEGIN OF ty_essr,
          lblni LIKE essr-lblni,
          lbldt LIKE essr-lbldt,
          lwert LIKE essr-lwert,
        END OF ty_essr.

TYPES BEGIN OF ty_bkpf,
          belnr LIKE bkpf-belnr,
          awkey LIKE bkpf-awkey,
        END OF ty_bkpf.

TYPES BEGIN OF ty_gabungan.
        INCLUDE TYPE ty_ekpo.
TYPES :

          gjahr LIKE ekbe-gjahr,

          "BBM
          bbm LIKE ekbe-belnr,
          bbm_d LIKE ekbe-budat,
          bbm_v LIKE ekbe-wrbtr,

          "Invoice
          inv LIKE ekbe-belnr,
          inv_d LIKE ekbe-budat,
          inv_v LIKE ekbe-wrbtr,

          "CN/DN
          cdn LIKE ekbe-belnr,
          cdn_d LIKE ekbe-budat,
          cdn_v LIKE ekbe-wrbtr,

          "Payment
          pym LIKE ekbe-belnr,
          pym_d LIKE ekbe-budat,
          pym_v LIKE ekbe-wrbtr,
          chbox,
        END OF ty_gabungan.


DATA : gi_gab TYPE STANDARD TABLE OF ty_gabungan WITH HEADER LINE,
       gi_ekpo TYPE STANDARD TABLE OF ty_ekpo WITH HEADER LINE,
       gi_ekko TYPE STANDARD TABLE OF ty_ekko WITH HEADER LINE,
       gi_ekbe TYPE STANDARD TABLE OF ty_ekbe WITH HEADER LINE,
       gi_mseg TYPE STANDARD TABLE OF ty_mseg WITH HEADER LINE,
       gi_ekbe_bbm TYPE STANDARD TABLE OF ty_ekbe WITH HEADER LINE,
       gi_ekbe_inv TYPE STANDARD TABLE OF ty_ekbe WITH HEADER LINE,
       gi_ekbe_cdn TYPE STANDARD TABLE OF ty_ekbe WITH HEADER LINE,
       gi_bbm_inv TYPE STANDARD TABLE OF rseg WITH HEADER LINE,
       gi_esh TYPE STANDARD TABLE OF ty_essr WITH HEADER LINE,
       gi_pym TYPE STANDARD TABLE OF ty_bkpf WITH HEADER LINE.


SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE text02.
SELECT-OPTIONS : s_ebeln FOR ekko-ebeln, "po number
*                 s_mblnr FOR mseg-mblnr, "material document number
                 s_bedat FOR ekko-bedat, "periode
                 s_werks FOR ekko-reswk. "OBLIGATORY. "plant Change by Bakoro 15/09/2014


SELECTION-SCREEN END OF BLOCK b02.

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text01.
SELECT-OPTIONS : s_ekorg FOR ekko-ekorg,
                 s_ekgrp FOR ekko-ekgrp,
                 s_bsart FOR ekko-bsart,
                 s_knttp FOR ekpo-knttp NO-DISPLAY,
                 s_pstyp FOR ekpo-pstyp NO-DISPLAY,
                 s_lifnr FOR ekko-lifnr,
                 s_matnr FOR ekpo-matnr,
                 s_matkl FOR ekpo-matkl NO-DISPLAY.

SELECTION-SCREEN END OF BLOCK b01.

INCLUDE z_alv.

START-OF-SELECTION.
  PERFORM fm_collect_data.
  PERFORM fm_process_data.
  PERFORM fm_display_data.


*&---------------------------------------------------------------------*
*&      Form  fm_collect_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fm_collect_data.

  RANGES : lr_ebelp FOR ekpo-ebelp.

  "Collect PO Item base on selection
  SELECT ebeln ebelp matnr txz01 pstyp werks menge meins INTO TABLE gi_ekpo
  FROM ekpo
  WHERE ebeln IN s_ebeln AND
        ebelp IN lr_ebelp AND " DUMMY SELECTION
        werks IN s_werks AND  " Mandatory
        knttp IN s_knttp AND
        pstyp IN s_pstyp AND
        matnr IN s_matnr AND
        matkl IN s_matkl . "Menggunakan index Z01, jgn lupa di transport jg Index-nya

*  DELETE gi_ekpo WHERE NOT werks IN s_werks. "Tidak masuk ke index sehingga di delete dari luar select

  IF lines( gi_ekpo ) > 0.
    "Colllect PO Header
    SELECT ebeln waers bedat bstyp
           ekorg ekgrp bsart lifnr
      INTO TABLE gi_ekko
    FROM ekko
      FOR ALL ENTRIES IN gi_ekpo
    WHERE ebeln = gi_ekpo-ebeln.

    DELETE gi_ekko WHERE NOT bstyp = 'F'.
    DELETE gi_ekko WHERE NOT ekorg IN s_ekorg.
    DELETE gi_ekko WHERE NOT ekgrp IN s_ekgrp.
    DELETE gi_ekko WHERE NOT bsart IN s_bsart.
    DELETE gi_ekko WHERE NOT lifnr IN s_lifnr.
    DELETE gi_ekko WHERE NOT bedat IN s_bedat.

    SORT gi_ekko BY ebeln.
    LOOP AT gi_ekpo.
      READ TABLE gi_ekko WITH KEY ebeln = gi_ekpo-ebeln BINARY SEARCH.
      IF sy-subrc NE 0.
        DELETE gi_ekpo.
      ENDIF.
    ENDLOOP.

  ENDIF.

  IF lines( gi_ekpo ) > 0.

    "Colllect BBM and Invoice
    SELECT ebeln ebelp vgabe gjahr belnr buzei budat
           menge wrbtr lfgja lfbnr lfpos shkzg    " Added SHKZG
      INTO CORRESPONDING FIELDS OF TABLE gi_ekbe  " Changed by Baskoro 16/09/2014
    FROM ekbe
      FOR ALL ENTRIES IN gi_ekpo
    WHERE ebeln = gi_ekpo-ebeln AND
          ebelp = gi_ekpo-ebelp.

    IF lines( gi_ekbe ) > 0.
      "Colllect BBM->INV
      SELECT INTO CORRESPONDING FIELDS OF TABLE gi_bbm_inv
      FROM rseg
        FOR ALL ENTRIES IN gi_ekbe
      WHERE belnr = gi_ekbe-belnr AND
            gjahr = gi_ekbe-gjahr.
      SORT gi_bbm_inv BY lfbnr lfgja lfpos.

      "Collect Entry Sheet
      SELECT INTO CORRESPONDING FIELDS OF TABLE gi_mseg
      FROM mseg
        FOR ALL ENTRIES IN gi_ekbe
      WHERE mblnr = gi_ekbe-belnr AND
            mjahr = gi_ekbe-gjahr.

      IF lines( gi_mseg ) > 0.
        SELECT INTO CORRESPONDING FIELDS OF TABLE gi_esh
        FROM essr
          FOR ALL ENTRIES IN gi_mseg
        WHERE lblni = gi_mseg-lfbnr.
      ENDIF.
    ENDIF.

    "Colllect BBM
    gi_ekbe_bbm[] = gi_ekbe[].
    DELETE gi_ekbe_bbm WHERE NOT vgabe = '1'.

    "Colllect Invoice
    gi_ekbe_inv[] = gi_ekbe[].
    DELETE gi_ekbe_inv WHERE NOT vgabe = '2'.

    "Colllect CN/DN
    gi_ekbe_cdn[] = gi_ekbe[].
    DELETE gi_ekbe_cdn WHERE NOT vgabe = '3'.

    "Colllect Payment
    DATA : li_pym TYPE STANDARD TABLE OF ty_bkpf WITH HEADER LINE.
    LOOP AT gi_ekbe_inv.
      CONCATENATE gi_ekbe_inv-belnr gi_ekbe_inv-gjahr INTO li_pym-awkey.
      APPEND li_pym.
    ENDLOOP.

    SELECT INTO CORRESPONDING FIELDS OF TABLE gi_pym
    FROM bkpf
      FOR ALL ENTRIES IN li_pym
    WHERE awkey = li_pym-awkey.
    SORT gi_pym BY awkey.

  ENDIF.

ENDFORM.                    "fm_collect_data

*&---------------------------------------------------------------------*
*&      Form  fm_process_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fm_process_data.
  DATA : lv_belnr_bbm LIKE ekbe-belnr,
         lv_belnr_inv LIKE ekbe-belnr,
         lv_belnr_cdn LIKE ekbe-belnr,
         lv_belnr_pym LIKE ekbe-belnr,
         lv_no_row.

  SORT gi_ekko BY ebeln.
  LOOP AT gi_ekpo.
    READ TABLE gi_ekko WITH KEY ebeln = gi_ekpo-ebeln BINARY SEARCH.
    IF sy-subrc = 0.
      gi_ekpo-waers = gi_ekko-waers.
      gi_ekpo-bedat = gi_ekko-bedat.
      MODIFY gi_ekpo.
    ENDIF.
  ENDLOOP.

  SORT gi_ekpo BY ebeln ebelp.
  LOOP AT gi_ekpo.
    "Process Start From BBM
    CLEAR : lv_belnr_bbm, lv_belnr_inv, lv_belnr_cdn, lv_no_row.

    PERFORM fm_create_docflow_bbm USING lv_belnr_bbm.
    PERFORM fm_create_docflow_inv USING lv_belnr_bbm lv_belnr_inv.
    PERFORM fm_create_docflow_cdn USING lv_belnr_bbm lv_belnr_cdn.

    IF lv_belnr_bbm IS NOT INITIAL.

      LOOP AT gi_gab WHERE ebeln = gi_ekpo-ebeln AND
                           ebelp = gi_ekpo-ebelp.
        IF gi_gab-bbm IS NOT INITIAL OR gi_gab-inv IS NOT INITIAL OR gi_gab-cdn IS NOT INITIAL..
          lv_no_row = 'X'.
        ENDIF.
      ENDLOOP.
    ENDIF.

    IF lv_no_row IS INITIAL.
      PERFORM fm_clear_data.  " Added by Baskoro 15/09/2014
      MOVE-CORRESPONDING gi_ekpo TO gi_gab.
      APPEND gi_gab.
    ENDIF.
  ENDLOOP.

  PERFORM fm_remove_junk_row.

ENDFORM.                    "fm_process_data

*&---------------------------------------------------------------------*
*&      Form  fm_remove_junk_row
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fm_remove_junk_row.
  "Clear Data
  DATA : li_gab LIKE STANDARD TABLE OF gi_gab WITH HEADER LINE.
  DATA : lv_found.

  li_gab[] = gi_gab[].
  DELETE li_gab WHERE NOT ( bbm IS INITIAL AND inv IS INITIAL AND cdn IS INITIAL ).

  LOOP AT li_gab.

    CLEAR : lv_found.
    LOOP AT gi_gab WHERE ebeln = li_gab-ebeln AND
                         ebelp = li_gab-ebelp.
      IF gi_gab-bbm IS NOT INITIAL OR gi_gab-inv IS NOT INITIAL OR gi_gab-cdn IS NOT INITIAL..
        lv_found = 'X'.
        EXIT.
      ENDIF.
    ENDLOOP.

    IF lv_found = 'X'.
      DELETE gi_gab WHERE ebeln = li_gab-ebeln AND
                          ebelp = li_gab-ebelp AND
                         ( bbm IS INITIAL AND inv IS INITIAL AND cdn IS INITIAL ).
    ENDIF.
  ENDLOOP.
ENDFORM.                    "fm_remove_junk_row

*&---------------------------------------------------------------------*
*&      Form  fm_create_docflow_bbm
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fm_create_docflow_bbm USING fu_belnr.
  DATA : lv_awkey LIKE bkpf-awkey,
       lv_index1 TYPE i,
       lv_index2 TYPE i,
       lv_belnr_bbm LIKE ekbe-belnr.


  CLEAR : lv_index1.
  MOVE-CORRESPONDING gi_ekpo TO gi_gab.
  break aby_thomasb.
  LOOP AT gi_ekbe_bbm WHERE ebeln = gi_ekpo-ebeln AND
                            ebelp = gi_ekpo-ebelp.
    ADD TO lv_index1.


    PERFORM fm_clear_data.

    gi_gab-gjahr = gi_ekbe_bbm-gjahr.

    gi_gab-bbm   = gi_ekbe_bbm-belnr.
    gi_gab-bbm_d = gi_ekbe_bbm-budat.

    IF gi_ekbe_bbm-shkzg = 'S'.
      gi_gab-bbm_v = gi_ekbe_bbm-wrbtr.  " Change by Baskoro 16/09/2014
    ELSEIF gi_ekbe_bbm-shkzg = 'H'.           " req by Dessy
      gi_gab-bbm_v = gi_ekbe_bbm-wrbtr * -1.
    ENDIF.

    "Process Entry Sheet
    IF gi_gab-pstyp = '9'.
      READ TABLE gi_mseg WITH KEY mblnr = gi_gab-bbm
                                  mjahr = gi_gab-gjahr.
      IF sy-subrc = 0.
        READ TABLE gi_ekbe_inv WITH KEY lfgja = gi_mseg-lfbja
                                        lfbnr = gi_mseg-lfbnr
                                        lfpos = gi_mseg-lfpos.
        IF sy-subrc = 0.
          lv_index2 = sy-tabix.
          gi_gab-inv   = gi_ekbe_inv-belnr.
          gi_gab-inv_d = gi_ekbe_inv-budat.

          IF gi_mseg-shkzg = 'S'.
            gi_gab-inv_v = gi_ekbe_inv-wrbtr.  " Change by Baskoro 16/09/2014
          ELSEIF gi_mseg-shkzg = 'H'.               " req by Dessy
            gi_gab-inv_v = gi_ekbe_inv-wrbtr * -1.
          ENDIF.

          gi_gab-gjahr = gi_ekbe_inv-gjahr.
          lv_belnr_bbm = gi_gab-inv.
          DELETE gi_ekbe_inv INDEX lv_index2.

        ENDIF.

        READ TABLE gi_ekbe_cdn WITH KEY lfgja = gi_mseg-lfbja
                                        lfbnr = gi_mseg-lfbnr
                                        lfpos = gi_mseg-lfpos.
        IF sy-subrc = 0.
          lv_index2 = sy-tabix.
          gi_gab-cdn   = gi_ekbe_cdn-belnr.
          gi_gab-cdn_d = gi_ekbe_cdn-budat.
          gi_gab-cdn_v = gi_ekbe_cdn-wrbtr.

          gi_gab-gjahr = gi_ekbe_cdn-gjahr.
          lv_belnr_bbm = gi_gab-cdn.
          DELETE gi_ekbe_cdn INDEX lv_index2.

        ENDIF.
      ENDIF.
    ENDIF.

    "Invoice
    IF gi_gab-pstyp NE '9'.
      CLEAR : lv_index2, lv_belnr_bbm.
      READ TABLE gi_bbm_inv WITH KEY lfbnr = gi_ekbe_bbm-belnr
                                     lfgja = gi_ekbe_bbm-gjahr
                                     lfpos = gi_ekbe_bbm-buzei BINARY SEARCH.
      IF sy-subrc = 0.
        READ TABLE gi_ekbe_inv WITH KEY belnr = gi_bbm_inv-belnr
                                        gjahr = gi_bbm_inv-gjahr
                                        buzei = gi_bbm_inv-buzei.
        IF sy-subrc = 0.
          lv_index2 = sy-tabix.
          gi_gab-inv   = gi_ekbe_inv-belnr.
          gi_gab-inv_d = gi_ekbe_inv-budat.

          IF gi_bbm_inv-shkzg = 'S'.
            gi_gab-inv_v = gi_ekbe_inv-wrbtr.  " Changed by Baskoro 16/09/2014
          ELSEIF gi_bbm_inv-shkzg = 'H'.
            gi_gab-inv_v = gi_ekbe_inv-wrbtr * -1.
          ENDIF.

          gi_gab-gjahr = gi_ekbe_inv-gjahr.
          lv_belnr_bbm = gi_gab-inv.
          DELETE gi_ekbe_inv INDEX lv_index2.

        ENDIF.

        READ TABLE gi_ekbe_cdn WITH KEY belnr = gi_bbm_inv-belnr
                                        gjahr = gi_bbm_inv-gjahr
                                        buzei = gi_bbm_inv-buzei.
        IF sy-subrc = 0.
          lv_index2 = sy-tabix.
          gi_gab-cdn   = gi_ekbe_cdn-belnr.
          gi_gab-cdn_d = gi_ekbe_cdn-budat.

          IF gi_bbm_inv-shkzg = 'S'.
            gi_gab-cdn_v = gi_ekbe_cdn-wrbtr.  " Changed by Baskoro 16/09/2014
          ELSEIF gi_bbm_inv-shkzg = 'H'.
            gi_gab-cdn_v = gi_ekbe_cdn-wrbtr * -1.
          ENDIF.

          gi_gab-gjahr = gi_ekbe_cdn-gjahr.
          lv_belnr_bbm = gi_gab-cdn.
          DELETE gi_ekbe_cdn INDEX lv_index2.

        ENDIF.


      ENDIF.
    ENDIF.


    "Process Payment
    IF lv_belnr_bbm IS NOT INITIAL.

      CONCATENATE lv_belnr_bbm gi_gab-gjahr INTO lv_awkey.
      READ TABLE gi_pym WITH KEY awkey = lv_awkey BINARY SEARCH.
      IF sy-subrc = 0.

        SELECT SINGLE augbl augdt INTO (gi_gab-pym, gi_gab-pym_d)
        FROM bsak
        WHERE belnr = gi_pym-belnr AND
              buzei = gi_ekbe_inv-buzei.

        SELECT SINGLE wrbtr INTO gi_gab-pym_v
        FROM bsak
        WHERE belnr = gi_gab-pym AND
              blart = 'KZ'.

      ENDIF.

    ENDIF.

    APPEND gi_gab.
    PERFORM fm_clear_data.

  ENDLOOP.

  fu_belnr = lv_belnr_bbm.
ENDFORM.                    "fm_create_docflow_bbm

*&---------------------------------------------------------------------*
*&      Form  fm_create_docflow_inv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FU_BELNR_BBM  text
*      -->FU_BELNR_INV  text
*----------------------------------------------------------------------*
FORM fm_create_docflow_inv USING fu_belnr_bbm fu_belnr_inv.

  DATA : lv_awkey LIKE bkpf-awkey,
       lv_index1 TYPE i,
       lv_index2 TYPE i.

  CLEAR : fu_belnr_inv.
*  IF fu_belnr_bbm IS INITIAL.

  CLEAR : lv_index1.
  MOVE-CORRESPONDING gi_ekpo TO gi_gab.
  LOOP AT gi_ekbe_inv WHERE ebeln = gi_ekpo-ebeln AND
                            ebelp = gi_ekpo-ebelp.
    ADD TO lv_index1.
    PERFORM fm_clear_data.

    gi_gab-gjahr = gi_ekbe_inv-gjahr.

    gi_gab-inv   = gi_ekbe_inv-belnr.
    gi_gab-inv_d = gi_ekbe_inv-budat.
    gi_gab-inv_v = gi_ekbe_inv-wrbtr.

    fu_belnr_inv = gi_ekbe_inv-belnr.

    "Process Payment
    CONCATENATE gi_ekbe_inv-belnr gi_gab-gjahr INTO lv_awkey.
    READ TABLE gi_pym WITH KEY awkey = lv_awkey BINARY SEARCH.
    IF sy-subrc = 0.
      SELECT SINGLE augbl augdt INTO (gi_gab-pym, gi_gab-pym_d)
      FROM bsak
      WHERE belnr = gi_pym-belnr AND
            buzei = gi_ekbe_inv-buzei.

      SELECT SINGLE wrbtr INTO gi_gab-pym_v
      FROM bsak
      WHERE belnr = gi_gab-pym AND
            blart = 'KZ'.

    ENDIF.

    APPEND gi_gab.
    PERFORM fm_clear_data.
  ENDLOOP.

*  ENDIF.

ENDFORM.                    "fm_create_docflow_inv

*&---------------------------------------------------------------------*
*&      Form  fm_create_docflow_cdn
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FU_BELNR_BBM  text
*      -->FU_BELNR_CDN  text
*----------------------------------------------------------------------*
FORM fm_create_docflow_cdn USING fu_belnr_bbm fu_belnr_cdn.

  DATA : lv_awkey LIKE bkpf-awkey,
       lv_index1 TYPE i,
       lv_index2 TYPE i.

  CLEAR : fu_belnr_cdn.
*  IF fu_belnr_bbm IS INITIAL.

  CLEAR : lv_index1.
  MOVE-CORRESPONDING gi_ekpo TO gi_gab.
  LOOP AT gi_ekbe_cdn WHERE ebeln = gi_ekpo-ebeln AND
                            ebelp = gi_ekpo-ebelp.
    ADD TO lv_index1.
    PERFORM fm_clear_data.

    gi_gab-gjahr = gi_ekbe_cdn-gjahr.
    gi_gab-cdn   = gi_ekbe_cdn-belnr.
    gi_gab-cdn_d = gi_ekbe_cdn-budat.
    gi_gab-cdn_v = gi_ekbe_cdn-wrbtr.

    fu_belnr_cdn = gi_ekbe_cdn-belnr.

    "Process Payment

    CONCATENATE gi_ekbe_cdn-belnr gi_gab-gjahr INTO lv_awkey.
    READ TABLE gi_pym WITH KEY awkey = lv_awkey BINARY SEARCH.
    IF sy-subrc = 0.
      SELECT SINGLE augbl augbl INTO (gi_gab-pym, gi_gab-pym_d)
      FROM bsak
      WHERE belnr = gi_pym-belnr AND
            buzei = gi_ekbe_cdn-buzei.

      SELECT SINGLE wrbtr INTO gi_gab-pym_v
      FROM bsak
      WHERE belnr = gi_gab-pym AND
            blart = 'KZ'.

    ENDIF.

    APPEND gi_gab.
    PERFORM fm_clear_data.
  ENDLOOP.


*  ENDIF.

ENDFORM.                    "fm_create_docflow_cdn

*&---------------------------------------------------------------------*
*&      Form  fm_display_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fm_display_data.
  PERFORM fm_alv_reset_data.

  "set ALV Parameters and Data
  PERFORM fm_alv_set_layout USING 'Laporan BBM-Invoice SPP'.
  PERFORM fm_alv_set_print.
  PERFORM fm_alv_set_column.

  gv_i_default = 'X'.
  gv_i_save = 'A'.

  PERFORM fm_alv_show TABLES gi_gab.
ENDFORM.                    "fm_display_data

*&---------------------------------------------------------------------*
*&      Form  fm_alv_set_column
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fm_alv_set_column.

  PERFORM fm_alv_add_fieldcat USING :
      'EBELN' 'EKPO' 'EBELN' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'EBELP' 'EKPO' 'EBELN' '' '' ''    'PO Item' 'PO Item' 'PO Item' '' '' '' '' '' '' '' '' '' '' 'X' 'X',  " Changed by Baskoro 15/09/2014
      'BEDAT' 'EKKO' 'BEDAT' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'WERKS' 'EKPO' 'WERKS' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'MATNR' 'EKPO' 'MATNR' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'TXZ01' 'EKPO' 'TXZ01' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'WAERS' 'EKKO' 'WAERS' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'MENGE' 'EKPO' 'MENGE' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',
      'MEINS' 'EKPO' 'MEINS' '' '' ''    '' '' '' '' '' '' '' '' '' '' '' '' '' 'X' 'X',

      'BBM' 'EKBE' 'BELNR' '' '' 'BBM'    'BBM' 'BBM' 'BBM' '' '' '' '' '' '' '' '' '' '' '' '',
      'BBM_D' 'EKBE' 'BUDAT' '' '' 'BBM Date'    'BBM Date' 'BBM Date' 'BBM Date' '' '' '' '' '' '' '' '' '' '' '' '',
      'BBM_V' 'EKBE' 'WRBTR' '' '' 'BBM Amount'    'BBM Amount' 'BBM Amount' 'BBM Amount' '' '' '' '' '' '' '' 'WAERS' '' '' '' '',

      'INV' 'EKBE' 'BELNR' '' '' 'INV'    'INV' 'INV' 'INV' '' '' '' '' '' '' '' '' '' '' '' '',
      'INV_D' 'EKBE' 'BUDAT' '' '' 'INV Date'    'INV Date' 'INV Date' 'INV Date' '' '' '' '' '' '' '' '' '' '' '' '',
      'INV_V' 'EKBE' 'WRBTR' '' '' 'INV Amount'    'INV Amount' 'INV Amount' '' '' '' '' '' '' '' '' 'WAERS' '' '' '' '',

loading...
      'CDN' 'EKBE' 'BELNR' '' '' 'CN/DN'    'CN/DN' 'CN/DN' 'CN/DN' '' '' '' '' '' '' '' '' '' '' '' '',     " Change by Baskoro 16/09/2014
      'CDN_D' 'EKBE' 'BUDAT' '' '' 'CN/DN Date'    'CN/DN Date' 'CN/DN Date' 'CN/DN Date' '' '' '' '' '' '' '' '' '' '' '' '',
      'CDN_V' 'EKBE' 'WRBTR' '' '' 'CN/DN Amount'    'CN/DN Amount' 'CN/DN Amount' 'CN/DN Amount' '' '' '' '' '' '' '' 'WAERS' '' '' '' '',

      'PYM' 'EKBE' 'BELNR' '' '' 'Payment'    'Payment' 'Payment' 'Payment' '' '' '' '' '' '' '' '' '' '' '' '',
      'PYM_D' 'BSAK' 'AUGDT' '' '' 'Payment Date'    'Payment Date' 'Payment Date' 'Payment Date' '' '' '' '' '' '' '' '' '' '' '' '',
      'PYM_V' 'EKBE' 'WRBTR' '' '' 'Payment Amount'    'Payment Amount' 'Payment Amount' 'Payment Amount' '' '' '' '' '' '' '' 'WAERS' '' '' '' ''.

*  Sort and Group by Field
  CLEAR gi_it_sort.
  gi_it_sort-fieldname = 'EBELN'">> Filled by Fieldname
  gi_it_sort-up        = 'X'.     ">> 'X' = Ascending ; ' ' = Descending
  gi_it_sort-subtot    = 'X'.
  gi_it_sort-group     = '*'.     ">> '*' = Grouped by field ; ' ' = Not grouped by this field
  APPEND gi_it_sort.
*  CLEAR gi_it_sort.
*  gi_it_sort-fieldname = 'EBELP'. ">> Filled by Fieldname
*  gi_it_sort-up        = 'X'.     ">> 'X' = Ascending ; ' ' = Descending
*  gi_it_sort-subtot    = 'X'.
*  gi_it_sort-group     = '*'.     ">> '*' = Grouped by field ; ' ' = Not grouped by this field
*  APPEND gi_it_sort.

ENDFORM.                    "fm_alv_set_column
*&---------------------------------------------------------------------*
*&      Form  FM_CLEAR_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <-- nbsp="" p2="" span="" text="">
*----------------------------------------------------------------------*
FORM fm_clear_data .
  CLEAR : gi_gab-bbm, gi_gab-bbm_v, gi_gab-bbm_d,
          gi_gab-inv, gi_gab-inv_v, gi_gab-inv_d,
          gi_gab-cdn, gi_gab-cdn_v, gi_gab-cdn_d,
          gi_gab-pym, gi_gab-pym_v, gi_gab-pym_d,
          gi_gab-spp, gi_gab-spp_v, gi_gab-spp_d.
ENDFORM.                    " FM_CLEAR_DATA

*&---------------------------------------------------------------------*
*&      Form  fm_open_tcode
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FU_VALUE   text
*----------------------------------------------------------------------*
FORM fm_open_tcode USING fu_value.
  DATA : lv_ebeln LIKE ekko-ebeln.

  lv_ebeln = fu_value.
  SET PARAMETER ID 'BES' FIELD lv_ebeln.
  CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
ENDFORM.                    "fm_open_tcode


<< Create New Include >>
*&---------------------------------------------------------------------*
*&  Include           Z_ALV
*&---------------------------------------------------------------------*
TYPE-POOLS : slis.

DATA : gw_is_layout               TYPE        slis_layout_alv,
       gi_it_fieldcat        TYPE        slis_t_fieldcat_alv WITH HEADER LINE,
       gi_it_excluding        TYPE        slis_t_extab        WITH HEADER LINE,
       gi_it_special_groups        TYPE        slis_t_sp_group_alv WITH HEADER LINE,
       gi_it_sort               TYPE        slis_t_sortinfo_alv WITH HEADER LINE,
       gi_it_filter               TYPE        slis_t_filter_alv   WITH HEADER LINE,
       gw_is_sel_hide        TYPE        slis_sel_hide_alv,
       gv_i_default,
       gv_i_save,
       gw_is_variant               LIKE        disvariant,
       gi_it_events               TYPE        slis_t_event        WITH HEADER LINE,
       gi_it_event_exit        TYPE        slis_t_event_exit   WITH HEADER LINE,
       gw_is_print               TYPE        slis_print_alv,
       gw_is_reprep_id        TYPE        slis_reprep_id.

*&--------------------------------------------------------------------*
*&      Form  fm_alv_show
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->FT_ITAB    text
*---------------------------------------------------------------------*
FORM fm_alv_show TABLES ft_itab.
  CLEAR gi_it_event_exit.
  gi_it_event_exit-ucomm = '&OUP'.
  gi_it_event_exit-after = 'X'.
  APPEND gi_it_event_exit.

  CLEAR gi_it_event_exit.
  gi_it_event_exit-ucomm = '&ODN'.
  gi_it_event_exit-after = 'X'.
  APPEND gi_it_event_exit.

  CLEAR gi_it_event_exit.
  gi_it_event_exit-ucomm = '&ETA'.
  gi_it_event_exit-after = 'X'.
  APPEND gi_it_event_exit.

  CLEAR gi_it_event_exit.
  gi_it_event_exit-ucomm = '&IC1'.
  gi_it_event_exit-after = 'X'.
  APPEND gi_it_event_exit.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*      I_INTERFACE_CHECK              = ' '
*      I_BYPASSING_BUFFER             =
*      I_BUFFER_ACTIVE                = ' '
      i_callback_program             = sy-repid
      i_callback_pf_status_set       = 'FM_ALV_SET_PF_STATUS'
      i_callback_user_command        = 'FM_ALV_USER_COMMAND'
*      I_STRUCTURE_NAME               =
      is_layout                      = gw_is_layout
      it_fieldcat                    = gi_it_fieldcat[]
*      IT_EXCLUDING                   =
*      IT_SPECIAL_GROUPS              =
      it_sort                        = gi_it_sort[]
      it_filter                      = gi_it_filter[]
      is_sel_hide                    = gw_is_sel_hide
      i_default                      = gv_i_default
      i_save                         = gv_i_save
      is_variant                     = gw_is_variant
      it_events                      = gi_it_events[]
      it_event_exit                  = gi_it_event_exit[]
      is_print                       = gw_is_print
      is_reprep_id                   = gw_is_reprep_id
*      I_SCREEN_START_COLUMN          = 0
*      I_SCREEN_START_LINE            = 0
*      I_SCREEN_END_COLUMN            = 0
*      I_SCREEN_END_LINE              = 0
*    IMPORTING
*      E_EXIT_CAUSED_BY_CALLER        =
*      ES_EXIT_CAUSED_BY_USER         =
    TABLES
      t_outtab                       = ft_itab
    EXCEPTIONS
      program_error                  = 1
      OTHERS                         2
            .
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    "fm_alv_show

*&--------------------------------------------------------------------*
*&      Form  fm_alv_reset_data
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM fm_alv_reset_data.
  CLEAR : gw_is_layout,
          gi_it_fieldcat,
          gi_it_excluding,
          gi_it_special_groups,
          gi_it_sort,
          gi_it_filter,
          gw_is_sel_hide,
          gv_i_default,
          gv_i_save,
          gw_is_variant,
          gi_it_events,
          gi_it_event_exit,
          gw_is_print,
          gw_is_reprep_id.

  REFRESH : gi_it_fieldcat,
            gi_it_excluding,
            gi_it_special_groups,
            gi_it_sort,
            gi_it_filter,
            gi_it_events,
            gi_it_event_exit.

ENDFORM.                    "fm_alv_reset_data

*&--------------------------------------------------------------------*
*&      Form  fm_alv_set_layout
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM fm_alv_set_layout USING fu_title.
  gw_is_layout-window_titlebar    = fu_title.
  gw_is_layout-zebra              = 'X'.
  gw_is_layout-colwidth_optimize  = 'X'.
  gw_is_layout-no_colhead         = space.
  gw_is_layout-group_change_edit  = 'X'.
  gw_is_layout-box_fieldname      = 'CHBOX'.

ENDFORM.                    "fm_alv_set_layout

*&--------------------------------------------------------------------*
*&      Form  fm_alv_set_print
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM fm_alv_set_print.
  gw_is_print-no_print_listinfos    = 'X'.
  gw_is_print-no_print_selinfos     = 'X'.
  gw_is_print-no_coverpage          = 'X'.
  gw_is_print-no_print_hierseq_item = 'X'.
ENDFORM.                    "fm_alv_set_print


*&--------------------------------------------------------------------*
*&      Form  fm_alv_add_fieldcat
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM fm_alv_add_fieldcat USING fu_1  fu_2  fu_3  fu_4  fu_5  fu_6  fu_7  fu_8  fu_9  fu_10
                               fu_11 fu_12 fu_13 fu_14 fu_15 fu_16 fu_17 fu_18 fu_19 fu_20 fu_21. " fu_22.

  CLEAR: gi_it_fieldcat.
  gi_it_fieldcat-fieldname     = fu_1.  " Fieldname
  gi_it_fieldcat-ref_tabname   = fu_2.  " Reference Tablename
  gi_it_fieldcat-ref_fieldname = fu_3.  " Reference Fieldname
  gi_it_fieldcat-no_out        = fu_4.  " (O)blig.(X)no out
  gi_it_fieldcat-outputlen     = fu_5.  " Output length
  gi_it_fieldcat-seltext_l     = fu_6.  " long key word
  gi_it_fieldcat-seltext_m     = fu_7.  " middle key word
  gi_it_fieldcat-seltext_s     = fu_8.  " short key word
  gi_it_fieldcat-reptext_ddic  = fu_9.  " heading (ddic)
  gi_it_fieldcat-round         = fu_10. " round in write statement
  gi_it_fieldcat-do_sum        = fu_11. " sum up
  gi_it_fieldcat-hotspot       = fu_12. " 'X' = hotspot is active -> Event click
  gi_it_fieldcat-decimals_out  = fu_13. " decimals in write statement
  gi_it_fieldcat-currency      = fu_14.
  gi_it_fieldcat-quantity      = fu_15.
  gi_it_fieldcat-qfieldname    = fu_16. " field with quantity unit
  gi_it_fieldcat-cfieldname    = fu_17. " field with currency unit
  gi_it_fieldcat-checkbox      = fu_18. " 'X' = checkbox or ' ' = not checkbox
  gi_it_fieldcat-icon          = fu_19. " 'X' = icon or ' ' = not icon
  gi_it_fieldcat-fix_column    = fu_20. " 'X' = Fix Column On or ' ' = Fix Column off  gi_it_fieldcat-key           = &21.
  gi_it_fieldcat-key           = fu_21. " 'X' = Key or ' ' = not Key
*  gi_it_fieldcat-no_zero       = fu_22.

  APPEND gi_it_fieldcat.
ENDFORM.                    "fm_alv_add_fieldcat

*&--------------------------------------------------------------------*
*&      Form  FM_ALV_SET_PF_STATUS
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->RT_EXTAB   text
*---------------------------------------------------------------------*
FORM fm_alv_set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZSTANDARD'.
ENDFORM.                    "fm_alv_set_pf_status

*&--------------------------------------------------------------------*
*&      Form  FM_USER_COMMAND
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM fm_alv_user_command USING fu_ucomm    LIKE sy-ucomm
                         fu_selfield TYPE slis_selfield.
  DATA: lt_dynpread LIKE dynpread OCCURS WITH HEADER LINE,
        lv_ok_code  LIKE sy-ucomm.

  MOVE fu_ucomm TO lv_ok_code.
  CASE lv_ok_code.
    WHEN '&PRC'.
*      perform fm_process.
*      PERFORM fm_alv_event_double_click
    WHEN '&IC1'.
      PERFORM fm_open_tcode USING fu_selfield-value.
    WHEN '&F03' OR '&F15' OR '&F12'.

  ENDCASE.

  MOVE 'X' TO fu_selfield-refresh.

ENDFORM.                    "FM_USER_COMMAND

Comments