2.1程序说明
-
- 计划订单导入前需要将选择物料期间内的计划订单清除。
- 生产计划以计划订单的形式导入系统。
- 计划订单类型为LA。
- 计划开始日期写入订单开始日期,计划完成日期写入订单完成日期。
- 当数据中有销售订单时,在分配栏中的科目分配类别选择M。
- 版本号写入生产版本。
- 工作中心写入详细计划栏中,当工作中心为1001001时,批量更新工作中心为1001开头的工序(根据工作中心前四位的编码)
- 需要在计划订单中增强一个文本字段(100个字符),备注写入此增强字段中。
举例:如果工序0010,0020,0030的工作中心是1001002,工序0040的工作中心是1002001,现在导入文件中的工作中心是1001001,那更新0010,0020,0030的工序中的工作中心。
程序实现
2.2.1 选择下载模板,则下载模板
"---下载模板
WHEN P_DOWN.
PERFORM SUB_DOWNLOAD_TEMPLATE.
2.2.2"导出模板的名称
DATA:TEMPFILE TYPE STRING.
CONCATENATE '计划工单' '_' SY-DATUM+6(2) '_' SY-DATUM+4(2) '_' SY-DATUM(4) '_' SY-UZEIT '.xls' INTO TEMPFILE.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = TEMPFILE
DEF_PATH = G_FILE
MASK = ',*.xls,*.*.'
MODE = '0'
TITLE = 'Save path'
IMPORTING
FILENAME = G_FILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 08
SELECTION_CANCEL = 12
SELECTION_ERROR = 16.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
2.2.3"调用OLE,将模板导出导Excel
IF G_FILE IS NOT INITIAL.
* start Excel
IF H_EXCEL-HEADER = SPACE OR H_EXCEL-HANDLE = -1.
CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
ENDIF.
*--- get list of workbooks, initially empty
CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
SET PROPERTY OF H_EXCEL 'Visible' = 0.
CALL METHOD OF H_MAPL 'Add' = H_MAP.
PERFORM SET_FIRST_SHEET.
LINE = 1.
L_RC = 0.
ROW = 19.
PERFORM FILL_RANGE USING LINE 1 '工厂'.
PERFORM FILL_RANGE USING LINE 2 '销售订单号'.
PERFORM FILL_RANGE USING LINE 3 '行项目'.
PERFORM FILL_RANGE USING LINE 4 '客户名称'.
PERFORM FILL_RANGE USING LINE 5 '物料编号'.
PERFORM FILL_RANGE USING LINE 6 '物料描述'.
PERFORM FILL_RANGE USING LINE 7 ''.
PERFORM FILL_RANGE USING LINE 8 ''.
PERFORM FILL_RANGE USING LINE 9 '订单数量'.
PERFORM FILL_RANGE USING LINE 10 '销售订单交期'.
PERFORM FILL_RANGE USING LINE 11 '计划开始日期'.
PERFORM FILL_RANGE USING LINE 12 '计划完成日期'.
PERFORM FILL_RANGE USING LINE 13 '工作中心'.
PERFORM FILL_RANGE USING LINE 14 '版本号'.
PERFORM FILL_RANGE USING LINE 15 '备注'.
PERFORM FILL_RANGE USING LINE 16 '计划生产数'.
LINE = LINE + 1.
PERFORM FILL_RANGE USING LINE 10 'YYYYMMDD'.
PERFORM FRM_COLFORMART USING 1.
PERFORM FRM_COLFORMART USING 2.
PERFORM FRM_COLFORMART USING 3.
PERFORM FRM_COLFORMART USING 5.
PERFORM FRM_COLFORMART USING 11.
PERFORM FRM_COLFORMART USING 12.
PERFORM FRM_COLFORMART USING 13.
PERFORM FRM_COLFORMART USING 14.
CALL METHOD OF H_MAP 'SAVEAS'
EXPORTING
#1 = G_FILE.
CALL METHOD OF H_EXCEL 'QUIT'.
FREE OBJECT: COLUMNS,
H_MAPL,
H_MAP,
H_EXCEL.
MESSAGE '模板下载完成' TYPE 'S'.
2.2.4 "如果选择查询信息,则根据选择条件获取查询信息
WHEN P_QUERY OR P_DELE.
PERFORM SUB_GET_DATA TABLES G_IT_UPLOAD_DATA[].
PERFORM SUB_DISPLAY_ALV TABLES G_IT_UPLOAD_DATA[] .
2.2.5"获取LA及KD的计划订单
SELECT *
INTO CORRESPONDING FIELDS OF TABLE L_IT_UPLOAD_DATA
FROM PLAF
WHERE PWWRK = P_WERKS
AND MATNR IN S_MATNR
AND PSTTR IN S_ERDAT
AND AUFFX IN S_AUFFX
AND PAART IN ('LA','KD').
2.2.6"处理唯一物料号
LOOP AT L_IT_UPLOAD_DATA ASSIGNING <F_UPLOAD_DATA>.
L_IT_MATNR-MATNR = <F_UPLOAD_DATA>-MATNR.
COLLECT L_IT_MATNR.
ENDLOOP.
SORT L_IT_MATNR BY MATNR.
2.2.7--取物料名称
SELECT MATNR MAKTX
INTO CORRESPONDING FIELDS OF TABLE L_IT_MAKT
FROM MAKT
FOR ALL ENTRIES IN L_IT_MATNR
WHERE SPRAS = SY-LANGU
AND MATNR = L_IT_MATNR-MATNR.
SORT L_IT_MAKT BY MATNR.
SORT L_IT_MARA BY MATNR.
2.2.8"获取物料描述
SELECT MATNR MTART
INTO CORRESPONDING FIELDS OF TABLE WA_MTAR
FROM MARA
FOR ALL ENTRIES IN L_IT_MATNR
WHERE MATNR = L_IT_MATNR-MATNR.
SORT WA_MTAR BY MATNR.
2.2.9"获取MRP数据
SELECT
WERKS
MATNR
EKGRP
PLIFZ
DZEIT
SHZET
FEVOR AS PLGRP
DISPO
SBDKZ
INTO CORRESPONDING FIELDS OF TABLE L_IT_MARC
FROM MARC
FOR ALL ENTRIES IN L_IT_UPLOAD_DATA
WHERE WERKS = L_IT_UPLOAD_DATA-PLWRK
AND MATNR = L_IT_UPLOAD_DATA-MATNR
AND DISPO IN S_DISPO.
SORT L_IT_MARC BY MATNR WERKS.
2.2.10"整理数据以输出
LOOP AT L_IT_UPLOAD_DATA ASSIGNING <F_UPLOAD_DATA> .
L_TBIX = SY-TABIX.
<F_UPLOAD_DATA>-LIGHT = C_YELLOW_LIGHT.
"---取物料描述
READ TABLE L_IT_MAKT WITH KEY MATNR = <F_UPLOAD_DATA>-MATNR
BINARY SEARCH.
IF SY-SUBRC = 0.
<F_UPLOAD_DATA>-MAKTX = L_IT_MAKT-MAKTX.
ELSE.
"--------添加错误信息
CONCATENATE '物料:' <F_UPLOAD_DATA>-MATNR ' 不存在!' INTO WA_MESSAGE-MESSAGE.
PERFORM SUB_ADD_MESSAGE USING 'E'
<F_UPLOAD_DATA>-ROWS
WA_MESSAGE-MESSAGE
'X'.
ENDIF.
<F_UPLOAD_DATA>-PWWRK = <F_UPLOAD_DATA>-PLWRK.
READ TABLE L_IT_MARC WITH KEY MATNR = <F_UPLOAD_DATA>-MATNR
WERKS = <F_UPLOAD_DATA>-PWWRK.
IF SY-SUBRC = 0.
CLEAR:WA_MTAR.
READ TABLE WA_MTAR WITH KEY MATNR = <F_UPLOAD_DATA>-MATNR BINARY SEARCH.
IF WA_MTAR-MTART = 'ND01' AND <F_UPLOAD_DATA>-MATNR+0(8) <> '00000019' AND L_IT_MARC-SBDKZ <> '1'.
<F_UPLOAD_DATA>-CHECKS = 'X'.
ENDIF.
<F_UPLOAD_DATA>-PLGRP = L_IT_MARC-PLGRP."
"<F_UPLOAD_DATA>-EKGRP = L_IT_MARC-EKGRP.
<F_UPLOAD_DATA>-DISPO = L_IT_MARC-DISPO.
2.2.11"如果销售订单不为空,则获取客户信息
IF <F_UPLOAD_DATA>-KDAUF <> ''.
SELECT SINGLE VDATU KUNNR INTO (<F_UPLOAD_DATA>-VDATU,<F_UPLOAD_DATA>-KUNNR)
FROM VBAK
WHERE VBELN = <F_UPLOAD_DATA>-KDAUF.
IF SY-SUBRC = 0.
SELECT SINGLE NAME1 INTO <F_UPLOAD_DATA>-NAME1
FROM KNA1
WHERE KUNNR = <F_UPLOAD_DATA>-KUNNR.
SELECT SINGLE KWMENG CUOBJ INTO (<F_UPLOAD_DATA>-KWMENG,<F_UPLOAD_DATA>-CUOBJ)
FROM VBAP
WHERE VBELN = <F_UPLOAD_DATA>-KDAUF
AND POSNR = <F_UPLOAD_DATA>-KDPOS.
ENDIF.
ENDIF.
CLEAR:L_ZZDCDY.
2.2.11"获取特性值
SELECT SINGLE ZZDCDY ZZDCZR INTO (L_ZZDCDY,<F_UPLOAD_DATA>-ATWTB_ZR)
FROM MARA
WHERE MATNR = <F_UPLOAD_DATA>-MATNR
AND MTART = 'ND01'.
<F_UPLOAD_DATA>-ATWTB_DY = L_ZZDCDY.
IF SY-SUBRC <> 0 AND <F_UPLOAD_DATA>-CUOBJ IS NOT INITIAL.
REFRESH:CONFIGURATION.
CALL FUNCTION 'VC_I_GET_CONFIGURATION_IBASE'
EXPORTING
INSTANCE = <F_UPLOAD_DATA>-CUOBJ
* BUSINESS_OBJECT =
* LANGUAGE = SY-LANGU
* IV_INVALID_POSSIBLE = ' '
* IV_NEUTRAL = ' '
TABLES
CONFIGURATION = CONFIGURATION
* ET_CONF_WITH_AUTHOR =
EXCEPTIONS
INSTANCE_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT CONFIGURATION.
* CASE:CONFIGURATION-ATNAM.
* WHEN 'ZCTND01_CP_VOLTAGE'.
* <F_UPLOAD_DATA>-ATWTB_DY = CONFIGURATION-ATWTB.
* WHEN 'ZCTND01_DC_FLAME'.
* <F_UPLOAD_DATA>-ATWTB_ZR = CONFIGURATION-ATWTB.
* ENDCASE.
CASE:CONFIGURATION-ATBEZ.
WHEN '成品系统电压'.
<F_UPLOAD_DATA>-ATWTB_DY = CONFIGURATION-ATWTB.
WHEN '电池阻燃'.
<F_UPLOAD_DATA>-ATWTB_ZR = CONFIGURATION-ATWTB.
ENDCASE.
CLEAR:CONFIGURATION.
ENDLOOP.
ENDIF.
IF <F_UPLOAD_DATA>-ATWTB_ZR = 'Z01'.
<F_UPLOAD_DATA>-ATWTB_ZR = '阻燃'.
ELSEIF <F_UPLOAD_DATA>-ATWTB_ZR = 'Z02'.
<F_UPLOAD_DATA>-ATWTB_ZR = '非阻燃'.
ENDIF.
IF <F_UPLOAD_DATA>-ZZVBE IS NOT INITIAL.
<F_UPLOAD_DATA>-KDAUF = <F_UPLOAD_DATA>-ZZVBE.
<F_UPLOAD_DATA>-KDPOS = <F_UPLOAD_DATA>-ZZPOS.
ENDIF.
IF <F_UPLOAD_DATA>-KDAUF IS NOT INITIAL.
CLEAR:ID,LANGUAGE,NAME,OBJECT.
REFRESH:LINES .
2.2.12"获取销售订单文本信息
ID = 'Z002'.
OBJECT = 'VBBP'.
CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
ID = ID
LANGUAGE = SY-LANGU
NAME = NAME
OBJECT = OBJECT
TABLES
LINES = LINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT LINES.
CONCATENATE <F_UPLOAD_DATA>-ZBZFS LINES-TDLINE INTO <F_UPLOAD_DATA>-ZBZFS.
CLEAR:LINES.
ENDLOOP.
CLEAR:ID,LANGUAGE,NAME,OBJECT.
REFRESH:LINES .
ID = 'Z003'.
OBJECT = 'VBBP'.
CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
ID = ID
LANGUAGE = SY-LANGU
NAME = NAME
OBJECT = OBJECT
TABLES
LINES = LINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT LINES.
CONCATENATE <F_UPLOAD_DATA>-ZAZFS LINES-TDLINE INTO <F_UPLOAD_DATA>-ZAZFS.
CLEAR:LINES.
ENDLOOP.
CLEAR:ID,LANGUAGE,NAME,OBJECT.
REFRESH:LINES .
ID = 'Z007'.
OBJECT = 'VBBP'.
CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
ID = ID
LANGUAGE = SY-LANGU
NAME = NAME
OBJECT = OBJECT
TABLES
LINES = LINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT LINES.
CONCATENATE <F_UPLOAD_DATA>-ZGCXX LINES-TDLINE INTO <F_UPLOAD_DATA>-ZGCXX.
CLEAR:LINES.
ENDLOOP.
CLEAR:ID,LANGUAGE,NAME,OBJECT.
REFRESH:LINES .
ID = 'Z005'.
OBJECT = 'VBBP'.
CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
ID = ID
LANGUAGE = SY-LANGU
NAME = NAME
OBJECT = OBJECT
TABLES
LINES = LINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT LINES.
CONCATENATE <F_UPLOAD_DATA>-ZSBWB LINES-TDLINE INTO <F_UPLOAD_DATA>-ZSBWB.
CLEAR:LINES.
ENDLOOP.
CLEAR:ID,LANGUAGE,NAME,OBJECT.
REFRESH:LINES .
ID = 'Z006'.
OBJECT = 'VBBP'.
CONCATENATE <F_UPLOAD_DATA>-KDAUF <F_UPLOAD_DATA>-KDPOS INTO NAME.
CALL FUNCTION 'READ_TEXT'
EXPORTING
* CLIENT = SY-MANDT
ID = ID
LANGUAGE = SY-LANGU
NAME = NAME
OBJECT = OBJECT
TABLES
LINES = LINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT LINES.
CONCATENATE <F_UPLOAD_DATA>-ZPJYQ LINES-TDLINE INTO <F_UPLOAD_DATA>-ZPJYQ.
CLEAR:LINES.
ENDLOOP.
ENDIF.
ELSE.
DELETE L_IT_UPLOAD_DATA INDEX L_TBIX.
ENDIF.
ENDLOOP.
2.2.13"显示查询数据
FORM SUB_DISPLAY_ALV TABLES TABLE .
DATA: L_IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
L_LT_EVENT_EXIT TYPE SLIS_T_EVENT_EXIT,
L_GS_LAYOUT TYPE SLIS_LAYOUT_ALV.
PERFORM SUB_BUILD_FIELDCAT TABLES L_IT_FIELDCAT.
PERFORM SUB_BUILD_LAYOUT USING L_GS_LAYOUT."设置ALV样式
PERFORM SUB_BUILD_EVENTEXIT TABLES L_LT_EVENT_EXIT. "设置事件
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
IT_FIELDCAT = L_IT_FIELDCAT[]
* it_events = l_it_events[]
I_SAVE = 'A'
IS_LAYOUT = L_GS_LAYOUT
TABLES
T_OUTTAB = TABLE
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. "sub_display_alv
M_FIELDCAT 'X' 'PLWRK' '工厂' '' '' '' '4'.
M_FIELDCAT '' 'KDAUF' '销售订单号' '' '' '' '10'.
M_FIELDCAT '' 'KDPOS' '行项目' '' '' '' '6'.
M_FIELDCAT '' 'NAME1' '客户名称' '' '' '' '25'.
M_FIELDCAT '' 'MATNR' '物料编号' '' '' '' '18'.
M_FIELDCAT '' 'MAKTX' '物料描述' '' '' '' '40'.
M_FIELDCAT '' 'ATWTB_ZR' '特性' '' '' '' '6'.
M_FIELDCAT '' 'ATWTB_DY' '电压' '' '' '' '6'.
M_FIELDCAT '' 'KWMENG' '订单数量' '' '' '' '17'.
M_FIELDCAT '' 'VDATU' '销售订单交期' '' '' '' '10'.
M_FIELDCAT '' 'PSTTR' '计划开始日期' '' '' '' '10'.
M_FIELDCAT '' 'PEDTR' '计划完成日期' '' '' '' '10'.
M_FIELDCAT '' 'ARBPL' '工作中心' '' '' '' '10'.
M_FIELDCAT '' 'VERID' '版本号' '' '' '' '4'.
M_FIELDCAT '' 'ZZBEIZ' '备注' '' '' '' '20'.
M_FIELDCAT '' 'GSMNG' '计划生产数' '' '' '' '17'.
M_FIELDCAT '' 'PLNUM' '计划订单' '' '' '' '10'.
M_FIELDCAT '' 'DISPO' 'MRP控制者' '' '' '' '4'.
M_FIELDCAT '' 'ZBZFS' '包装方式' '' '' '' '200'.
M_FIELDCAT '' 'ZAZFS' '安装方式' '' '' '' '200'.
M_FIELDCAT '' 'ZGCXX' '挑选要求' '' '' '' '200'.
M_FIELDCAT '' 'ZSBWB' '商标' '' '' '' '200'.
M_FIELDCAT '' 'ZPJYQ' '配件要求' '' '' '' '200'.
IF P_IMPORT = 'X'.
M_FIELDCAT '' 'LIGHT' '状态' '' '' '' '4'.
M_FIELDCAT '' 'ROWS' '序列' '' '' '' '4'.
M_FIELDCAT '' 'MESSAGE' '信息' '' '' '' '20'.
ENDIF.
2.2.14选择导入路径
WHEN P_IMPORT.
IF P_FILE IS INITIAL.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = '*.xls'
DEF_PATH = ''
MASK = ',Excel Files,All Files,*.*.'
MODE = 'O'
TITLE = '选择导入文件'
IMPORTING
FILENAME = P_FILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
ENDIF.
2.2.15 "上传文件
PERFORM SUB_UPLOAD_FILE TABLES G_IT_UPLOAD_DATA.
DATA: L_IT_XLSDATA TYPE STANDARD TABLE OF ALSMEX_TABLINE WITH HEADER LINE."表内容
REFRESH:L_IT_UPLOAD_DATA,
L_IT_XLSDATA.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 10
TEXT = '正在导入数据......'.
2.2.16*"----导入EXCEL数据到内表
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = P_FILE
I_BEGIN_COL = '1'
I_BEGIN_ROW = '2'
I_END_COL = '16'
I_END_ROW = '99999'
TABLES
INTERN = L_IT_XLSDATA.
SORT L_IT_XLSDATA BY ROW COL.
"----格式化导入数据到内表
PERFORM SUB_FORMAT_UPLOAD TABLES L_IT_UPLOAD_DATA
L_IT_XLSDATA.
2.2.17"----分析导入数据
LOOP AT L_IT_XLSDATA.
AT NEW ROW.
CLEAR:L_IT_UPLOAD_DATA.
CONCATENATE '正在处理第' L_IT_XLSDATA-ROW '行数据,请稍后...' INTO L_V_MSG.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = 20
TEXT = L_V_MSG.
L_V_ROWS = L_V_ROWS + 1.
L_IT_UPLOAD_DATA-ROWS = L_V_ROWS.
ENDAT.
CONDENSE L_IT_XLSDATA-VALUE.
CASE L_IT_XLSDATA-COL.
WHEN 1."工厂
TRANSLATE L_IT_XLSDATA-VALUE TO UPPER CASE.
L_IT_UPLOAD_DATA-PLWRK = L_IT_XLSDATA-VALUE.
WHEN 2."销售订单号
L_IT_UPLOAD_DATA-KDAUF = L_IT_XLSDATA-VALUE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_IT_UPLOAD_DATA-KDAUF
IMPORTING
OUTPUT = L_IT_UPLOAD_DATA-KDAUF.
WHEN 3."行项目
L_IT_UPLOAD_DATA-KDPOS = L_IT_XLSDATA-VALUE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_IT_UPLOAD_DATA-KDPOS
IMPORTING
OUTPUT = L_IT_UPLOAD_DATA-KDPOS.
WHEN 4.
WHEN 5. "物料
L_IT_UPLOAD_DATA-MATNR = L_IT_XLSDATA-VALUE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_IT_UPLOAD_DATA-MATNR
IMPORTING
OUTPUT = L_IT_UPLOAD_DATA-MATNR.
WHEN 6.
WHEN 7.
WHEN 8.
WHEN 9.
WHEN 10.
WHEN 11. "开始日期
L_V_DATE = L_IT_XLSDATA-VALUE.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
DATE = L_V_DATE
EXCEPTIONS
PLAUSIBILITY_CHECK_FAILED = 1
OTHERS = 2.
"如果是日期型时就直接赋值
IF SY-SUBRC EQ 0 .
L_IT_UPLOAD_DATA-PSTTR = L_V_DATE.
ELSE.
CONCATENATE '行号:' L_IT_XLSDATA-COL ' 开始日期不是日期类型' INTO WA_MESSAGE-MESSAGE.
PERFORM SUB_ADD_MESSAGE1 USING 'E'
L_V_ROWS
WA_MESSAGE-MESSAGE
L_IT_UPLOAD_DATA.
ENDIF.
WHEN 12."完成日期
L_V_DATE = L_IT_XLSDATA-VALUE.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
DATE = L_V_DATE
EXCEPTIONS
PLAUSIBILITY_CHECK_FAILED = 1
OTHERS = 2.
"如果是日期型时就直接赋值
IF SY-SUBRC EQ 0 .
L_IT_UPLOAD_DATA-PEDTR = L_V_DATE.
ELSE.
CONCATENATE '行号:' L_IT_XLSDATA-COL ' 开始日期不是日期类型' INTO WA_MESSAGE-MESSAGE.
PERFORM SUB_ADD_MESSAGE1 USING 'E'
L_V_ROWS
WA_MESSAGE-MESSAGE
L_IT_UPLOAD_DATA.
ENDIF.
WHEN 13. "工作中心
L_IT_UPLOAD_DATA-ARBPL = L_IT_XLSDATA-VALUE.
WHEN 14."版本
L_IT_UPLOAD_DATA-VERID = L_IT_XLSDATA-VALUE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = L_IT_UPLOAD_DATA-VERID
IMPORTING
OUTPUT = L_IT_UPLOAD_DATA-VERID.
WHEN 15."备注
L_IT_UPLOAD_DATA-ZZBEIZ = L_IT_XLSDATA-VALUE.
WHEN 16."数量
TRY.
L_IT_UPLOAD_DATA-GSMNG = L_IT_XLSDATA-VALUE * 1.
CATCH CX_SY_CONVERSION_NO_NUMBER.
CONCATENATE '行' '数量不是数值类型' '' INTO WA_MESSAGE-MESSAGE.
PERFORM SUB_ADD_MESSAGE1 USING 'E'
L_V_ROWS
WA_MESSAGE-MESSAGE
L_IT_UPLOAD_DATA.
ENDTRY.
ENDCASE.
AT END OF ROW.
APPEND L_IT_UPLOAD_DATA.
ENDAT.
ENDLOOP.
2.2.18将数据整理后输出
SELECT *
APPENDING CORRESPONDING FIELDS OF TABLE L_IT_UPLOAD_DATA
FROM PLAF
FOR ALL ENTRIES IN L_IT_UPLOAD_DATA
WHERE PWWRK = P_WERKS
AND MATNR = L_IT_UPLOAD_DATA-MATNR
AND MATNR IN S_MATNR
AND PSTTR IN S_ERDAT
AND PAART IN ('LA','KD').
IF SY-SUBRC = 0.
G_DELE = 'X'.
ENDIF.
2.2.19输出导入数据
DATA: L_IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
L_LT_EVENT_EXIT TYPE SLIS_T_EVENT_EXIT,
L_GS_LAYOUT TYPE SLIS_LAYOUT_ALV.
PERFORM SUB_BUILD_FIELDCAT TABLES L_IT_FIELDCAT.
PERFORM SUB_BUILD_LAYOUT USING L_GS_LAYOUT."设置ALV样式
PERFORM SUB_BUILD_EVENTEXIT TABLES L_LT_EVENT_EXIT. "设置事件
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
IT_FIELDCAT = L_IT_FIELDCAT[]
* it_events = l_it_events[]
I_SAVE = 'A'
IS_LAYOUT = L_GS_LAYOUT
TABLES
T_OUTTAB = TABLE
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
2.2.20"删除相同物料的其它计划订单
LOOP AT L_IT_UPLOAD_DATA WHERE PLNUM IS NOT INITIAL.
CALL FUNCTION 'BAPI_PLANNEDORDER_DELETE'
EXPORTING
PLANNEDORDER = L_IT_UPLOAD_DATA-PLNUM
IMPORTING
RETURN = L_WA_BAPIRETURN1.
IF L_WA_BAPIRETURN1-TYPE = 'E'."更新错误
PERFORM SUB_ADD_MESSAGE USING 'E'
0
L_WA_BAPIRETURN1-MESSAGE
'X'.
ELSE.
"---提交bapi
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
UPDATE ZTPPLO SET AEDAT = SY-DATUM
AEZEIT = SY-UZEIT
AENAM = SY-UNAME
ELOEK = 'X'
WHERE PLNUM = L_IT_UPLOAD_DATA-PLNUM.
COMMIT WORK AND WAIT.
DELETE L_IT_UPLOAD_DATA.
ENDIF.
CLEAR:L_IT_UPLOAD_DATA.
ENDLOOP.
2.2.21"------创建计划订单
LOOP AT L_IT_UPLOAD_DATA ASSIGNING <F_UPLOAD_DATA> WHERE PLNUM IS INITIAL .
"调用锁对象,查询物料是否被锁定
CALL FUNCTION 'ENQUEUE_EZMARC'
EXPORTING
MODE_MARC = 'E'
MANDT = SY-MANDT
MATNR = <F_UPLOAD_DATA>-MATNR
WERKS = <F_UPLOAD_DATA>-PWWRK
* X_MATNR = ' '
* X_WERKS = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
<F_UPLOAD_DATA>-LIGHT = C_RED_LIGHT."提示图
<F_UPLOAD_DATA>-MESSAGE = '该物料已被锁定'.
PERFORM SUB_ADD_MESSAGE USING 'E'
<F_UPLOAD_DATA>-ROWS
<F_UPLOAD_DATA>-MESSAGE
'X'.
* Implement suitable error handling here
ELSE.
CLEAR:L_WA_HEADERDATA.
2.2.22"添加创建计划订单所需数据
CLEAR:L_V_PLNUM,L_WA_HEADERDATA,L_WA_PLOLOG,L_WA_BAPIRETURN1.
REFRESH:L_COMPONENTSDATA,L_CREATEDCOMPONENTSDATA,L_CAPACITYDATA1,L_CAPACITYDATA2,L_CAPACITYDATA3.
CLEAR:L_HEADERDATA,L_HEADERDATAX.
REFRESH:LT_PLPO,LT_PLAS.
L_WA_HEADERDATA-PLDORD_PROFILE = 'LA'.
L_WA_HEADERDATA-MATERIAL = <F_UPLOAD_DATA>-MATNR.
L_WA_HEADERDATA-PLAN_PLANT = <F_UPLOAD_DATA>-PWWRK.
L_WA_HEADERDATA-PROD_PLANT = <F_UPLOAD_DATA>-PWWRK.
L_WA_HEADERDATA-TOTAL_PLORD_QTY = <F_UPLOAD_DATA>-GSMNG.
L_WA_HEADERDATA-ORDER_START_DATE = <F_UPLOAD_DATA>-PSTTR.
L_WA_HEADERDATA-ORDER_FIN_DATE = <F_UPLOAD_DATA>-PEDTR.
L_WA_HEADERDATA-FIRMING_IND = 'X'.
" L_WA_HEADERDATA-USE_COLL_UPD = 'X'.
L_WA_HEADERDATA-DET_SCHEDULE = 'X'.
" L_WA_HEADERDATA-LAST_ORDER = 'X'.
" L_WA_HEADERDATA-STGE_LOC = <F_UPLOAD_DATA>-LGORT.
" L_WA_HEADERDATA-MRP_AREA = <F_UPLOAD_DATA>-BERID.
2.2.23"如果销售订单不为空,则创建KD类型的计划订单
L_WA_HEADERDATA-VERSION = <F_UPLOAD_DATA>-VERID.
IF <F_UPLOAD_DATA>-KDAUF IS NOT INITIAL AND <F_UPLOAD_DATA>-CHECKS = ''.
L_WA_HEADERDATA-PLDORD_PROFILE = 'KD'.
L_WA_HEADERDATA-ACCTASSCAT = 'M'.
L_WA_HEADERDATA-SALES_ORD = <F_UPLOAD_DATA>-KDAUF.
L_WA_HEADERDATA-S_ORD_ITEM = <F_UPLOAD_DATA>-KDPOS.
ENDIF.
* L_WA_HEADERDATA-BASE_UOM = 'PC'.
* L_WA_HEADERDATA-BASE_UOM_ISO = 'PC'.
2.2.24 "调用Bapi创建计划订单
CALL FUNCTION 'BAPI_PLANNEDORDER_CREATE'
EXPORTING
HEADERDATA = L_WA_HEADERDATA
IMPORTING
RETURN = L_WA_BAPIRETURN1
PLANNEDORDER = L_V_PLNUM
TABLES
COMPONENTSDATA = L_COMPONENTSDATA
CREATEDCOMPONENTSDATA = L_CREATEDCOMPONENTSDATA
CAPACITYDATA1 = L_CAPACITYDATA1
CAPACITYDATA2 = L_CAPACITYDATA2
CAPACITYDATA3 = L_CAPACITYDATA3.
.
IF L_WA_BAPIRETURN1-TYPE = 'E'."更新错误
<F_UPLOAD_DATA>-LIGHT = C_RED_LIGHT."提示图
<F_UPLOAD_DATA>-MESSAGE = L_WA_BAPIRETURN1-MESSAGE.
PERFORM SUB_ADD_MESSAGE USING 'E'
<F_UPLOAD_DATA>-ROWS
<F_UPLOAD_DATA>-MESSAGE
'X'.
ELSE.
"---提交bapi
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
<F_UPLOAD_DATA>-PLNUM = L_V_PLNUM.
<F_UPLOAD_DATA>-LIGHT = C_GREEN_LIGHT."提示图
CLEAR: <F_UPLOAD_DATA>-MESSAGE,
L_WA_PLOLOG.
MOVE-CORRESPONDING <F_UPLOAD_DATA> TO L_WA_PLOLOG.
L_WA_PLOLOG-BERID = <F_UPLOAD_DATA>-BERID.
L_WA_PLOLOG-ERNAM = SY-UNAME.
L_WA_PLOLOG-ERDAT = SY-DATUM.
L_WA_PLOLOG-CPUTM = SY-UZEIT.
MODIFY ZTPPLO FROM L_WA_PLOLOG.
COMMIT WORK AND WAIT.
2.2.25"如果工作中心有导入,则更新计划订单的工作中心
IF <F_UPLOAD_DATA>-ARBPL IS NOT INITIAL.
CLEAR:L_ARBPL.
CONCATENATE <F_UPLOAD_DATA>-ARBPL+0(4) '%' INTO L_ARBPL.
CLEAR:MKAL.
2.2.26"获取工艺路线信息
IF <F_UPLOAD_DATA>-VERID IS NOT INITIAL.
SELECT SINGLE * INTO MKAL
FROM MKAL
WHERE MATNR = <F_UPLOAD_DATA>-MATNR
AND WERKS = <F_UPLOAD_DATA>-PWWRK
AND VERID = <F_UPLOAD_DATA>-VERID.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_PLPO
FROM PLAS AS PS INNER JOIN PLPO AS PO
ON PS~PLNTY = PO~PLNTY AND PS~PLNNR = PO~PLNNR
AND PS~PLNKN = PO~PLNKN AND PS~ZAEHL = PO~ZAEHL
WHERE PS~PLNTY = MKAL-PLNTY
AND PS~PLNNR = MKAL-PLNNR
AND PS~PLNAL = MKAL-ALNAL
AND PS~LOEKZ = ''.
ELSE.
SELECT SINGLE PLNTY PLNNR PLNAL AS ALNAL INTO CORRESPONDING FIELDS OF MKAL
FROM MAPL
WHERE MATNR = <F_UPLOAD_DATA>-MATNR
AND WERKS = <F_UPLOAD_DATA>-PWWRK
AND LOEKZ = ''.
SELECT * INTO CORRESPONDING FIELDS OF TABLE LT_PLPO
FROM PLAS AS PS INNER JOIN PLPO AS PO
ON PS~PLNTY = PO~PLNTY AND PS~PLNNR = PO~PLNNR
AND PS~PLNKN = PO~PLNKN AND PS~ZAEHL = PO~ZAEHL
WHERE PS~PLNTY = MKAL-PLNTY
AND PS~PLNNR = MKAL-PLNNR
AND PS~PLNAL = MKAL-ALNAL
AND PS~LOEKZ = ''.
ENDIF.
IF MKAL-PLNNR IS NOT INITIAL.
REFRESH:T_TASK,T_ITEM,T_RETURN.
2.2.27"将需要更新工作中心的工艺路线信息写到行项目
LOOP AT LT_PLPO.
CLEAR:T_TASK.
T_TASK-MATERIAL = <F_UPLOAD_DATA>-MATNR.
T_TASK-PLANT = <F_UPLOAD_DATA>-PWWRK.
T_TASK-ZMARK = 'U'.
T_TASK-TASK_LIST_GROUP = LT_PLPO-PLNNR.
T_TASK-GROUP_COUNTER = LT_PLPO-PLNAL.
COLLECT T_TASK.
CLEAR:T_ITEM.
T_ITEM-MATERIAL = <F_UPLOAD_DATA>-MATNR.
T_ITEM-PLANT_H = <F_UPLOAD_DATA>-PWWRK.
T_ITEM-ZMARK = 'U'.
T_ITEM-TASK_LIST_GROUP = LT_PLPO-PLNNR.
T_ITEM-GROUP_COUNTER = LT_PLPO-PLNAL.
T_ITEM-ACTIVITY = LT_PLPO-VORNR.
SELECT SINGLE ARBPL INTO T_ITEM-WORK_CNTR
FROM CRHD
WHERE OBJTY = 'A'
AND OBJID = LT_PLPO-ARBID
AND ARBPL LIKE L_ARBPL.
IF SY-SUBRC = 0.
T_ITEM-WORK_CNTR = <F_UPLOAD_DATA>-ARBPL.
APPEND T_ITEM.
ENDIF.
CLEAR:LT_PLPO.
ENDLOOP.
2.2.28"调用function,修改工艺路线的工作中心
CALL FUNCTION 'ZMM_CHANGEROUTING'
TABLES
T_TASK = T_TASK
T_ITEM = T_ITEM
T_RETURN = T_RETURN.
WAIT UP TO 1 SECONDS.
ENDIF.
L_HEADERDATA-DET_SCHEDULE = 'X'.
L_HEADERDATAX-DET_SCHEDULE = 'X'.
2.2.29"修改计划订单的工作中心
CALL FUNCTION 'BAPI_PLANNEDORDER_CHANGE'
EXPORTING
PLANNEDORDER = L_V_PLNUM
HEADERDATA = L_HEADERDATA
HEADERDATAX = L_HEADERDATAX
IMPORTING
RETURN = L_WA_BAPIRETURN1
* CHANGEDHEADERDATA =
* CAPACITYHEADERDATA1 =
* CAPACITYHEADERDATA2 =
* CAPACITYHEADERDATA3 =
TABLES
* COMPONENTSDATA =
CAPACITYDATA1 = L_CAPACITYDATA1
CAPACITYDATA2 = L_CAPACITYDATA2
CAPACITYDATA3 = L_CAPACITYDATA3.
.
"---提交bapi
IF L_WA_BAPIRETURN1-TYPE = 'E'."更新错误
<F_UPLOAD_DATA>-LIGHT = C_RED_LIGHT."提示图
<F_UPLOAD_DATA>-MESSAGE = L_WA_BAPIRETURN1-MESSAGE.
PERFORM SUB_ADD_MESSAGE USING 'E'
<F_UPLOAD_DATA>-ROWS
<F_UPLOAD_DATA>-MESSAGE
'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
IF MKAL-PLNNR IS NOT INITIAL.
REFRESH:T_TASK,T_ITEM,T_RETURN.
LOOP AT LT_PLPO.
CLEAR:T_TASK.
T_TASK-MATERIAL = <F_UPLOAD_DATA>-MATNR.
T_TASK-PLANT = <F_UPLOAD_DATA>-PWWRK.
T_TASK-ZMARK = 'U'.
T_TASK-TASK_LIST_GROUP = LT_PLPO-PLNNR.
T_TASK-GROUP_COUNTER = LT_PLPO-PLNAL.
COLLECT T_TASK.
CLEAR:T_ITEM.
T_ITEM-MATERIAL = <F_UPLOAD_DATA>-MATNR.
T_ITEM-PLANT_H = <F_UPLOAD_DATA>-PWWRK.
T_ITEM-ZMARK = 'U'.
T_ITEM-TASK_LIST_GROUP = LT_PLPO-PLNNR.
T_ITEM-GROUP_COUNTER = LT_PLPO-PLNAL.
T_ITEM-ACTIVITY = LT_PLPO-VORNR.
SELECT SINGLE ARBPL INTO T_ITEM-WORK_CNTR
FROM CRHD
WHERE OBJTY = 'A'
AND OBJID = LT_PLPO-ARBID.
APPEND T_ITEM.
CLEAR:LT_PLPO.
ENDLOOP.
CALL FUNCTION 'ZMM_CHANGEROUTING'
TABLES
T_TASK = T_TASK
T_ITEM = T_ITEM
T_RETURN = T_RETURN.
ENDIF.
ENDIF.
UPDATE PLAF SET ZZBEIZ = <F_UPLOAD_DATA>-ZZBEIZ
WHERE PLNUM = L_V_PLNUM.
IF <F_UPLOAD_DATA>-CHECKS = 'X'.
UPDATE PLAF SET ZZVBE = <F_UPLOAD_DATA>-KDAUF
ZZPOS = <F_UPLOAD_DATA>-KDPOS
WHERE PLNUM = L_V_PLNUM.
ENDIF.
ENDIF.
2.2.30"解除物料的锁对象
CALL FUNCTION 'DEQUEUE_EZMARC'
EXPORTING
MODE_MARC = 'E'
MANDT = SY-MANDT
MATNR = <F_UPLOAD_DATA>-MATNR
WERKS = <F_UPLOAD_DATA>-PWWRK
* X_MATNR = ' '
* X_WERKS = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
ENDIF.
ENDLOOP.