采购需求计划报表
REPORT??Z_MM_PURCHASE_PLAN.
*定義要用到的數據庫表
tables:?aufk,?afpo,?resb,?mard,?mara,
??ekpo,?eket.?????????????????????????
*定義要用到的變量和內表
data:?begin?of?po_stru?occurs?1,
????????aufnr?like?aufk-aufnr,????"工單號
????????objnr?like?aufk-objnr,????"工單對象號
??????end?of?po_stru.
DATA:?LV_LINE?LIKE?BSVX-STTXT,????"工單狀態
??????mdezx?type?table?of?mdez,???"需求覽表
??????wa_mdezx?like?line?of?mdezx,
??????V_EISBE?LIKE?MARC-EISBE,????"安全庫存
??????V_EISLO?LIKE?MARC-EISLO,????"最少安全庫存
??????V_MNG01?LIKE?MDEZ-MNG01,????"總庫存
??????V_MNG02?LIKE?MDEZ-MNG01,????"開出的采購數量
??????V_MNG03?LIKE?MDEZ-MNG01,????"工單需求數量
??????V_MNG04?LIKE?MDEZ-MNG01,????"差異數量
??????V_FLAG?TYPE?I.??????????????"標記
*定義ALV
type-pools:?slis.
data:?????i_fieldcat_alv?type?slis_t_fieldcat_alv,
??????????i_fieldcat_alv1?type?slis_fieldcat_alv,
??????????i_layout?type?slis_layout_alv,?????"ALV的格式
??????????i_fieldcat?type?slis_fieldcat_alv,?"表單列信息
??????????w_repid?like?sy-repid.?????????????"程序名
DATA:?begin?of?I_DATA?OCCURS?0,???"ALV?輸出的內容
?????????matkl?like?mara-matkl,???"物料組
?????????wgbez?like?t023t-wgbez,??"物料組描述
?????????maktx?like?makt-maktx,???"物料描述
?????????matnr?like?mard-matnr,???"物料號
?????????werks?like?mard-werks,???"工廠
?????????meins?like?mara-meins,???"單位
?????????eisbe?like?marc-eisbe,???"安全庫存?
?????????eislo?like?marc-eislo,???"最少安全庫存??
?????????mng01?like?mdez-mng01,???"庫存總量
?????????mng02?like?mdez-mng01,???"開出的采購總量
?????????mng03?like?mdez-mng01,???"工單需求總量
?????????mng04?like?mdez-mng04,???"差異量
????????end?of?I_DATA.
DATA:?wa_itab?like?line?of?I_DATA.
*定義選擇屏幕
*定義選擇條件塊CHECK
SELECTION-SCREEN?BEGIN?OF?BLOCK?CHECK?WITH?FRAME?TITLE?TEXT-001.
parameters:?rad1?radiobutton?group?RAD,??????????????"工單模式運行
????????????rad2?radiobutton?group?RAD?default?'X',??"原材料模式運行
????????????rad3?radiobutton?group?RAD.??????????????"兩種方式同時運行
SELECTION-SCREEN?END?OF?BLOCK?CHECK.
*定義生產訂單選擇塊PRD*
SELECTION-SCREEN?BEGIN?OF?BLOCK?PRD?WITH?FRAME?TITLE?TEXT-002.
select-options:?so_aufnr?for?aufk-aufnr,???"工單號
????????????????so_erdat?for?aufk-erdat,???"工單日期
????????????????so_matnr?for?afpo-matnr,???"工單物料號
????????????????so_werks?for?afpo-dwerk.???"工廠
SELECTION-SCREEN?END?OF?BLOCK?PRD."
*定義原材料選擇塊RAW
SELECTION-SCREEN?BEGIN?OF?BLOCK?RAW?WITH?FRAME?TITLE?TEXT-003.
select-options:?p_matnr?for?resb-matnr,????"原材料號
????????????????p_werks?for?resb-werks,????"工廠
????????????????p_mtart?for?mara-mtart,????"物料類型
????????????????p_matkl?for?mara-matkl.????"物料##
SELECTION-SCREEN?END?OF?BLOCK?RAW.
parameters:?checkbox?as?checkbox.
*選擇屏幕事件
AT?SELECTION-SCREEN.
??IF?rad1?=?'X'.
????if?so_aufnr?and?so_erdat?and?so_matnr?and?so_werks?is?initial.
??????message?e000(/BEV1/NE)?with?'請在工單選擇屏幕輸入選擇條件'.
????endif.
????perform??get_data_from_order.
??ELSEif?rad2?=?'X'.
????if?p_matnr?and?p_werks?is?initial.
??????message?e000(/BEV1/NE)?with?'請輸入原材料號或工廠'.
????endif.
????perform?get_data_from_RAW.
??ELSE.
????if?p_matnr?and?p_werks?is?initial.
??????message?e000(/BEV1/NE)?with?'請輸入原材料號或工廠'.
????endif.
????if?so_aufnr?and?so_erdat?and?so_matnr?and?so_werks?is?initial.
??????message?e000(/BEV1/NE)?with?'請在工單選擇屏幕輸入選擇條件'.
????endif.
????perform?get_data_from_RAW.
????perform??get_data_from_order.
??ENDIF.
??read?table?I_DATA?index?1.
??if?sy-subrc?<>?0.
????message?e000(/BEV1/NE)?WITH?'沒有符合條件的數據'.
??endif.
start-of-selection.
??perform?get_data.??????"得到要輸出的數據
??perform?layout_build.??"定義輸出ALV的格式和屬性
??perform?fields.????????"定義ALV表單列信息
??perform?display_data.??"ALV?輸出數據
*&---------------------------------------------------------------------*
*&??????Form??get_data
*&---------------------------------------------------------------------*
*???????text?得到要輸出的數據
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?get_data?.
??DELETE?ADJACENT?DUPLICATES?FROM?I_DATA.
*取得MD04中的數據
??loop?at?I_DATA?into?wa_itab.
????if?wa_itab-matnr?<>?''?and?wa_itab-werks?<>?''.
??????CALL?FUNCTION?'MD_STOCK_REQUIREMENTS_LIST_API'
????????EXPORTING
*???PLSCN??????????????????????????=
??????????MATNR??????????????????????????=?wa_itab-matnr
??????????WERKS??????????????????????????=?wa_itab-werks
*???BERID??????????????????????????=
*???ERGBZ??????????????????????????=
*???AFIBZ??????????????????????????=
*???INPER??????????????????????????=
*???DISPLAY_LIST_MDPSX?????????????=
*???DISPLAY_LIST_MDEZX?????????????=
*???DISPLAY_LIST_MDSUX?????????????=
*???NOBUF??????????????????????????=
*?IMPORTING
*???E_MT61D????????????????????????=
*???E_MDKP?????????????????????????=
*???E_CM61M????????????????????????=
*???E_MDSTA????????????????????????=
???????TABLES
*???MDPSX??????????????????????????=
?????????MDEZX??????????????????????????=?mdezx
*???MDSUX??????????????????????????=
?EXCEPTIONS
???MATERIAL_PLANT_NOT_FOUND???????=?1
???PLANT_NOT_FOUND????????????????=?2
???OTHERS?????????????????????????=?3
????????????????.
??????IF?SY-SUBRC?<>?0.
????????message?i000(/BEV1/NE)
????????????with?wa_itab-matnr?'在工廠'?wa_itab-werks
????????????'的MRP參數被維護'.
????????delete?table?I_DATA?from?wa_itab.
????????continue.
*?MESSAGE?ID?SY-MSGID?TYPE?SY-MSGTY?NUMBER?SY-MSGNO
*?????????WITH?SY-MSGV1?SY-MSGV2?SY-MSGV3?SY-MSGV4.
??????ENDIF.
??????loop?at?mdezx?into?wa_mdezx
???????????where?DELB0?=?'Stock'?or?DELB0?=?'PO項目'
???????????or?DELB0?=?'OrdRes'?or?DELB0?=?'SchLne'.
????????CASE?WA_MDEZX-DELB0.
??????????WHEN?'Stock'.
????????????V_MNG01?=?V_MNG01?+?WA_MDEZX-MNG01.
??????????WHEN?'PO項目'.
????????????V_MNG02?=?V_MNG02?+?WA_MDEZX-MNG01.
??????????WHEN?'SchLne'.
????????????V_MNG02?=?V_MNG02?+?WA_MDEZX-MNG01.
??????????WHEN?'OrdRes'.
????????????V_MNG03?=?V_MNG03?+?WA_MDEZX-MNG01.
????????ENDCASE.
??????ENDLOOP.
*計算各種需求
??????wa_itab-MNG01?=?V_MNG01.
??????wa_itab-MNG02?=?V_MNG02.
??????wa_itab-MNG03?=?V_MNG03.
??????wa_itab-MNG04?=?V_MNG01?+?V_MNG02?+?V_MNG03?-?WA_ITAB-eisbe.
??????if?wa_itab-mng01?is?initial
???????and?wa_itab-mng02?is?initial
???????and?wa_itab-mng03?is?initial.
?????delete?table?I_DATA?from?wa_itab.
?????else.
??????CLEAR:?V_MNG01,?V_MNG02,?V_MNG03.
??????modify?I_DATA?from?wa_itab.
??????endif.
????else.
??????delete?table?I_DATA?from?wa_itab.
????endif.
??endloop.
??sort?I_DATA?by?matnr.
??DELETE?ADJACENT?DUPLICATES?FROM?I_DATA.
??if?checkbox?=?'X'.
????LOOP?AT?I_DATA?WHERE?MNG04?>=?0.
????DELETE?TABLE?I_DATA.
????ENDLOOP.
??endif.
??loop?at?i_data.
????select?single?matkl?meins?from?mara
????into?(I_DATA-matkl,?I_DATA-meins)
??????where?matnr?=?I_DATA-matnr.
????select?single?maktx?from?makt?into?I_DATA-maktx
??????where?matnr?=?I_DATA-matnr.
????select?single?WGBEZ?from?T023T?into?I_DATA-WGBEZ
??????where?matkl?=?I_DATA-matkl.
????select?single?eisbe?eislo?from?marc??????????"加入安全庫存,?最少安全庫存
????into?(i_data-eisbe,?i_data-eislo)
??????where?matnr?=?I_DATA-matnr?and?werks?=?I_DATA-werks.
*?計算已訂未到數量?2008-12-11
????perform?cal_outs?using?i_data-werks?i_data-matnr?i_data-mng02.
*
????i_data-mng04?=?i_data-mng01?+?i_data-mng02?+?i_data-mng03?-
????i_data-eisbe.
????modify?I_DATA.
??endloop.
ENDFORM.????????????????????"?get_data
*?計算已訂未到數量?2008-12-11
form?cal_outs?using?p_werks?p_matnr?p_mng02.
data:?l_menge?like?eket-menge,?l_wemng?like?eket-wemng.
select?sum(?eket~menge?)?sum(?eket~wemng?)
??into??(l_menge,?l_wemng)
??from?ekpo
??join?eket
??on?ekpo~ebeln?=?eket~ebeln?and?ekpo~ebelp?=?eket~ebelp
??where?ekpo~werks?=?p_werks?and?ekpo~matnr?=?p_matnr
??group?by?ekpo~matnr.
????p_mng02?=?l_menge?-?l_wemng.
endselect.
endform.
*&---------------------------------------------------------------------*
*&??????Form??get_data_from_order
*&---------------------------------------------------------------------*
*???????text?從工單中得到原材料號
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?get_data_from_order?.
??select?A~aufnr?A~objnr?from?aufk?as?A?join?afpo?AS?B
???????????on?A~aufnr?=?B~aufnr
???????????into?table?po_stru
???????????where?A~aufnr?in?so_aufnr
?????????????and?A~erdat?in?so_erdat
?????????????and?B~dwerk?in?so_werks
?????????????and?B~matnr?in?so_matnr.
??loop?at?po_stru.
????CALL?FUNCTION?'STATUS_TEXT_EDIT'
??????EXPORTING
*????CLIENT??????????????????=?SY-MANDT
*????FLG_USER_STAT???????????=?'?'
????????OBJNR???????????????????=?po_stru-objnr
????????ONLY_ACTIVE?????????????=?'X'
????????SPRAS???????????????????=?'1'
*????BYPASS_BUFFER???????????=?'?'
??????IMPORTING
*????ANW_STAT_EXISTING???????=
*????E_STSMA?????????????????=
????????LINE????????????????????=?lv_line
*????USER_LINE???????????????=
*????STONR???????????????????=
?????EXCEPTIONS
???????OBJECT_NOT_FOUND????????=?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.
*篩選工單(去掉完成的和刪除的)
????IF?LV_LINE?CS?'TECO'?OR?LV_LINE?CS?'DLT'.
??????DELETE?PO_STRU.
????ENDIF.
??ENDLOOP.
??read?table?po_stru?index?1.
??if?sy-subrc?=?0.
????select?matnr?werks?from?resb
??????appending?corresponding?fields?of?table?I_DATA
??????????????????for?all?entries?in?po_stru
??????????????????where?aufnr?=?po_stru-aufnr.
??endif.
ENDFORM.????????????????????"?get_data_from_order
*&---------------------------------------------------------------------*
*&??????Form??get_data_from_RAW
*&---------------------------------------------------------------------*
*???????text?從原材料條件選取數據
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?get_data_from_RAW?.
??select?A~matnr?A~werks?A~eisbe?A~eislo?from?marc?as?A?join
??????mara?as?B?on?A~matnr?=?B~matnr
??????into?corresponding?fields?of?table?I_DATA
???????????????????where?A~matnr?in?p_matnr
?????????????????????and?A~werks?in?p_werks
?????????????????????and?B~mtart?in?p_mtart
?????????????????????and?B~matkl?in?p_matkl.
ENDFORM.????????????????????"?get_data_from_RAW
*&---------------------------------------------------------------------*
*&??????Form??layout_build
*&---------------------------------------------------------------------*
*???????text?定義輸出ALV的格式和屬性
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?layout_build?.
??i_layout-zebra?=?'X'.
??i_layout-detail_popup?=?'X'.
??w_repid?=?sy-repid.
*??i_layout-f2code?=?'&ETA'.
??i_layout-no_vline?????????????=?'X'.
*??i_layout-colwidth_optimize????=?'X'.
*??i_layout-detail_initial_lines?=?'X'.
*??i_layout-detail_titlebar??????=?'詳細內容'.
ENDFORM.????????????????????"?layout_build
*&---------------------------------------------------------------------*
*&??????Form??fields
*&---------------------------------------------------------------------*
*???????text??定義ALV表單列信息
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?fields?.
??CALL?FUNCTION?'REUSE_ALV_FIELDCATALOG_MERGE'
????EXPORTING
??????I_PROGRAM_NAME???????????????=?w_repid
??????I_INTERNAL_TABNAME???????????=?'I_DATA'
*???I_STRUCTURE_NAME?????????????=
*???I_CLIENT_NEVER_DISPLAY???????=?'X'
??????I_INCLNAME???????????????????=?w_repid
*???I_BYPASSING_BUFFER???????????=
*???I_BUFFER_ACTIVE??????????????=
????CHANGING
??????CT_FIELDCAT??????????????????=?i_fieldcat_alv
???EXCEPTIONS
?????INCONSISTENT_INTERFACE???????=?1
?????PROGRAM_ERROR????????????????=?2
?????OTHERS???????????????????????=?3
????????????.
??IF?SY-SUBRC?<>?0.
????MESSAGE?ID?SY-MSGID?TYPE?SY-MSGTY?NUMBER?SY-MSGNO
????????????WITH?SY-MSGV1?SY-MSGV2?SY-MSGV3?SY-MSGV4.
??ENDIF.
*?ALV?Title
??loop?at?i_fieldcat_alv?into?i_fieldcat_alv1.
????case?i_fieldcat_alv1-fieldname.
??????when?'EISBE'.
????????i_fieldcat_alv1-seltext_l?=?'安全庫存'.
????????i_fieldcat_alv1-seltext_m?=?'安全庫存'.
????????i_fieldcat_alv1-seltext_s?=?'安全庫存'.
????????I_FIELDCAT_ALV1-REPTEXT_DDIC?=?'安全庫存'.
??????when?'EISLO'.
????????i_fieldcat_alv1-seltext_l?=?'最少安全庫存'.
????????i_fieldcat_alv1-seltext_m?=?'最少安全庫存'.
????????i_fieldcat_alv1-seltext_s?=?'最少安全庫存'.
????????I_FIELDCAT_ALV1-REPTEXT_DDIC?=?'最少安全庫存'.
??????when?'MNG01'.
????????i_fieldcat_alv1-seltext_l?=?'可用庫存'.
????????i_fieldcat_alv1-seltext_m?=?'可用庫存'.
????????i_fieldcat_alv1-seltext_s?=?'可用庫存'.
????????I_FIELDCAT_ALV1-REPTEXT_DDIC?=?'可用庫存'.
??????when?'MNG02'.
????????i_fieldcat_alv1-seltext_l?=?'已開采購量'.
????????i_fieldcat_alv1-seltext_m?=?'已開采購量'.
????????i_fieldcat_alv1-seltext_s?=?'已開采購量'.
????????I_FIELDCAT_ALV1-REPTEXT_DDIC?=?'已開采購量'.
??????when?'MNG03'.
????????i_fieldcat_alv1-seltext_l?=?'工單需求量'.
????????i_fieldcat_alv1-seltext_m?=?'工單需求量'.
????????i_fieldcat_alv1-seltext_s?=?'工單需求量'.
????????I_FIELDCAT_ALV1-REPTEXT_DDIC?=?'工單需求量'.
??????when?'MNG04'.
????????i_fieldcat_alv1-seltext_l?=?'差異量'.
????????i_fieldcat_alv1-seltext_m?=?'差異量'.
????????i_fieldcat_alv1-seltext_s?=?'差異量'.
????????I_FIELDCAT_ALV1-REPTEXT_DDIC?=?'差異量'.
????endcase.
????modify?i_fieldcat_alv?from?i_fieldcat_alv1.
??endloop.
ENDFORM.????????????????????"?fields
*&---------------------------------------------------------------------*
*&??????Form??display_data
*&---------------------------------------------------------------------*
*???????text???ALV?輸出數據
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?display_data?.
??CALL?FUNCTION?'REUSE_ALV_GRID_DISPLAY'
???EXPORTING
*???I_INTERFACE_CHECK?????????????????=?'?'
*???I_BYPASSING_BUFFER????????????????=?'?'
*???I_BUFFER_ACTIVE???????????????????=?'?'
??????I_CALLBACK_PROGRAM????????????????=?w_repid
*???I_CALLBACK_PF_STATUS_SET??????????=?'?'
????I_CALLBACK_USER_COMMAND???????????=?'USER_COMMAND'
*???I_CALLBACK_TOP_OF_PAGE????????????=?'?'
*???I_CALLBACK_HTML_TOP_OF_PAGE???????=?'?'
*???I_CALLBACK_HTML_END_OF_LIST???????=?'?'
*???I_STRUCTURE_NAME??????????????????=?'ZMARD_A'
*???I_BACKGROUND_ID???????????????????=?'?'
*???I_GRID_TITLE??????????????????????=
*???I_GRID_SETTINGS???????????????????=
??????IS_LAYOUT?????????????????????????=?i_layout
??????IT_FIELDCAT???????????????????????=?i_fieldcat_alv[]
*???IT_EXCLUDING??????????????????????=
*???IT_SPECIAL_GROUPS?????????????????=
*???IT_SORT???????????????????????????=
*???IT_FILTER?????????????????????????=
*???IS_SEL_HIDE???????????????????????=
*???I_DEFAULT?????????????????????????=?'X'
??????I_SAVE????????????????????????????=?'A'
*???IS_VARIANT????????????????????????=?w_variant
*???IT_EVENTS?????????????????????????=
*???IT_EVENT_EXIT?????????????????????=
*???IS_PRINT??????????????????????????=
*???IS_REPREP_ID??????????????????????=
*???I_SCREEN_START_COLUMN?????????????=?0
*???I_SCREEN_START_LINE???????????????=?0
*???I_SCREEN_END_COLUMN???????????????=?0
*???I_SCREEN_END_LINE?????????????????=?0
*???I_HTML_HEIGHT_TOP?????????????????=?0
*???I_HTML_HEIGHT_END?????????????????=?0
*???IT_ALV_GRAPHICS???????????????????=
*???IT_HYPERLINK??????????????????????=
*???IT_ADD_FIELDCAT???????????????????=
*???IT_EXCEPT_QINFO???????????????????=
*???IR_SALV_FULLSCREEN_ADAPTER????????=
*?IMPORTING
*???E_EXIT_CAUSED_BY_CALLER???????????=
*???ES_EXIT_CAUSED_BY_USER????????????=
????TABLES
??????T_OUTTAB??????????????????????????=?I_DATA
???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.????????????????????"?display_data
FORM?USER_COMMAND?USING?UCOMM?LIKE?SY-UCOMM
SELFIELD?TYPE?SLIS_SELFIELD.
READ?TABLE?I_DATA?INDEX?SELFIELD-TABINDEX.
CHECK?SY-SUBRC?=?0.
CASE?UCOMM.
WHEN?'&IC1'.
CASE?SELFIELD-SEL_TAB_FIELD.
WHEN??'I_DATA-MATNR'.
SET?PARAMETER?ID?'MAT'?FIELD?I_DATA-MATNR.
SET?PARAMETER?ID?'WRK'?FIELD?I_DATA-WERKS.
CALL?TRANSACTION?'MD04'?AND?SKIP?FIRST?SCREEN.
ENDCASE.
ENDCASE.
ENDFORM.
總結
- 上一篇: 关于SmartForm和ScriptFo
- 下一篇: 订单状态一览