ZMLSCP1_RE0008-批量创建物料凭证
FS:
1. 检查寄售库存是否足够:
Select SLABS
From MKOL
Where matnr = 批量输入matnr and werk = 0批量输入plant
and lifnr = 批量输入 vendor and sobkz = “K”
IF SLABS < 批量输入ENTRY_QNT
MESSAGE ‘物料代码***的库存数量不足,请检查!’
EXIT
ENDIF
2. 调用bapi记账(注意该bapi最大记录数量为300条,大于300条要进行拆分)
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER-PSTING_DATE = 批量输入BUDAT
GOODSMVT_HEADER- DOC_DATE = 批量输入BUDAT
GOODSMVT_CODE-GM_CODE = “04”
GOODSMVT_ITEM-MATERIAL = 批量输入MATNR
GOODSMVT_ITEM-PLANT = 批量输入PLANT
GOODSMVT_ITEM-STGE_LOC = 批量输入STGE_LOC
GOODSMVT_ITEM-MOVE_TYPE = “411“
GOODSMVT_ITEM- SPEC_STOCK = “K”
GOODSMVT_ITEM- VENDOR = 批量输入VENDOR
GOODSMVT_ITEM-ENTRY_QNT = 批量输入ENTRY_QNT
GOODSMVT_ITEM-BATCH = 批量输入BATCH
GOODSMVT_ITEM- MOVE_PLANT = 批量输入PLANT
GOODSMVT_ITEM- MOVE_STLOC = 批量输入STGE_LOC
INPORTING
MATERIALDOCUMENT = W_ MATERIALDOCUMENT
TYPE = W_ TYPE
ID = W_ ID
NUMBER = W_ NUMBER
MESSAGE = W_ MESSAGE
输出格式(需要输出时,提供具体输出字段及格式,如果有样板文件,请附上)
1.导入格式:
技巧:按300line 分批创建物料凭证,
测试方法:将分批改成按几条来测试;3 line
2.对于程序处理:必须有抬头主键;
技巧:可以自己设定一个XBLNR,
3.需要提前检查物料的信息记录价格:BAPI_INFORECORD_GETLIST.
*& 寄售价格是否存在: CALL FUNCTION 'BAPI_INFORECORD_GETLIST' EXPORTING VENDOR = LS_OUTPUT-LIFNR MATERIAL = LS_OUTPUT-MATNR PLANT = LS_OUTPUT-WERKS INFO_TYPE = '2' PURCHORG_DATA = 'X' GENERAL_DATA = 'X' TABLES INFORECORD_GENERAL = LT_GENERAL INFORECORD_PURCHORG = LT_PURCHORG RETURN = LT_RETURN. *& check INFORECORD_PURCHORG-NET_PRICE LOOP AT LT_PURCHORG WHERE NET_PRICE NE SPACE AND PRICE_DATE >= LS_OUTPUT-BUDAT. "2017.12.31 ENDLOOP. IF SY-SUBRC NE 0. LV_MSG = '寄售采购信息记录的价格不存在,请检查!'. CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'. G_GR = 'X'. ENDIF.
4.检查没有错误才创建GR:
************************************************************************ * MAIN logic' ************************************************************************ START-OF-SELECTION. PERFORM FRM_GET_EXCEL_DATA TABLES GT_INTERN. *&check is all ok,create. IF G_GR NE 'X'. PERFORM FRM_GOODMVT_CREATE. ENDIF. PERFORM FRM_SHOW_DATA .
Source CODE:
*&---------------------------------------------------------------------* *& Report ZMLSCP1_RE0008 *& TITLE : 批量创建物料凭证 * *& MODULE NAME : MM * *& AUTHOR : CX * *& CREATE DATE : 20170315 * *& PROGRAM TYPE : 功能开发 * *& DESCRIPTION : 导入excel,选中数据创建物料凭证 * *& 1.excel导入指定字段(必输项?)到系统, *& 2.检查物料代码***的库存数量是否足够,不足报错, *& 3.对于库存检查ok 数据,每300条分批创建GR, *& 拿到返回结果显示ALV *&---------------------------------------------------------------------* *& MODIFICATION LOG * *& * *& DATE AUTHOR DESCRIPTION * *& <DATE> <修改人> <更新的内容> * *&---------------------------------------------------------------------* REPORT YDEMO_020 MESSAGE-ID ZMLSCP_001. INCLUDE <ICON>. TABLES:SSCRFIELDS. TABLES:MKPF, MSEG, MKOL."供应商的特殊库存 *FUNCTION-POOL:SLIS. TYPES:BEGIN OF TY_UPLOAD_STR, BUDAT TYPE STRING, "记账日期 MATNR TYPE STRING, "物料代码 WERKS TYPE STRING, "发出工厂 LGORT TYPE STRING, "发出库存地 MENGE TYPE STRING, "QUAN 13数量 PLANT TYPE STRING, "接收工厂 STLOC TYPE STRING, "接收库存地 LIFNR TYPE STRING, "供应商代码 CHARG TYPE STRING, "批次号 MESG TYPE STRING, END OF TY_UPLOAD_STR. TYPES :BEGIN OF TY_UPLOAD, BUDAT TYPE BUDAT, "记账日期 MATNR TYPE MATNR, "物料代码 WERKS TYPE WERKS_D,"发出工厂 LGORT TYPE LGORT_D,"发出库存地 MENGE TYPE KTMNG, "数量 PLANT TYPE PLWRK, "接收工厂 STLOC TYPE LGORT_D,"接收库存地 LIFNR TYPE LIFNR, "供应商代码 CHARG TYPE CHARG_D,"批次号 *是否加field? MBLNR TYPE MBLNR, "success MESG TYPE STRING,"error MSGTYPE TYPE C, ZICON TYPE CHAR4, LIGHT TYPE C, ZLINE TYPE SY-TABIX, XBLNR TYPE XBLNR, * XSELP TYPE C,"sel END OF TY_UPLOAD. TYPES:TY_DATA(256) TYPE C. TYPES: BEGIN OF TY_MKPF, XBLNR TYPE XBLNR, BUDAT TYPE DATUM, * MBLNR TYPE MBLNR, * MJAHR TYPE GJAHR, END OF TY_MKPF. DATA: GT_INTERN TYPE TABLE OF ALSMEX_TABLINE. DATA: GT_ALV TYPE TABLE OF TY_UPLOAD, GT_UPLOAD TYPE TABLE OF TY_UPLOAD_STR, GT_FLDCT TYPE STANDARD TABLE OF LVC_S_FCAT. "字段属性 DATA: GS_LAYOUT TYPE LVC_S_LAYO, G_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA: G_GR TYPE C. * CLASS LCL_EVENT_RECEIVER DEFINITION CONSTANTS:GCST_EXCEL_FILE LIKE RLGRAP-FILENAME VALUE 'C:\Users\Administrator\Desktop\ZPP_ML51.xlsx'."EXCEL文件名 CONSTANTS:GCST_EXCEL_TEMPLATE LIKE WWWDATATAB-OBJID VALUE 'ZPP_ML51'. "数据模板,数据模板名称 *---------------------------------------------------------------------- * * *---------------------------------------------------------------------- CLASS LCL_EVENT_RECEIVER DEFINITION. PUBLIC SECTION. METHODS HANDLE_MODIFY FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID IMPORTING E_MODIFIED ET_GOOD_CELLS. ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION *---------------------------------------------------------------------- * * CLASS LCL_EVENT_RECEIVER IMPLEMENTATION *---------------------------------------------------------------------- * * *---------------------------------------------------------------------- CLASS LCL_EVENT_RECEIVER IMPLEMENTATION. METHOD HANDLE_MODIFY. DATA STBL TYPE LVC_S_STBL. DATA:L_ERR_FLG TYPE C, L_FIELDNAME TYPE LVC_FNAME. DATA:LT_MSG TYPE STANDARD TABLE OF BAPIRET2. DATA:LS_CURRENT_CELL TYPE LVC_S_MODI. DATA: L_ROW TYPE I, L_VALUE TYPE C, L_COL TYPE I, LS_ROW_ID TYPE LVC_S_ROW, LS_COL_ID TYPE LVC_S_COL, LS_ROW_NO TYPE LVC_S_ROID, LS_OUTPUT TYPE TY_UPLOAD, LV_XBLNR TYPE XBLNR, LV_CHECK TYPE C. CLEAR: LV_XBLNR,LV_CHECK . CHECK E_MODIFIED = 'X'. * READ TABLE ET_GOOD_CELLS INTO LS_CURRENT_CELL INDEX 1. * L_ROW = LS_CURRENT_CELL-ROW_ID. * L_FIELDNAME = LS_CURRENT_CELL-FIELDNAME. * CHECK L_FIELDNAME = 'XSELP'. * READ TABLE GT_ALV INTO LS_OUTPUT INDEX L_ROW. * IF SY-SUBRC = 0. * LV_XBLNR = LS_OUTPUT-XBLNR. * LV_CHECK = LS_OUTPUT-XSELP. * ENDIF. * LOOP AT GT_ALV INTO LS_OUTPUT WHERE XBLNR = LV_XBLNR . * LS_OUTPUT-XSELP = LV_CHECK. * MODIFY GT_ALV FROM LS_OUTPUT TRANSPORTING XSELP. * ENDLOOP. * 稳定刷新 STBL-ROW = 'X'." 基于行的稳定刷新 STBL-COL = 'X'." 基于列稳定刷新 CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY EXPORTING IS_STABLE = STBL. ENDMETHOD. "HANDLE_MODIFY ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-T01. SELECTION-SCREEN:FUNCTION KEY 1. PARAMETERS:P_UPLOAD LIKE RLGRAP-FILENAME MEMORY ID WS OBLIGATORY ."DEFAULT GCST_EXCEL_FILE. PARAMETERS:P_COUNT TYPE SY-TABIX DEFAULT 300 NO-DISPLAY. SELECTION-SCREEN END OF BLOCK B1. *&->(添加模板导入) INITIALIZATION. DATA LS_FUNCTXT TYPE SMP_DYNTXT. *&启用自定义工具 CLEAR LS_FUNCTXT. LS_FUNCTXT-ICON_TEXT = '下载模板'. LS_FUNCTXT-ICON_ID = '@49@'. LS_FUNCTXT-QUICKINFO = '下载模板'. SSCRFIELDS-FUNCTXT_01 = LS_FUNCTXT. GET PARAMETER ID 'WS' FIELD P_UPLOAD. IF P_UPLOAD IS INITIAL. * BREAK LZH. P_UPLOAD = GCST_EXCEL_FILE. ENDIF. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UPLOAD. PERFORM FRM_OPEN_DIALOG. ************************************************************************ * AT SELECTION-SCREEN ************************************************************************ AT SELECTION-SCREEN. CLEAR SY-UCOMM. CASE SSCRFIELDS-UCOMM. WHEN 'FC01'. PERFORM FRM_DOWNLOAD_TEMPLATE CHANGING P_UPLOAD. * WHEN 'FC02'. "开启文件 * PERFORM frm_open_excel_file USING p_file. ENDCASE. LOOP AT SCREEN. IF SCREEN-NAME EQ 'P_COUNT'. SCREEN-INPUT = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ************************************************************************ * MAIN logic' ************************************************************************ START-OF-SELECTION. PERFORM FRM_GET_EXCEL_DATA TABLES GT_INTERN. *&check is all ok,create. IF G_GR NE 'X'. PERFORM FRM_GOODMVT_CREATE. ENDIF. PERFORM FRM_SHOW_DATA . SET PARAMETER ID 'WS' FIELD P_UPLOAD. *&---------------------------------------------------------------------* *& Form FRM_OPEN_DIALOG *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_OPEN_DIALOG . DATA : LT_FILE_TABLE TYPE FILETABLE, LV_RC TYPE I. DATA : LV_FILENAME TYPE STRING. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = 'Select file' * default_extension = 'XLS' * default_filename = * file_filter = cl_gui_frontend_services=>filetype_excel * with_encoding = * initial_directory = MULTISELECTION = ' ' CHANGING FILE_TABLE = LT_FILE_TABLE 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. * Implement suitable error handling here ENDIF. READ TABLE LT_FILE_TABLE INTO LV_FILENAME INDEX 1. P_UPLOAD = LV_FILENAME. ENDFORM. "frm_open_dialog *&---------------------------------------------------------------------* *& Form FRM_GET_EXCEL_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_GT_INTERN text *----------------------------------------------------------------------* FORM FRM_GET_EXCEL_DATA TABLES PT_INTERN STRUCTURE ALSMEX_TABLINE. DATA: LS_INTERN TYPE ALSMEX_TABLINE. DATA: LS_INTERN_TEMP TYPE ALSMEX_TABLINE. DATA: LV_VALUE TYPE TY_DATA. DATA: LS_UPLOAD TYPE TY_UPLOAD_STR. DATA: LT_UPLOAD TYPE TABLE OF TY_UPLOAD_STR. DATA: LT_UPLOAD_DEL TYPE TABLE OF TY_UPLOAD_STR. FIELD-SYMBOLS: <FV_UPLOAD> TYPE ANY ."symbols. DATA:L_LINE TYPE SY-TABIX, L_LINE1 TYPE SY-TABIX. REFRESH PT_INTERN. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = P_UPLOAD I_BEGIN_COL = 1 I_BEGIN_ROW = 1 I_END_COL = 100 I_END_ROW = 10000 * sheet_name = TABLES INTERN = PT_INTERN EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 . ENDIF. LOOP AT PT_INTERN INTO LS_INTERN_TEMP WHERE ROW > 1. LS_INTERN = LS_INTERN_TEMP. ASSIGN COMPONENT LS_INTERN-COL OF STRUCTURE LS_UPLOAD TO <FV_UPLOAD>. <FV_UPLOAD> = LS_INTERN-VALUE. AT END OF ROW. APPEND LS_UPLOAD TO LT_UPLOAD. CLEAR: LS_UPLOAD. ENDAT. CLEAR: LS_INTERN. ENDLOOP. *&A1.检查数据重复: L_LINE = LINES( LT_UPLOAD[] ). SORT LT_UPLOAD BY BUDAT MATNR WERKS LGORT PLANT STLOC LIFNR. IF L_LINE = 0. MESSAGE I001 WITH '没有上传数据!'. STOP. ENDIF. LT_UPLOAD_DEL[] = LT_UPLOAD[]. SORT LT_UPLOAD_DEL. DELETE ADJACENT DUPLICATES FROM LT_UPLOAD_DEL COMPARING ALL FIELDS. * COMPARING BUDAT MATNR WERKS LGORT PLANT STLOC LIFNR. L_LINE1 = LINES( LT_UPLOAD_DEL[] ). IF L_LINE1 LT L_LINE. MESSAGE I001 WITH '导入数据有重复条目,请检查!'. ENDIF. *&move data into GT_ALV[]. PERFORM FRM_INVALID_CHECK TABLES LT_UPLOAD. ENDFORM. "frm_get_excel_data *&---------------------------------------------------------------------* *& Form FRM_SHOW_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_SHOW_DATA . DATA: L_S_GLAY TYPE LVC_S_GLAY . DATA: LT_EVENTS TYPE SLIS_T_EVENT. L_S_GLAY-EDT_CLL_CB = 'X'. * 设置布局 PERFORM FRM_LAYOUT_SET. * 设置字段 PERFORM FRM_SET_ALY_FIELDCAT_ACC. * 设置ALV事件 * PERFORM FRM_EVENTS_SET TABLES LT_EVENTS. * 显示ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = SY-REPID IS_LAYOUT_LVC = GS_LAYOUT "布局 IT_FIELDCAT_LVC = GT_FLDCT[] "字段 * I_CALLBACK_PF_STATUS_SET = 'FRM_SET_STATUS' "状态 * I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND' "用户自定义命令 I_GRID_SETTINGS = L_S_GLAY * IT_EVENTS = LT_EVENTS I_SAVE = 'A' TABLES T_OUTTAB = GT_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. "frm_show_data *&---------------------------------------------------------------------* *& Form FRM_LAYOUT_SET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_LAYOUT_SET . GS_LAYOUT-DETAILINIT = 'X'. GS_LAYOUT-ZEBRA = 'X'. GS_LAYOUT-CWIDTH_OPT = 'X'."CWIDTH_OPT * GS_LAYOUT-EXCP_FNAME = 'ZICON'. "例外行 ENDFORM. "frm_layout_set *&---------------------------------------------------------------------* *& Form FRM_SET_ALY_FIELDCAT_ACC *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_SET_ALY_FIELDCAT_ACC . DATA: L_INDEX TYPE SY-INDEX. DATA: LS_FLDCT TYPE LVC_S_FCAT. DEFINE SET_FIELDCAT. LS_FLDCT-TABNAME = 'GT_ALV'. LS_FLDCT-COL_POS = L_INDEX. LS_FLDCT-FIELDNAME = '&1'. LS_FLDCT-SCRTEXT_M = &2. LS_FLDCT-OUTPUTLEN = &3. LS_FLDCT-EDIT = &4. LS_FLDCT-CHECKBOX = &5. APPEND LS_FLDCT TO GT_FLDCT. CLEAR LS_FLDCT. L_INDEX = L_INDEX + 1. END-OF-DEFINITION. * BUDAT "记账日期 * MATNR "物料代码 * WERKS "发出工厂 * LGORT "发出库存地 * MENGE "QUAN 13数量 * PLANT "接收工厂 * STLOC "接收库存地 * LIFNR "供应商代码 * CHARG "批次号 * SET_FIELDCAT XSELP '' '5' 'X' 'X' . SET_FIELDCAT ZICON '状态' '5' '' '' . SET_FIELDCAT BUDAT '记账日期' '10' '' '' . SET_FIELDCAT MATNR '物料代码' '18' '' ''. SET_FIELDCAT WERKS '发出工厂' '4' '' ''. SET_FIELDCAT LGORT '发出库存地' '4' '' ''. SET_FIELDCAT MENGE '数量' ' ' '' ''. SET_FIELDCAT PLANT '接收工厂' '4' '' ''. SET_FIELDCAT STLOC '接收库存地' '4' '' ''. SET_FIELDCAT LIFNR '供应商代码' '10' '' ''. SET_FIELDCAT CHARG '批次号' '12' '' ''. SET_FIELDCAT MBLNR '凭证号' '10' '' ''. SET_FIELDCAT MESG '错误信息' '12' '' ''. * LOOP AT GT_FLDCT ENDFORM. "frm_set_aly_fieldcat_acc **---------------------------------------------------------------------* ** FORM FRM_USER_COMMAND * **---------------------------------------------------------------------* ** ........ 用户命令 * **---------------------------------------------------------------------* ** --> P_UCOMM * ** --> P_SELFIELD * **---------------------------------------------------------------------* *FORM FRM_USER_COMMAND USING P_UCOMM TYPE SY-UCOMM * P_SELFIELD TYPE SLIS_SELFIELD. * DATA STBL TYPE LVC_S_STBL. * P_SELFIELD-REFRESH = 'X'. * CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' * IMPORTING * E_GRID = G_GRID. * CASE P_UCOMM. * WHEN '&SELECTALL'. "全选 * PERFORM FRM_SEL_ALL USING 'X'. * WHEN '&DISSELA'. "全选取消 * PERFORM FRM_SEL_ALL USING ''. * WHEN '&GENERATE'. * CALL METHOD G_GRID->CHECK_CHANGED_DATA. "取得屏幕的值 * PERFORM FRM_ORDER_SAVE. * PERFORM FRM_REFRESH_ALV. * MESSAGE TEXT-004 TYPE 'S'. * ENDCASE. *ENDFORM. "FRM_USER_COMMAND **---------------------------------------------------------------------* ** FORM FRM_SET_STATUS * **---------------------------------------------------------------------* ** ........根据事务码的不同设置不同的GUI状态栏 * **---------------------------------------------------------------------* *FORM FRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. * CLEAR: RT_EXTAB. * REFRESH: RT_EXTAB. * SET PF-STATUS '1000'." EXCLUDING rt_extab. *ENDFORM . "frm_set_status *&---------------------------------------------------------------------* *& Form FRM_INVALID_CHECK *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_INVALID_CHECK TABLES PT_UPLOAD LIKE GT_UPLOAD. DATA: LS_UPLOAD TYPE TY_UPLOAD_STR. DATA: LS_OUTPUT TYPE TY_UPLOAD. DATA: O_CX TYPE REF TO CX_ROOT. DATA: LV_MSG TYPE CHAR255. * DATA:LT_GENERAL LIKE TABLE OF BAPIEINA WITH HEADER LINE, * LT_PURCHORG LIKE TABLE OF BAPIEINE WITH HEADER LINE, * LT_RETURN LIKE TABLE OF BAPIRETURN WITH HEADER LINE. DATA:LT_GENERAL LIKE BAPIEINA OCCURS 0, LT_PURCHORG LIKE BAPIEINE OCCURS 0 WITH HEADER LINE, LT_RETURN LIKE BAPIRETURN OCCURS 0. LOOP AT PT_UPLOAD INTO LS_UPLOAD . LS_OUTPUT-ZLINE = SY-TABIX. LS_OUTPUT-BUDAT = LS_UPLOAD-BUDAT. LS_OUTPUT-MATNR = LS_UPLOAD-MATNR. LS_OUTPUT-WERKS = LS_UPLOAD-WERKS. LS_OUTPUT-LGORT = LS_UPLOAD-LGORT. * LS_OUTPUT-MENGE = LS_UPLOAD-MENGE. LS_OUTPUT-PLANT = LS_UPLOAD-PLANT. LS_OUTPUT-STLOC = LS_UPLOAD-STLOC. LS_OUTPUT-LIFNR = LS_UPLOAD-LIFNR. LS_OUTPUT-CHARG = LS_UPLOAD-CHARG. TRY . MOVE LS_UPLOAD-MENGE TO LS_OUTPUT-MENGE. CATCH CX_ROOT INTO O_CX. LV_MSG = O_CX->IF_MESSAGE~GET_TEXT( ). CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'. ENDTRY. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = LS_OUTPUT-MATNR IMPORTING OUTPUT = LS_OUTPUT-MATNR. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = LS_OUTPUT-LIFNR IMPORTING OUTPUT = LS_OUTPUT-LIFNR. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = LS_OUTPUT-CHARG IMPORTING OUTPUT = LS_OUTPUT-CHARG. *& check mkol-寄售库存 CLEAR:MKOL. SELECT SINGLE SLABS INTO MKOL-SLABS FROM MKOL WHERE MATNR = LS_OUTPUT-MATNR AND WERKS = LS_OUTPUT-WERKS AND LGORT = LS_OUTPUT-LGORT AND CHARG = LS_OUTPUT-CHARG AND LIFNR = LS_OUTPUT-LIFNR AND SOBKZ = 'K'. IF MKOL-SLABS < LS_OUTPUT-MENGE. LV_MSG = '物料代码' && LS_OUTPUT-MATNR && '的库存数量不足,请检查!'. CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'. G_GR = 'X'. ENDIF. CLEAR:LT_GENERAL[] , LT_PURCHORG[], LT_RETURN[]. *& 寄售价格是否存在: CALL FUNCTION 'BAPI_INFORECORD_GETLIST' EXPORTING VENDOR = LS_OUTPUT-LIFNR MATERIAL = LS_OUTPUT-MATNR PLANT = LS_OUTPUT-WERKS INFO_TYPE = '2' PURCHORG_DATA = 'X' GENERAL_DATA = 'X' TABLES INFORECORD_GENERAL = LT_GENERAL INFORECORD_PURCHORG = LT_PURCHORG RETURN = LT_RETURN. *& check INFORECORD_PURCHORG-NET_PRICE LOOP AT LT_PURCHORG WHERE NET_PRICE NE SPACE AND PRICE_DATE >= LS_OUTPUT-BUDAT. "2017.12.31 ENDLOOP. IF SY-SUBRC NE 0. LV_MSG = '寄售采购信息记录的价格不存在,请检查!'. CONCATENATE LS_OUTPUT-MESG LV_MSG INTO LS_OUTPUT-MESG SEPARATED BY ';'. G_GR = 'X'. ENDIF. IF LS_OUTPUT-MESG NE SPACE. LS_OUTPUT-LIGHT = 1. LS_OUTPUT-ZICON = '@02@'. ELSE. LS_OUTPUT-LIGHT = 3. LS_OUTPUT-ZICON = '@01@'. ENDIF. SHIFT LS_OUTPUT-MESG LEFT DELETING LEADING ';'. SHIFT:LS_OUTPUT-CHARG LEFT DELETING LEADING '0', LS_OUTPUT-MATNR LEFT DELETING LEADING '0', LS_OUTPUT-LIFNR LEFT DELETING LEADING '0'. APPEND LS_OUTPUT TO GT_ALV. CLEAR: LS_OUTPUT, LV_MSG. ENDLOOP. SORT GT_ALV BY BUDAT MATNR WERKS LIFNR. ENDFORM. "frm_invalid_check *&---------------------------------------------------------------------* *& Form FRM_GOODMVT_CREATE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_GOODMVT_CREATE . DATA:LT_ALV TYPE TABLE OF TY_UPLOAD, WA_ALV TYPE TY_UPLOAD, L_TABIX TYPE SY-TABIX. DATA:LT_MKPF TYPE TABLE OF TY_MKPF, WA_MKPF TYPE TY_MKPF. DATA:L_DIV TYPE SY-TABIX, L_MOD TYPE SY-TABIX. * DATA:L_PACK TYPE SY-TABIX. DATA:L_LINE TYPE SY-TABIX, L_FLAG TYPE C. RANGES:R_XBLNR FOR SY-TABIX. *&-bapi use. DATA: LS_GOODSMVT_HEADER TYPE BAPI2017_GM_HEAD_01, LS_GOODSMVT_CODE TYPE BAPI2017_GM_CODE, * lv_materialdocument TYPE bapi2017_gm_head_ret-mat_doc, LV_MATDOCUMENTYEAR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR, LT_GOODSMVT_ITEM TYPE TABLE OF BAPI2017_GM_ITEM_CREATE, LS_GOODSMVT_ITEM TYPE BAPI2017_GM_ITEM_CREATE, LT_RETURN TYPE TABLE OF BAPIRET2, LS_RETURN TYPE BAPIRET2, LS_OUTPUT TYPE TY_UPLOAD. DATA: LV_MATERIALDOCUMENT TYPE MBLNR, LV_MESSAGE TYPE CHAR255. CLEAR:L_TABIX,LT_ALV[],LT_MKPF[]. LT_ALV[] = GT_ALV[]. DELETE LT_ALV WHERE MESG NE SPACE. L_TABIX = LINES( LT_ALV[] ). *&创建GR table LOOP AT LT_ALV INTO WA_ALV WHERE MESG EQ SPACE. CLEAR:L_DIV,L_MOD. L_TABIX = WA_ALV-ZLINE. IF SY-TABIX <= P_COUNT. WA_ALV-XBLNR = P_COUNT. ELSE. L_DIV = SY-TABIX DIV P_COUNT. L_MOD = SY-TABIX MOD P_COUNT. IF L_MOD > 0. WA_ALV-XBLNR = ( L_DIV + 1 ) * P_COUNT . ELSE. WA_ALV-XBLNR = L_DIV * P_COUNT . ENDIF. ENDIF. WA_MKPF-XBLNR = WA_ALV-XBLNR. WA_MKPF-BUDAT = WA_ALV-BUDAT. COLLECT WA_MKPF INTO LT_MKPF. CLEAR WA_MKPF. MODIFY LT_ALV FROM WA_ALV TRANSPORTING XBLNR WHERE ZLINE = L_TABIX. MODIFY GT_ALV FROM WA_ALV TRANSPORTING XBLNR WHERE ZLINE = L_TABIX. CLEAR WA_ALV. ENDLOOP. * BREAK LZH. LOOP AT LT_MKPF INTO WA_MKPF. *&s1.head LS_GOODSMVT_HEADER-PSTNG_DATE = WA_MKPF-BUDAT."过账 LS_GOODSMVT_HEADER-DOC_DATE = WA_MKPF-BUDAT."凭证 LS_GOODSMVT_HEADER-PR_UNAME = SY-UNAME. * LS_GOODSMVT_HEADER-REF_DOC_NO = WA_ALV-XBLNR. "单号 * LS_GOODSMVT_HEADER-HEADER_TXT = WA_ALV-BKTXT. "备注 LS_GOODSMVT_CODE = '04'. "MB1B - Transfer Posting *&s2.item LOOP AT LT_ALV INTO WA_ALV WHERE XBLNR = WA_MKPF-XBLNR AND BUDAT = WA_MKPF-BUDAT. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = WA_ALV-MATNR IMPORTING OUTPUT = WA_ALV-MATNR. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = WA_ALV-LIFNR IMPORTING OUTPUT = WA_ALV-LIFNR. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = LS_OUTPUT-CHARG IMPORTING OUTPUT = LS_OUTPUT-CHARG. *&s1.item data, LS_GOODSMVT_ITEM-MATERIAL = WA_ALV-MATNR. LS_GOODSMVT_ITEM-PLANT = WA_ALV-WERKS. LS_GOODSMVT_ITEM-STGE_LOC = WA_ALV-LGORT. LS_GOODSMVT_ITEM-MOVE_TYPE = '411'. LS_GOODSMVT_ITEM-SPEC_STOCK = 'K'. LS_GOODSMVT_ITEM-VENDOR = WA_ALV-LIFNR. LS_GOODSMVT_ITEM-ENTRY_QNT = WA_ALV-MENGE. LS_GOODSMVT_ITEM-BATCH = WA_ALV-CHARG. LS_GOODSMVT_ITEM-MOVE_PLANT = WA_ALV-PLANT. LS_GOODSMVT_ITEM-MOVE_STLOC = WA_ALV-STLOC. * IF LS_OUTPUT-BWART = '262' OR LS_OUTPUT-BWART = 'Y62'. "部分冲销 * LS_GOODSMVT_ITEM-XSTOB = 'X'. * ENDIF. APPEND LS_GOODSMVT_ITEM TO LT_GOODSMVT_ITEM. ENDLOOP. *&S3.create CALL FUNCTION 'BAPI_GOODSMVT_CREATE' EXPORTING GOODSMVT_HEADER = LS_GOODSMVT_HEADER GOODSMVT_CODE = LS_GOODSMVT_CODE IMPORTING MATERIALDOCUMENT = LV_MATERIALDOCUMENT MATDOCUMENTYEAR = LV_MATDOCUMENTYEAR TABLES GOODSMVT_ITEM = LT_GOODSMVT_ITEM[] RETURN = LT_RETURN[]. IF LV_MATERIALDOCUMENT IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. WA_ALV-MSGTYPE = 'E'. WA_ALV-LIGHT = '1'. WA_ALV-ZICON = '@02@'. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. WA_ALV-MSGTYPE = 'S'. WA_ALV-MESG = '转库成功!'. WA_ALV-LIGHT = '3'. WA_ALV-ZICON = '@01@'. WA_ALV-MBLNR = LV_MATERIALDOCUMENT. ENDIF. LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E' . CONCATENATE LV_MESSAGE LS_RETURN-MESSAGE LS_RETURN-MESSAGE_V1 LS_RETURN-MESSAGE_V2 LS_RETURN-MESSAGE_V3 LS_RETURN-MESSAGE_V4 INTO WA_ALV-MESG. ENDLOOP. *&s1.clear: CLEAR:LS_GOODSMVT_HEADER,LS_GOODSMVT_CODE, LV_MATERIALDOCUMENT,LV_MATDOCUMENTYEAR, LS_GOODSMVT_ITEM, LT_GOODSMVT_ITEM[],LT_RETURN[]. * MODIFY LT_ALV FROM WA_ALV MODIFY GT_ALV FROM WA_ALV TRANSPORTING MSGTYPE MESG LIGHT MBLNR ZICON WHERE XBLNR = WA_MKPF-XBLNR AND BUDAT = WA_MKPF-BUDAT. CLEAR:WA_MKPF,WA_ALV. ENDLOOP. ENDFORM. " FRM_GOODMVT_CREATE *&---------------------------------------------------------------------* *& Form FRM_DOWNLOAD_TEMPLATE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_P_UPLOAD text *----------------------------------------------------------------------* FORM FRM_DOWNLOAD_TEMPLATE CHANGING IC_FILE. *数据定义 DATA:LC_FILE TYPE STRING, LC_RESULT TYPE C. "标识: 空表示文件不存在;否则,表示存在 DATA:LC_DEST TYPE LOCALFILE. "目标文件 DATA:LS_KEY TYPE WWWDATATAB, LV_SUBRC TYPE SY-SUBRC. *S1.判断文件是否存在 LC_FILE = IC_FILE. CLEAR LC_RESULT. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST EXPORTING FILE = LC_FILE RECEIVING RESULT = LC_RESULT EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 WRONG_PARAMETER = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF LC_RESULT IS NOT INITIAL. *&S2."文件已经存在,是否选择覆盖, DATA LC_ANSWER TYPE C. CLEAR LC_ANSWER. CALL FUNCTION 'POPUP_TO_CONFIRM' EXPORTING TITLEBAR = TEXT-S01 "'请确认 ' TEXT_QUESTION = TEXT-S02 "'文件已经存在,是否要覆盖?' TEXT_BUTTON_1 = 'Yes'(S03) TEXT_BUTTON_2 = 'No'(S04) DEFAULT_BUTTON = '2' "缺省选中按钮: 1 是; 2 否 DISPLAY_CANCEL_BUTTON = '' "标识: 为空,不显示 取消按钮 IMPORTING ANSWER = LC_ANSWER "标识: 1 是; EXCEPTIONS TEXT_NOT_FOUND = 1 OTHERS = 2. IF LC_ANSWER NE '1'. EXIT. ENDIF. ENDIF. *下载EXCEL模板 * IF IC_FILE NS '.xls' AND IC_FILE NS '.xls'. * CONCATENATE IC_FILE '.xls' INTO IC_FILE. * ENDIF. LC_DEST = IC_FILE. LS_KEY-RELID = 'MI'. LS_KEY-OBJID = GCST_EXCEL_TEMPLATE. "Z01MM090"SY-TCODE. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING KEY = LS_KEY DESTINATION = LC_DEST IMPORTING RC = LV_SUBRC. IF LV_SUBRC <> 0. MESSAGE E001 WITH 'Template file does not exist, or the file path error!'. "(ZMLSCP_001) TYPE 'E'. EXIT. ENDIF. ** 打开EXCEL模板文件 PERFORM FRM_OPEN_EXCEL_FILE USING IC_FILE. ENDFORM. "FRM_DOWNLOAD_TEMPLATE *&---------------------------------------------------------------------* *& Form FRM_OPEN_EXCEL_FILE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_IC_FILE text *----------------------------------------------------------------------* FORM FRM_OPEN_EXCEL_FILE USING IC_FILE. *数据定义 TYPE-POOLS:OLE2. "OLE声明 DATA:LO_EXCEL TYPE OLE2_OBJECT, "EXCEL应用程序 LO_WORKBOOKS TYPE OLE2_OBJECT, "EXCEL文件窗口 LO_WORKBOOK TYPE OLE2_OBJECT, "EXCEL文件 LO_SHEET TYPE OLE2_OBJECT. "EXCEL 文件的SHEET页 DATA:LC_FILE TYPE STRING, LC_RESULT TYPE C. "标识: 空表示文件不存在;否则,表示存在 *******程序主体******* **判断文件是否存在 LC_FILE = IC_FILE. CLEAR LC_RESULT. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST EXPORTING FILE = LC_FILE RECEIVING RESULT = LC_RESULT EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 WRONG_PARAMETER = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF LC_RESULT IS INITIAL. MESSAGE E001 WITH '文件不存在!'. EXIT. ENDIF. **打开EXCEL文件 CREATE OBJECT LO_EXCEL 'EXCEL.APPLICATION'. IF SY-SUBRC NE 0 . CREATE OBJECT LO_EXCEL 'ET.APPLICATION'. IF SY-SUBRC NE 0. MESSAGE E001 WITH '无法创建OLE OBJECT,请检查是否安装金山WPS或微软Office!'." '无法创建OLE OBJECT,请检查是否安装金山WPS或微软Office!'. ENDIF. ENDIF . CALL METHOD OF LO_EXCEL 'WORKBOOKS' = LO_WORKBOOKS. CALL METHOD OF LO_WORKBOOKS 'OPEN' = LO_WORKBOOK EXPORTING #1 = IC_FILE. CALL METHOD OF LO_WORKBOOK 'WORKSHEETS' = LO_SHEET EXPORTING #1 = 1. ** PERFORM FRM_EXPORT_FILL_HEADER. * PERFORM FRM_EXPORT_FILL. * CALL METHOD OF SHEET 'CELLS' = CELL EXPORTING #1 = 1 #2 = 1. * CALL METHOD OF CELL 'SELECT'. * SET PROPERTY OF EXCEL 'CUTCOPYMODE' = 0. ** SET PROPERTY OF WORKBOOK 'SAVED' = 1. SET PROPERTY OF LO_EXCEL 'VISIBLE' = 1. * CALL METHOD OF WORKBOOK 'SAVE'. FREE OBJECT: LO_EXCEL,LO_WORKBOOKS,LO_WORKBOOK. ",SHEET,RANGE,CELL. ENDFORM. "FRM_OPEN_EXCEL_FILE
本人常年接收SAP运维和远程项目,ECC,S/4HANA,CRM,WDA.
远程人天可谈,终身售后,有活请联系V信:18925782767(问问题免费,欢迎交流!)
!!请关注本人技术分享公众号:SAP翔子(可扫头像二维码)
每天分享新知识,博客文章也会陆续整理并迁移至公众号,与您一起共同学习

浙公网安备 33010602011771号