動態內表及動態ALV顯示(轉)

weilish發表於2011-06-17
最近寫了一個forecast,要求按使用者輸入的日期分周或月顯示,我把它貼出來,給有需要的人蔘考一下
*&---------------------------------------------------------------------*
*& Report  ZRSD041
*&
*&---------------------------------------------------------------------*
*&Description : Forecast Report (MD61)
*&Created By  : Michael Chow 2008.04.29
*&---------------------------------------------------------------------*

REPORT  ZRSD041.

TYPE-POOLS: slis.

TABLES: PBED,   "Independent Requirements Data
        PBHI,   "Independent Requirements History
        PBIM,   "Independent Requirements for Material
        MDKP,  "Header Data for MRP Document
        MDTB,  "MRP table
        MDTC,  "Aggregated MRP table items
        T457T. "Description of MRP elements




********************Global Data definitation*************************************
FIELD-SYMBOLS: TYPE STANDARD TABLE ,  "??? Dynamic internal table name
                type any ,                    " Field symbol to create work area
                type any,              " Field symbol to assign values
                type any.

DATA:        G_cols TYPE I ,                     " number of columns
             G_Rows TYPE I,                      " Number of Lines
             g_dc(5) TYPE C,                     " Date format
             g_count TYPE I,                     "Period Value Count
             G_sta_col(2) TYPE N.                   "Start Column



DATA:   t_newtable TYPE REF TO data,
        t_newline  TYPE REF TO data,
        MY_TABLEREF type ref to DATA ,
        MY_WAREF type ref to DATA ,
        fs_fldcat   TYPE slis_t_fieldcat_alv,
        l_fldcat   TYPE lvc_t_fcat,
        wa_it_fldcat TYPE lvc_s_fcat,
        wa_colno(2) TYPE n,
        wa_flname(10) TYPE c.


DATA:  BEGIN OF IT_MD61 OCCURS 0,   "Independent Requirements for Material
                        MATNR   like PBIM-MATNR,  "Material
                        WERKS   LIKE PBIM-WERKS,  "Plant
                        BEDAE   LIKE PBIM-BEDAE,  "Requirement type
                        VERSB   LIKE PBIM-VERSB,  "Version number
                        PBDNR   LIKE PBIM-PBDNR,  "Requirement Number
                        BDZEI   LIKE PBIM-BDZEI,  "Independent requirements pointer
                        PDATU   LIKE PBED-PDATU,  "Delivery/order finish date
                        WDATU   LIKE PBED-WDATU,  "Reqstd date
                        LAEDA   LIKE PBED-LAEDA,  "Date of Last Change
                        MEINS   LIKE PBED-MEINS,  "Base Unit of Measure
                        PLNMG   LIKE PBED-PLNMG,  "Planned quantity
                        UPLMG   LIKE PBED-UPLMG,  "Originally planned quantity
                        ENTLI   LIKE PBED-ENTLI,  "Date type (day, week, month, interval)
                        ENTLU   LIKE PBED-ENTLU,  "Period indicator (day, week, month, posting period)
                        PERXX   LIKE PBED-PERXX.  "Planning period
DATA: END OF  IT_MD61.


DATA: BEGIN OF IT_PBHI  OCCURS 0. "Independent Requirements History
      include structure PBHI.
DATA:       MATNR LIKE PBIM-MATNR.
DATA:       PERXX LIKE PBED-PERXX.
DATA: END OF  IT_PBHI.


DATA: BEGIN OF IT_TOTAL OCCURS 0, "Totoal requirement
                        MATNR LIKE PBIM-MATNR,  "Material
                        PLNMG LIKE PBED-PLNMG,  "Total
                        LAEDA LIKE PBED-LAEDA.  "Doc date
DATA: END OF   IT_TOTAL.


DATA: BEGIN OF IT_HI_TOTAL OCCURS 0, "Totoal requirement
                        MATNR LIKE PBIM-MATNR,  "Material
                        PLNMG LIKE PBED-PLNMG,  "Total
                        LAEDA LIKE PBED-LAEDA.  "Doc date
DATA: END OF   IT_HI_TOTAL.

DATA: BEGIN OF MDTBX OCCURS 0.
        INCLUDE STRUCTURE MDTB.
DATA:   MATNR   LIKE MARC-MATNR.
DATA:   PERXX   LIKE PBED-PERXX.
DATA: END   OF MDTBX.


DATA: BEGIN OF IT_MDTB OCCURS 0.
        INCLUDE STRUCTURE MDTB.
DATA:          DELB1 LIKE T457T-DELB1.
DATA: END OF   IT_MDTB.


********************End of Global Data definitation********************************


SELECTION-SCREEN  BEGIN OF BLOCK rpt1 with frame. title text-t01.
  PARAMETERS: P_werks  like MARC-WERKS OBLIGATORY DEFAULT '7231'.
  SELECT-OPTIONS: s_MATNR FOR PBIM-MATNR. "OBLIGATORY.
  PARAMETERS: p_year   LIKE bkpf-gjahr DEFAULT sy-datum+0(4) OBLIGATORY.
  PARAMETERS: p_entlu  LIKE PBED-ENTLI OBLIGATORY DEFAULT 'W',
              p_Frm(2) TYPE N OBLIGATORY,
              P_TO(2)  TYPE N OBLIGATORY.

  SELECTION-SCREEN skip.

  PARAMETERS: P_WHIS AS CHECKBOX DEFAULT 'X'.


SELECTION-SCREEN END OF BLOCK rpt1.





INITIALIZATION.
*  G_Cols = 10.     "Initialize the Column Numbers.
  G_Rows = 20.     "Initialize the Row Numbers

Start-of-SELECTION.

PERFORM. Input_Analyst.
PERFORM. GET_FC_DATA.     "Get sales forecast data.
PERFORM. GET_FC_HIS.      "Get Forecast History
PERFORM. Dny_field_Creation.
PERFORM. Dny_Table_Creation.
PERFORM. Dny_field_value_update.
PERFORM. Add_alv_fields.
PERFORM. Show_Alv.


end-of-SELECTION.




Form. Dny_Field_Creation.    "Step 1

* Create fields .
   wa_it_fldcat-fieldname = 'MATNR'.
   wa_it_fldcat-datatype = 'CHAR'.
   wa_it_fldcat-intlen = 18.
   APPEND wa_it_fldcat TO l_fldcat.

   wa_it_fldcat-fieldname = 'Remark'.
   wa_it_fldcat-datatype = 'CHAR'.
   wa_it_fldcat-intlen = 30.
   APPEND wa_it_fldcat TO l_fldcat.

  g_sta_col = p_frm.

  DO G_cols TIMES.
    CLEAR wa_it_fldcat.
*    move sy-index to wa_colno.
    move g_sta_col to wa_colno.

    concatenate G_DC wa_colno into wa_flname.
    wa_it_fldcat-fieldname = wa_flname.
    wa_it_fldcat-datatype = 'CHAR'.
    wa_it_fldcat-intlen = 10.
    APPEND wa_it_fldcat TO l_fldcat.
    g_sta_col = g_sta_col + 1.

  ENDDO.

   wa_it_fldcat-fieldname = 'Total'.
   wa_it_fldcat-datatype = 'N'.
   wa_it_fldcat-intlen = 13.
   APPEND wa_it_fldcat TO l_fldcat.

   wa_it_fldcat-fieldname = 'Docdt'.
   wa_it_fldcat-datatype = 'D'.
   wa_it_fldcat-intlen = 10.
   APPEND wa_it_fldcat TO l_fldcat.

ENDFORM.

FORM. Dny_Table_Creation. "Step 2
* Create dynamic internal table and assign to FS


  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = l_fldcat
    IMPORTING
      ep_table        = t_newtable.

  ASSIGN t_newtable->* TO .
* Create dynamic work area and assign to FS
  CREATE DATA t_newline LIKE LINE OF .
  ASSIGN t_newline->* TO .

ENDFORM.

"Update field value dynamically
Form. Dny_Field_value_Update.  "Step 3
  DATA: fieldname(20) TYPE c.
  DATA: fieldvalue(10) TYPE c.
  DATA: index(3) TYPE c.
  DATA: L_WK(2) TYPE C.
  DATA: L_Period(6) TYPE C.
"Setup the field value

    ASSIGN t_newtable->* TO .
* Create dynamic work area and assign to FS
  CREATE DATA t_newline LIKE LINE OF .
  ASSIGN t_newline->* TO .

g_sta_col = p_frm.

Loop at it_total.

  if P_WHIS EQ 'X'.
   PERFORM. Dny_Field_FC_HIS_Update USING it_total-matnr. "Insert Fc History Record
   endif.

  ASSIGN COMPONENT  'MATNR'
        OF STRUCTURE TO .
    =  it_total-matnr.

  ASSIGN COMPONENT  'REMARK'
        OF STRUCTURE TO .
    =  'Current'.

     ASSIGN COMPONENT  'TOTAL'
        OF STRUCTURE TO .
       =  it_total-plnmg.

     ASSIGN COMPONENT  'DOCDT'
        OF STRUCTURE TO .
    = it_total-LAEDA.

G_Cols = p_frm.
g_sta_col = G_Cols.

While G_Cols < p_To.
  clear fieldvalue.

  CONCATENATE p_year g_sta_col into l_period.
    MOVE g_sta_col TO wa_colno.
    CONCATENATE G_DC wa_colno INTO wa_flname.
* Set up fieldvalue


read TABLE it_md61 with key matnr = it_total-matnr PERXX  = l_period.
if sy-subrc eq 0.
      fieldvalue = it_md61-PLNMG.
      else.
      fieldvalue = ''.
    endif.
   g_sta_col = g_sta_col + 1.
   G_Cols = G_Cols + 1.

   ASSIGN COMPONENT  wa_flname
     OF STRUCTURE TO .
    =  fieldvalue.

ENDWHILE.
    append to .
    clear .
    PERFORM. Extract_MRP_DATA using IT_TOTAL-MATNR. "Get MRP data
endloop.


**************************************************

*      INSERT   INTO TABLE .
*    append to .


ENDFORM.

Form. add_alv_fields. "Step 4
* Append fields to the dynamic internal table

  APPEND TO .

DATA: wa_cat LIKE LINE OF fs_fldcat,
      L_TXT(20) TYPE C.

"Added Special Field into ALV FCAT.

    wa_cat-fieldname = 'MATNR'.

    wa_cat-seltext_s = 'Material'.

    wa_cat-outputlen = '18'.

    APPEND wa_cat TO fs_fldcat.

    wa_cat-fieldname = 'REMARK'.

    wa_cat-seltext_s = 'REMARK'.

    wa_cat-outputlen = '30'.

    APPEND wa_cat TO fs_fldcat.

g_sta_col = p_frm.

  DO G_cols TIMES.

    CLEAR wa_cat.

    MOVE g_sta_col TO wa_colno.

    CONCATENATE G_DC wa_colno INTO wa_flname.


  CONCATENATE wa_colno '.' P_Year into L_TXT.
IF P_ENTLU EQ 'W'.
  CONCATENATE 'W ' L_TXT into L_TXT SEPARATED BY SPACE.
else.
  CONCATENATE 'M ' L_TXT into L_TXT SEPARATED BY SPACE.
endif.
    wa_cat-fieldname = wa_flname.

    wa_cat-seltext_s = L_TXT.

    wa_cat-outputlen = '10'.

    APPEND wa_cat TO fs_fldcat.

  g_sta_col = g_sta_col + 1.

  ENDDO.

      wa_cat-fieldname = 'TOTAL'.

    wa_cat-seltext_s = 'Total'.

    wa_cat-outputlen = '17'.

    APPEND wa_cat TO fs_fldcat.

    wa_cat-fieldname = 'DOCDT'.

    wa_cat-seltext_s = 'Doc. Date'.

    wa_cat-outputlen = '10'.

    APPEND wa_cat TO fs_fldcat.
ENDFORM.

Form. Show_Alv.
* Call ABAP List Viewer (ALV)
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = fs_fldcat
    TABLES
      t_outtab    = .

Endform.

FORM  Input_Analyst.

If P_ENTLU NE 'W' AND P_ENTLU NE 'M'.
  Message 'Invaild Date Type,only (Week or Month) are available currently' type 'S' DISPLAY LIKE 'E'.
  Stop.
endif.

    g_dc = P_ENTLU.
    CONDENSE g_dc NO-GAPS.

  CASE  G_DC.
        WHEN 'W'.
        G_DC = 'WEEK'.
        WHEN 'M'.
        G_DC = 'MONTH'.
ENDCASE.

G_count = p_to - p_frm.

IF G_count <= 0.
  Message 'Invaild Date planning period' type 'S' DISPLAY LIKE 'E'.
  Stop.
elseif G_DC EQ 'WEEK' and p_to > 52.
    Message 'Invaild Date planning period' type 'S' DISPLAY LIKE 'E'.
   stop.
elseif  G_DC EQ 'MONTH' and p_to > 12.
    Message 'Invaild Date planning period' type 'S' DISPLAY LIKE 'E'.
   stop.
elseif G_DC EQ 'WEEK' and G_Count > 51.
   Message 'Invaild Date planning period' type 'S' DISPLAY LIKE 'E'.
   stop.
elseif G_DC EQ 'MONTH' and G_Count > 11.
   Message 'Invaild Date planning period' type 'S' DISPLAY LIKE 'E'.
   stop.
endif.

g_sta_col = p_frm.
g_cols = g_count.
G_cols = G_cols + 1.

ENDFORM.

Form. Get_FC_DATA. "Get forecast data.
DATA: l_year(5) type c,
      v_index like sy-tabix,
      v_ENTLI like pbed-ENTLI.

if P_ENTLU EQ 'W'.
    v_entli = '2'.
   else.
    v_entli = '3'.
endif.

CONCATENATE p_year '%' into l_year.

SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_MD61
  FROM PBIM AS a
  INNER JOIN PBED as b
  ON a~BDZEI = b~BDZEI
  WHERE a~matnr in s_matnr
  AND b~PERXX like l_year
  AND B~ENTLI = v_entli
  and a~LOEVR NE 'X'.

"Get total requirement

  Loop at IT_MD61.
      read TABLE IT_TOTAL WITH KEY MATNR = IT_MD61-MATNR.
      if sy-subrc eq 0.
      v_index = sy-tabix.
      IT_TOTAL-PLNMG = IT_TOTAL-PLNMG + IT_MD61-PLNMG.
      modify it_total index v_index.
      else.
      it_total-matnr = it_md61-matnr.
      it_total-plnmg = it_md61-plnmg.
      it_total-LAEDA = it_md61-LAEDA.
      append it_total.
      ENDIF.
endloop.
ENDFORM.


FORM. GET_FC_HIS. "Get Forecast History

DATA: v_index like sy-tabix,
      l_index like sy-tabix,
      v_DATE  like sy-datum,
      V_WEEK  LIKE SCAL-WEEK.


SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_PBHI
  FROM PBIM AS a
  INNER JOIN PBHI as b
  ON a~bdzei = b~bdzei
  FOR ALL ENTRIES IN it_total
  where a~MATNR = it_total-matnr
  and a~LOEVR NE 'X'
  And B~DBMNG > 0
  and B~plnmg NE b~DBMNG.


Loop at IT_PBHI.
     l_index = sy-tabix.

  read TABLE it_hi_total WITH KEY MATNR = IT_PBHI-MATNR.
      if sy-subrc eq 0.
      v_index = sy-tabix.
      it_hi_total-PLNMG = it_hi_total-PLNMG + IT_PBHI-PLNMG.
      modify it_hi_total index v_index.
      else.
      it_hi_total-matnr = IT_PBHI-matnr.
      it_hi_total-plnmg = IT_PBHI-plnmg.
      it_hi_total-LAEDA = IT_PBHI-LAEDA.
      append it_hi_total.
      ENDIF.

V_date = IT_PBHI-PDATU.
CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
EXPORTING
   DATE          = V_date
IMPORTING
   WEEK          = V_WEEK
*   MONDAY        =
*   SUNDAY        =
          .
if sy-subrc eq 0.
  it_pbhi-PERXX = v_week.
  modify it_pbhi index l_index.
ENDIF.
ENDLOOP.
*DELETE ADJACENT DUPLICATES FROM it_pbhi COMPARING  MATNR PERXX PDATU  LAEDA AENAM.

ENDFORM.


Form. Dny_Field_FC_HIS_Update USING V_MATNR.
  DATA: fieldname(20) TYPE c.
  DATA: fieldvalue(10) TYPE c.
  DATA: index(3) TYPE c.
  DATA: L_WK(2) TYPE C.
  DATA: L_Period(6) TYPE C.
"Setup the field value

    ASSIGN t_newtable->* TO .
* Create dynamic work area and assign to FS
  CREATE DATA t_newline LIKE LINE OF .
  ASSIGN t_newline->* TO .

g_sta_col = p_frm.

Loop at it_hi_total where matnr = v_matnr.
  ASSIGN COMPONENT  'MATNR'
        OF STRUCTURE TO .
    =  it_hi_total-matnr.

  ASSIGN COMPONENT  'REMARK'
        OF STRUCTURE TO .
    =  'History'.

     ASSIGN COMPONENT  'TOTAL'
        OF STRUCTURE TO .
       =  it_hi_total-plnmg.

     ASSIGN COMPONENT  'DOCDT'
        OF STRUCTURE TO .
    = it_hi_total-LAEDA.

G_Cols = p_frm.
g_sta_col = G_Cols.

While G_Cols < p_To.
  clear fieldvalue.

  CONCATENATE p_year g_sta_col into l_period.
    MOVE g_sta_col TO wa_colno.
    CONCATENATE G_DC wa_colno INTO wa_flname.
* Set up fieldvalue


read TABLE it_PBHI with key matnr = it_hi_total-matnr PERXX  = l_period.
if sy-subrc eq 0.
      fieldvalue = it_PBHI-PLNMG.
      else.
      fieldvalue = ''.
    endif.
   g_sta_col = g_sta_col + 1.
   G_Cols = G_Cols + 1.

   ASSIGN COMPONENT  wa_flname
     OF STRUCTURE TO .
    =  fieldvalue.


ENDWHILE.
    append to .
    clear .
endloop.

**************************************************

*      INSERT   INTO TABLE .
*    append to .


ENDFORM.


Form. Extract_MRP_DATA using v_matnr.

DATA:
      l_index like sy-tabix,
      v_DATE  like sy-datum,
      V_WEEK  LIKE SCAL-WEEK.


CLEAR: MDKP, MDTB.

SELECT * FROM MDKP WHERE DTART EQ 'MD'
                     AND MATNR EQ v_MATNR
                     AND PLWRK EQ p_werks.

*    WRITE:/ MDKP-MATNR, MDKP-PLWRK.
    IF MDKP-CFLAG EQ 'X'.
       CLEAR MDTBX. REFRESH MDTBX.
       IMPORT MDTBX FROM DATABASE MDTC(AR) ID MDKP-DTNUM.
       LOOP AT MDTBX.
         L_index = sy-tabix.
         MOVE MDTBX TO MDTB.

         SELECT SINGLE * FROM T457T WHERE SPRAS = 'E'
                                      AND DELKZ = MDTB-DELKZ.

         IF MDTB-PLUMI = '-'. MULTIPLY MDTB-MNG01 BY -1. ENDIF.

V_date = MDTBX-DAT00.
CALL FUNCTION 'GET_WEEK_INFO_BASED_ON_DATE'
EXPORTING
   DATE          = V_date
IMPORTING
   WEEK          = V_WEEK
*   MONDAY        =
*   SUNDAY        =
          .
if sy-subrc eq 0.
   MDTBX-PERXX = v_week.
   MDTBX-MATNR = v_matnr.
  modify MDTBX index l_index.

ENDIF.

*         WRITE:/ MDTB-DAT00, T457T-DELB1, MDTB-VSTAT,
*                                          MDTB-MNG01, MDTB-LGORT.
       ENDLOOP.
    ELSE.
       SELECT * FROM MDTB
                     WHERE DTNUM EQ MDKP-DTNUM
                     ORDER BY PRIMARY KEY.
         SELECT SINGLE * FROM T457T WHERE SPRAS = 'E'
                                      AND DELKZ = MDTB-DELKZ.

         IF MDTB-PLUMI = '-'. MULTIPLY MDTB-MNG01 BY -1. ENDIF.

*         WRITE:/ MDTB-DAT00, T457T-DELB1, MDTB-VSTAT,
*                                          MDTB-MNG01, MDTB-LGORT.
       ENDSELECT.
    ENDIF.
ENDSELECT.

ENDFORM.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16794144/viewspace-700140/,如需轉載,請註明出處,否則將追究法律責任。

相關文章