*-----------------------------------------------------------------------*
* 程序名称:ZMMEXEC0030
* 程序标题:采购订单批量导入
* 程序类型:功能报表
* 创建人 :www
* 创建日期:2013-11-20
* 模块 :
* 事务码 :ZMM003
* 请求号 :
* 功能描述:
* 相关文档:
*----------------------------------------------------------------------*
* 修改记录:
* 作者 日期 请求号 修改原因描述
*----------- -------- -----------------------------------------------*
*
*----------------------------------------------------------------------*
REPORT zmmexec0030
NO STANDARD PAGE HEADING
MESSAGE-ID zcomm.
*----------------------------------------------------------------------*
* INCLUDE *
*----------------------------------------------------------------------*
INCLUDE zslis.
INCLUDE zfile.
*----------------------------------------------------------------------*
* 声明数据表;
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 定义结构;
*----------------------------------------------------------------------*
TYPES: BEGIN OF gts_alv_data,
ztype TYPE char1, " 类型 H-抬头 I-明细
bsart TYPE ekko-bsart,
verkf TYPE ekko-verkf,
ihrez TYPE ekko-ihrez, " 项目号
unsez TYPE ekko-unsez, "事业部项目号 新加 20140625
lifnr TYPE ekko-lifnr,
ekorg TYPE ekko-ekorg,
ekgrp TYPE ekko-ekgrp,
bukrs TYPE ekko-bukrs,
zterm TYPE ekko-zterm,
inco1 TYPE ekko-inco1,
inco2 TYPE ekko-inco2,
ebelp TYPE char5,
knttp TYPE ekpo-knttp,
pstyp TYPE ekpo-pstyp,
matnr TYPE ekpo-matnr,
menge TYPE char25,
meins TYPE ekpo-meins,
eindt TYPE ekpo-agdat,
netpr TYPE char25,
peinh TYPE char5,
mwskz TYPE ekpo-mwskz,
waers TYPE ekko-waers,
navnw TYPE char25, " 折扣金额
navnw2 TYPE char25, " 净价折扣%
matkl TYPE ekpo-matkl,
werks TYPE ekpo-werks,
lgort TYPE ekpo-lgort,
insmk TYPE ekpo-insmk,
charg TYPE charg_d,
retpo TYPE ekpo-retpo,
hkont TYPE hkont,
vbeln TYPE vbap-vbeln,
posnr TYPE char6,
aufnr TYPE aufk-aufnr,
kostl TYPE kostl,
banfn TYPE ekpo-banfn,
bnfpo TYPE char5,
ebeln TYPE ekko-ebeln,
ebeln_o TYPE c LENGTH 50,"added by yangk 20151224
ebeln_p TYPE c LENGTH 50,"added by yangk 20151224
END OF gts_alv_data.
TYPES: BEGIN OF gts_alv_base,
grp TYPE i, " 用于分组
id TYPE i,
tag TYPE i,
sel TYPE char1,
light TYPE c,
rowcolor TYPE char4,
msg TYPE text255,
update TYPE char1,
END OF gts_alv_base.
TYPES: BEGIN OF gts_alv.
INCLUDE TYPE ty_file_data.
INCLUDE TYPE gts_alv_data.
INCLUDE TYPE gts_alv_base.
TYPES: END OF gts_alv.
TYPES: gtt_alv TYPE TABLE OF gts_alv.
*----------------------------------------------------------------------*
* 定义内表;
*----------------------------------------------------------------------*
DATA: gds_alv TYPE gts_alv,
gdt_alv TYPE TABLE OF gts_alv.
DATA: gdt_item_n TYPE TABLE OF bapimepoitem WITH HEADER LINE. "added by yangk 20151230
*----------------------------------------------------------------------*
* 定义变量;
*----------------------------------------------------------------------*
DATA: gdf_mandt TYPE mandt.
*----------------------------------------------------------------------*
* 定义常量.
*----------------------------------------------------------------------*
CONSTANTS:
gdc_objid TYPE wwwdata-objid VALUE 'ZMM03A',
gdc_startrow TYPE i VALUE 2,
* gdc_maxcolumn TYPE i VALUE 38,
gdc_maxcolumn TYPE i VALUE 40,
gdc_maxline TYPE i VALUE 65000.
*----------------------------------------------------------------------*
* SELECTION-SCREEN 检索条件 *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK condi WITH FRAME TITLE text-004.
PARAMETERS : r3 RADIOBUTTON GROUP d1 DEFAULT 'X' USER-COMMAND zks, " 导入文件
r4 RADIOBUTTON GROUP d1. " 下载空白模板
SELECTION-SCREEN END OF BLOCK condi.
SELECTION-SCREEN BEGIN OF BLOCK ifile WITH FRAME TITLE text-002.
PARAMETERS: p_ifile TYPE ibipparms-path MODIF ID ife.
PARAMETERS: p_maxrow TYPE i DEFAULT 500 MODIF ID ife.
PARAMETERS: p_return TYPE c AS CHECKBOX DEFAULT 'X' MODIF ID ife.
SELECTION-SCREEN END OF BLOCK ifile.
SELECTION-SCREEN BEGIN OF BLOCK ofile WITH FRAME TITLE text-003.
PARAMETERS: p_ofile TYPE ibipparms-path MODIF ID ofe.
SELECTION-SCREEN END OF BLOCK ofile.
*$*$----------------------------------------------------------------$*$*
*$*$ Main Program $*$*
*$*$----------------------------------------------------------------$*$*
*--------- 初始化 ----------
INITIALIZATION.
*&------------------------------------------------------------
*& At selection-screen.
*&------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
CASE 'X'.
WHEN r3. " 导入文件
IF screen-group1 = 'IFE'.
screen-active = 1.
MODIFY SCREEN.
ENDIF.
IF screen-group1 = 'OFE'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
WHEN r4. " 下载模板
IF screen-group1 = 'OFE'.
screen-active = 1.
MODIFY SCREEN.
ENDIF.
IF screen-group1 = 'IFE'.
screen-active = 0.
MODIFY SCREEN.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
*----------------------------------------------------------------------*
* At selection-screen *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ifile .
* 方便用户选择指定的Excel文件
PERFORM select_ifile.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_ofile .
* 方便用户选择指定的Excel文件
PERFORM select_ofile.
*&------------------------------------------------------------
*& At selection-screen.
*&------------------------------------------------------------
AT SELECTION-SCREEN.
* 检查参数输入的合法性 / 检查输入权限
PERFORM frm_check_parameter.
*&------------------------------------------------------------
*& LOAD-OF-PROGRAM.
*&------------------------------------------------------------
LOAD-OF-PROGRAM.
*--------- START-OF-SELECTION ----------
START-OF-SELECTION.
* 从数据表去数据并整理
PERFORM get_data.
*--------- END-OF-SELECTION ----------
END-OF-SELECTION.
CASE 'X'.
WHEN r3. " 导入数据
IF gdt_alv[] IS INITIAL.
MESSAGE s001 DISPLAY LIKE 'E'.
ELSE.
* 显示alv界面
PERFORM frm_display_lvc.
ENDIF.
WHEN r4. " 下载模板
WHEN OTHERS.
ENDCASE.
CLEAR: gdt_alv.
REFRESH: gdt_alv.
************************************************************************
* END OF MAIN PROGRAM
************************************************************************
*&---------------------------------------------------------------------*
*& Form select_ifile
*&---------------------------------------------------------------------*
* 弹出打开文件路径选择窗口,方便用户选择
*----------------------------------------------------------------------*
FORM select_ifile.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'(100)
mode = 'O'
title = '选择文件'(101)
IMPORTING
filename = p_ifile
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0 AND sy-subrc <> 3.
MESSAGE e021. " 读取文件出错!
ENDIF.
ENDFORM. " select_ifile
*&---------------------------------------------------------------------*
*& Form select_ofile
*&---------------------------------------------------------------------*
* 弹出打开文件路径选择窗口,方便用户选择
*----------------------------------------------------------------------*
FORM select_ofile.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'(100)
mode = 'S'
title = '选择文件'(101)
IMPORTING
filename = p_ofile
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0 AND sy-subrc <> 3.
MESSAGE e021. " 读取文件出错!
ENDIF.
ENDFORM. " select_ofile
*&---------------------------------------------------------------------*
*& Form frm_check_parameter
*&---------------------------------------------------------------------*
* 检查参数输入的合法性 / 检查输入权限
*----------------------------------------------------------------------*
FORM frm_check_parameter .
IF sy-ucomm = 'ZKS'.
RETURN.
ENDIF.
* 权限检查
CASE 'X'.
WHEN r3. " 导入数据
IF p_ifile IS INITIAL.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'
mode = 'O'
title = '选择文件'
IMPORTING
filename = p_ifile
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
CASE sy-subrc.
WHEN 0.
WHEN 3.
SET CURSOR FIELD 'P_IFILE'.
MESSAGE e010.
WHEN OTHERS.
SET CURSOR FIELD 'P_IFILE'.
MESSAGE e021.
ENDCASE.
ENDIF.
WHEN r4. " 下载模板
IF p_ofile IS INITIAL.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',Excel Files,*.xls,Excel Files(2007),*.xlsx,All Files,*.*.'
mode = 'S'
title = '选择文件'
IMPORTING
filename = p_ofile
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
CASE sy-subrc.
WHEN 0.
WHEN 3.
SET CURSOR FIELD 'P_OFILE'.
MESSAGE e010.
WHEN OTHERS.
SET CURSOR FIELD 'P_OFILE'.
MESSAGE e021.
ENDCASE.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFORM. " frm_check_parameter
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* 逻辑处理
*----------------------------------------------------------------------*
FORM get_data .
CLEAR: gdt_alv.
REFRESH: gdt_alv.
CASE 'X'.
WHEN r3. " 导入数据
PERFORM frm_upload_file.
WHEN r4. " 下载模板
PERFORM frm_download_file.
WHEN OTHERS.
ENDCASE.
ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD_FILE
*&---------------------------------------------------------------------*
* 将模板下载到本地
*----------------------------------------------------------------------*
FORM frm_download_file .
DATA: lv_subrc TYPE sysubrc,
lv_file TYPE rlgrap-filename,
lds_data TYPE wwwdatatab.
CALL FUNCTION 'ZTOOL_FILE_DOWNLOAD_SMW0'
EXPORTING
objname = gdc_objid
pathname = p_ofile
IMPORTING
filename = p_ofile
EXCEPTIONS
objname_not_exist = 1
inv_winsys = 2
no_batch = 3
selection_cancel = 4
selection_error = 5
download_false = 6
OTHERS = 7.
CASE sy-subrc.
WHEN 0.
MESSAGE s017. " 模板下载成功!
WHEN 1.
MESSAGE e016 DISPLAY LIKE 'S'. " 模板不存在!
WHEN 4.
WHEN 5.
MESSAGE e021 DISPLAY LIKE 'S'. " 读取文件出错!
WHEN OTHERS.
MESSAGE e018 DISPLAY LIKE 'S'. " 模板下载失败!
ENDCASE.
ENDFORM. " FRM_DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
* 导入数据
*----------------------------------------------------------------------*
FORM frm_upload_file .
DATA: lv_info TYPE text255,
lv_tag TYPE i,
lv_msg TYPE text255.
lv_info = '导入进行中...'.
* 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 1
text = lv_info.
* 读取 Excel 表格
PERFORM frm_read_excel_files USING p_ifile gdc_maxcolumn p_maxrow.
* 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 5
text = lv_info.
* 数据导入内表
PERFORM frm_build_excel_data USING gdc_startrow 2.
* 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 10
text = lv_info.
* 整理导入的数据
PERFORM frm_build_data.
* 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 15
text = lv_info.
* 即时执行
IF gdt_alv[] IS NOT INITIAL.
PERFORM frm_file_input.
ENDIF.
* 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 90
text = lv_info.
* 数据导出
IF p_return = 'X'.
IF gdt_alv[] IS NOT INITIAL.
PERFORM frm_file_output USING p_ifile gdc_startrow CHANGING lv_tag lv_msg.
IF lv_tag <> 0.
MESSAGE lv_msg TYPE 'W'.
ENDIF.
ENDIF.
ENDIF.
* 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = 100
text = lv_info.
ENDFORM. " FRM_UPLOAD_FILE
*&---------------------------------------------------------------------*
*& Form FRM_BUILD_DATA
*&---------------------------------------------------------------------*
* 整理导入的数据
*----------------------------------------------------------------------*
FORM frm_build_data .
DATA: lv_grp TYPE i,
lv_rowcolor TYPE char4,
ldf_temp TYPE char30,
lv_tag TYPE i.
DATA: ldf_aufnr TYPE aufk-aufnr.
"added by yangk 20160411 begin 查找公司代码对应的工厂
RANGES: ldf_bukrs FOR bseg-bukrs,
ldf_werks FOR mseg-werks.
DATA: BEGIN OF ldt_t001w OCCURS 10,
werks TYPE t001w-werks,
bwkey TYPE t001w-bwkey,
END OF ldt_t001w.
DATA: BEGIN OF ldt_t001k OCCURS 10,
bwkey TYPE t001k-bwkey,
bukrs TYPE t001k-bukrs,
END OF ldt_t001k.
* CLEAR: ldt_t001w, ldt_t001w[].
* SELECT DISTINCT werks bwkey
* INTO TABLE ldt_t001w
* FROM t001w.
*
* SELECT DISTINCT bwkey bukrs
* INTO TABLE ldt_t001k
* FROM t001k
* WHERE ( bukrs = '8100' OR bukrs = '8200' ).
*
* LOOP AT ldt_t001w.
* READ TABLE ldt_t001k WITH KEY bwkey = ldt_t001w-bwkey.
* CHECK sy-subrc = 0.
* CLEAR: ldf_werks.
* ldf_werks+0(3) = 'IEQ'.
* ldf_werks-low = ldt_t001w-werks.
* APPEND ldf_werks .
* ENDLOOP.
"added by yangk 20160411 end.
lv_grp = 0.
lv_rowcolor = ''.
LOOP AT gt_ifile INTO gs_ifile.
CLEAR gds_alv.
MOVE-CORRESPONDING gs_ifile TO gds_alv.
* CHECK 抬头-H 明细-I
PERFORM frm_check_length USING 1 gs_ifile-f01 '类型' 1
CHANGING gds_alv-ztype lv_tag gds_alv-msg.
* 只针对标记为抬头和明细的数据行进行处理
IF gs_ifile-f01 <> 'H' AND gs_ifile-f01 <> 'I'.
gds_alv-msg = '类型设置错误, 只能为"H"或者"I"!'.
CONTINUE.
ENDIF.
* 抬头检查
IF gs_ifile-f01 = 'H'.
PERFORM frm_check_length USING 1 gs_ifile-f02 '订单类型' 4
CHANGING gds_alv-bsart lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-bsart TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f03 'IMIS合同号' 30
CHANGING gds_alv-verkf lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-verkf TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f04 '库存采购项目号' 12
CHANGING gds_alv-ihrez lv_tag gds_alv-msg.
IF lv_tag = 0.
IF gds_alv-ihrez IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gds_alv-ihrez
IMPORTING
output = ldf_aufnr.
SELECT SINGLE aufnr
INTO ldf_aufnr
FROM aufk
WHERE aufnr = ldf_aufnr
AND autyp = '01'.
IF sy-subrc <> 0.
PERFORM frm_add_msg USING '"库存采购项目号"不是一个有效的内部订单号!' CHANGING gds_alv-msg.
ENDIF.
ENDIF.
ENDIF.
"begin add by lumingdao 20151211 注释代码
* "新加 侯鹏飞 20140625
* PERFORM frm_check_length USING 0 gs_ifile-f05 '事业部项目号' 12
* CHANGING gds_alv-unsez lv_tag gds_alv-msg.
* IF lv_tag = 0.
* IF gs_ifile-f07 ='8110' OR gs_ifile-f07 ='8120'.
* IF gds_alv-unsez IS NOT INITIAL.
* ELSE.
* PERFORM frm_add_msg USING '"事业部项目号"在通信事业部和事业五部是必填信息!' CHANGING gds_alv-msg.
* ENDIF.
* ENDIF.
* ENDIF.
"begin add by lumingdao 20151211 注释代码
"beign add by lumingdao 20151211 组织架构调整-事业部项目校验修改
"事业一部采购组织及采购组校验
PERFORM frm_check_length USING 0 gs_ifile-f05 '事业部项目号' 12
CHANGING gds_alv-unsez lv_tag gds_alv-msg.
IF lv_tag = 0.
* IF gs_ifile-f07 ='8204' AND gs_ifile-f08 = '804'.
* IF gds_alv-unsez IS NOT INITIAL.
* ELSE.
* PERFORM frm_add_msg USING '"事业部项目号"在事业一部到事业五部及招标业务部是必填信息!' CHANGING gds_alv-msg.
* ENDIF.
* ENDIF.
*
* IF gs_ifile-f07 ='8202'OR gs_ifile-f07 ='8203'OR gs_ifile-f07 ='8201'OR gs_ifile-f07 ='8205'OR gs_ifile-f07 ='8206'.
* IF gds_alv-unsez IS NOT INITIAL.
* ELSE.
* PERFORM frm_add_msg USING '"事业部项目号"在事业一部到事业五部及招标业务部是必填信息!' CHANGING gds_alv-msg.
* ENDIF.
* ENDIF.
ENDIF.
"end add by lumingdao 20151211 组织架构调整-事业部项目校验修改
"新加 侯鹏飞 20140625
PERFORM frm_check_length USING 1 gs_ifile-f06 '供应商' 10
CHANGING gds_alv-lifnr lv_tag gds_alv-msg.
PERFORM frm_check_length USING 1 gs_ifile-f07 '采购组织' 4
CHANGING gds_alv-ekorg lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-ekorg TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 1 gs_ifile-f08 '采购组' 3
CHANGING gds_alv-ekgrp lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-ekgrp TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 1 gs_ifile-f09 '公司代码' 4
CHANGING gds_alv-bukrs lv_tag gds_alv-msg.
CHECK gds_alv-bukrs+0(1) = '8'."added by yangk 20160411
PERFORM frm_check_length USING 0 gs_ifile-f10 '付款条款' 4
CHANGING gds_alv-zterm lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-zterm TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 1 gs_ifile-f11 '货币' 5
CHANGING gds_alv-waers lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-waers TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f12 '国际贸易条件1' 3
CHANGING gds_alv-inco1 lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-inco1 TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f13 '国际贸易条件2' 28
CHANGING gds_alv-inco2 lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-inco2 TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f14 '原采购订单编号' 28
CHANGING gds_alv-ebeln_o lv_tag gds_alv-msg.
* 明细数据检查
ELSEIF gs_ifile-f01 = 'I'.
PERFORM frm_check_length USING 1 gs_ifile-f15 '行项目号' 5
CHANGING gds_alv-ebelp lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f15 '行项目号'
CHANGING gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f16 '科目分配类别' 1
CHANGING gds_alv-knttp lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-knttp TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f17 '项目类别' 1
CHANGING gds_alv-pstyp lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-pstyp TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f18 '物料号' 18
CHANGING gds_alv-matnr lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-matnr TO UPPER CASE.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gs_ifile-f18
IMPORTING
output = gds_alv-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f19 '订单数量' 20
CHANGING gds_alv-menge lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_number USING gs_ifile-f19 '订单数量'
CHANGING gds_alv-menge lv_tag gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f20 '订单单位' 3
CHANGING gds_alv-meins lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-meins TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f21 '交货日期' 10
CHANGING ldf_temp lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_date USING gs_ifile-f21 '交货日期' CHANGING gds_alv-eindt gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 1 gs_ifile-f22 '含税净价' 20
CHANGING gds_alv-netpr lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_number USING gs_ifile-f22 '含税净价'
CHANGING gds_alv-netpr lv_tag gds_alv-msg.
ENDIF.
IF gs_ifile-f22 IS INITIAL.
gds_alv-peinh = '1'.
ELSE.
PERFORM frm_check_length USING 0 gs_ifile-f23 '价格单位' 5
CHANGING gds_alv-peinh lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_number USING gs_ifile-f23 '价格单位'
CHANGING gds_alv-peinh lv_tag gds_alv-msg.
ENDIF.
ENDIF.
PERFORM frm_check_length USING 1 gs_ifile-f24 '税码' 2
CHANGING gds_alv-mwskz lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-mwskz TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f25 '折扣金额' 20
CHANGING gds_alv-navnw lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_number USING gs_ifile-f25 '折扣金额'
CHANGING gds_alv-navnw lv_tag gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f26 '净价折扣%' 20
CHANGING gds_alv-navnw2 lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_number USING gs_ifile-f26 '净价折扣%'
CHANGING gds_alv-navnw2 lv_tag gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f27 '物料组' 9
CHANGING gds_alv-matkl lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-matkl TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f28 '工厂' 4
CHANGING gds_alv-werks lv_tag gds_alv-msg.
** CHECK gds_alv-werks IN ldf_werks. "added by yangk 20160411
PERFORM frm_check_length USING 1 gs_ifile-f29 '库存地点' 4
CHANGING gds_alv-lgort lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-lgort TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f30 '库存类型' 1
CHANGING gds_alv-insmk lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-insmk TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f31 '批次' 10
CHANGING gds_alv-charg lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-charg TO UPPER CASE.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f32 '退货项目' 1
CHANGING gds_alv-retpo lv_tag gds_alv-msg.
IF lv_tag = 0.
TRANSLATE gds_alv-retpo TO UPPER CASE.
ENDIF.
IF lv_tag = 0.
IF gs_ifile-f32 = '' OR gs_ifile-f32 = space OR gs_ifile-f32 = 'X'.
ELSE.
PERFORM frm_add_msg USING '退货项目只能输入空或者"X"' CHANGING gds_alv-msg.
ENDIF.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f32 '总账科目' 10
CHANGING gds_alv-hkont lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f33 '总账科目'
CHANGING gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f34 '销售订单号' 10
CHANGING gds_alv-vbeln lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f34 '销售订单号'
CHANGING gds_alv-msg.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gds_alv-vbeln
IMPORTING
output = gds_alv-vbeln.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f35 '销售订单项目' 6
CHANGING gds_alv-posnr lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f35 '销售订单项目'
CHANGING gds_alv-msg.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gds_alv-posnr
IMPORTING
output = gds_alv-posnr.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f36 '内部订单号' 12
CHANGING gds_alv-aufnr lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f36 '内部订单号'
CHANGING gds_alv-msg.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gds_alv-aufnr
IMPORTING
output = gds_alv-aufnr.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f37 '成本中心' 10
CHANGING gds_alv-kostl lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f37 '成本中心'
CHANGING gds_alv-msg.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f38 '采购申请号' 10
CHANGING gds_alv-banfn lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f38 '采购申请号'
CHANGING gds_alv-msg.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_ifile-f38
IMPORTING
output = gds_alv-banfn.
IF gs_ifile-f02 ='ZXS'.
IF gds_alv-banfn IS INITIAL.
PERFORM frm_add_msg USING '以销定采采购订单时,采购申请号 为必填!' CHANGING gds_alv-msg.
ENDIF.
ENDIF.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f39 '采购申请行项目号' 5
CHANGING gds_alv-bnfpo lv_tag gds_alv-msg.
IF lv_tag = 0.
PERFORM frm_check_numb USING gs_ifile-f39 '采购申请行项目号'
CHANGING gds_alv-msg.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_ifile-f39
IMPORTING
output = gds_alv-bnfpo.
IF gs_ifile-f02 ='ZXS'.
IF gds_alv-bnfpo IS INITIAL.
PERFORM frm_add_msg USING '以销定采采购订单时,采购申请行项目号 为必填!' CHANGING gds_alv-msg.
ENDIF.
ENDIF.
ENDIF.
PERFORM frm_check_length USING 0 gs_ifile-f40 '原采购订单及行项目编号' 50
CHANGING gds_alv-ebeln_p lv_tag gds_alv-msg.
ENDIF.
* 分组设定
IF gs_ifile-f01 = 'H'.
ADD 1 TO lv_grp.
* 颜色设定
IF lv_rowcolor = 'C500'.
lv_rowcolor = 'C210'.
ELSE.
lv_rowcolor = 'C500'.
ENDIF.
ENDIF.
gds_alv-grp = lv_grp.
gds_alv-rowcolor = lv_rowcolor.
gds_alv-id = gs_ifile-line.
IF gds_alv-msg IS NOT INITIAL.
gds_alv-light = '1'.
ENDIF.
APPEND gds_alv TO gdt_alv.
ENDLOOP.
CLEAR: gt_ifile.
REFRESH: gt_ifile.
ENDFORM. " FRM_BUILD_DATA
*&---------------------------------------------------------------------*
*& Form FRM_FILE_INPUT
*&---------------------------------------------------------------------*
* 即时执行
*----------------------------------------------------------------------*
FORM frm_file_input .
DATA: BEGIN OF ldt_sort OCCURS 10,
grp TYPE i,
tag TYPE i,
END OF ldt_sort.
DATA: ldf_from TYPE i,
ldf_index TYPE i,
ldf_count TYPE i,
ldf_ebeln TYPE ekko-ebeln,
ldf_waers TYPE ekko-waers,
ldf_msg TYPE text255.
DATA: lds_head TYPE gts_alv,
ldt_item TYPE TABLE OF gts_alv WITH HEADER LINE.
DATA: lds_num TYPE c LENGTH 5.
* 判断分组错误状态,保证每个分组中都没有错误的记录
CLEAR: ldt_sort, ldt_sort[].
LOOP AT gdt_alv INTO gds_alv WHERE msg IS NOT INITIAL.
CLEAR ldt_sort.
ldt_sort-grp = gds_alv-grp.
ldt_sort-tag = 1.
APPEND ldt_sort.
ENDLOOP.
LOOP AT gdt_alv INTO gds_alv.
READ TABLE ldt_sort WITH KEY grp = gds_alv-grp.
IF sy-subrc <> 0.
CLEAR ldt_sort.
ldt_sort-grp = gds_alv-grp.
ldt_sort-tag = 0.
APPEND ldt_sort.
ENDIF.
ENDLOOP.
DELETE ldt_sort WHERE tag = 1.
SORT ldt_sort BY grp.
* 根据分组 执行采购订单的导入操作
SORT gdt_alv BY grp id.
LOOP AT ldt_sort.
READ TABLE gdt_alv INTO gds_alv WITH KEY grp = ldt_sort-grp
BINARY SEARCH.
IF sy-subrc = 0.
ldf_from = sy-tabix.
ldf_count = 0.
CLEAR: lds_head, ldt_item, ldt_item[], ldf_waers.
LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
IF gds_alv-grp <> ldt_sort-grp.
EXIT.
ENDIF.
IF gds_alv-ztype = 'H'.
lds_head = gds_alv.
ADD 1 TO ldf_count.
ELSEIF gds_alv-ztype = 'I'.
* IF gds_alv-waers is not INITIAL.
* IF ldf_waers is INITIAL.
* ldf_waers = gds_alv-waers.
* elseif ldf_waers <> gds_alv-waers.
* ldf_waers = 'XXX'.
* ENDIF.
* ENDIF.
APPEND gds_alv TO ldt_item.
ENDIF.
ENDLOOP.
* lds_head-waers = ldf_waers.
* IF ldf_waers is INITIAL or ldf_waers = 'XXX'.
* LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
* ldf_index = sy-tabix.
* IF gds_alv-grp <> ldt_sort-grp.
* EXIT.
* ENDIF.
* gds_alv-light = '1'.
* gds_alv-msg = '同一张凭证中的币种必需一致!'.
* MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
* ENDLOOP.
* CONTINUE.
* ENDIF.
* 抬头信息错误
IF ldf_count <> 1.
LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
ldf_index = sy-tabix.
IF gds_alv-grp <> ldt_sort-grp.
EXIT.
ENDIF.
gds_alv-light = '1'.
IF ldf_count = 0.
gds_alv-msg = '缺少抬头信息'.
ELSE.
gds_alv-msg = '只需要一条抬头信息'.
ENDIF.
MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
ENDLOOP.
CONTINUE.
ENDIF.
* 缺少明细数据
IF ldt_item[] IS INITIAL.
LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
ldf_index = sy-tabix.
IF gds_alv-grp <> ldt_sort-grp.
EXIT.
ENDIF.
gds_alv-light = '1'.
gds_alv-msg = '缺少明细信息'.
MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
ENDLOOP.
CONTINUE.
ENDIF.
* 创建 PO
CLEAR:gdt_item_n,gdt_item_n[],lds_num.
PERFORM frm_create_po TABLES ldt_item USING lds_head CHANGING ldf_ebeln ldf_msg .
IF ldf_ebeln IS INITIAL.
LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
ldf_index = sy-tabix.
IF gds_alv-grp <> ldt_sort-grp.
EXIT.
ENDIF.
gds_alv-light = '1'.
gds_alv-msg = ldf_msg.
MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING light msg.
ENDLOOP.
ELSE.
LOOP AT gdt_alv INTO gds_alv FROM ldf_from.
ldf_index = sy-tabix.
IF gds_alv-grp <> ldt_sort-grp.
EXIT.
ENDIF.
gds_alv-light = '3'.
gds_alv-ebeln = ldf_ebeln.
CONCATENATE '创建成功,采购订单号:' ldf_ebeln INTO gds_alv-msg.
gds_alv-f42 = ldf_ebeln.
IF lds_num IS NOT INITIAL.
gds_alv-f43 = lds_num.
ENDIF.
lds_num = lds_num + 10.
MODIFY gdt_alv FROM gds_alv INDEX ldf_index TRANSPORTING ebeln light msg f42 f43.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR: ldt_sort, ldt_sort[].
CLEAR: lds_head, ldt_item, ldt_item[].
ENDFORM. " FRM_FILE_INPUT
*&---------------------------------------------------------------------*
*& Form FRM_FILE_outPUT
*&---------------------------------------------------------------------*
* 数据导出 -- 反馈错误日志
*----------------------------------------------------------------------*
FORM frm_file_output USING im_ifile TYPE ibipparms-path
im_startrow TYPE i
CHANGING ex_tag TYPE i
ex_msg TYPE text255.
DATA: ldf_filename TYPE text255,
ls_fieldcat TYPE zexcel_s_fieldcat,
lt_fieldcat TYPE zexcel_t_fieldcat.
DATA: ldf_count TYPE i,
ldf_row TYPE i,
ldf_col TYPE i,
ldf_title TYPE text255.
DATA: ldt_alv TYPE TABLE OF gts_alv WITH HEADER LINE.
ldf_filename = im_ifile.
* 打开文件
CALL FUNCTION 'ZEXCEL_START'
EXPORTING
filename = ldf_filename
IMPORTING
subrc = ex_tag
msg = ex_msg.
CHECK ex_tag = 0.
CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
ls_fieldcat-fname = 'MSG'.
ls_fieldcat-coltext = '错误日志'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ldt_alv.
ldf_row = im_startrow.
LOOP AT gdt_alv INTO gds_alv.
DO.
IF gds_alv-id > ldf_row.
APPEND ldt_alv.
ADD 1 TO ldf_row.
ELSE.
EXIT.
ENDIF.
ENDDO.
APPEND gds_alv TO ldt_alv.
ADD 1 TO ldf_row.
ENDLOOP.
"added by yangk 20151220 begin
CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
ls_fieldcat-fname = 'F42'.
ls_fieldcat-coltext = '新采购订单编号'.
APPEND ls_fieldcat TO lt_fieldcat.
ldf_row = im_startrow.
ldf_col = 42.
CALL FUNCTION 'ZEXCEL_FILL_ITAB'
EXPORTING
row = ldf_row
column = ldf_col
fieldcat = lt_fieldcat
autoheader = 0
IMPORTING
subrc = ex_tag
msg = ex_msg
TABLES
itab = ldt_alv.
CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
ls_fieldcat-fname = 'F43'.
ls_fieldcat-coltext = '新采购订单行项目号'.
APPEND ls_fieldcat TO lt_fieldcat.
ldf_row = im_startrow.
ldf_col = 43.
CALL FUNCTION 'ZEXCEL_FILL_ITAB'
EXPORTING
row = ldf_row
column = ldf_col
fieldcat = lt_fieldcat
autoheader = 0
IMPORTING
subrc = ex_tag
msg = ex_msg
TABLES
itab = ldt_alv.
"added by yangk 20151220 end
CLEAR: ls_fieldcat, lt_fieldcat, lt_fieldcat[].
ls_fieldcat-fname = 'MSG'.
ls_fieldcat-coltext = '错误日志'.
APPEND ls_fieldcat TO lt_fieldcat.
ldf_row = im_startrow.
ldf_col = gdc_maxcolumn + 1.
CALL FUNCTION 'ZEXCEL_FILL_ITAB'
EXPORTING
row = ldf_row
column = ldf_col
fieldcat = lt_fieldcat
autoheader = 0
IMPORTING
subrc = ex_tag
msg = ex_msg
TABLES
itab = ldt_alv.
CLEAR: ldt_alv, ldt_alv[].
* 结束Excel
CALL FUNCTION 'ZEXCEL_END'
EXPORTING
visible = 1
saves = 1
* FILENAME = LDF_FILENAME
close = 1
IMPORTING
subrc = ex_tag
msg = ex_msg.
ENDFORM. " FRM_FILE_outPUT
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
* 显示alv界面
*----------------------------------------------------------------------*
FORM frm_display_lvc.
* 设定报表输出样式。
PERFORM set_layout_lvc.
* 设定报表列标题格式
PERFORM set_fieldcat_lvc.
* 输出ALV报表
PERFORM alv_grid_display_lvc.
ENDFORM. " FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form SET_LAYOUT_LVC
*&---------------------------------------------------------------------*
* 设定报表输出样式。
*----------------------------------------------------------------------*
FORM set_layout_lvc.
CLEAR: gds_alv_layout_lvc.
* 设置Grid的字段列宽度自动适应
gds_alv_layout_lvc-cwidth_opt = 'X'.
* 设置Grid的行颜色变换显示
gds_alv_layout_lvc-zebra = 'X'.
* 置弹出窗口的标题栏
gds_alv_layout_lvc-detailtitl = '详细内容'.
* 设置Grid的多行选择列,其中BOX必须为内表的一列,为一个字符长度
gds_alv_layout_lvc-box_fname = 'SEL'.
* 行颜色字段设置
gds_alv_layout_lvc-info_fname = 'ROWCOLOR'.
* 信号灯设置
gds_alv_layout_lvc-excp_fname = 'LIGHT'.
ENDFORM. " SET_LAYOUT_LVC
*&---------------------------------------------------------------------*
*& Form SET_FIELDCAT_LVC
*&---------------------------------------------------------------------*
* 设定报表列标题格式
*----------------------------------------------------------------------*
FORM set_fieldcat_lvc.
* ------ initial valuation
CLEAR gdt_alv_fieldcat_lvc.
REFRESH gdt_alv_fieldcat_lvc.
gdf_alv_col_pos = 0.
DEFINE fieldcat_macro.
gdf_alv_col_pos = gdf_alv_col_pos + 1.
gds_alv_fieldcat_lvc-tabname = 'GDT_ALV'.
gds_alv_fieldcat_lvc-fieldname = '&1'.
gds_alv_fieldcat_lvc-scrtext_l = &2.
gds_alv_fieldcat_lvc-key = &3.
gds_alv_fieldcat_lvc-emphasize = &4.
gds_alv_fieldcat_lvc-no_out = &5.
gds_alv_fieldcat_lvc-edit = &6.
* gds_alv_fieldcat_lvc-hotspot = &6.
* GdS_ALV_FIELDCAT_LVC-DECIMALS_O = &6.
* GdS_ALV_FIELDCAT_LVC-DECIMALS = &6.
* gds_alv_fieldcat_lvc-checkbox = &6.
* gds_alv_fieldcat_lvc-cwidth_opt = &6.
gds_alv_fieldcat_lvc-outputlen = &7.
gds_alv_fieldcat_lvc-no_zero = &8.
gds_alv_fieldcat_lvc-just = &9.
gds_alv_fieldcat_lvc-col_pos = gdf_alv_col_pos.
append gds_alv_fieldcat_lvc to gdt_alv_fieldcat_lvc.
clear gds_alv_fieldcat_lvc.
END-OF-DEFINITION.
* 列标题设定
fieldcat_macro msg '消息' '' 'C700' '' '' '' '' ''.
fieldcat_macro ebeln '采购订单' '' 'C510' '' '' '' '' ''.
fieldcat_macro ztype '类型' '' '' '' '' '' '' ''.
fieldcat_macro bsart '订单类型' '' '' '' '' '' '' ''.
fieldcat_macro verkf 'IMIS合同号' '' '' '' '' '' '' ''.
fieldcat_macro ihrez '库存采购项目号' '' '' '' '' '' '' ''.
fieldcat_macro unsez '事业部项目号' '' '' '' '' '' '' ''. "新加
fieldcat_macro lifnr '供应商' '' '' '' '' '' '' ''.
fieldcat_macro ekorg '采购组织' '' '' '' '' '' '' ''.
fieldcat_macro ekgrp '采购组' '' '' '' '' '' '' ''.
fieldcat_macro bukrs '公司代码' '' '' '' '' '' '' ''.
fieldcat_macro zterm '付款条款' '' '' '' '' '' '' ''.
fieldcat_macro inco1 '国际贸易条件1' '' '' '' '' '' '' ''.
fieldcat_macro inco2 '国际贸易条件2' '' '' '' '' '' '' ''.
fieldcat_macro ebelp '行项目号' '' '' '' '' '' '' ''.
fieldcat_macro knttp '科目分配类别' '' '' '' '' '' '' ''.
fieldcat_macro pstyp '项目类别' '' '' '' '' '' '' ''.
fieldcat_macro matnr '物料号' '' '' '' '' '' '' ''.
fieldcat_macro menge '订单数量' '' 'C300' '' '' '' '' ''.
fieldcat_macro meins '订单单位' '' '' '' '' '' '' ''.
fieldcat_macro eindt '交货日期' '' '' '' '' '' '' ''.
fieldcat_macro netpr '含税净价' '' 'C300' '' '' '' '' ''.
fieldcat_macro peinh '价格单位' '' '' '' '' '' '' ''.
fieldcat_macro mwskz '税码' '' '' '' '' '' '' ''.
fieldcat_macro waers '货币' '' '' '' '' '' '' ''.
fieldcat_macro navnw '折扣金额' '' 'C300' '' '' '' '' ''.
fieldcat_macro matkl '物料组(如果无料号)' '' '' '' '' '' '' ''.
fieldcat_macro werks '工厂' '' '' '' '' '' '' ''.
fieldcat_macro lgort '库存地点' '' '' '' '' '' '' ''.
fieldcat_macro insmk '库存类型' '' '' '' '' '' '' ''.
fieldcat_macro charg '批次' '' '' '' '' '' '' ''.
fieldcat_macro retpo '退货项目' '' '' '' '' '' '' ''.
fieldcat_macro hkont '总账科目' '' '' '' '' '' '' ''.
fieldcat_macro vbeln '销售订单号' '' '' '' '' '' '' ''.
fieldcat_macro posnr '销售订单行项目号' '' '' '' '' '' '' ''.
fieldcat_macro aufnr '内部订单号' '' '' '' '' '' '' ''.
fieldcat_macro kostl '成本中心' '' '' '' '' '' '' ''.
fieldcat_macro banfn '采购申请号' '' '' '' '' '' '' ''.
fieldcat_macro bnfpo '采购申请行项目号' '' '' '' '' '' '' ''.
* 其他项目补充
CALL FUNCTION 'ZTOOL_BUILD_FIELDCAT'
EXPORTING
im_fieldcat = gdt_alv_fieldcat_lvc
IMPORTING
fieldcat = gdt_alv_fieldcat_lvc
TABLES
itab = gdt_alv.
ENDFORM. " SET_FIELDCAT_LVC
*&---------------------------------------------------------------------*
*& Form ALV_GRID_DISPLAY_LVC
*&---------------------------------------------------------------------*
* 输出ALV报表
*----------------------------------------------------------------------*
FORM alv_grid_display_lvc.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF_STATUS_LVC'
i_callback_user_command = 'USER_COMMAND_LVC'
is_layout_lvc = gds_alv_layout_lvc "设定报表输出样式。
it_fieldcat_lvc = gdt_alv_fieldcat_lvc[]
* it_sort_lvc = gdt_alv_sortinfo_lvc
i_default = 'X'
i_save = 'A' "设定是否可以保存报表布局
* i_html_height_top = 12
* i_html_height_end = 8
TABLES
t_outtab = gdt_alv[]
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. " ALV_GRID_DISPLAY_LVC
*&---------------------------------------------------------------------*
*& Form PF_STATUS_SET_LVC
*&---------------------------------------------------------------------*
* 定义用户自定义的屏幕菜单。
*----------------------------------------------------------------------*
FORM set_pf_status_lvc USING im_extab TYPE slis_t_extab.
DATA: l_count TYPE i.
DATA: ldt_fcode TYPE TABLE OF sy-ucomm.
CLEAR: ldt_fcode.
REFRESH: ldt_fcode.
DESCRIBE TABLE gdt_alv[] LINES l_count.
SET TITLEBAR 'TITLE' WITH l_count.
* APPEND '&SUM' TO ldt_fcode. " 小计
* APPEND '&ABC' TO ldt_fcode. " ABC分析
* APPEND '&GRAPH' TO ldt_fcode. " 图形分析
APPEND 'REFR' TO ldt_fcode. " 刷新
APPEND 'SAVE' TO ldt_fcode. " 保存
SET PF-STATUS 'STANDARD' EXCLUDING ldt_fcode.
ENDFORM. "SET_PF_STATUS_LVC
*&---------------------------------------------------------------------*
*& Form USER_COMMAND_LVC
*&---------------------------------------------------------------------*
* 响应菜单项及相应事件。
*----------------------------------------------------------------------*
FORM user_command_lvc USING im_ucomm TYPE sy-ucomm
im_filecat TYPE slis_selfield.
DATA: lv_tag TYPE i.
CASE im_ucomm .
* 返回/退出
WHEN 'BACK' OR 'EXIT'.
LEAVE TO SCREEN 0.
WHEN 'CANCEL'.
LEAVE PROGRAM.
* 刷新
* WHEN 'REFR'.
** 从数据表取数据并整理
* PERFORM get_data.
* IF gdt_alv[] IS INITIAL.
* MESSAGE i001. " 没有找到相关的数据!
* LEAVE TO SCREEN 0.
* ELSE.
* im_filecat-refresh = 'X'.
* ENDIF.
* 双击
WHEN '&IC1' .
READ TABLE gdt_alv INTO gds_alv INDEX im_filecat-tabindex.
IF sy-subrc = 0.
PERFORM frm_alv_dbclick USING gds_alv im_filecat CHANGING lv_tag.
* IF lv_tag <> 0.
* ENDIF.
ENDIF .
WHEN OTHERS.
ENDCASE.
ENDFORM. "user_command_lvc
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_PO
*&---------------------------------------------------------------------*
* 创建 PO
*----------------------------------------------------------------------*
FORM frm_create_po TABLES it_item TYPE gtt_alv
USING is_head TYPE gts_alv
CHANGING ex_ebeln TYPE ekko-ebeln
ex_msg TYPE text255.
DATA: lds_head TYPE bapimepoheader,
lds_headx TYPE bapimepoheaderx.
DATA: ldt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
ldt_item TYPE TABLE OF bapimepoitem WITH HEADER LINE,
ldt_itemx TYPE TABLE OF bapimepoitemx WITH HEADER LINE,
ldt_plan TYPE TABLE OF bapimeposchedule WITH HEADER LINE,
ldt_planx TYPE TABLE OF bapimeposchedulx WITH HEADER LINE,
ldt_account TYPE TABLE OF bapimepoaccount WITH HEADER LINE,
ldt_accountx TYPE TABLE OF bapimepoaccountx WITH HEADER LINE,
ldt_cond TYPE TABLE OF bapimepocond WITH HEADER LINE,
ldt_condx TYPE TABLE OF bapimepocondx WITH HEADER LINE.
CLEAR: ex_ebeln, ex_msg, lds_head, lds_headx.
CLEAR: ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
ldt_account, ldt_accountx, ldt_cond, ldt_condx.
REFRESH: ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
ldt_account, ldt_accountx, ldt_cond, ldt_condx.
* 抬头信息
lds_head-comp_code = is_head-bukrs.
lds_head-doc_type = is_head-bsart.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = is_head-lifnr
IMPORTING
output = lds_head-vendor.
* 付款条件
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = is_head-zterm
IMPORTING
output = lds_head-pmnttrms.
lds_head-purch_org = is_head-ekorg.
lds_head-pur_group = is_head-ekgrp.
lds_head-ref_1 = is_head-ihrez.
lds_head-our_ref = is_head-unsez. "新加
lds_head-sales_pers = is_head-verkf.
lds_head-incoterms1 = is_head-inco1.
lds_head-incoterms2 = is_head-inco2.
lds_head-currency = is_head-waers.
lds_head-telephone = is_head-ebeln_o."added by yangk 20151224
* lds_head-po_rel_ind = 'X'.
* lds_headx-po_rel_ind = 'X'.
lds_headx-telephone = 'X'."added by yangk 20151224
lds_headx-comp_code = 'X'.
lds_headx-doc_type = 'X'.
lds_headx-vendor = 'X'.
lds_headx-pmnttrms = 'X'.
lds_headx-purch_org = 'X'.
lds_headx-pur_group = 'X'.
IF is_head-ihrez IS NOT INITIAL.
lds_headx-ref_1 = 'X'.
ENDIF.
lds_headx-our_ref = 'X'.
lds_headx-sales_pers = 'X'.
lds_headx-incoterms1 = 'X'.
lds_headx-incoterms2 = 'X'.
lds_headx-currency = 'X'.
* 明细数据
LOOP AT it_item.
CLEAR ldt_item.
ldt_item-po_item = it_item-ebelp.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = it_item-matnr
IMPORTING
output = ldt_item-material
EXCEPTIONS
length_error = 1
OTHERS = 2.
ldt_item-plant = it_item-werks.
ldt_item-stge_loc = it_item-lgort.
ldt_item-batch = it_item-charg.
ldt_item-matl_group = it_item-matkl. " 物料组
ldt_item-quantity = it_item-menge.
ldt_item-po_unit = it_item-meins.
ldt_item-net_price = it_item-netpr.
ldt_item-price_unit = it_item-peinh.
ldt_item-item_cat = it_item-pstyp.
ldt_item-acctasscat = it_item-knttp.
ldt_item-ret_item = it_item-retpo.
ldt_item-tax_code = it_item-mwskz. " 税代码
ldt_item-gr_to_date = it_item-eindt.
ldt_item-qual_insp = it_item-insmk.
ldt_item-preq_no = it_item-banfn. " 采购申请编号
ldt_item-preq_item = it_item-bnfpo. " 采购申请的项目编号
ldt_item-vend_mat = it_item-ebeln_p. "原采购订单+行项目 "added by yangk 20151224
APPEND ldt_item.
CLEAR ldt_itemx.
ldt_itemx-po_item = it_item-ebelp.
ldt_itemx-po_itemx = 'X'.
ldt_itemx-vend_mat = 'X'. "added by yangk 20151224
IF ldt_item-preq_no IS INITIAL.
ldt_itemx-material = 'X'.
ldt_itemx-plant = 'X'.
ldt_itemx-matl_group = 'X'.
ldt_itemx-quantity = 'X'.
ldt_itemx-po_unit = 'X'.
ldt_itemx-item_cat = 'X'.
ldt_itemx-acctasscat = 'X'.
ldt_itemx-ret_item = 'X'.
ENDIF.
ldt_itemx-stge_loc = 'X'.
ldt_itemx-batch = 'X'.
ldt_itemx-net_price = 'X'.
ldt_itemx-price_unit = 'X'.
ldt_itemx-tax_code = 'X'.
IF ldt_item-gr_to_date IS NOT INITIAL.
ldt_itemx-gr_to_date = 'X'.
ENDIF.
ldt_itemx-qual_insp = 'X'.
ldt_itemx-preq_no = 'X'. " 采购申请编号
ldt_itemx-preq_item = 'X'. " 采购申请的项目编号
APPEND ldt_itemx.
IF it_item-eindt IS NOT INITIAL.
CLEAR ldt_plan.
ldt_plan-po_item = it_item-ebelp.
ldt_plan-sched_line = 1.
ldt_plan-del_datcat_ext = 'D'.
WRITE it_item-eindt TO ldt_plan-delivery_date.
ldt_plan-quantity = it_item-menge.
ldt_plan-stat_date = it_item-eindt.
APPEND ldt_plan.
CLEAR ldt_planx.
ldt_planx-po_item = it_item-ebelp.
ldt_planx-sched_line = 1.
ldt_planx-po_itemx = 'X'.
ldt_planx-sched_linex = 'X'.
ldt_planx-del_datcat_ext = 'X'.
ldt_planx-delivery_date = 'X'.
IF ldt_plan-quantity IS NOT INITIAL.
ldt_planx-quantity = 'X'.
ENDIF.
ldt_planx-stat_date = 'X'.
APPEND ldt_planx.
ENDIF.
IF it_item-navnw IS NOT INITIAL.
CLEAR ldt_cond.
ldt_cond-itm_number = it_item-ebelp.
ldt_cond-cond_st_no = 1.
ldt_cond-cond_type = 'RB00'. " 绝对折扣
ldt_cond-cond_value = it_item-navnw.
ldt_cond-currency = is_head-waers.
* ldt_cond-COND_UNIT = it_item-meins.
* ldt_cond-CONBASEVAL = 1.
* ldt_cond-NUMCONVERT = 1.
* ldt_cond-DENOMINATO = 1.
ldt_cond-change_id = 'I'.
APPEND ldt_cond.
CLEAR ldt_condx.
ldt_condx-itm_number = it_item-ebelp.
ldt_condx-cond_st_no = 1.
ldt_condx-itm_numberx = 'X'.
ldt_condx-cond_st_nox = 'X'.
ldt_condx-cond_type = 'X'.
ldt_condx-cond_value = 'X'.
ldt_condx-currency = 'X'.
* ldt_condx-COND_UNIT = 'X'.
* ldt_condx-CONBASEVAL = 'X'.
* ldt_condx-NUMCONVERT = 'X'.
* ldt_condx-DENOMINATO = 'X'.
ldt_condx-change_id = 'X'.
APPEND ldt_condx.
ENDIF.
IF it_item-navnw2 IS NOT INITIAL.
CLEAR ldt_cond.
ldt_cond-itm_number = it_item-ebelp.
ldt_cond-cond_st_no = 1.
ldt_cond-cond_type = 'RA00'. " 净价折扣%
ldt_cond-cond_value = it_item-navnw2.
ldt_cond-currency = '%'.
* ldt_cond-COND_UNIT = it_item-meins.
* ldt_cond-CONBASEVAL = 1.
* ldt_cond-NUMCONVERT = 1.
* ldt_cond-DENOMINATO = 1.
ldt_cond-change_id = 'I'.
APPEND ldt_cond.
CLEAR ldt_condx.
ldt_condx-itm_number = it_item-ebelp.
ldt_condx-cond_st_no = 1.
ldt_condx-itm_numberx = 'X'.
ldt_condx-cond_st_nox = 'X'.
ldt_condx-cond_type = 'X'.
ldt_condx-cond_value = 'X'.
ldt_condx-currency = 'X'.
* ldt_condx-COND_UNIT = 'X'.
* ldt_condx-CONBASEVAL = 'X'.
* ldt_condx-NUMCONVERT = 'X'.
* ldt_condx-DENOMINATO = 'X'.
ldt_condx-change_id = 'X'.
APPEND ldt_condx.
ENDIF.
IF it_item-hkont IS NOT INITIAL
OR it_item-vbeln IS NOT INITIAL
OR it_item-aufnr IS NOT INITIAL
OR it_item-kostl IS NOT INITIAL.
CLEAR ldt_account.
ldt_account-po_item = it_item-ebelp.
ldt_account-serial_no = 1.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_item-hkont
IMPORTING
output = ldt_account-gl_account.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_item-vbeln
IMPORTING
output = ldt_account-sd_doc.
ldt_account-itm_number = it_item-posnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_item-aufnr
IMPORTING
output = ldt_account-orderid.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = it_item-kostl
IMPORTING
output = ldt_account-costcenter.
APPEND ldt_account.
CLEAR ldt_accountx.
ldt_accountx-po_item = it_item-ebelp.
ldt_accountx-serial_no = 1.
ldt_accountx-po_itemx = 'X'.
ldt_accountx-serial_nox = 'X'.
ldt_accountx-gl_account = 'X'.
ldt_accountx-sd_doc = 'X'.
ldt_accountx-itm_number = 'X'.
ldt_accountx-orderid = 'X'.
ldt_accountx-costcenter = 'X'.
APPEND ldt_accountx.
ENDIF.
ENDLOOP.
* navnw TYPE char25,
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = lds_head
poheaderx = lds_headx
* POADDRVENDOR =
* TESTRUN =
* MEMORY_UNCOMPLETE =
* MEMORY_COMPLETE =
* POEXPIMPHEADER =
* POEXPIMPHEADERX =
* VERSIONS =
* NO_MESSAGING =
* NO_MESSAGE_REQ =
* NO_AUTHORITY =
no_price_from_po = 'X'
* PARK_COMPLETE =
* PARK_UNCOMPLETE =
IMPORTING
exppurchaseorder = ex_ebeln
* EXPHEADER =
* EXPPOEXPIMPHEADER =
TABLES
return = ldt_return[]
poitem = ldt_item[]
poitemx = ldt_itemx[]
* POADDRDELIVERY =
poschedule = ldt_plan[]
poschedulex = ldt_planx[]
poaccount = ldt_account[]
* POACCOUNTPROFITSEGMENT =
poaccountx = ldt_accountx[]
* POCONDHEADER =
* POCONDHEADERX =
pocond = ldt_cond
pocondx = ldt_condx
* POLIMITS =
* POCONTRACTLIMITS =
* POSERVICES =
* POSRVACCESSVALUES =
* POSERVICESTEXT =
* EXTENSIONIN =
* EXTENSIONOUT =
* POEXPIMPITEM =
* POEXPIMPITEMX =
* POTEXTHEADER =
* POTEXTITEM =
* ALLVERSIONS =
* POPARTNER =
* POCOMPONENTS =
* POCOMPONENTSX =
* POSHIPPING =
* POSHIPPINGX =
* POSHIPPINGEXP =
* SERIALNUMBER =
* SERIALNUMBERX =
* INVPLANHEADER =
* INVPLANHEADERX =
* INVPLANITEM =
* INVPLANITEMX =
.
IF ex_ebeln IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
SORT ldt_return BY type id number message.
DELETE ADJACENT DUPLICATES FROM ldt_return COMPARING type id number message.
LOOP AT ldt_return WHERE type = 'E'.
PERFORM frm_add_msg USING ldt_return-message CHANGING ex_msg.
ENDLOOP.
LOOP AT ldt_return WHERE type <> 'E' AND type <> 'I'.
PERFORM frm_add_msg USING ldt_return-message CHANGING ex_msg.
ENDLOOP.
ELSE.
gdt_item_n[] = ldt_item[]. "added by yangk 20151230
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
CLEAR: ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
ldt_account, ldt_accountx, ldt_cond, ldt_condx.
REFRESH: ldt_return, ldt_item, ldt_itemx, ldt_plan, ldt_planx,
ldt_account, ldt_accountx, ldt_cond, ldt_condx.
ENDFORM. " FRM_CREATE_PO
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_NUMB
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_check_numb USING im_value TYPE c
im_desc TYPE c
CHANGING ex_msg TYPE gts_alv-msg.
DATA: lv_temp TYPE text255.
CALL FUNCTION 'ZTOOL_GET_NUMCHAR'
EXPORTING
im_char = im_value
EXCEPTIONS
not_number = 1
OTHERS = 2.
IF sy-subrc <> 0.
CONCATENATE '“' im_desc '”不是数字' INTO lv_temp.
PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
ENDIF.
ENDFORM. " FRM_CHECK_NUMB
INCLUDE zslis. 详细代码如下
:
*&---------------------------------------------------------------------*
*& Include ZSLIS
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 程序名称: ALV公用包含程序段
* 作者 : 王俊岭
* 时间 : 2013-11-07
* 模块 : 通用
* 描述 : ALV报表常用变量定义等
* 特殊特性: 无
*----------------------------------------------------------------------*
* 修改记录:
* 作者 时间 描述 请求号
* ------ ---------- ---------------------------------------- ----------*
*
*----------------------------------------------------------------------*
*&------------------------------------------------------------
*& ALV data declarations.
*&------------------------------------------------------------
INCLUDE <icon>.
INCLUDE <symbol>.
TYPE-POOLS slis.
TYPES: BEGIN OF ty_alv_color,
ch1 TYPE char1,
ch2 TYPE char1,
ch3 TYPE char1,
ch4 TYPE char1,
END OF ty_alv_color.
DATA: gds_alv_layout TYPE slis_layout_alv,
gds_alv_layout_lvc TYPE lvc_s_layo,
gds_alv_layout_lv2 TYPE lvc_s_layo,
gds_alv_layout_lv3 TYPE lvc_s_layo.
DATA: gds_alv_grid TYPE lvc_s_glay.
DATA: gds_alv_fieldcat TYPE slis_fieldcat_alv,
gdt_alv_fieldcat TYPE TABLE OF slis_fieldcat_alv,
gdt_alv_fieldca1 TYPE TABLE OF slis_fieldcat_alv,
gdt_alv_fieldca2 TYPE TABLE OF slis_fieldcat_alv,
gdt_alv_fieldca3 TYPE TABLE OF slis_fieldcat_alv,
gdt_alv_fieldca4 TYPE TABLE OF slis_fieldcat_alv,
gdt_alv_fieldcat_item TYPE TABLE OF slis_fieldcat_alv,
gdt_alv_fieldcat_msg TYPE TABLE OF slis_fieldcat_alv.
DATA: gds_alv_fieldcat_lvc TYPE lvc_s_fcat,
gdt_alv_fieldcat_lvc TYPE lvc_t_fcat,
gdt_alv_fieldcat_lv2 TYPE lvc_t_fcat,
gdt_alv_fieldcat_lv3 TYPE lvc_t_fcat,
gdt_alv_fieldcat_lv4 TYPE lvc_t_fcat.
DATA: gds_alv_sortinfo TYPE slis_sortinfo_alv,
gdt_alv_sortinfo TYPE slis_t_sortinfo_alv.
DATA: gds_alv_sortinfo_lvc TYPE lvc_s_sort,
gdt_alv_sortinfo_lvc TYPE lvc_t_sort,
gdt_alv_sortinfo_lv2 TYPE lvc_t_sort,
gdt_alv_sortinfo_lv3 TYPE lvc_t_sort.
DATA: gdt_alv_top_of_page TYPE slis_t_listheader.
DATA: gds_alv_print TYPE slis_print_alv.
DATA: gds_alv_event TYPE slis_alv_event,
gdt_alv_event TYPE slis_t_event.
DATA: gdf_alv_col_pos TYPE i,
gdf_alv_fieldcat_val TYPE text10.
DATA: gds_alv_color TYPE slis_specialcol_alv,
gds_alv_cellcolor TYPE ty_alv_color,
gds_alv_style TYPE lvc_s_styl..
DATA: gdo_alv_grid TYPE REF TO cl_gui_alv_grid,
gdo_alv_igrid TYPE REF TO cl_gui_alv_grid.
DATA: gdo_alv_screen TYPE REF TO cl_gui_alv_grid.
DATA: gdo_alv_descr TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <gdf_alv_value> TYPE any,
<gdf_alv_line> TYPE any.
*&---------------------------------------------------------------------*
*& Form ALV_CHECK_VALUE
*&---------------------------------------------------------------------*
* 获取改变后的值
*----------------------------------------------------------------------*
FORM alv_check_value.
IF gdo_alv_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = gdo_alv_grid.
ENDIF.
IF NOT gdo_alv_grid IS INITIAL.
CALL METHOD gdo_alv_grid->check_changed_data.
ENDIF.
ENDFORM. " ALV_CHECK_VALUE
*&---------------------------------------------------------------------*
*& Form ALV_REJUST_LAYOUT_WIDTH
*&---------------------------------------------------------------------*
* 重新调整列宽
*----------------------------------------------------------------------*
FORM alv_rejust_layout_width.
DATA: lv_layout TYPE lvc_s_layo.
IF gdo_alv_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = gdo_alv_grid.
ENDIF.
IF NOT gdo_alv_grid IS INITIAL.
CALL METHOD gdo_alv_grid->get_frontend_layout
IMPORTING
es_layout = lv_layout.
lv_layout-cwidth_opt = 'X'. " 设置Grid的字段列宽度自动适应
CALL METHOD gdo_alv_grid->set_frontend_layout
EXPORTING
is_layout = lv_layout.
ENDIF.
ENDFORM. " ALV_REJUST_LAYOUT_WIDTH
*&---------------------------------------------------------------------*
*& Form ALV_CHECK_ITEMVALUE
*&---------------------------------------------------------------------*
* 获取改变后的值
*----------------------------------------------------------------------*
FORM alv_check_itemvalue.
IF gdo_alv_igrid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = gdo_alv_igrid.
ENDIF.
IF NOT gdo_alv_igrid IS INITIAL.
CALL METHOD gdo_alv_igrid->check_changed_data.
ENDIF.
ENDFORM. " ALV_CHECK_ITEMVALUE
*&---------------------------------------------------------------------*
*& Form frm_alv_dbclick
*&---------------------------------------------------------------------*
* 检查并进入相关业务界面
*----------------------------------------------------------------------*
FORM frm_alv_dbclick USING is_line TYPE any
im_filecat TYPE slis_selfield
CHANGING ex_tag TYPE i.
DATA: lv_tag TYPE i.
* 全局变量赋值
ASSIGN is_line TO <gdf_alv_line>.
* 初始化
ex_tag = 0.
lv_tag = 0.
* 根据点击的不同字段,跳转到相应的tcode.
CASE im_filecat-fieldname.
*==================================== MM 采购 =========================
WHEN 'EBELN'. " 采购订单
PERFORM frm_set_param_id USING 'BES' 'EBELN' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'ME23N' CHANGING lv_tag.
WHEN 'MATNR' OR 'MAKTX'. " 物料代码
PERFORM frm_set_param_id USING 'MAT' 'MATNR' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'MM03' CHANGING lv_tag.
WHEN 'MBLNR' OR 'MJAHR'. " 物料凭证
PERFORM frm_set_param_id USING 'MBN' 'MBLNR' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'MJA' 'MJAHR' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'MB03' CHANGING lv_tag.
*==================================== SD 采购 =========================
WHEN 'VBELN'. " 销售订单
PERFORM frm_set_param_id USING 'AUN' 'VBELN' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'VA03' CHANGING lv_tag.
* when 'VBELN'. " 发货单
* PERFORM frm_set_param_id USING 'VL' 'VBELN' CHANGING lv_tag.
* PERFORM frm_turnto_tcode USING 'VL03N' CHANGING lv_tag.
WHEN 'KUNNR'. " 客户
PERFORM frm_set_param_id USING 'KUN' 'KUNNR' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'XD03' CHANGING lv_tag.
WHEN 'BLRQNO'. " 金税发票
PERFORM frm_set_param_id USING 'ZBLRQ' 'BLRQNO' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'ZSD007' CHANGING lv_tag.
*==================================== FI 财务 =========================
WHEN 'BELNR' OR 'GJAHR'. " 会计凭证
PERFORM frm_set_param_id USING 'BLN' 'BELNR' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'BUK' 'BUKRS' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'GJR' 'GJAHR' CHANGING lv_tag.
* PERFORM frm_turnto_tcode USING 'FB03' CHANGING lv_tag.
SET PARAMETER ID 'GLN_FLEX' FIELD '0L'.
CALL TRANSACTION 'IDCNFB03'.
WHEN 'BELNR2' OR 'GJAHR2'. " 会计凭证
PERFORM frm_set_param_id USING 'BLN' 'BELNR2' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'BUK' 'BUKRS2' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'GJR' 'GJAHR2' CHANGING lv_tag.
* PERFORM frm_turnto_tcode USING 'FB03' CHANGING lv_tag.
SET PARAMETER ID 'GLN_FLEX' FIELD '0L'.
CALL TRANSACTION 'IDCNFB03'.
*==================================== PM 设备 =========================
WHEN 'EQUNR' OR 'EQKTX'. " 设备号
PERFORM frm_set_param_id USING 'EQN' 'EQUNR' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'IE03' CHANGING lv_tag.
WHEN 'PLNNR' OR 'PLNTY' OR 'PLNAL'. " 设备任务清单
PERFORM frm_set_param_id USING 'PLN' 'PLNNR' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'PTY' 'PLNTY' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'PAL' 'PLNAL' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'IA07' CHANGING lv_tag.
*==================================== PM 设备维修 =====================
WHEN 'PLNUM'. " 计划订单
PERFORM frm_set_param_id USING 'PAF' 'PLNUM' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'MD13' CHANGING lv_tag.
WHEN 'AUFNR'. " 内部订单
PERFORM frm_set_param_id USING 'ANR' 'AUFNR' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'KO03' CHANGING lv_tag.
* PERFORM frm_turnto_tcode USING 'IW33' CHANGING lv_tag.
* WHEN 'AUFNR'. " 生产订单
* PERFORM frm_set_param_id USING 'ANR' 'AUFNR' CHANGING lv_tag.
* PERFORM frm_turnto_tcode USING 'CO03' CHANGING lv_tag.
WHEN 'QMNUM'. " 通知单
PERFORM frm_set_param_id USING 'IQM' 'QMNUM' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'IW23' CHANGING lv_tag.
WHEN 'RSNUM'. " 预留
PERFORM frm_set_param_id USING 'RES' 'RSNUM' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'MB23' CHANGING lv_tag.
*==================================== PS 项目管理 =====================
WHEN 'PSPHI'. " 项目 SET PARAMETER ID 'PSP' FIELD ''.
SET PARAMETER ID 'PRO' FIELD ''.
PERFORM frm_set_param_id_proj USING 'PSP' 'PSPHI'
CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'CJ03'
CHANGING lv_tag.
WHEN 'PSPNR' OR 'PSPNR1' OR 'PSPNR2' OR 'PSPNR3'. " WBS 要素
SET PARAMETER ID 'PSP' FIELD ''.
SET PARAMETER ID 'PRO' FIELD ''.
PERFORM frm_set_param_id_pspnr USING 'PRO' im_filecat-fieldname
CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'CJ03'
CHANGING lv_tag.
WHEN 'POSKI' OR 'POSKI1' OR 'POSKI2' OR 'POSKI3'. " WBS 要素
SET PARAMETER ID 'PSP' FIELD ''.
SET PARAMETER ID 'PRO' FIELD ''.
PERFORM frm_set_param_id USING 'PRO' im_filecat-fieldname
CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'CJ03'
CHANGING lv_tag.
*==================================== 其它 ============================
WHEN 'DOKNR'. " 凭证编号
PERFORM frm_set_param_id USING 'CV1' 'DOKNR' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'CV2' 'DOKAR' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'CV4' 'DOKTL' CHANGING lv_tag.
PERFORM frm_set_param_id USING 'CV3' 'DOKVR' CHANGING lv_tag.
PERFORM frm_turnto_tcode USING 'CV03N' CHANGING lv_tag.
WHEN OTHERS.
ex_tag = 1.
ENDCASE.
ENDFORM. " frm_alv_dbclick
*&---------------------------------------------------------------------*
*& Form FRM_SET_PARAM_ID
*&---------------------------------------------------------------------*
* 设置 Parameter ID
*----------------------------------------------------------------------*
FORM frm_set_param_id USING im_parameterid TYPE c
im_fieldname TYPE c
CHANGING ex_tag TYPE i.
IF ex_tag <> 0.
RETURN.
ENDIF.
ASSIGN COMPONENT im_fieldname OF STRUCTURE <gdf_alv_line>
TO <gdf_alv_value>.
IF sy-subrc <> 0.
ex_tag = 1.
RETURN.
ENDIF.
IF <gdf_alv_value> IS INITIAL.
ex_tag = 2.
RETURN.
ENDIF.
SET PARAMETER ID im_parameterid FIELD <gdf_alv_value>.
ENDFORM. " frm_set_PARAM_id
*&---------------------------------------------------------------------*
*& Form FRM_SET_PARAM_ID_PSPNR
*&---------------------------------------------------------------------*
* 设置 Parameter ID
*----------------------------------------------------------------------*
FORM frm_set_param_id_pspnr USING im_parameterid TYPE c
im_fieldname TYPE c
CHANGING ex_tag TYPE i.
DATA: lv_poski TYPE char40.
IF ex_tag <> 0.
RETURN.
ENDIF.
ASSIGN COMPONENT im_fieldname OF STRUCTURE <gdf_alv_line>
TO <gdf_alv_value>.
IF sy-subrc <> 0.
ex_tag = 1.
RETURN.
ENDIF.
IF <gdf_alv_value> IS INITIAL.
ex_tag = 2.
RETURN.
ENDIF.
lv_poski = <gdf_alv_value>.
CALL FUNCTION 'CONVERSION_EXIT_ABPSP_OUTPUT'
EXPORTING
input = <gdf_alv_value>
IMPORTING
output = lv_poski.
SET PARAMETER ID im_parameterid FIELD lv_poski.
ENDFORM. " FRM_SET_PARAM_ID_PSPNR
*&---------------------------------------------------------------------*
*& Form FRM_SET_PARAM_ID_PROJ
*&---------------------------------------------------------------------*
* 设置 Parameter ID
*----------------------------------------------------------------------*
FORM frm_set_param_id_proj USING im_parameterid TYPE c
im_fieldname TYPE c
CHANGING ex_tag TYPE i.
DATA: lv_poski TYPE char40.
IF ex_tag <> 0.
RETURN.
ENDIF.
ASSIGN COMPONENT im_fieldname OF STRUCTURE <gdf_alv_line>
TO <gdf_alv_value>.
IF sy-subrc <> 0.
ex_tag = 1.
RETURN.
ENDIF.
IF <gdf_alv_value> IS INITIAL.
ex_tag = 2.
RETURN.
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_KONPD_OUTPUT'
EXPORTING
input = <gdf_alv_value>
IMPORTING
output = lv_poski.
SET PARAMETER ID im_parameterid FIELD lv_poski.
ENDFORM. " FRM_SET_PARAM_ID_PROJ
*&---------------------------------------------------------------------*
*& Form frm_turnto_tcode
*&---------------------------------------------------------------------*
* 跳转到指定的tcode
*----------------------------------------------------------------------*
FORM frm_turnto_tcode USING im_tcode TYPE c
CHANGING ex_tag TYPE i.
IF ex_tag <> 0.
RETURN.
ENDIF.
CALL TRANSACTION im_tcode AND SKIP FIRST SCREEN .
ENDFORM. " frm_turnto_tcode
*&---------------------------------------------------------------------*
*& Form frm_update_shorttxt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_update_shorttxt USING im_fname TYPE lvc_s_fcat-fieldname
im_descp TYPE lvc_s_fcat-scrtext_s.
READ TABLE gdt_alv_fieldcat_lvc INTO gds_alv_fieldcat_lvc
WITH KEY fieldname = im_fname.
IF sy-subrc = 0.
gds_alv_fieldcat_lvc-scrtext_s = im_descp.
MODIFY gdt_alv_fieldcat_lvc
FROM gds_alv_fieldcat_lvc
INDEX sy-tabix.
ENDIF.
ENDFORM. " frm_update_shorttxt
*&---------------------------------------------------------------------*
*& Form FRM_ADD_MSG
*&---------------------------------------------------------------------*
* 添加消息
*----------------------------------------------------------------------*
FORM frm_add_msg USING im_msg TYPE c
CHANGING ex_msg TYPE c.
IF ex_msg IS INITIAL.
ex_msg = im_msg.
ELSE.
CONCATENATE ex_msg im_msg INTO ex_msg SEPARATED BY '; '.
ENDIF.
ENDFORM. " FRM_ADD_MSG
*&---------------------------------------------------------------------*
*& Form FRM_ADD_MSG2
*&---------------------------------------------------------------------*
* 添加消息
*----------------------------------------------------------------------*
FORM frm_add_msg2 USING im_msg TYPE c
CHANGING ex_msg TYPE c.
IF ex_msg IS INITIAL.
ex_msg = im_msg.
ELSE.
CONCATENATE im_msg ex_msg INTO ex_msg SEPARATED BY '; '.
ENDIF.
ENDFORM. " FRM_ADD_MSG2
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT_FIELD
*&---------------------------------------------------------------------*
* 输出文本
*----------------------------------------------------------------------*
FORM frm_output_field USING im_document TYPE REF TO cl_dd_document
im_index TYPE i
im_text TYPE sdydo_text_element
im_value TYPE sdydo_text_element.
IF im_index > 0.
CALL METHOD im_document->add_gap
EXPORTING
width = im_index.
ENDIF.
CALL METHOD im_document->add_text
EXPORTING
text = im_text
sap_fontsize = cl_dd_document=>small
sap_emphasis = 'Strong'.
CALL METHOD im_document->add_text
EXPORTING
text = im_value
sap_color = cl_dd_document=>list_total_int
sap_fontsize = cl_dd_document=>small
* sap_fontstyle = cl_dd_document=>serif
sap_emphasis = cl_dd_document=>emphasis. "加粗还是斜体 STRONG是加粗
ENDFORM. " FRM_OUTPUT_FIELD
INCLUDE zfile 详细代码如下:
*&---------------------------------------------------------------------*
*& 包含 ZFILE
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 程序名称: 文件操作公用包含程序段
* 作者 : www
* 时间 : 2013-04-22
* 模块 : 通用
* 描述 : 文件操作常用变量定义等
* 特殊特性: 无
*----------------------------------------------------------------------*
* 修改记录:
* 作者 时间 描述 请求号
* ------ ---------- ---------------------------------------- ----------*
*
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* 定义结构;
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_file_data,
line TYPE i,
f01 TYPE text255,
f02 TYPE text255,
f03 TYPE text255,
f04 TYPE text255,
f05 TYPE text255,
f06 TYPE text255,
f07 TYPE text255,
f08 TYPE text255,
f09 TYPE text255,
f10 TYPE text255,
f11 TYPE text255,
f12 TYPE text255,
f13 TYPE text255,
f14 TYPE text255,
f15 TYPE text255,
f16 TYPE text255,
f17 TYPE text255,
f18 TYPE text255,
f19 TYPE text255,
f20 TYPE text255,
f21 TYPE text255,
f22 TYPE text255,
f23 TYPE text255,
f24 TYPE text255,
f25 TYPE text255,
f26 TYPE text255,
f27 TYPE text255,
f28 TYPE text255,
f29 TYPE text255,
f30 TYPE text255,
f31 TYPE text255,
f32 TYPE text255,
f33 TYPE text255,
f34 TYPE text255,
f35 TYPE text255,
f36 TYPE text255,
f37 TYPE text255,
f38 TYPE text255,
f39 TYPE text255,
f40 TYPE text255,
f41 TYPE text255,
f42 TYPE text255,
f43 TYPE text255,
f44 TYPE text255,
f45 TYPE text255,
f46 TYPE text255,
f47 TYPE text255,
f48 TYPE text255,
f49 TYPE text255,
f50 TYPE text255,
END OF ty_file_data.
DATA: gs_ifile TYPE ty_file_data,
gt_ifile TYPE TABLE OF ty_file_data,
gs_efile TYPE ztool_exceltabline, " 读入的Excel文件
gt_efile TYPE TABLE OF ztool_exceltabline.
FIELD-SYMBOLS: <gf_file_data>.
*&---------------------------------------------------------------------*
*& Form FRM_FILE_INIT
*&---------------------------------------------------------------------*
* FILE 初始化
*----------------------------------------------------------------------*
FORM frm_file_init .
CLEAR: gt_efile, gt_ifile.
REFRESH: gt_efile, gt_ifile.
ENDFORM. " FRM_FILE_INIT
*&--------------------------------------------------------------------*
*& Form frm_read_excel_files
*&--------------------------------------------------------------------*
* 读取 Excel 文件
*---------------------------------------------------------------------*
FORM frm_read_excel_files USING im_ifile TYPE ibipparms-path
im_maxcolumn TYPE i
im_maxline TYPE i.
CLEAR: gt_efile.
REFRESH: gt_efile.
* 第一行作为标题行,不读。
* 最大行数为 6万5千 行
CALL FUNCTION 'ZTOOL_EXCEL_FROM_FILE_TO_ITAB'
EXPORTING
filename = im_ifile
i_begin_col = 1
i_begin_row = 1
i_end_col = im_maxcolumn
i_end_row = im_maxline
TABLES
intern = gt_efile
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
ENDFORM. " frm_read_excel_user
*&--------------------------------------------------------------------*
*& Form frm_build_excel_data
*&--------------------------------------------------------------------*
* 整理读入的数据
*---------------------------------------------------------------------*
FORM frm_build_excel_data USING im_startrow TYPE i
im_startcol TYPE i.
DATA: lv_tag TYPE i,
lv_num2 TYPE numc2,
lv_fieldname TYPE char20.
CLEAR: gt_ifile.
REFRESH: gt_ifile.
SORT gt_efile BY row col.
LOOP AT gt_efile INTO gs_efile WHERE row >= im_startrow.
* 每行初始化
AT NEW row.
lv_tag = 0.
CLEAR: gs_ifile.
gs_ifile-line = gs_efile-row.
ENDAT.
CONDENSE gs_efile-value.
* 按列号赋值
lv_num2 = gs_efile-col.
CONCATENATE 'GS_IFILE-F' lv_num2 INTO lv_fieldname.
ASSIGN (lv_fieldname) TO <gf_file_data>.
<gf_file_data> = gs_efile-value.
IF gs_efile-col >= im_startcol.
IF gs_efile-value IS NOT INITIAL.
ADD 1 TO lv_tag.
ENDIF.
ENDIF.
AT END OF row.
DO 1 TIMES.
IF gs_ifile-f01 = '例'. EXIT. ENDIF.
IF gs_ifile-f01 = '样例'. EXIT. ENDIF.
IF gs_ifile-f01 = '样例行'. EXIT. ENDIF.
IF lv_tag = 0. EXIT. ENDIF.
APPEND gs_ifile TO gt_ifile.
CLEAR:gs_ifile.
ENDDO.
ENDAT.
CLEAR:lv_num2,lv_fieldname.
ENDLOOP.
CLEAR: gt_efile.
REFRESH: gt_efile.
ENDFORM. " frm_build_excel_data
*&---------------------------------------------------------------------*
*& Form frm_check_length
*&---------------------------------------------------------------------*
* 长度验证
*----------------------------------------------------------------------*
FORM frm_check_length USING im_flag TYPE i
im_value TYPE c
im_desc TYPE c
im_len TYPE i
CHANGING ex_value TYPE c
ex_tag TYPE i
ex_msg TYPE text255.
DATA: lv_len TYPE i,
lv_num TYPE text255,
lv_temp TYPE text255.
ex_tag = 0.
IF im_value IS INITIAL.
IF im_flag = 0.
RETURN.
ELSE.
ex_tag = 1.
CONCATENATE '“' im_desc '”不能为空' INTO lv_temp.
PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
RETURN.
ENDIF.
ENDIF.
lv_len = strlen( im_value ).
IF lv_len > im_len.
ex_tag = 1.
lv_num = im_len. CONDENSE lv_num.
CONCATENATE '“' im_desc '”长度不能大于' INTO lv_temp.
CONCATENATE lv_temp lv_num '位!' INTO lv_temp SEPARATED BY space.
PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
RETURN.
ELSE.
ex_value = im_value.
ENDIF.
ENDFORM. " frm_check_length
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_NUMBER
*&---------------------------------------------------------------------*
* 检查是否数字
*----------------------------------------------------------------------*
FORM frm_check_number USING im_value TYPE c
im_desc TYPE c
CHANGING ex_value TYPE c
ex_tag TYPE i
ex_msg TYPE c.
DATA: lv_temp TYPE text255.
CLEAR ex_value.
ex_tag = 0.
CALL FUNCTION 'ZTOOL_GET_NUMCHAR'
EXPORTING
im_char = im_value
IMPORTING
ex_char = ex_value
EXCEPTIONS
not_number = 1
OTHERS = 2.
IF sy-subrc <> 0.
ex_tag = 1.
CONCATENATE '“' im_desc '”不是数字' INTO lv_temp.
PERFORM frm_add_msg USING lv_temp CHANGING ex_msg.
ENDIF.
ENDFORM. " FRM_CHECK_NUMBER
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATE
*&---------------------------------------------------------------------*
* 检查日期
*----------------------------------------------------------------------*
* 输入的日期格式: YYYYMMDD / YYYY-MM-DD / YYYY.MM.DD / YYYY/MM/DD
*----------------------------------------------------------------------*
FORM frm_check_date USING im_value TYPE c
im_desc TYPE c
CHANGING ex_dat TYPE sydatum
ex_msg TYPE c.
DATA: ldf_value TYPE char10,
ldf_msg TYPE text255,
ldf_datum TYPE sydatum,
ldf_len TYPE i,
ldf_year TYPE numc4,
ldf_month TYPE numc2,
ldf_day TYPE numc2.
IF im_value IS INITIAL.
RETURN.
ENDIF.
ldf_len = strlen( im_value ).
IF ldf_len < 8.
CONCATENATE im_desc '格式不正确!' INTO ldf_msg.
PERFORM frm_add_msg USING ldf_msg CHANGING ex_msg.
RETURN.
ENDIF.
CASE im_value+4(1).
WHEN '-' OR '.' OR '/'.
ldf_year = im_value+0(4).
CASE im_value+6(1).
WHEN '-' OR '.' OR '/'.
ldf_month = im_value+5(1).
ldf_day = im_value+7(2).
WHEN OTHERS.
ldf_month = im_value+5(2).
ldf_day = im_value+8(2).
ENDCASE.
CONCATENATE ldf_year ldf_month ldf_day INTO ldf_datum.
WHEN OTHERS.
ldf_value = im_value.
REPLACE ALL OCCURRENCES OF '-' IN ldf_value WITH ``.
REPLACE ALL OCCURRENCES OF '.' IN ldf_value WITH ``.
REPLACE ALL OCCURRENCES OF '/' IN ldf_value WITH ``.
ldf_datum = ldf_value.
ENDCASE.
ldf_len = strlen( ldf_datum ).
IF ldf_len <> 8.
CONCATENATE im_desc '格式不正确!' INTO ldf_msg.
PERFORM frm_add_msg USING ldf_msg CHANGING ex_msg.
RETURN.
ENDIF.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = ldf_datum
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
CONCATENATE im_desc '格式不正确!' INTO ldf_msg.
PERFORM frm_add_msg USING ldf_msg CHANGING ex_msg.
ELSE.
ex_dat = ldf_datum.
ENDIF.
ENDFORM. " FRM_CHECK_DATE