REPORT zwc_pro13.
TABLES:sscrfields.
DATA:gt_upload TYPE alsmex_tabline OCCURS 0 WITH HEADER LINE. " 弹出EXCEL
FIELD-SYMBOLS:<fs_upload> LIKE LINE OF gt_upload.
DATA:zdcno(10) TYPE c.
DATA:BEGIN OF gt_out OCCURS 0,
zdcno(2) TYPE c, "号码
bsart LIKE ekko-bsart, "采购订单类型
lifnr LIKE ekko-lifnr, "供应商
ekorg LIKE ekko-ekorg, "采购组织
ekgrp LIKE ekko-ekgrp, "采购组
bukrs LIKE ekko-bukrs, "公司代码
ebelp LIKE ekpo-ebelp, "订单行项目号
knttp LIKE ekpo-knttp, "科目分配类别
pstyp LIKE ekpo-pstyp, "项目类别
matnr LIKE ekpo-matnr, "物料
menge LIKE ekpo-menge, "订单数量
meins LIKE ekpo-meins, "订单单位
eindt LIKE eket-eindt, "交货日期
netpr LIKE ekpo-netpr, "净价
waers LIKE ekko-waers, "币别
werks LIKE ekpo-werks, "工厂
* LGOBE LIKE EKPO-LGOBE, "库存地点
matkl LIKE ekpo-matkl, "物料组
change_id TYPE c, "有信息记录U,无信息记录I
zstat(30) TYPE c,
msgty TYPE c,
msg(200) TYPE c,
* BEDAT LIKE EKKO-BEDAT, "采购订单日期
* TXZ01 LIKE EKPO-TXZ01, "物料描述
* LGORT LIKE EKPO-LGORT, "库位
* KOSTL TYPE KOSTL, "成本中心
* ANLN1 TYPE ANLN1, "固定资产号
* PEINH LIKE EKPO-PEINH, "价格单位
* MWSKZ TYPE MWSKZ, "税码
* TXT20 TYPE TDLINE, "行项目文本
* IHREZ LIKE EKKO-IHREZ, "原采购订单号
END OF gt_out.
FIELD-SYMBOLS:<fs_out> LIKE gt_out.
***alv data define
DATA:gv_repid LIKE sy-repid VALUE sy-repid,
gs_layout TYPE slis_layout_alv,
gt_fcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA:lt_t163y LIKE t163y OCCURS 0 WITH HEADER LINE. "ADD BY XULE 20150427
DATA: wa_log TYPE ZPRO13_LOG,
lv_zguid TYPE sysuuid_c32.
DEFINE mcr_build_fieldcat.
gt_fcat-fieldname = &1.
gt_fcat-seltext_l = &2. " 长文本
gt_fcat-seltext_m = &2. " 中文版
gt_fcat-seltext_s = &2. " 短文本
gt_fcat-ddictxt = 'L'.
gt_fcat-inttype = &3.
* gt_fcat-intlen = &4.
* gt_fcat-outputlen = &5.
IF &1 = 'LIFNR' OR &1 = 'MATNR' OR &1 = 'INFNR'.
gt_fcat-no_zero = 'X'.
ENDIF.
APPEND gt_fcat.
CLEAR gt_fcat.
END-OF-DEFINITION.
CONSTANTS:c_pf_status TYPE slis_formname VALUE 'FRM_SET_PF_STATUS',
c_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.
DATA:gv_flag TYPE c.
***selection screen define
SELECTION-SCREEN FUNCTION KEY 1. "工具条按钮 最多为5个.
SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE TEXT-001.
PARAMETERS:p_file TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK blc .
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_select_file.
INITIALIZATION.
sscrfields-functxt_01 = '模板下载'.
sscrfields-ucomm = 'FC01'.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'ONLI'.
PERFORM frm_check_file_exist.
WHEN 'FC01'.
PERFORM frm_generate_template.
WHEN OTHERS.
ENDCASE.
START-OF-SELECTION.
PERFORM FRM_UPLOAD_DATA.
PERFORM frm_get_fieldcat.
PERFORM frm_output_data.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_FILE_EXIST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_check_file_exist .
DATA:lv_file TYPE string,
lv_result TYPE abap_bool.
DATA:lv_name(255) TYPE c,
lv_path(255) TYPE c.
DATA:lv_lenth TYPE i.
CHECK sy-ucomm = 'ONLI'.
IF p_file IS INITIAL.
MESSAGE '请输入文件路径' TYPE 'E'.
ENDIF.
lv_file = p_file.
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_file
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE '文件不存在' TYPE 'E'.
ENDIF.
***检查文件格式
CALL FUNCTION 'TRINT_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = p_file
IMPORTING
stripped_name = lv_name
file_path = lv_path
EXCEPTIONS
x_error = 1
OTHERS = 2.
IF sy-subrc = 0.
lv_lenth = strlen( lv_name ).
IF lv_lenth > 4.
lv_lenth = lv_lenth - 4.
ENDIF.
lv_name = lv_name+lv_lenth.
TRANSLATE lv_name TO UPPER CASE.
IF lv_name NE '.XLS' AND lv_name NE 'XLSX'.
MESSAGE '文件不是EXCEL格式文件,请检查' TYPE 'E'.
ENDIF.
ENDIF.
ENDFORM. " FRM_CHECK_FILE_EXIST
*&---------------------------------------------------------------------*
*& Form FRM_GENERATE_TEMPLATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_generate_template .
DATA: gv_name TYPE string,
gv_file TYPE string,
gv_user_action TYPE i.
CALL FUNCTION 'GUI_FILE_SAVE_DIALOG'
EXPORTING
default_file_name = gv_name
IMPORTING
fullpath = gv_file
user_action = gv_user_action.
IF gv_user_action EQ 0.
PERFORM frm_download_excel USING 'ZWC_BPO' gv_file.
MESSAGE '模板下载成功!' TYPE 'S'.
ENDIF.
* IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
* ELSE.
* CHECK LV_UA = 0.
* READ TABLE LT_FT INTO LS_FT INDEX 1.
* LWK_FN = LS_FT-FILENAME.
****下载模板
* CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
* EXPORTING
* KEY = LS_OBJECT
* DESTINATION = LWK_FN
* IMPORTING
* RC = LV_RC.
* IF LV_RC <> 0.
* MESSAGE S003(ZMM_RPT_MSG) DISPLAY LIKE 'E'. "下载模板失败!
* EXIT.
* ENDIF.
* ENDIF.
ENDFORM. " FRM_GENERATE_TEMPLATE
FORM frm_download_excel USING excel_name excel_name1.
DATA:
ls_objdata LIKE wwwdatatab,
ls_mime LIKE w3mime,
ls_destination LIKE rlgrap-filename,
lv_objnam TYPE string,
lv_subrc LIKE sy-subrc,
lv_errtxt TYPE string,
lv_objid TYPE wwwdatatab-objid,
lv_dest LIKE sapb-sappfad,
lv_fullpath LIKE rlgrap-filename.
MOVE excel_name TO lv_objid.
CONCATENATE lv_objid '.XLSX' INTO lv_objnam.
CONDENSE lv_objnam NO-GAPS.
SELECT SINGLE
relid,
objid
FROM
wwwdata
WHERE srtf2 EQ 0
AND relid EQ 'MI'
AND objid EQ @lv_objid
INTO CORRESPONDING FIELDS OF @ls_objdata.
IF sy-subrc NE 0 OR ls_objdata-objid EQ space.
CONCATENATE '模板文件:' lv_objnam '不存在,请用TCODE:SMW0进行加载' INTO lv_errtxt.
MESSAGE lv_errtxt TYPE 'E'.
RETURN.
ENDIF.
CONCATENATE excel_name1 '.xlsx' INTO lv_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_objdata
destination = lv_fullpath
IMPORTING
rc = lv_subrc.
IF lv_subrc NE 0.
CONCATENATE '模板文件:' lv_objnam '下载失败' INTO lv_errtxt.
MESSAGE lv_errtxt TYPE 'E'.
ELSE.
MESSAGE '模板下载成功' TYPE 'S'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SELECT_FILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_select_file .
DATA:lv_window_title TYPE string,
lv_file_filter TYPE string VALUE 'Excel Files(*.xls;*.xlsx)|*.xls;*.xlsx|All Files(*.*)|*.*',
lt_filetable TYPE filetable WITH HEADER LINE,
lv_rc TYPE i.
***选择文件
lv_window_title = '文件选择'(004).
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = lv_window_title
* default_extension =
* default_filename =
file_filter = lv_file_filter
* with_encoding =
initial_directory = 'C:\'
* multiselection =
CHANGING
file_table = lt_filetable[]
rc = lv_rc
* user_action =
* file_encoding =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0.
READ TABLE lt_filetable INDEX 1.
IF sy-subrc = 0.
p_file = lt_filetable-filename.
ENDIF.
ENDIF.
ENDFORM. " FRM_SELECT_FILE
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload_data .
DATA:lv_no(2) TYPE c VALUE '10'.
DEFINE mcr_add_zero.
IF &1 IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = &1
IMPORTING
output = &1.
ENDIF.
END-OF-DEFINITION.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = '1'
i_begin_row = '2'
i_end_col = '20'
i_end_row = '9999'
TABLES
intern = gt_upload[]
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF gt_upload[] IS INITIAL.
MESSAGE '上传文档为空' TYPE 'I'.
EXIT.
ENDIF.
LOOP AT gt_upload ASSIGNING <fs_upload>.
TRANSLATE <fs_upload>-value TO UPPER CASE.
CASE <fs_upload>-col.
WHEN '1'.
gt_out-zdcno = <fs_upload>-value. "序号
WHEN '2'.
gt_out-bsart = <fs_upload>-value. "订单类型
WHEN '3'.
gt_out-lifnr = <fs_upload>-value. "供应商
WHEN '4'.
gt_out-ekorg = <fs_upload>-value. "采购组织
WHEN '5'.
gt_out-ekgrp = <fs_upload>-value."采购组
WHEN '6'.
gt_out-bukrs = <fs_upload>-value. "公司代码
WHEN '7'.
gt_out-ebelp = <fs_upload>-value. "行项目文本
WHEN '8'.
gt_out-knttp = <fs_upload>-value. "科目分配类别
WHEN '9'.
gt_out-pstyp = <fs_upload>-value. "项目类别
WHEN '10'.
gt_out-matnr = <fs_upload>-value. "物料编码
WHEN '11'.
gt_out-menge = <fs_upload>-value. "采购订单数量
WHEN '12'.
gt_out-meins = <fs_upload>-value."采购订单单位
WHEN '13'.
gt_out-eindt = <fs_upload>-value. "交货日期
WHEN '14'.
gt_out-netpr = <fs_upload>-value. "单价
WHEN '15'.
gt_out-waers = <fs_upload>-value."货币
WHEN '16'.
gt_out-werks = <fs_upload>-value."工厂
WHEN '17'.
gt_out-matkl = <fs_upload>-value. "物料组
WHEN OTHERS.
ENDCASE.
AT END OF row.
IF gt_out-bsart IS NOT INITIAL AND gt_out-lifnr IS NOT INITIAL AND gt_out-ekorg IS NOT INITIAL
AND gt_out-ekgrp IS NOT INITIAL AND gt_out-bukrs IS NOT INITIAL .
ADD 1 TO lv_no.
ENDIF.
* gt_out-zdcno = lv_no.
mcr_add_zero:gt_out-lifnr,gt_out-matnr.
APPEND gt_out.
CLEAR gt_out.
ENDAT.
ENDLOOP.
***check上传的数据
PERFORM frm_check_data.
ENDFORM. " FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_check_data .
DATA:lv_no1(10) TYPE c.
DATA:lt_t161 LIKE t161 OCCURS 0 WITH HEADER LINE,
lt_t024e LIKE t024e OCCURS 0 WITH HEADER LINE,
lt_t024 LIKE t024 OCCURS 0 WITH HEADER LINE.
DATA:BEGIN OF lt_lfa1 OCCURS 0,
lifnr LIKE lfa1-lifnr,
END OF lt_lfa1.
DATA:BEGIN OF lt_t001 OCCURS 0,
bukrs LIKE t001-bukrs,
END OF lt_t001.
DATA:BEGIN OF lt_matnr OCCURS 0,
matnr LIKE mara-matnr,
matkl LIKE mara-matkl,
END OF lt_matnr.
DATA:BEGIN OF lt_t001w OCCURS 0,
werks LIKE t001w-werks,
END OF lt_t001w.
DATA:BEGIN OF lt_t001l OCCURS 0,
werks LIKE t001l-werks,
lgort LIKE t001l-lgort,
END OF lt_t001l.
DATA:lt_t163i LIKE t163i OCCURS 0 WITH HEADER LINE.
DATA:BEGIN OF lt_vbap OCCURS 0,
vbeln LIKE vbap-vbeln,
posnr LIKE vbap-posnr,
END OF lt_vbap.
DATA:BEGIN OF lt_marc OCCURS 0,
matnr LIKE marc-matnr,
werks LIKE marc-werks,
lgfsb LIKE marc-lgfsb,
lgpro LIKE marc-lgpro,
END OF lt_marc.
DATA:lv_banfn LIKE eban-banfn,
lv_pstyp LIKE eban-pstyp.
DATA:BEGIN OF lt_ekpo OCCURS 0,
ebeln LIKE ekpo-ebeln,
ebelp LIKE ekpo-ebelp,
banfn LIKE ekpo-banfn,
bnfpo LIKE ekpo-bnfpo,
END OF lt_ekpo.
DATA:BEGIN OF lt_rfq OCCURS 0,
ebeln LIKE ekko-ebeln,
ebelp LIKE ekpo-ebelp,
END OF lt_rfq.
DATA:lv_subrc TYPE sy-subrc.
DATA:lv_index LIKE sy-tabix.
DEFINE mcr_add_msg.
IF gt_out-msg IS INITIAL.
gt_out-msg = &1.
ELSE.
CONCATENATE gt_out-msg &1 INTO gt_out-msg SEPARATED BY ','.
ENDIF.
END-OF-DEFINITION.
CHECK gt_out[] IS NOT INITIAL.
***抓取采购订单类型
SELECT * INTO TABLE lt_t161 FROM t161 WHERE bstyp EQ 'F'.
IF sy-subrc = 0.
SORT lt_t161 BY bsart.
ENDIF.
***抓取供应商信息
SELECT lifnr
INTO TABLE lt_lfa1
FROM lfa1
FOR ALL ENTRIES IN gt_out
WHERE lifnr = gt_out-lifnr.
IF sy-subrc = 0.
SORT lt_lfa1 BY lifnr.
ENDIF.
***抓取采购组织
SELECT * INTO TABLE lt_t024e FROM t024e.
IF sy-subrc = 0.
SORT lt_t024e.
ENDIF.
***采购组
SELECT * INTO TABLE lt_t024 FROM t024.
IF sy-subrc = 0.
SORT lt_t024.
ENDIF.
***抓取公司
SELECT bukrs INTO CORRESPONDING FIELDS OF TABLE lt_t001 FROM t001.
IF sy-subrc = 0.
SORT lt_t001.
ENDIF.
***抓取物料编码
SELECT matnr matkl INTO TABLE lt_matnr FROM mara FOR ALL ENTRIES IN gt_out WHERE matnr = gt_out-matnr.
IF sy-subrc = 0.
SORT lt_matnr BY matnr.
ENDIF.
***抓取工厂
SELECT werks INTO TABLE lt_t001w FROM t001w.
IF sy-subrc = 0.
SORT lt_t001w.
ENDIF.
***抓取库位信息
SELECT werks
INTO CORRESPONDING FIELDS OF TABLE lt_t001l
FROM t001l
FOR ALL ENTRIES IN gt_out
WHERE werks = gt_out-werks.
IF sy-subrc = 0.
SORT lt_t001l BY werks .
ENDIF.
SELECT matnr werks lgfsb lgpro
INTO CORRESPONDING FIELDS OF TABLE lt_marc
FROM marc
FOR ALL ENTRIES IN gt_out
WHERE matnr = gt_out-matnr
AND werks = gt_out-werks.
SORT lt_marc BY matnr werks.
LOOP AT gt_out.
lv_index = sy-tabix.
***采购订单类型
lv_no1 = gt_out-zdcno.
READ TABLE gt_out INTO DATA(gs) WITH KEY zdcno = lv_no1.
IF gt_out-bsart IS INITIAL.
mcr_add_msg:'采购订单类型为空'.
ELSE.
READ TABLE lt_t161 WITH KEY bsart = gt_out-bsart BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'采购订单类型不存在'.
ENDIF.
ENDIF.
***凭证日期
* AT NEW ZDCNO.
* IF GT_OUT-BEDAT IS INITIAL.
** mcr_add_msg:'凭证日期为空'.
* ELSE.
* PERFORM FRM_DATE_CHECK USING GT_OUT-BEDAT CHANGING LV_SUBRC.
* IF LV_SUBRC NE 0.
* MCR_ADD_MSG:'凭证日期无效'.
* ENDIF.
* ENDIF.
* ENDAT.
***K3采购订单号
* if gt_out-ihrez is initial.
* mcr_add_msg:'原采购订单号'.
* endif.
***供应商
IF gt_out-lifnr IS INITIAL.
mcr_add_msg:'供应商编码为空'.
ELSE.
READ TABLE lt_lfa1 WITH KEY lifnr = gt_out-lifnr BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'供应商不存在'.
ENDIF.
ENDIF.
***采购组织
IF gt_out-ekorg IS INITIAL.
mcr_add_msg:'采购组织为空'.
ELSE.
READ TABLE lt_t024e WITH KEY ekorg = gt_out-ekorg BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'采购组织不存在'.
ENDIF.
ENDIF.
***采购组
IF gt_out-ekgrp IS INITIAL.
mcr_add_msg:'采购组为空'.
ELSE.
READ TABLE lt_t024 WITH KEY ekgrp = gt_out-ekgrp BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'采购组不存在'.
ENDIF.
ENDIF.
***公司代码
IF gt_out-bukrs IS INITIAL.
mcr_add_msg:'公司代码为空'.
ELSE.
READ TABLE lt_t001 WITH KEY bukrs = gt_out-bukrs BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'公司代码不存在'.
ENDIF.
ENDIF.
***物料编码
IF gt_out-matkl = ''.
IF gt_out-matnr IS INITIAL.
mcr_add_msg:'物料编码为空'.
ELSE.
READ TABLE lt_matnr WITH KEY matnr = gt_out-matnr BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'物料编码不存在'.
ELSE.
gt_out-matkl = lt_matnr-matkl.
ENDIF.
ENDIF.
ENDIF.
***未清采购订单数量
IF gt_out-menge IS INITIAL.
mcr_add_msg:'采购订单数量为空'.
ENDIF.
***计划交货日期
IF gt_out-eindt IS INITIAL.
* mcr_add_msg:'计划交货日期为空'.
ELSE.
PERFORM frm_date_check USING gt_out-eindt CHANGING lv_subrc.
IF lv_subrc NE 0.
mcr_add_msg:'计划交货日期无效'.
ENDIF.
ENDIF.
***工厂
IF gt_out-werks IS INITIAL.
mcr_add_msg:'工厂为空'.
ELSE.
READ TABLE lt_t001w WITH KEY werks = gt_out-werks BINARY SEARCH.
IF sy-subrc <> 0.
mcr_add_msg:'工厂不存在'.
ENDIF.
ENDIF.
***库存地点
* IF GT_OUT-LGORT IS INITIAL.
* SELECT SINGLE LGFSB INTO GT_OUT-LGORT FROM MARC WHERE MATNR = GT_OUT-MATNR AND WERKS = GT_OUT-WERKS.
* ENDIF.
* IF GT_OUT-LGORT IS INITIAL AND GT_OUT-WERKS IS NOT INITIAL.
* READ TABLE LT_T001L WITH KEY WERKS = GT_OUT-WERKS LGORT = GT_OUT-LGORT BINARY SEARCH.
* IF SY-SUBRC <> 0.
* MCR_ADD_MSG:'工厂与库存地点不匹配'.
* ENDIF.
* ENDIF.
***订单单位
IF gt_out-meins IS INITIAL.
SELECT SINGLE meins INTO gt_out-meins FROM mara WHERE matnr = gt_out-matnr.
ENDIF.
***科目分配类别
* CASE GT_OUT-KNTTP.
* WHEN 'K'.
* IF GT_OUT-KOSTL = ''.
* MCR_ADD_MSG:'成本中心不能为空'.
* ENDIF.
* WHEN 'A'.
* IF GT_OUT-ANLN1 = ''.
* MCR_ADD_MSG:'固定资产号不能为空'.
* ENDIF.
* WHEN OTHERS.
* ENDCASE.
***含税单价 价格单位 税码
IF gt_out-netpr IS INITIAL.
gt_out-change_id = 'U'.
SELECT SINGLE konp~kbetr INTO gt_out-netpr FROM a017
INNER JOIN konp ON konp~knumh = a017~knumh AND konp~kopos = 1
WHERE a017~kappl = 'M'
AND a017~kschl = 'PB00'
AND a017~lifnr = gs-lifnr
AND a017~matnr = gt_out-matnr
AND a017~ekorg = gs-ekorg
AND a017~werks = gs-werks
AND a017~esokz = '0'
AND a017~datab <= sy-datum
AND a017~datbi >= sy-datum.
IF sy-subrc <> 0.
mcr_add_msg:'信息记录中无有效价格'.
ENDIF.
ELSE.
gt_out-change_id = 'I'.
ENDIF.
* IF GT_OUT-MWSKZ IS INITIAL.
* SELECT SINGLE EINE~PEINH EINE~MWSKZ INTO (GT_OUT-PEINH,GT_OUT-MWSKZ)
* FROM EINE
* INNER JOIN EINA ON EINA~INFNR = EINE~INFNR
* WHERE EINA~MATNR = GT_OUT-MATNR
* AND EINA~LIFNR = GS-LIFNR
* AND EINE~EKORG = GS-EKORG
* AND EINE~ESOKZ = '0'
* AND EINE~WERKS = GS-WERKS.
*
* IF GT_OUT-MWSKZ = ''.
* MCR_ADD_MSG:'信息记录中无税码'.
* ENDIF.
* ENDIF.
IF gt_out-msg IS INITIAL.
* gt_out-zstat = icon_light_out.
gt_out-zstat = icon_green_light.
ELSE.
gt_out-zstat = icon_red_light.
gt_out-msgty = 'E'.
ENDIF.
MODIFY gt_out INDEX lv_index.
CLEAR gt_out.
ENDLOOP.
ENDFORM. " FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& Form FRM_DATE_CHECK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GT_OUT_BEDAT text
* <--P_LV_SUBRC text
*----------------------------------------------------------------------*
FORM frm_date_check USING u_date LIKE sy-datum
CHANGING c_subrc LIKE sy-subrc.
CLEAR : c_subrc.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = u_date
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
c_subrc = sy-subrc.
ENDIF.
ENDFORM. " FRM_DATE_CHECK
*&---------------------------------------------------------------------*
*& Form FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_fieldcat .
mcr_build_fieldcat:'ZSTAT' '状态' 'C' , " '30' '5',
'MSG' '消息' 'C' , " '200' '30',
'BSART' '采购订单类型' 'C' , " '4' '6',
'LIFNR' '供应商' 'C' , " '10' '10',
'EKORG' '采购组织' 'C' , " '4' '6',
'EKGRP' '采购组' 'C' , " '3' '6',
'BUKRS' '公司代码' 'C' , " '4' '6',
'EBELP' '行项目文本' 'C' , " '20' '15',
'KNTTP' '科目分配类别' 'C' , " '1' '4',
'PSTYP' '项目类别' 'C' , " '1' '4',
'MATNR' '物料' 'C' , " '18' '15',
'MENGE' '订单数量' 'P' , " '15' '12',
'MEINS' '订单单位' 'C' , " '3' '3',
'EINDT' '交货日期' 'D' , " '8' '10',
'NETPR' '净价' 'P' , " '11' '11',
'WAERS' '币别' 'C' , " '5' '5',
'WERKS' '工厂' 'C' , " '4' '4',
* 'LGOBE' '库存地点' 'C' , " '4' '4',
'MATKL' '物料组' 'C' . " '9' '8',
gs_layout-zebra = 'X'.
* gs_layout-colwidth_optimize = 'X'.
ENDFORM. " FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_output_data .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = gv_repid
i_callback_pf_status_set = c_pf_status
i_callback_user_command = c_user_command
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = gs_layout
it_fieldcat = gt_fcat[]
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
i_default = 'X'
i_save = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gt_out[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM. " FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*& Form FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'S0100'.
ENDFORM. " FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*& Form FRM_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
rs_selfield-refresh = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
CASE r_ucomm.
WHEN 'ZCREATE'.
PERFORM frm_create_po.
WHEN OTHERS.
ENDCASE.
ENDFORM. " FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_BOM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_create_po .
DATA:lt_out LIKE gt_out OCCURS 0 WITH HEADER LINE.
DATA:ls_poheader LIKE bapimepoheader,
ls_poheaderx LIKE bapimepoheaderx,
lt_poitem LIKE bapimepoitem OCCURS 0 WITH HEADER LINE,
lt_poitemx LIKE bapimepoitemx OCCURS 0 WITH HEADER LINE,
lt_poschedule LIKE bapimeposchedule OCCURS 0 WITH HEADER LINE,
lt_poschedulex LIKE bapimeposchedulx OCCURS 0 WITH HEADER LINE,
lt_poaccount LIKE bapimepoaccount OCCURS 0 WITH HEADER LINE,
lt_poaccountx LIKE bapimepoaccountx OCCURS 0 WITH HEADER LINE,
lt_pocond LIKE bapimepocond OCCURS 0 WITH HEADER LINE,
lt_pocondx LIKE bapimepocondx OCCURS 0 WITH HEADER LINE,
lt_potextitem LIKE bapimepotext OCCURS 0 WITH HEADER LINE,
lt_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA:lv_ebelp LIKE ekpo-ebelp.
DATA:lv_po_number LIKE ekko-ebeln,
lv_type TYPE c,
lv_msg TYPE string,
lv_msg_sum TYPE string.
IF gv_flag IS INITIAL.
gv_flag = 'X'.
ELSE.
MESSAGE '请不要重复导入数据' TYPE 'E'.
ENDIF.
READ TABLE gt_out WITH KEY msgty = 'E'.
IF sy-subrc = 0.
MESSAGE '上载数据存在错误,请先修正' TYPE 'E'.
ENDIF.
APPEND LINES OF gt_out TO lt_out.
LOOP AT lt_out ASSIGNING <fs_out>.
AT NEW zdcno.
zdcno = <fs_out>-zdcno.
CLEAR:lv_ebelp,ls_poheader,ls_poheaderx,lv_msg_sum,lv_po_number,lt_poitem,
lt_poitemx,lt_poschedule,lt_poschedulex,lt_poaccount,lt_poaccountx,
lt_pocond,lt_pocondx,lt_return,lv_ebelp,lt_potextitem,lt_potextitem[].
REFRESH:lt_poitem,lt_poitemx,lt_poschedule,lt_poschedulex,
lt_poaccount,lt_poaccountx,lt_pocond,lt_pocondx,lt_return.
ls_poheader-doc_type = <fs_out>-bsart.
ls_poheader-vendor = <fs_out>-lifnr.
ls_poheader-purch_org = <fs_out>-ekorg.
ls_poheader-pur_group = <fs_out>-ekgrp.
ls_poheader-comp_code = <fs_out>-bukrs.
* IF <FS_OUT>-BEDAT = '00000000'.
* LS_POHEADER-DOC_DATE = SY-DATUM.
* ELSE.
* LS_POHEADER-DOC_DATE = <FS_OUT>-BEDAT.
* ENDIF.
SELECT SINGLE zterm
INTO ls_poheader-pmnttrms
FROM lfb1
WHERE lifnr = <fs_out>-lifnr
AND bukrs = <fs_out>-bukrs.
* LS_POHEADER-REF_1 = <FS_OUT>-IHREZ. "旧物料
ls_poheaderx-doc_type = 'X'.
ls_poheaderx-doc_date = 'X'.
ls_poheaderx-vendor = 'X'.
ls_poheaderx-purch_org = 'X'.
ls_poheaderx-pur_group = 'X'.
ls_poheaderx-comp_code = 'X'.
ls_poheaderx-pmnttrms = 'X'.
ls_poheaderx-ref_1 = 'X'.
ENDAT.
***行项目数据
* lv_ebelp = lv_ebelp + 10.
lv_ebelp = <fs_out>-ebelp.
lt_poitem-po_item = lv_ebelp. "项目
lt_poitem-material = <fs_out>-matnr. "物料
* IF <FS_OUT>-TXZ01 <> ''.
* LT_POITEM-SHORT_TEXT = <FS_OUT>-TXZ01. "物料描述
* ENDIF.
lt_poitem-matl_group = <fs_out>-matkl. "物料组
lt_poitem-plant = <fs_out>-werks. "工厂
* LT_POITEM-STGE_LOC = <FS_OUT>-LGORT. "库存地点
lt_poitem-item_cat = <fs_out>-pstyp. "项目类别
lt_poitem-acctasscat = <fs_out>-knttp. "科目分配类别
lt_poitem-quantity = <fs_out>-menge. "数量
lt_poitem-po_unit = <fs_out>-meins. " 采购订单单位
* LT_POITEM-TAX_CODE = <FS_OUT>-MWSKZ. " 税码
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = lt_poitem-po_unit
language = sy-langu
IMPORTING
output = lt_poitem-po_unit
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
lt_poitem-gr_basediv = 'X'. "标识:基于收货的发票验证
lt_poitem-ir_ind = 'X'. "发票收据标识
lt_poitem-gr_ind = 'X'. "货物收据标识
lt_pocond-cond_unit = lt_poitem-po_unit. "条件单位
APPEND lt_poitem.
CLEAR lt_poitem.
lt_poitemx-po_item = lv_ebelp.
lt_poitemx-material = 'X'.
* IF <FS_OUT>-TXZ01 <> ''.
* LT_POITEMX-SHORT_TEXT = 'X'.
* ENDIF.
lt_poitemx-matl_group = 'X'.
lt_poitemx-plant = 'X'.
lt_poitemx-stge_loc = 'X'.
lt_poitemx-item_cat = 'X'.
lt_poitemx-acctasscat = 'X'.
lt_poitemx-quantity = 'X'.
lt_poitemx-po_unit = 'X'.
lt_poitemx-tax_code = 'X'.
lt_poitemx-net_price = 'X'.
lt_poitemx-po_price = 'X'.
lt_poitemx-info_rec = 'X'.
lt_poitemx-info_upd = 'X'.
lt_poitemx-orderpr_un = 'X'.
lt_poitemx-gr_basediv = 'X'.
lt_poitemx-ir_ind = 'X'.
lt_poitemx-gr_ind = 'X'.
APPEND lt_poitemx.
CLEAR lt_poitemx.
***采购价格
lt_pocond-itm_number = lv_ebelp.
lt_pocond-cond_type = 'PB00'.
lt_pocond-cond_value = <fs_out>-netpr. "价格
"lt_pocond-COND_UNIT = lt_poitem-po_unit. "'PC'.
* LT_POCOND-COND_P_UNT = <FS_OUT>-PEINH."GS_EXCEL_RAW0-PEINH. "价格单位
lt_pocond-currency = <fs_out>-waers.
lt_pocond-change_id = <fs_out>-change_id.
APPEND lt_pocond.
CLEAR lt_pocond.
lt_pocondx-itm_number = lv_ebelp.
lt_pocondx-cond_type = 'X'.
lt_pocondx-cond_value = 'X'.
lt_pocondx-cond_unit = 'X'. "条件单位
lt_pocondx-cond_p_unt = 'X'. "价格单位
lt_pocondx-currency = 'X'.
lt_pocondx-change_id = 'X'.
APPEND lt_pocondx.
CLEAR lt_pocondx.
***计划交货日期
lt_poschedule-po_item = lv_ebelp.
lt_poschedule-sched_line = 1.
lt_poschedule-delivery_date = <fs_out>-eindt.
lt_poschedule-quantity = <fs_out>-menge.
APPEND lt_poschedule.
CLEAR lt_poschedule.
lt_poschedulex-po_item = lv_ebelp.
lt_poschedulex-sched_line = 1.
lt_poschedulex-delivery_date = 'X'.
lt_poschedulex-quantity = 'X'.
APPEND lt_poschedulex.
CLEAR lt_poschedulex.
***科目分配
* LT_POACCOUNT-PO_ITEM = LV_EBELP.
* LT_POACCOUNT-SERIAL_NO = 1.
* IF <FS_OUT>-KNTTP = 'K'. "科目分配类别
** MCR_ADD_ZERO <FS_OUT>-KOSTL.
* LT_POACCOUNT-COSTCENTER = <FS_OUT>-KOSTL. "成本中心
* ELSEIF <FS_OUT>-KNTTP = 'A'.
* LT_POACCOUNT-ASSET_NO = <FS_OUT>-ANLN1. "固定资产号
* ENDIF.
* APPEND LT_POACCOUNT.
* CLEAR LT_POACCOUNT.
lt_poaccountx-po_item = lv_ebelp.
lt_poaccountx-serial_no = 1.
IF <fs_out>-knttp = 'K'. "科目分配类别
lt_poaccountx-costcenter = 'X'.
ELSEIF <fs_out>-knttp = 'A'.
lt_poaccountx-asset_no = 'X'.
ENDIF.
APPEND lt_poaccountx.
CLEAR lt_poaccountx.
***行项目文本
* LT_POTEXTITEM-PO_ITEM = LV_EBELP.
* LT_POTEXTITEM-TEXT_ID = 'F01'.
* LT_POTEXTITEM-TEXT_FORM = 'X'.
* LT_POTEXTITEM-TEXT_LINE = <FS_OUT>-TXT20.
* APPEND LT_POTEXTITEM.
* CLEAR LT_POTEXTITEM.
***调用BAPI 创建PO
AT END OF zdcno.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = ls_poheader
poheaderx = ls_poheaderx
* no_price_from_po = 'X'
IMPORTING
exppurchaseorder = lv_po_number
TABLES
return = lt_return
poitem = lt_poitem
poitemx = lt_poitemx
* POADDRDELIVERY =
poschedule = lt_poschedule
poschedulex = lt_poschedulex
* POEXPIMPITEM =
* POEXPIMPITEMX =
* POTEXTHEADER =
potextitem = lt_potextitem
pocond = lt_pocond
pocondx = lt_pocondx
poaccount = lt_poaccount
poaccountx = lt_poaccountx.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = lv_zguid.
IF lv_po_number IS INITIAL. "存在错误
lv_type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT lt_return WHERE type = 'A' OR type = 'E'.
PERFORM frm_get_msg USING lt_return CHANGING lv_msg.
CONCATENATE lv_msg_sum lv_msg INTO lv_msg_sum .
CONDENSE lv_msg_sum .
ENDLOOP.
wa_log-guid = lv_zguid.
wa_log-result_flag = lv_type.
wa_log-created_by = sy-uname.
wa_log-created_on = sy-datum.
wa_log-created_at = sy-uzeit.
wa_log-comp_code = <fs_out>-bukrs.
wa_log-vendor = <fs_out>-lifnr.
wa_log-purch_org = <fs_out>-ekorg.
wa_log-pur_group = <fs_out>-ekgrp.
wa_log-msg = lv_msg_sum.
wa_log-external_document = lv_po_number.
ELSE.
lv_type = 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CONCATENATE '创建成功:'(041) lv_po_number INTO lv_msg_sum .
wa_log-guid = lv_zguid.
wa_log-result_flag = lv_type.
wa_log-created_by = sy-uname.
wa_log-created_on = sy-datum.
wa_log-created_at = sy-uzeit.
wa_log-comp_code = <fs_out>-bukrs.
wa_log-vendor = <fs_out>-lifnr.
wa_log-purch_org = <fs_out>-ekorg.
wa_log-pur_group = <fs_out>-ekgrp.
wa_log-msg = lv_msg_sum.
wa_log-external_document = lv_po_number.
ENDIF.
IF wa_log IS NOT INITIAL.
MODIFY ZPRO13_LOG FROM wa_log.
ENDIF.
LOOP AT gt_out WHERE zdcno = <fs_out>-zdcno.
gt_out-msgty = lv_type.
CASE lv_type.
WHEN 'S'.
gt_out-zstat = icon_green_light.
WHEN 'E'.
gt_out-zstat = icon_red_light.
ENDCASE.
gt_out-msg = lv_msg_sum .
MODIFY gt_out INDEX sy-tabix.
ENDLOOP.
ENDAT.
ENDLOOP.
ENDFORM. " FRM_CREATE_BOM
*&---------------------------------------------------------------------*
*& Form FRM_GET_MSG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_RETURN text
* <--P_LV_MSG text
*----------------------------------------------------------------------*
FORM frm_get_msg USING u_return LIKE bapiret2
CHANGING c_message TYPE string.
CLEAR c_message.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = u_return-id
msgnr = u_return-number
msgv1 = u_return-message_v1
msgv2 = u_return-message_v2
msgv3 = u_return-message_v3
msgv4 = u_return-message_v4
IMPORTING
message_text_output = c_message.
ENDFORM. " FRM_GET_MSG
采购订单批导
于 2024-01-09 18:01:48 首次发布