SAP MM 庫存初始化和批量擴充物料倉位
阿新 • • 發佈:2019-01-09
庫存初始化和批量擴充物料倉位 這兩個功能合在一個程式裡。
SAP剛上線時這兩功能很管用。
*&---------------------------------------------------------------------*
*& Report ZR_KTK_MM_0017
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZR_KTK_MM_0017.
TABLES: MKPF,RM07M,MSEG,T100,RM03M.
DATA: BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
* messages of call transaction
DATA: MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
DATA: E_GROUP_OPENED,
E_KEEP(1) TYPE C,
SMALLLOG(1) TYPE C.
DATA: BEGIN OF RECORD OCCURS
BLDAT LIKE MKPF-BLDAT, "建立日期
BUDAT LIKE MKPF-BUDAT, "過賬日期
SOBKZ LIKE RM07M-SOBKZ, "特殊庫存
WERKS LIKE RM07M-WERKS, "工廠
LGORT LIKE MSEG-LGORT, "倉碼
MATNR LIKE MSEG-MATNR, "料號
* ERFMG LIKE MSEG-ERFMG, "數量
ERFMG(13) type c, "數量
ERFME LIKE MSEG-ERFME, "單位
END OF RECORD.
DATA: BEGIN OF RECORD1 OCCURS 0,
MATNR LIKE RM03M-MATNR, "料號
WERKS LIKE RM03M-WERKS, "工廠
LGORT LIKE RM03M-LGORT, "倉碼
END OF RECORD1.
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME.
****** N > A
PARAMETERS CTUMODE LIKE CTU_PARAMS-DISMODE DEFAULT 'N' NO-DISPLAY.
* PARAMETERS CTUMODE LIKE CTU_PARAMS-DISMODE DEFAULT 'P'.
PARAMETERS CUPDATE LIKE CTU_PARAMS-UPDMODE DEFAULT 'L' NO-DISPLAY.
PARAMETERS E_GROUP(12) NO-DISPLAY. "group name of error-session
PARAMETERS: E_USER(12) DEFAULT SY-UNAME NO-DISPLAY. "user for error-session
* PARAMETERS: E_KEEP AS CHECKBOX. "' ' = delete session if finished
"'X' = keep session if finished
PARAMETERS: E_HDATE LIKE SY-DATUM NO-DISPLAY.
*SELECTION-SCREEN SKIP.
PARAMETERS: NODATA DEFAULT ' ' LOWER CASE NO-DISPLAY. "nodata
* PARAMETERS: SMALLLOG AS CHECKBOX. "' ' = log all transactions
"'X' = no transaction logging
PARAMETERS: p_qty RADIOBUTTON GROUP g1.
PARAMETERS: p_mat RADIOBUTTON GROUP g1.
PARAMETERS: FILENAME(132) LOWER CASE DEFAULT
'C:\data.xls'.
SELECTION-SCREEN END OF BLOCK BLOCK1.
*&------------------------------------------------------------------*
*& AT SELECTION-SCREEN ON VALUE-REQUEST FOR
*&------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILENAME .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = 'c:\test.xls' "default selected file
DEF_PATH = 'c:' "Default path
* MASK = ',*.txt,*.txt.'
MASK = ',*.xls,*.xls.'
MODE = '0'
TITLE = 'Select a file to open'
IMPORTING
FILENAME = FILENAME
* RC =
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
*&------------------------------------------------------------------*
START-OF-SELECTION.
IF P_QTY = 'X'.
PERFORM INITIALIZE_QTY.
ELSE.
PERFORM INITIALIZE_MAT.
ENDIF.
PERFORM CLOSE_GROUP.
END-OF-SELECTION.
FORM INITIALIZE_QTY.
DATA: FILENAME1 LIKE RLGRAP-FILENAME.
FILENAME1 = FILENAME.
TYPE-POOLS:truxs.
DATA:l_raw_data TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
* I_LINE_HEADER =
i_tab_raw_data = l_raw_data
i_filename = filename1
TABLES
i_tab_converted_data = record
* EXCEPTIONS
* CONVERSION_FAILED = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE E398(00) WITH '資料在匯入內表時出錯!'.
ENDIF.
LOOP AT RECORD.
perform bdc_dynpro using 'SAPMM07M' '0400'.
perform bdc_field using 'BDC_CURSOR'
'RM07M-WERKS'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'MKPF-BLDAT'
RECORD-BLDAT.
perform bdc_field using 'MKPF-BUDAT'
RECORD-BUDAT.
perform bdc_field using 'RM07M-BWARTWA'
'561'.
perform bdc_field using 'RM07M-WERKS'
RECORD-WERKS.
perform bdc_field using 'XFULL'
'X'.
perform bdc_field using 'RM07M-WVERS2'
'X'.
perform bdc_dynpro using 'SAPMM07M' '0421'.
perform bdc_field using 'BDC_CURSOR'
'MSEG-LGORT(01)'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'MSEG-MATNR(01)'
RECORD-MATNR.
perform bdc_field using 'MSEG-ERFMG(01)'
RECORD-ERFMG.
perform bdc_field using 'MSEG-ERFME(01)'
RECORD-ERFME.
perform bdc_field using 'MSEG-LGORT(01)'
RECORD-LGORT.
perform bdc_field using 'MSEG-WERKS(01)'
RECORD-WERKS.
perform bdc_field using 'DKACB-FMORE'
'X'.
perform bdc_dynpro using 'SAPLKACB' '0002'.
perform bdc_field using 'BDC_OKCODE'
'=ENTE'.
perform bdc_dynpro using 'SAPLKACB' '0002'.
perform bdc_field using 'BDC_OKCODE'
'=ENTE'.
perform bdc_transaction using 'MB1C'.
ENDLOOP.
ENDFORM.
FORM INITIALIZE_MAT.
DATA: FILENAME1 LIKE RLGRAP-FILENAME.
FILENAME1 = FILENAME.
TYPE-POOLS:truxs.
DATA:l_raw_data TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
* I_LINE_HEADER =
i_tab_raw_data = l_raw_data
i_filename = filename1
TABLES
i_tab_converted_data = record1
* EXCEPTIONS
* CONVERSION_FAILED = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE E398(00) WITH '資料在匯入內表時出錯!'.
ENDIF.
LOOP AT RECORD1.
perform bdc_dynpro using 'SAPMM03M' '0105'.
perform bdc_field using 'BDC_CURSOR'
'RM03M-WERKS'.
perform bdc_field using 'BDC_OKCODE'
'/00'.
perform bdc_field using 'RM03M-MATNR'
RECORD1-MATNR.
perform bdc_field using 'RM03M-WERKS'
RECORD1-WERKS.
perform bdc_field using 'RM03M-LFLAG'
'X'.
perform bdc_dynpro using 'SAPMM03M' '0195'.
perform bdc_field using 'BDC_CURSOR'
'RM03M-LGORT(09)'.
perform bdc_field using 'BDC_OKCODE'
'=BU'.
perform bdc_field using 'RM03M-LGORT(09)'
RECORD1-LGORT.
perform bdc_transaction using 'MMSC'.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BDC_TRANSACTION
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Start new transaction according to parameters *
*----------------------------------------------------------------------*
FORM BDC_TRANSACTION USING TCODE.
DATA: L_MSTRING(480).
DATA: L_SUBRC LIKE SY-SUBRC.
* call transaction using
REFRESH MESSTAB.
CALL TRANSACTION TCODE USING BDCDATA
MODE CTUMODE
UPDATE CUPDATE
MESSAGES INTO MESSTAB.
L_SUBRC = SY-SUBRC.
IF SMALLLOG <> 'X'.
WRITE: / 'CALL_TRANSACTION',
TCODE,
'returncode:'(I05),
L_SUBRC,
'RECORD:',
SY-INDEX.
LOOP AT MESSTAB.
SELECT SINGLE * FROM T100 WHERE SPRSL = MESSTAB-MSGSPRA
AND ARBGB = MESSTAB-MSGID
AND MSGNR = MESSTAB-MSGNR.
IF SY-SUBRC = 0.
L_MSTRING = T100-TEXT.
IF L_MSTRING CS '&1'.
REPLACE '&1' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&2' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&3' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&4' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ELSE.
REPLACE '&' WITH MESSTAB-MSGV1 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV2 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV3 INTO L_MSTRING.
REPLACE '&' WITH MESSTAB-MSGV4 INTO L_MSTRING.
ENDIF.
CONDENSE L_MSTRING.
WRITE: / MESSTAB-MSGTYP, L_MSTRING(250).
ELSE.
WRITE: / MESSTAB.
ENDIF.
ENDLOOP.
SKIP.
ENDIF.
** Erzeugen fehlermappe ************************************************
IF L_SUBRC <> 0 AND E_GROUP <> SPACE.
IF E_GROUP_OPENED = ' '.
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING CLIENT = SY-MANDT
GROUP = E_GROUP
USER = E_USER
KEEP = E_KEEP
HOLDDATE = E_HDATE.
E_GROUP_OPENED = 'X'.
ENDIF.
CALL FUNCTION 'BDC_INSERT'
EXPORTING TCODE = TCODE
TABLES DYNPROTAB = BDCDATA.
ENDIF.
REFRESH BDCDATA.
endform. " BDC_TRANSACTION
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR BDCDATA.
BDCDATA-PROGRAM = PROGRAM.
BDCDATA-DYNPRO = DYNPRO.
BDCDATA-DYNBEGIN = 'X'.
APPEND BDCDATA.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
IF FVAL <> NODATA.
CLEAR BDCDATA.
BDCDATA-FNAM = FNAM.
BDCDATA-FVAL = FVAL.
APPEND BDCDATA.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CLOSE_GROUP
*&---------------------------------------------------------------------*
form CLOSE_GROUP.
IF E_GROUP_OPENED = 'X'.
CALL FUNCTION 'BDC_CLOSE_GROUP'.
WRITE: /.
WRITE: /(30) 'Fehlermappe wurde erzeugt'(I06).
ENDIF.
endform. " CLOSE_GROUP