动态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(5TYPE C,                   " Date format
         g_count TYPE I,                   "Period Value Count
         G_sta_col(2TYPE N.                "Start Column



DATAt_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(2TYPE n,
       wa_flname(10TYPE 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
DATAEND OF   IT_MD61.


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


DATABEGIN OF IT_TOTAL OCCURS 0"Totoal requirement
                     MATNR LIKE PBIM-MATNR,   "Material
                     PLNMG LIKE PBED-PLNMG,   "Total
                     LAEDA LIKE PBED-LAEDA.   "Doc date
DATAEND OF IT_TOTAL.


DATABEGIN OF IT_HI_TOTAL OCCURS 0"Totoal requirement
                     MATNR LIKE PBIM-MATNR,   "Material
                     PLNMG LIKE PBED-PLNMG,   "Total
                     LAEDA LIKE PBED-LAEDA.   "Doc date
DATAEND OF IT_HI_TOTAL.

DATABEGIN OF MDTBX OCCURS 0.
       INCLUDE STRUCTURE MDTB.
DATAMATNR LIKE MARC-MATNR.
DATAPERXX LIKE PBED-PERXX.
DATAEND OF MDTBX.


DATABEGIN OF IT_MDTB OCCURS 0.
       INCLUDE STRUCTURE MDTB.
DATA:       DELB1 LIKE T457T-DELB1.
DATAEND OF IT_MDTB.


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


SELECTION-SCREEN   BEGIN OF BLOCK rpt1 with frame title text-t01.
   PARAMETERSP_werks   like MARC-WERKS OBLIGATORY DEFAULT '1000'.
   SELECT-OPTIONSs_MATNR FOR PBIM-MATNR"OBLIGATORY.
   PARAMETERSp_year LIKE bkpf-gjahr DEFAULT sy-datum+0(4OBLIGATORY.
   PARAMETERSp_entlu   LIKE PBED-ENTLI OBLIGATORY DEFAULT 'W',
             p_Frm(2TYPE N OBLIGATORY,
             P_TO(2)   TYPE N OBLIGATORY.

   SELECTION-SCREEN skip.

   PARAMETERSP_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
   DATAfieldname(20TYPE c.
   DATAfieldvalue(10TYPE c.
   DATAindex(3TYPE c.
   DATAL_WK(2TYPE C.
   DATAL_Period(6TYPE 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>.

DATAwa_cat LIKE LINE OF fs_fldcat,
   L_TXT(20TYPE 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.
DATAl_year(5type 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

DATAv_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.
   DATAfieldname(20TYPE c.
   DATAfieldvalue(10TYPE c.
   DATAindex(3TYPE c.
   DATAL_WK(2TYPE C.
   DATAL_Period(6TYPE 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.


CLEARMDKPMDTB.

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 MDTBXREFRESH MDTBX.
   IMPORT MDTBX FROM DATABASE MDTC(ARID 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 -1ENDIF.

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 -1ENDIF.

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

ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值