动态ALV报表

REPORT  ZTESTIAN.

    TYPE-POOLSslis.

TABLESPBED"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 :<t_dyntable>  TYPE  STANDARD  TABLE  ,    "??? Dynamic internal table name
            <fs_dyntable>  type  any  ,                     " Field symbol to create work area
            <fs_fldval>  type  any ,               " Field symbol to assign values
            <l_field>  type  any .

DATA :        G_cols  TYPE  ,                    " 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  '1000' .
    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 <t_dyntable> .
* Create dynamic work area and assign to FS
    CREATE  DATA t_newline  LIKE  LINE  OF <t_dyntable> .
    ASSIGN t_newline ->TO <fs_dyntable> .

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 <t_dyntable> .
* Create dynamic work area and assign to FS
    CREATE  DATA t_newline  LIKE  LINE  OF <t_dyntable> .
    ASSIGN t_newline ->TO <l_field> .

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 <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  =   it_total -matnr .

    ASSIGN  COMPONENT    'REMARK'
        OF  STRUCTURE <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  =    'Current' .

     ASSIGN  COMPONENT    'TOTAL'
        OF  STRUCTURE <fs_dyntable>  TO <fs_fldval> .
   <fs_fldval>  =   it_total -plnmg .

     ASSIGN  COMPONENT    'DOCDT'
        OF  STRUCTURE <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  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 <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  =   fieldvalue .

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


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

*    INSERT <fs_dyntable>   INTO TABLE <t_dyntable>.
* append <fs_dyntable> to <t_dyntable>.


ENDFORM .

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

    APPEND <fs_dyntable>  TO <t_dyntable> .

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  <t_dyntable> .

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 <t_dyntable> .
* Create dynamic work area and assign to FS
    CREATE  DATA t_newline  LIKE  LINE  OF <t_dyntable> .
    ASSIGN t_newline ->TO <l_field> .

g_sta_col  p_frm .

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

    ASSIGN  COMPONENT    'REMARK'
        OF  STRUCTURE <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  =    'History' .

     ASSIGN  COMPONENT    'TOTAL'
        OF  STRUCTURE <fs_dyntable>  TO <fs_fldval> .
   <fs_fldval>  =   it_hi_total -plnmg .

     ASSIGN  COMPONENT    'DOCDT'
        OF  STRUCTURE <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  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 <fs_dyntable>  TO <fs_fldval> .
<fs_fldval>  =   fieldvalue .


ENDWHILE .
append <fs_dyntable>  to <t_dyntable> .
clear <fs_dyntable>  .
endloop .

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

*    INSERT <fs_dyntable>   INTO TABLE <t_dyntable>.
* append <fs_dyntable> to <t_dyntable>.


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 .

你可能感兴趣的:(动态ALV报表)