1、已开发程序查询

*&---------------------------------------------------------------------* *& Report ZHAVE *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZHAVE. TABLES: trdir, tstc. DATA: BEGIN OF gs_data, sel TYPE boolean, " 用于选择多行 name TYPE trdir-name, " 程序名 subc TYPE trdir-subc, " 程序类型 rstat TYPE trdir-rstat, " 状态 tcode TYPE tstc-tcode, " 事务码 ttext TYPE tstct-ttext, " 事务码描述 cnam TYPE trdir-cnam, " 创建者 cdat TYPE trdir-cdat, " 创建日期 unam TYPE trdir-unam, " 最后修改人 udat TYPE trdir-udat, " 修改日期 END OF gs_data. DATA: gt_data LIKE TABLE OF gs_data. " ALV显示內表 DATA: line TYPE i." ALV行数 " 选择屏幕 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: s_name FOR trdir-name, " 程序名 s_tcode FOR tstc-tcode, " 事务码 s_cnam FOR trdir-cnam, " 创建者 s_unam FOR trdir-unam, " 最后修改人 s_subc FOR trdir-subc DEFAULT 1, " 程序类型 s_rstat FOR trdir-rstat. " 状态 SELECTION-SCREEN END OF BLOCK b1. INITIALIZATION. %_s_name_%_app_%-text = '程序名'. %_s_tcode_%_app_%-text = '事务码'. %_s_cnam_%_app_%-text = '创建者'. %_s_unam_%_app_%-text = '最后修改人'. %_s_subc_%_app_%-text = '程序类型'. %_s_rstat_%_app_%-text = '状态'. " F8事件 AT SELECTION-SCREEN. DATA p_prog TYPE programm . DATA: l_rc(5). p_prog = sy-repid. PERFORM copy_status_diff_progs_new IN PROGRAM saplsmpe IF FOUND USING 'X' 'SAPLKKBL' p_prog 'STANDARD_FULLSCREEN' 'STATUS_ALV' CHANGING l_rc. START-OF-SELECTION. IF s_name[] IS INITIAL AND " 程序名 s_cnam[] IS INITIAL AND " 创建者 s_unam[] IS INITIAL AND " 最后修改人 s_subc[] IS INITIAL AND " 程序类型 s_tcode[] IS INITIAL AND " 事务码 s_rstat[] IS INITIAL. " 状态 MESSAGE '请至少输入一个条件!' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. PERFORM get_data. IF gt_data[] IS INITIAL. MESSAGE '无符合条件的记录' TYPE 'S' DISPLAY LIKE 'E'. EXIT. ENDIF. PERFORM alv_data. *&---------------------------------------------------------------------* *& Form get_data *&---------------------------------------------------------------------* * text 获取数据 *----------------------------------------------------------------------* FORM get_data. DATA: BEGIN OF ls_tstc, tcode TYPE tstc-tcode, ttext TYPE tstct-ttext, END OF ls_tstc. DATA: lt_tstc LIKE TABLE OF ls_tstc. " 输入事务码时 IF s_tcode[] IS NOT INITIAL. SELECT a~tcode b~name b~subc b~rstat b~cnam b~cdat b~unam b~udat c~ttext INTO CORRESPONDING FIELDS OF TABLE gt_data FROM tstc AS a INNER JOIN trdir AS b ON a~pgmna = b~name INNER JOIN tstct AS c ON a~tcode = c~tcode WHERE a~tcode IN s_tcode AND b~name IN s_name " 程序名 AND b~cnam IN s_cnam " 创建者 AND b~unam IN s_unam " 最后修改人 AND b~subc IN s_subc " 程序类型 AND b~rstat IN s_rstat. " 状态 ELSE. " 没有输入事务码时 SELECT a~name a~subc a~rstat a~cnam a~cdat a~unam a~udat b~tcode INTO CORRESPONDING FIELDS OF TABLE gt_data FROM trdir AS a LEFT JOIN tstc AS b ON a~name = b~pgmna WHERE a~name IN s_name " 程序名 AND a~cnam IN s_cnam " 创建者 AND a~unam IN s_unam " 最后修改人 AND a~subc IN s_subc " 程序类型 AND a~rstat IN s_rstat. " 状态 IF gt_data[] IS NOT INITIAL. " 查询事务码描述文本 SELECT tcode ttext INTO CORRESPONDING FIELDS OF TABLE lt_tstc FROM tstct FOR ALL ENTRIES IN gt_data WHERE tcode = gt_data-tcode. SORT lt_tstc BY tcode." 先排序 LOOP AT gt_data INTO gs_data. READ TABLE lt_tstc INTO ls_tstc WITH KEY tcode = gs_data-tcode BINARY SEARCH. IF sy-subrc EQ 0. gs_data-ttext = ls_tstc-ttext. MODIFY gt_data FROM gs_data TRANSPORTING ttext. ENDIF. ENDLOOP. ENDIF. ENDIF. " 统计內表行数 DESCRIBE TABLE gt_data LINES line. " 排序 SORT gt_data BY cnam cdat. ENDFORM. "get_data *&---------------------------------------------------------------------* *& Form alv_data *&---------------------------------------------------------------------* * text 显示ALV数据 *----------------------------------------------------------------------* FORM alv_data. DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE, layout TYPE slis_layout_alv. PERFORM get_layout CHANGING layout. " alv布局 PERFORM get_fieldcat TABLES fieldcat. " 控制报表显示哪些栏位 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid " 程序名 is_layout = layout " 布局 * i_callback_pf_status_set = 'STATUS_ALV' " STATUS * i_callback_user_command = 'USER_COMMAND_FORM' " 定义按钮的功能 it_fieldcat = fieldcat[] " alv栏目(显示字段)内表 TABLES t_outtab = gt_data " 将内表数据赋给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_data *&---------------------------------------------------------------------* *& Form get_layout *&---------------------------------------------------------------------* * text ALV布局设置 *----------------------------------------------------------------------* * -->C_LAYOUT text *----------------------------------------------------------------------* FORM get_layout CHANGING c_layout TYPE slis_layout_alv. CLEAR: c_layout. c_layout-colwidth_optimize = 'X'." 宽度自动调节 c_layout-box_fieldname = 'SEL'. " 选择多行 c_layout-zebra = 'X'. " 颜色交替显示 ENDFORM. "get_layout *&---------------------------------------------------------------------* *& Form USER_COMMAND_FORM *&---------------------------------------------------------------------* * text 自定义按钮功能 *----------------------------------------------------------------------* * -->R_UCOMM text * -->RS_SELFIELD text *----------------------------------------------------------------------* FORM user_command_form USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. READ TABLE gt_data INTO gs_data INDEX rs_selfield-tabindex. IF sy-subrc EQ 0 AND gs_data-tcode IS NOT INITIAL. CASE r_ucomm. WHEN '&IC1'. " 双击事件 CALL TRANSACTION gs_data-tcode. " 调用事务码,运行程序 WHEN OTHERS. ENDCASE. ENDIF. ENDFORM. "USER_COMMAND_FORM *&---------------------------------------------------------------------* *& Form get_fieldcat *&---------------------------------------------------------------------* * text 显示字段 *----------------------------------------------------------------------* * -->CT_TAB text *----------------------------------------------------------------------* FORM get_fieldcat TABLES ct_tab TYPE slis_t_fieldcat_alv. DATA: fcat TYPE slis_fieldcat_alv. DEFINE add_fcat. CLEAR fcat. fcat-fieldname = &1. " 字段名 fcat-seltext_l = &2. " 显示字段文本 fcat-seltext_m = &2. fcat-seltext_s = &2. fcat-key = &3. " 主键 fcat-hotspot = &4. " 链接 fcat-checkbox = &5. " 复选框 fcat-edit = &6. " 是否可修改 fcat-ref_tabname = &7. " 参考表 fcat-ref_fieldname = &8. " 参考表字段 APPEND fcat TO ct_tab. END-OF-DEFINITION. add_fcat 'NAME' '程序名' '' '' '' '' '' ''. add_fcat 'SUBC' '程序类型' '' '' '' '' 'TRDIR' 'SUBC'. add_fcat 'RSTAT' '状态' '' '' '' '' 'TRDIR' 'RSTAT'. add_fcat 'TCODE' '事务码' '' '' '' '' '' ''. add_fcat 'TTEXT' '事务码描述' '' '' '' '' '' ''. add_fcat 'CNAM' '创建者' '' '' '' '' '' ''. add_fcat 'CDAT' '创建日期' '' '' '' '' '' ''. add_fcat 'UNAM' '最后修改人' '' '' '' '' '' ''. add_fcat 'UDAT' '修改日期' '' '' '' '' '' ''. ENDFORM. "get_fieldcat *&---------------------------------------------------------------------* *& Form pfstatus_form *&---------------------------------------------------------------------* * text STATUS *----------------------------------------------------------------------* * -->RT_EXTAB text *----------------------------------------------------------------------* FORM status_alv USING rt_extab TYPE slis_t_extab. * DATA: l_rc(5). * PERFORM copy_status_diff_progs_new IN PROGRAM saplsmpe IF FOUND * USING 'X' 'SAPLKKBL' sy-repid 'STANDARD_FULLSCREEN' 'STATUS_ALV' * CHANGING l_rc. * SET PF-STATUS 'STATUS_ALV'. " 工具条 ENDFORM. "pfstatus_form </span>
2、展开BOM
2.1 单层/多层展开
IF gt_car_result[] IS NOT INITIAL. SELECT mast~matnr, mast~werks, mast~stlnr, "物料清单 stpo~idnrk, stpo~menge, stko~bmeng, stpo~meins INTO TABLE @DATA(gt_stpo) FROM mast INNER JOIN stpo ON stpo~stlnr = mast~stlnr AND stpo~stlty = 'M' INNER JOIN stko ON mast~stlnr = stko~stlnr FOR ALL ENTRIES IN @gt_car_result WHERE matnr = @gt_car_result-matnr AND mast~werks = @lm_werks AND mast~stlan = '1'. ENDIF.

*&---------------------------------------------------------------------* *& Report ZPP_R001 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zsearch MESSAGE-ID zpp. ********************************************************************** *引用 * ********************************************************************** TABLES:mast,stko. TYPE-POOLS:slis. ********************************************************************** *TYPES ********************************************************************** TYPES:BEGIN OF ts_data, box TYPE c LENGTH 1, " stufe TYPE c LENGTH 5, "层级 werks TYPE mast-werks, "工厂 matnr TYPE mast-matnr, "产品编码 char20(20) TYPE c, maktx TYPE makt-maktx, "产品描述 stlan TYPE mast-stlan, "BOM 用途 stlal TYPE mast-stlal, "可选的 BOM stlnr TYPE mast-stlnr, "BOM 物料单 aennr TYPE stko-aennr, "更改编码 datuv TYPE stko-datuv, "有效起始日期 datu1 TYPE stko-datuv, "有效起始日期 stktx TYPE stko-stktx, "BOM版本 bmeng TYPE stko-bmeng, "基本数量 bmein TYPE stko-bmein, "产品单位 posnr TYPE stpo-posnr, "项目 idnrk TYPE stpo-idnrk, "子件编码 ojtxp TYPE char40, "子件描述 menge TYPE stpo-menge, "子件数量 meins TYPE stpo-meins, "单位 lgort TYPE stpo-lgort, rekrs TYPE stpo-rekrs, alpgr TYPE stpo-alpgr, alprf TYPE stpo-alprf, alpst TYPE stpo-alpst, ewahr TYPE stpo-ewahr, potx1 TYPE stpo-potx1, potx2 TYPE stpo-potx2, ausch TYPE stpo-ausch, zzsl TYPE stpo-menge, END OF ts_data. ********************************************************************** *ALV 定义 和 DATA ********************************************************************** DATA:gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE, "定义列标题(属性信息) gs_layout TYPE slis_layout_alv, wa_repid LIKE sy-repid. "当前程序 DATA:lt_data TYPE STANDARD TABLE OF ts_data WITH HEADER LINE. DATA:gt_data TYPE STANDARD TABLE OF ts_data WITH HEADER LINE. DATA:lt_mast TYPE STANDARD TABLE OF mast WITH HEADER LINE. DATA:lt_stko TYPE STANDARD TABLE OF stko WITH HEADER LINE. DATA:lt_stpox LIKE stpox OCCURS 100 WITH HEADER LINE. DATA:lt_matcat LIKE cscmat OCCURS 100 WITH HEADER LINE. DATA:ls_topmat TYPE cstmat. ************************************************************************ * SELECTION-SCREEN ************************************************************************ SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-001. "选择条件 SELECT-OPTIONS: s_matnr FOR mast-matnr, "产品编码 s_werks FOR mast-werks DEFAULT '2000', "工厂 s_stlan FOR mast-stlan, "BOM用途 s_datuv FOR stko-datuv. "有效起始日期 PARAMETERS:p_dqbb AS CHECKBOX DEFAULT 'X'. "当前版本 SELECTION-SCREEN END OF BLOCK bk1. SELECTION-SCREEN BEGIN OF BLOCK bk2 WITH FRAME TITLE TEXT-004."单层多层 SELECTION-SCREEN BEGIN OF LINE . SELECTION-SCREEN COMMENT 1(4) TEXT-002. PARAMETERS:p_danc RADIOBUTTON GROUP cx DEFAULT 'X' . "单层 SELECTION-SCREEN COMMENT 10(4) TEXT-003. PARAMETERS:p_duoc RADIOBUTTON GROUP cx. "多层 SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK bk2. ***====================================================================* *初始化 ***====================================================================* INITIALIZATION. %C002009_1000 = '单层'. %C003011_1000 = '多层'. %_p_danc_%_app_%-text = '单层'. %_p_dqbb_%_app_%-text = '当前版本'. %_p_duoc_%_app_%-text = '多层'. %_s_datuv_%_app_%-text = '有效起始日期'. %_s_matnr_%_app_%-text = '产品编码'. %_s_stlan_%_app_%-text = 'BOM用途'. %_s_werks_%_app_%-text = '工厂'. ***====================================================================* *获取数据 ***====================================================================* START-OF-SELECTION. IF p_dqbb IS INITIAL . "当前版本为空时,以输入日期为条件获取数据,每一条物料的最大日期数据将日期修改为当前日期 SELECT mast~matnr mast~werks mast~stlan mast~stlnr mast~stlal stko~aennr stko~datuv stko~stktx stko~bmeng stko~bmein FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal INTO CORRESPONDING FIELDS OF TABLE lt_data WHERE mast~matnr IN s_matnr AND mast~werks IN s_werks AND mast~stlan IN s_stlan AND stko~datuv IN s_datuv. SORT lt_data BY matnr werks datuv DESCENDING. LOOP AT lt_data. lt_data-datu1 = lt_data-datuv. CONCATENATE lt_data-werks lt_data-matnr INTO lt_data-char20. MODIFY lt_data TRANSPORTING datu1 char20. ENDLOOP. SORT lt_data BY char20 datuv DESCENDING. LOOP AT lt_data. AT NEW char20. lt_data-datu1 = sy-datum. MODIFY lt_data TRANSPORTING datu1. ENDAT. ENDLOOP. ELSE. "当前版本不为空时,以当前日期为条件获取数据 SELECT mast~matnr mast~werks mast~stlan mast~stlnr mast~stlal stko~aennr stko~datuv stko~stktx stko~bmeng stko~bmein FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal INTO CORRESPONDING FIELDS OF TABLE lt_data WHERE mast~matnr IN s_matnr AND mast~werks IN s_werks AND mast~stlan IN s_stlan AND stko~datuv IN s_datuv. SORT lt_data BY matnr werks datuv DESCENDING. DELETE ADJACENT DUPLICATES FROM lt_data COMPARING matnr werks stlal. LOOP AT lt_data. lt_data-datu1 = sy-datum. MODIFY lt_data TRANSPORTING datu1. ENDLOOP. ENDIF. CLEAR:gt_data. LOOP AT lt_data. IF p_danc = 'X'. "单层展开 CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' EXPORTING capid = 'PP01' "BOM应用 datuv = lt_data-datu1 "BOM有效期 mktls = 'X' mehrs = '' "x表示多层展开﹐space表示只展开第一层 mtnrv = lt_data-matnr "产品编码/要展开BOM的物料 svwvo = 'X' werks = lt_data-werks "物料所在工厂 vrsvo = 'X' stlal = lt_data-stlal "物料用途 IMPORTING topmat = ls_topmat * matcat = matcat "下面含有元件的物料存放在该内表 TABLES stb = lt_stpox matcat = lt_matcat EXCEPTIONS alt_not_found = 1 material_not_found = 3 missing_authorization = 4 no_bom_found = 5 OTHERS = 9. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ELSEIF p_duoc = 'X'. "多层展开 CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' EXPORTING capid = 'PP01' "BOM应用 datuv = lt_data-datu1 "有效起始日 mktls = 'X' mehrs = 'X' "多层展开 mtnrv = lt_data-matnr "产品编码 svwvo = 'X' werks = lt_data-werks "物料所在工厂 vrsvo = 'X' stlal = lt_data-stlal IMPORTING topmat = ls_topmat TABLES stb = lt_stpox matcat = lt_matcat EXCEPTIONS alt_not_found = 1 material_not_found = 3 missing_authorization = 4 no_bom_found = 5 OTHERS = 9. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. . IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDIF. ******************************最后展示数据整理******************8 LOOP AT lt_stpox. gt_data-stufe = lt_stpox-stufe. "层级 gt_data-werks = lt_data-werks. "工厂 LOOP AT lt_matcat WHERE index = lt_stpox-ttidx. gt_data-matnr = lt_matcat-matnr. "产品编码 gt_data-stktx = lt_matcat-stktx. "BOM版本 ENDLOOP. gt_data-maktx = lt_stpox-ojtxb. "产品描述 gt_data-stlan = lt_data-stlan. "BOM用途 gt_data-stlal = lt_data-stlal. "可选BOM gt_data-aennr = lt_data-aennr. "更改编码 gt_data-datuv = lt_data-datuv. "有效起始日期 * gt_data-stktx = ls_topmat-stktx. "BOM版本 gt_data-bmeng = ls_topmat-bmeng. "基本数量 gt_data-bmein = ls_topmat-bmein. "产品单位 gt_data-posnr = lt_stpox-posnr. "项目 gt_data-idnrk = lt_stpox-idnrk. "子件编码 gt_data-ojtxp = lt_stpox-ojtxp. "子件描述 gt_data-menge = lt_stpox-menge. "子件数量 gt_data-meins = lt_stpox-meins. "单位 gt_data-lgort = lt_stpox-lgort. gt_data-rekrs = lt_stpox-rekrs. gt_data-alpgr = lt_stpox-alpgr. gt_data-alprf = lt_stpox-alprf. gt_data-alpst = lt_stpox-alpst. gt_data-ewahr = lt_stpox-ewahr. gt_data-potx1 = lt_stpox-potx1. gt_data-potx2 = lt_stpox-potx2. gt_data-ausch = lt_stpox-ausch. gt_data-zzsl = lt_stpox-menge * ( 1 + gt_data-ausch / 100 ). APPEND gt_data. CLEAR gt_data. ENDLOOP. ENDLOOP. DESCRIBE TABLE gt_data LINES DATA(lines). IF lines < 1. MESSAGE s000(zpp) WITH '没有相关单据信息!' DISPLAY LIKE 'W'. RETURN. ELSE. MESSAGE s000(zpp) WITH '共查询到记录' lines '条.' DISPLAY LIKE 'S'. ENDIF. **************************ALV输出布局******************************** gs_layout-zebra = 'X'. gs_layout-colwidth_optimize = 'X'. gs_layout-box_fieldname = 'BOX'. wa_repid = sy-repid. **************************ALV输出字段设置**************************** * DATA LV_POS TYPE I . REFRESH gt_fieldcat. CLEAR gt_fieldcat. * CLEAR lv_pos. DEFINE %%append_fieldcat. * lv_pos = lv_pos + 1. * gs_fieldcat-col_pos = lv_pos. gt_fieldcat-fieldname = &1."字段名 gt_fieldcat-seltext_l = &2."文本 IF gt_fieldcat-fieldname = 'BOX'. gt_fieldcat-checkbox = 'X'. ENDIF. IF gt_fieldcat-fieldname = 'MATNR'. gt_fieldcat-ref_tabname = 'MARA'. gt_fieldcat-ref_fieldname = 'MATNR'. gt_fieldcat-no_zero = 'X'. ENDIF. IF gt_fieldcat-fieldname = 'IDNRK'. gt_fieldcat-ref_tabname = 'MARA'. gt_fieldcat-ref_fieldname = 'MATNR'. gt_fieldcat-no_zero = 'X'. ENDIF. IF gt_fieldcat-fieldname = 'EWAHR'. gt_fieldcat-no_zero = 'X'. ENDIF. IF gt_fieldcat-fieldname = 'BMEIN'. gt_fieldcat-ref_tabname = 'STKO'. gt_fieldcat-ref_fieldname = 'BMEIN'. ENDIF. IF gt_fieldcat-fieldname = 'MEINS'. gt_fieldcat-ref_tabname = 'STPO'. gt_fieldcat-ref_fieldname = 'MEINS'. ENDIF. APPEND gt_fieldcat. CLEAR gt_fieldcat. END-OF-DEFINITION. %%append_fieldcat: * 'BOX' 'SELECT', 'STUFE' '层级', 'WERKS' '工厂', 'MATNR' '产品编码', 'MAKTX' '产品描述', 'STLAN' 'BOM用途', 'STLAL' '可选BOM', 'AENNR' '更改编码', 'DATUV' '有效起始日期', 'STKTX' 'BOM版本', 'BMENG' '基本数量', 'BMEIN' '产品单位', 'POSNR' '项目', 'IDNRK' '子件编码', 'OJTXP' '子件描述', 'MENGE' '子件数量', 'MEINS' '单位', 'LGORT' '生产库存地点', 'REKRS' '递归允许', 'ALPGR' '替代项目组', 'ALPRF' '优先级', 'ALPST' '策略', 'EWAHR' '使用可能性%', 'POTX1' '净含量', 'POTX2' '出品率', 'AUSCH' '物料损耗%', 'ZZSL' '子件总数量'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = wa_repid i_callback_pf_status_set = 'FRM_USER_STATUS' "USER_COMMAND i_callback_user_command = 'FRM_USER_COMMAND' is_layout = gs_layout i_save = 'X' it_fieldcat = gt_fieldcat[] TABLES t_outtab = gt_data[] 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. EXIT. ENDIF. *&---------------------------------------------------------------------* *& Form frm_user_status *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->EXTAB text *----------------------------------------------------------------------* FORM frm_user_status USING extab TYPE slis_t_extab. SET PF-STATUS '1000_STATUS'. ENDFORM. "frm_user_status *&---------------------------------------------------------------------* *& Form frm_user_command *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->R_UCOMM text * -->RS_SELFIELD text *----------------------------------------------------------------------* FORM frm_user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE r_ucomm. WHEN 'BCAK' OR 'CANCEL' OR 'EXIT' OR 'ESC'. LEAVE TO SCREEN 0. ENDCASE. ENDFORM. "frm_user_command
2.2 按版本和用途展开

*&---------------------------------------------------------------------* *& Report ZRCO0034_SUB *& *&---------------------------------------------------------------------* *&产品工艺BOM报表 *& *&---------------------------------------------------------------------* REPORT zrco0034_sub. TABLES: mkal,stko. DATA: BEGIN OF wa_bom OCCURS 0, matnr LIKE mkal-matnr, werks LIKE mkal-werks, verid LIKE mkal-verid, maktx LIKE makt-maktx, END OF wa_bom. DATA: BEGIN OF gt_bom OCCURS 0, matnr LIKE mara-matnr, werks LIKE mseg-werks, stlal LIKE mkal-stlal, " BOM用途 stlan LIKE mkal-stlan, " 可选Bom END OF gt_bom. DATA: BEGIN OF wa_out OCCURS 0, stlan LIKE stpox-stlan, " BOM类别 stlal LIKE stpox-stlal, verid LIKE mkal-verid, matnr LIKE mkal-matnr, " 成品物料号 maktx LIKE makt-maktx, " 物料描述 menge LIKE stpox-mngko, " 基本数量 stufe LIKE stpox-stufe, " 展开层 posnr LIKE stpox-posnr, " 项目 idnrk LIKE stpox-idnrk, " 组建物料 ojtxp LIKE stpox-ojtxp, " 组建描述 meins LIKE stpox-meins, " 单位 mngko LIKE stpox-mngko, " 组建数量 mnglg LIKE stpox-mnglg, " 组建数量 *** 增加 recipe 和 合并项目文本 TRY 20190305 begin *** recipe LIKE stpox-mnglg, " recipe用量 * potx TYPE char80, " 合并项目文本 "add by LIUJIE 2020/08/24 注释 potx TYPE string, " 合并项目文本 "add by LIUJIE 2020/08/24 增加 potx_a TYPE string, " 合并项目文本 "add by LIUJIE 2020/08/24 增加 *** 增加 recipe 和 合并项目文本 TRY 20190305 end *** potx1 LIKE stpox-potx1, " 项目文本1 potx2 LIKE stpox-potx2, " 项目文本2 kausf LIKE stpox-kausf, " 组建报废 ausch LIKE stpox-ausch, " 组件报废(项目) avoau LIKE stpox-avoau, " 工序废品 bausf LIKE stpox-bausf, " 装配报废 sanka LIKE stpox-sanka, " 成本关联 alpgr LIKE stpox-alpgr, " 替代组 * ewahr LIKE stpox-ewahr, " 使用概率 mtart LIKE stpox-mtart, " 物料类型 werks LIKE stpox-werks, " 工厂 datuv LIKE stpox-datuv, " 有效自 aennr LIKE stpox-aennr, " 更改编号 andat LIKE stpox-andat, " 创建日期 annam LIKE stpox-annam, " 创建者 aedat LIKE stpox-aedat, " 更改日期 aenam LIKE stpox-aenam, " 更改者 stlnr LIKE mast-stlnr, " 物料单 alpos LIKE stpox-alpos, " 替代项目 ewahr LIKE stpox-ewahr, " 使用的可能性 box TYPE c, END OF wa_out. DATA: gt_out LIKE wa_out OCCURS 0 WITH HEADER LINE. DATA: lt_stb LIKE stpox OCCURS 0 WITH HEADER LINE. DATA:l_stkoz LIKE stko-stkoz. SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE text-t01. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(7) func1 FOR FIELD p_func1. PARAMETERS: p_func1 RADIOBUTTON GROUP f1 DEFAULT 'X' USER-COMMAND z05. SELECTION-SCREEN COMMENT 30(7) func2 FOR FIELD p_func2. PARAMETERS: p_func2 RADIOBUTTON GROUP f1. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN: END OF BLOCK blk1. SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE t1. PARAMETERS: p_werks LIKE mkal-werks OBLIGATORY DEFAULT '1000' MODIF ID fu1. SELECT-OPTIONS: s_matnr FOR mkal-matnr MODIF ID fu1, s_verid FOR mkal-verid MODIF ID fu1. PARAMETERS: p_datuv LIKE stko-datuv OBLIGATORY DEFAULT sy-datum MODIF ID fu1. SELECTION-SCREEN: END OF BLOCK b1. SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE t2. PARAMETERS: p_werks1 LIKE mkal-werks OBLIGATORY DEFAULT '1000' MODIF ID fu2. SELECT-OPTIONS: s_matnr1 FOR mkal-matnr MODIF ID fu2, s_stlal1 FOR mkal-stlal MODIF ID fu2, s_stlan1 FOR mkal-stlan MODIF ID fu2. PARAMETERS: p_datuv1 LIKE stko-datuv OBLIGATORY DEFAULT sy-datum MODIF ID fu2. SELECTION-SCREEN: END OF BLOCK b2. INITIALIZATION. func1 = '按生产版本查找'. func2 = '按BOM用途查找'. %_p_datuv_%_app_%-text = '有效起始日期'. %_p_datuv1_%_app_%-text = '有效起始日期'. %_p_werks_%_app_%-text = '工厂'. %_p_werks1_%_app_%-text = '工厂'. %_s_matnr_%_app_%-text = '物料'. %_s_matnr1_%_app_%-text = '物料'. %_s_stlal1_%_app_%-text = '可选的BOM'. %_s_stlan1_%_app_%-text = 'BOM用途'. %_s_verid_%_app_%-text = '生产版本'. AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF ( p_func1 EQ 'X' AND screen-group1 EQ 'FU2' ) OR ( p_func2 EQ 'X' AND screen-group1 EQ 'FU1' ). screen-active = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. START-OF-SELECTION. ***********add by linxq 20150324 增加权限 PERFORM frm_auth_check. ******* IF p_func1 = 'X'. PERFORM get_bom_data. " 按工艺路线展Bom ELSE. PERFORM get_bom_data_usage." 按用途展Bom ENDIF. PERFORM frm_prapare_output. PERFORM frm_fill_layout USING ''. PERFORM frm_init_field_len USING: 'T1' 'STLAN' 'BOM类别' '2', 'T1' 'STLAL' '可选BOM' '2', 'T1' 'VERID' '生产版本' '4', 'T1' 'MATNR' '物料' '18', 'T1' 'MAKTX' '物料描述' '30', 'T1' 'MENGE' '基本数量' '10', 'T1' 'STUFE' '展开层' '2', 'T1' 'POSNR' '项目' '4', * 'T1' 'ALPOS' '替代项目', * 'T1' 'EWAHR' '使用的可能性', 'T1' 'IDNRK' '组件' '18', 'T1' 'OJTXP' '组件描述' '30', 'T1' 'MEINS' '单位' '4', 'T1' 'MNGLG' '组件数量' '10', *** 增加recipe和合并项目文本字段 TRY 20190305 BEGIN *** 'T1' 'RECIPE' 'RECIPE数量' '10', 'T1' 'POTX' '合并项目文本' '80', *** 增加recipe和合并项目文本字段 TRY 20190305 END *** 'T1' 'POTX1' '项目文本1' '30', 'T1' 'POTX2' '项目文本2' '30', 'T1' 'KAUSF' '组件报废' '4', 'T1' 'AUSCH' '组件报废(项目)' '4', 'T1' 'AVOAU' '工序废品' '4', 'T1' 'BAUSF' '装配报废' '4', 'T1' 'SANKA' '成本关联' '4', 'T1' 'ALPGR' '组' '4', 'T1' 'EWAHR' '使用频率' '4', 'T1' 'MTART' '物料类型' '10', 'T1' 'WERKS' '工厂' '4', 'T1' 'DATUV' '有效自' '10', 'T1' 'AENNR' '更改编号' '10', 'T1' 'ANDAT' '创建日期' '8', 'T1' 'ANNAM' '创建者' '10', 'T1' 'AEDAT' '更改日期' '8', 'T1' 'AENAM' '更改者' '10'. PERFORM frm_print_alv TABLES wa_out USING '' ''. *&---------------------------------------------------------------------* *& Form get_bom_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM get_bom_data. " 按工艺路线展Bom *********"ADD BY LIUJIE 2020/08/24 增加 BEGIN DATA:l_txt01 TYPE string," l_txt02 TYPE string," l_potx TYPE string. " DATA: t_tline TYPE TABLE OF tline WITH HEADER LINE. DATA: lv_tline TYPE string. *********"ADD BY LIUJIE 2020/08/24 增加 END SELECT * INTO CORRESPONDING FIELDS OF TABLE wa_bom FROM mkal WHERE matnr IN s_matnr AND werks = p_werks AND verid IN s_verid. LOOP AT wa_bom. SELECT SINGLE maktx INTO wa_bom-maktx FROM makt WHERE matnr = wa_bom-matnr AND spras = '1'. MODIFY wa_bom. ENDLOOP. LOOP AT wa_bom. REFRESH lt_stb. CLEAR lt_stb. CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' EXPORTING capid = 'PP01' datuv = p_datuv * auskz = 'X' mehrs = 'X' ehndl = '1' * emeng = 1000 mtnrv = wa_bom-matnr verid = wa_bom-verid werks = p_werks TABLES stb = lt_stb EXCEPTIONS alt_not_found = 1 call_invalid = 2 material_not_found = 3 missing_authorization = 4 no_bom_found = 5 no_plant_data = 6 no_suitable_bom_found = 7 conversion_error = 8 OTHERS = 9. CLEAR lt_stb. LOOP AT lt_stb WHERE stlan = '1' OR stlan = '2' OR stlan = '8' OR stlan = '7' . MOVE-CORRESPONDING lt_stb TO wa_out. wa_out-matnr = wa_bom-matnr. wa_out-maktx = wa_bom-maktx. wa_out-verid = wa_bom-verid. ******* ADD BY LIUJIE 2020/08/24 BEGIN FREE:t_tline,lv_tline. CALL FUNCTION 'ZRFC_CO_GET_BOM_TXT' EXPORTING i_stlnr = lt_stb-stlnr i_stlkn = lt_stb-stlkn i_stpoz = lt_stb-stpoz i_stlty = lt_stb-stlty TABLES t_tline = t_tline. IF t_tline[] IS NOT INITIAL. LOOP AT t_tline. CONCATENATE t_tline-tdline lv_tline INTO lv_tline. ENDLOOP. CONDENSE lv_tline NO-GAPS. CONCATENATE l_potx lv_tline INTO l_potx. CONDENSE l_potx NO-GAPS. wa_out-potx_a = l_potx. ENDIF. ********ADD BY LIUJIE 2020/08/24 END APPEND wa_out.CLEAR wa_out. ENDLOOP. * SORT wa_out BY matnr. ENDLOOP. LOOP AT wa_out. ***************add by fayne 2019-03-28 wa_out-recipe = wa_out-menge. *************end SELECT SINGLE stlnr INTO wa_out-stlnr FROM mast WHERE matnr = wa_out-matnr. CLEAR:wa_out-menge. SELECT bmeng INTO wa_out-menge FROM stko WHERE stlnr = wa_out-stlnr. ENDSELECT. * IF wa_out-alpos IS NOT INITIAL. * wa_out-mnglg = wa_out-mnglg * wa_out-ewahr / 100. * ENDIF. *** 增加recipe和合并项目文本字段 TRY 20190305 BEGIN *** * wa_out-recipe = wa_out-mnglg * wa_out-ewahr / 100."MARK BY fayne 2019-03-28 CONCATENATE wa_out-potx1 wa_out-potx2 INTO wa_out-potx. ******** ADD BY LIUJIE 2020/08/24 BEGIN IF wa_out-potx_a IS NOT INITIAL. CONCATENATE wa_out-potx wa_out-potx_a INTO wa_out-potx. ENDIF. ******** ADD BY LIUJIE 2020/08/24 end *** 增加recipe和合并项目文本字段 TRY 20190305 END *** MODIFY wa_out. ENDLOOP. * SORT gt_out. * DELETE ADJACENT DUPLICATES FROM gt_out COMPARING ALL FIELDS. ENDFORM. "get_bom_data *&---------------------------------------------------------------------* *& Form get_bom_data_usage *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM get_bom_data_usage. " 按Bom用途展BOM SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_bom FROM mast WHERE matnr IN s_matnr1 AND stlan IN s_stlan1 AND stlal IN s_stlal1 AND werks = p_werks1. SORT gt_bom. DELETE ADJACENT DUPLICATES FROM gt_bom COMPARING ALL FIELDS. LOOP AT gt_bom. REFRESH lt_stb.CLEAR lt_stb. CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' EXPORTING capid = 'PP01' datuv = p_datuv1 mehrs = 'X' ehndl = '1' mtnrv = gt_bom-matnr werks = p_werks1 stlal = gt_bom-stlal stlan = gt_bom-stlan TABLES stb = lt_stb EXCEPTIONS alt_not_found = 1 call_invalid = 2 material_not_found = 3 missing_authorization = 4 no_bom_found = 5 no_plant_data = 6 no_suitable_bom_found = 7 conversion_error = 8 OTHERS = 9. CLEAR lt_stb. LOOP AT lt_stb WHERE stlan = '1' OR stlan = '2' OR stlan = '8' OR stlan = '7'. MOVE-CORRESPONDING lt_stb TO wa_out. wa_out-matnr = gt_bom-matnr. APPEND wa_out.CLEAR wa_out. ENDLOOP. ENDLOOP. LOOP AT wa_out. ***************add by fayne 2019-03-28 wa_out-recipe = wa_out-menge. *************end SELECT SINGLE stlnr INTO wa_out-stlnr FROM mast WHERE matnr = wa_out-matnr. SELECT SINGLE maktx INTO wa_out-maktx FROM makt WHERE matnr = wa_out-matnr AND spras = '1'. * SELECT SINGLE bmeng INTO wa_out-menge FROM stko * WHERE stlnr = wa_out-stlnr. CLEAR wa_out-menge. SELECT bmeng INTO wa_out-menge FROM stko WHERE stlnr = wa_out-stlnr. ENDSELECT. * IF wa_out-alpos IS NOT INITIAL. * wa_out-mnglg = wa_out-mnglg * wa_out-ewahr / 100. * ENDIF. *** 增加recipe和合并项目文本字段 TRY 20190305 BEGIN *** * wa_out-recipe = wa_out-mnglg * wa_out-ewahr / 100. "MARK BY fayne 2019-03-28 CONCATENATE wa_out-potx1 wa_out-potx2 INTO wa_out-potx. *** 增加recipe和合并项目文本字段 TRY 20190305 END *** MODIFY wa_out. ENDLOOP. ENDFORM. "get_bom_data_usage *&---------------------------------------------------------------------* *& Form FRM_AUTH_CHECK *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_auth_check . AUTHORITY-CHECK OBJECT 'C_AFKO_AWA' ID 'WERKS' FIELD p_werks. IF sy-subrc NE 0. MESSAGE '账号没有此工厂的权限!' TYPE 'E'. ENDIF. DATA: mes TYPE string. AUTHORITY-CHECK OBJECT 'Z_ZTH_WRK' ID '' FIELD ''. IF sy-subrc = 0. AUTHORITY-CHECK OBJECT 'Z_ZTH_WRK' ID 'WERKS' FIELD p_werks. IF sy-subrc <> 0. CONCATENATE '无工厂权限' p_werks INTO mes. MESSAGE mes TYPE 'E' DISPLAY LIKE 'E'. ENDIF. ENDIF. ENDFORM. " FRM_AUTH_CHECK *&---------------------------------------------------------------------* *& Form frm_prapare_output *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_prapare_output. LOOP AT wa_out. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = wa_out-idnrk IMPORTING output = wa_out-idnrk. MODIFY wa_out. ENDLOOP. ENDFORM. "frm_prapare_output *&-ALV输出-子程序 *&---------------------------------------------------------------------* *& TABLES: *&---------------------------------------------------------------------* TYPE-POOLS: slis. DATA: gt_fieldcat TYPE slis_t_fieldcat_alv, gs_fieldcat LIKE LINE OF gt_fieldcat, gs_layout TYPE slis_layout_alv, gt_events TYPE slis_t_event, gs_events LIKE LINE OF gt_events. *&---------------------------------------------------------------------* *& Form FRM_INIT_FIELD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_0071 text * -->P_0072 text * -->P_0073 text *----------------------------------------------------------------------* FORM frm_init_field USING pr_tabname pr_field pr_fieldlabel. * pr_fieldoutputlen. CLEAR gs_fieldcat. gs_fieldcat-tabname = pr_tabname. gs_fieldcat-fieldname = pr_field. gs_fieldcat-seltext_m = pr_fieldlabel. gs_fieldcat-just = 'L'. IF pr_field = 'BOX'. gs_fieldcat-edit = 'X'. gs_fieldcat-checkbox = 'X'. ENDIF. * gs_fieldcat-outputlen = pr_fieldoutputlen. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. " FRM_INIT_FIELD *&---------------------------------------------------------------------* *& Form FRM_INIT_FIELD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PR_TABNAME text * -->PR_FIELD text * -->PR_FIELDLABEL text *----------------------------------------------------------------------* FORM frm_init_field_matnr USING pr_tabname pr_field pr_fieldlabel. * pr_fieldoutputlen. CLEAR gs_fieldcat. gs_fieldcat-tabname = pr_tabname. gs_fieldcat-fieldname = pr_field. gs_fieldcat-seltext_m = pr_fieldlabel. gs_fieldcat-just = 'L'. IF pr_field = 'MATNR'. gs_fieldcat-intlen = '18'. gs_fieldcat-outputlen = '18'. ENDIF. * gs_fieldcat-outputlen = pr_fieldoutputlen. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. "FRM_INIT_FIELD *&---------------------------------------------------------------------* *& Form frm_init_field_len *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PR_TABNAME text * -->PR_FIELD text * -->PR_FIELDLABEL text * -->PR_FIELDOUTPUTLEN text *----------------------------------------------------------------------* FORM frm_init_field_len USING pr_tabname pr_field pr_fieldlabel pr_fieldoutputlen. CLEAR gs_fieldcat. gs_fieldcat-tabname = pr_tabname. gs_fieldcat-fieldname = pr_field. gs_fieldcat-seltext_m = pr_fieldlabel. gs_fieldcat-just = 'L'. gs_fieldcat-outputlen = pr_fieldoutputlen. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. " FRM_INIT_FIELD *&---------------------------------------------------------------------* *& Form frm_init_field_edit *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PR_TABNAME text * -->PR_FIELD text * -->PR_FIELDLABEL text * -->PR_EDIT text *----------------------------------------------------------------------* FORM frm_init_field_edit USING pr_tabname pr_field pr_fieldlabel pr_edit. * pr_fieldoutputlen. CLEAR gs_fieldcat. gs_fieldcat-tabname = pr_tabname. gs_fieldcat-fieldname = pr_field. gs_fieldcat-seltext_l = pr_fieldlabel. gs_fieldcat-edit = pr_edit. gs_fieldcat-just = 'L'. * gs_fieldcat-outputlen = pr_fieldoutputlen. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. " FRM_INIT_FIELD *&---------------------------------------------------------------------* *& Form frm_init_field_edit_all *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PR_TABNAME text * -->PR_FIELD text * -->PR_FIELDLABEL text * -->PR_EDIT text * -->PR_FIELDOUTPUTLEN text *----------------------------------------------------------------------* FORM frm_init_field_edit_all USING pr_tabname pr_field pr_fieldlabel pr_edit pr_fieldoutputlen. CLEAR gs_fieldcat. gs_fieldcat-tabname = pr_tabname. gs_fieldcat-fieldname = pr_field. gs_fieldcat-seltext_l = pr_fieldlabel. gs_fieldcat-edit = pr_edit. gs_fieldcat-just = 'L'. gs_fieldcat-outputlen = pr_fieldoutputlen. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. " FRM_INIT_FIELD *&---------------------------------------------------------------------* *& Form FRM_FILL_LAYOUT *&---------------------------------------------------------------------* * ALV参数定义 *----------------------------------------------------------------------* * -->PR_BOX Checkbox *----------------------------------------------------------------------* FORM frm_fill_layout USING pr_box. CLEAR:gt_events[],gs_events,gs_layout. gs_layout-colwidth_optimize = 'X'. " 自动收缩 IF pr_box IS NOT INITIAL. gs_layout-box_fieldname = pr_box. ENDIF. ENDFORM. " FRM_FILL_LAYOUT *&---------------------------------------------------------------------* *& Form FRM_PRINT_ALV *&---------------------------------------------------------------------* * ALV参数定义 *----------------------------------------------------------------------* * -->PT_ALV 输出表结构 * -->PR_SET Status * -->PR_command User command *----------------------------------------------------------------------* FORM frm_print_alv TABLES gt_alv USING pr_set pr_command. DATA: l_set TYPE slis_formname, l_command TYPE slis_formname. l_set = pr_set. l_command = pr_command. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' * call function 'REUSE_ALV_LIST_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = l_set i_callback_user_command = l_command is_layout = gs_layout it_fieldcat = gt_fieldcat " it_events = gt_events i_save = 'A' * i_grid_title = l_title 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_FILL_PRINT_ALV *FUNCTION ZRFC_CO_GET_BOM_TXT. **"---------------------------------------------------------------------- **"*"Local interface: **" IMPORTING **" VALUE(I_STLNR) TYPE STNUM OPTIONAL **" VALUE(I_STLKN) TYPE STLKN OPTIONAL **" VALUE(I_STPOZ) TYPE CIM_COUNT OPTIONAL **" VALUE(I_STLTY) TYPE STLTY OPTIONAL **" TABLES **" T_TLINE STRUCTURE TLINE **"---------------------------------------------------------------------- * * * DATA:LWA_LINE TYPE CSLTX_LINE. * DATA:LIT_TLINE TYPE STANDARD TABLE OF TLINE WITH HEADER LINE, * LWA_TLINE TYPE TLINE, * LWA_TEXTHEADER TYPE THEAD. * DATA: BEGIN OF LWA_HTEXT, * TDOBJECT LIKE THEAD-TDOBJECT, * TDNAME LIKE THEAD-TDNAME, * TDID LIKE THEAD-TDID, * TDSPRAS LIKE THEAD-TDSPRAS. * DATA: END OF LWA_HTEXT. * DATA:LV_DD TYPE I. ** Fill textheader * CLEAR LWA_HTEXT. * LWA_HTEXT-TDID = 'MPO'. * LWA_HTEXT-TDSPRAS = SY-LANGU. * LWA_HTEXT-TDOBJECT = 'BOM'. * LWA_HTEXT-TDNAME(3) = SY-MANDT. * LWA_HTEXT-TDNAME+3(1) = I_STLTY. "BOM category * LWA_HTEXT-TDNAME+4(8) = I_STLNR. "Bill of material * LWA_HTEXT-TDNAME+12(8) = I_STLKN. "BOM item node number * LWA_HTEXT-TDNAME+20(8) = I_STPOZ. "Internal counter * ** read longtext into table textlines * CALL FUNCTION 'READ_TEXT' * EXPORTING * ID = LWA_HTEXT-TDID * LANGUAGE = LWA_HTEXT-TDSPRAS * NAME = LWA_HTEXT-TDNAME * OBJECT = LWA_HTEXT-TDOBJECT * IMPORTING * HEADER = LWA_TEXTHEADER * TABLES * LINES = LIT_TLINE * EXCEPTIONS * OTHERS = 1. * LOOP AT LIT_TLINE. * LV_DD = LV_DD + 1. * IF LV_DD < 3. * DELETE LIT_TLINE. * ENDIF. * ENDLOOP. * APPEND LINES OF LIT_TLINE TO T_TLINE. * * * *ENDFUNCTION.
3、业务伙伴/供应商/工厂创建 批导
ADRC
ADR2
ADR6
LFA1
LFB1
LFC1
LFM1
LFBK
T001
https://www.cnblogs.com/sapSB/articles/10033270.html
** 根据伙伴GUID取出下一个能用的 编码
***********************************************************************
修改的时候报错,与这个有关 创建时候 是新的guid,修改的时候 要找出原来的guid addresses-data_key-guid
SELECT
SINGLE address_guid
INTO @DATA(lv_addrguid)
FROM but020
WHERE partner = @lv_kunnr.
BP的bapi用这个函数RFC_CVI_EI_INBOUND_MAIN会比CVI_EI_INBOUND_MAIN好理解

1 *&---------------------------------------------------------------------* 2 *& Report ZSDB_002 3 *&---------------------------------------------------------------------* 4 *& 5 *&---------------------------------------------------------------------* 6 REPORT zsdb_002. 7 8 TABLES:sscrfields. 9 INCLUDE <icon>. 10 DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE. 11 * messages of call transaction 12 DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE. 13 TABLES: t100. 14 DATA: g_line TYPE i . 15 DATA : v_line TYPE i. "Record number 16 PARAMETERS: p_typ TYPE ctu_mode AS LISTBOX OBLIGATORY DEFAULT 'N' VISIBLE LENGTH 20, 17 p_upd TYPE ctu_update AS LISTBOX OBLIGATORY DEFAULT 'S' VISIBLE LENGTH 20. 18 *DATA:p_typ TYPE ctu_mode VALUE 'N', 19 * p_upd TYPE ctu_update VALUE 'S'.. 20 DATA: gv_error(1),error_flag(1). 21 TYPES:BEGIN OF ty_structure , 22 23 werks(10), "门店代码 24 name1(040),"门店名称码 25 financial(020),"财务部门 26 pstlz(020),"邮编地区 27 sort1(020),"(检索项) 28 zone1(020),"门店地址 29 regio(020),"所在省份 30 cityc(020),"所在城市 31 office_district(020),"行政区 32 pp(020),"品牌 33 mdsx(020),"门店属性 34 tax_number(020),"税号 35 bukrs(020),"贸易伙伴 36 telephone(020),"电话 37 bankl(020),"银行编号 38 bankn(020),"银行帐户号码 39 zhz(020),"账户组 40 bahne(020),"配送中心编码 41 bahns(020)," 门店自采供应商 42 sales_region(020),"销售区域 43 receipt(010),"发票方 44 payer(010),"付款方 45 limit_rule(020),"风险类 46 check_rule(020),"检查规则 47 credit_sgmnt(020),"信用段 48 credit_limit(020),"信用额度(限制) 49 50 katr2(020),"门店属性 51 checkbox TYPE c, 52 light TYPE icon_d, 53 znum TYPE i, 54 msgtp(1), 55 msg(250) , 56 END OF ty_structure, 57 ty_data TYPE ty_structure. 58 59 DATA gt_data TYPE TABLE OF ty_data. 60 DATA gs_data TYPE ty_data. 61 DATA gt_excel TYPE TABLE OF ty_structure. 62 DATA gs_excel TYPE ty_structure. 63 DATA gt_zsd_b_md LIKE TABLE OF zsd_b_md WITH HEADER LINE. 64 65 DATA :gt_t005u LIKE TABLE OF t005u WITH HEADER LINE. 66 DATA :gt_t005s LIKE TABLE OF t005s WITH HEADER LINE. 67 DATA bapi_ret TYPE bapiret2 OCCURS 10 WITH HEADER LINE. 68 "ALV 69 DATA:gt_fieldcat TYPE lvc_t_fcat, "定义列标题(属性信息) 70 gs_layout TYPE lvc_s_layo, 71 gs_fieldcat TYPE lvc_s_fcat, "定义对象 72 73 wa_repid LIKE sy-repid, "当前程序 74 gs_title TYPE lvc_title. 75 76 SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-s01. 77 PARAMETERS p_file TYPE rlgrap-filename MODIF ID imp. 78 *PARAMETERS p_wl RADIOBUTTON GROUP gp1. 79 *PARAMETERS p_khwl RADIOBUTTON GROUP gp1. 80 *PARAMETERS p_dqwl RADIOBUTTON GROUP gp1. 81 SELECTION-SCREEN END OF BLOCK blk1. 82 SELECTION-SCREEN: FUNCTION KEY 1."WISE-WANGM 20190816 83 84 INITIALIZATION. 85 sscrfields-functxt_01 = '下载模板'. 86 %_p_typ_%_app_%-text = '处理模式'. 87 %_p_upd_%_app_%-text = '更新模式'. 88 89 AT SELECTION-SCREEN OUTPUT. 90 * LOOP AT SCREEN. 91 * IF screen-group1 = 'MD1'. 92 * screen-active = '0'. 93 * MODIFY SCREEN. 94 * ENDIF. 95 * ENDLOOP. 96 97 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. 98 CALL METHOD zcl_bc_excel=>f4_file_excel 99 * EXPORTING 100 * iv_file_filter = 'Excel(*.xlsm)' 101 CHANGING 102 cv_file_name = p_file. 103 104 AT SELECTION-SCREEN. 105 CASE sscrfields-ucomm. 106 WHEN 'FC01'. 107 PERFORM frm_down_template. 108 ENDCASE. 109 110 START-OF-SELECTION. 111 IF p_file IS INITIAL. 112 MESSAGE s000(zmm) WITH '请填入文件路径' DISPLAY LIKE 'E'. 113 RETURN. 114 ENDIF. 115 PERFORM start_of_selection. 116 117 118 END-OF-SELECTION. 119 PERFORM check_data. 120 PERFORM alv_display. 121 122 *&---------------------------------------------------------------------* 123 *& Form START_OF_SELECTION 124 *&---------------------------------------------------------------------* 125 *& text 126 *&---------------------------------------------------------------------* 127 *& --> p1 text 128 *& <-- p2 text 129 *&---------------------------------------------------------------------* 130 FORM start_of_selection . 131 PERFORM upload_excel. 132 ENDFORM. 133 *&---------------------------------------------------------------------* 134 *& Form FRM_DOWN_TEMPLATE 135 *&---------------------------------------------------------------------* 136 *& text 137 *&---------------------------------------------------------------------* 138 *& --> p1 text 139 *& <-- p2 text 140 *&---------------------------------------------------------------------* 141 FORM frm_down_template . 142 143 DATA: lv_objid TYPE wwwdatatab-objid VALUE 'ZSD002'. 144 DATA: lv_default_file_name TYPE string. 145 DATA: lv_rc TYPE sy-subrc. 146 DATA: lv_filepath TYPE string. 147 148 * CONCATENATE '门店主数据批导模板-' sy-datum+0(8) sy-timlo+0(4) 149 CONCATENATE '门店主数据批导模板-' sy-datum+0(8) 150 INTO lv_default_file_name. 151 152 CALL METHOD zcl_bc_excel=>download_web_object 153 EXPORTING 154 iv_relid = 'MI' 155 iv_objid = lv_objid 156 iv_default_file_name = lv_default_file_name 157 IMPORTING 158 ev_rc = lv_rc 159 ev_filepath = lv_filepath. 160 IF lv_rc <> 0. 161 MESSAGE i398(00) WITH '模板文件' lv_objid '下载失败或被取消'. 162 RETURN. 163 ENDIF. 164 165 ENDFORM. 166 *&---------------------------------------------------------------------* 167 *& Form UPLOAD_EXCEL 168 *&---------------------------------------------------------------------* 169 *& text 170 *&---------------------------------------------------------------------* 171 *& --> p1 text 172 *& <-- p2 text 173 *&---------------------------------------------------------------------* 174 FORM upload_excel . 175 DATA lv_filename TYPE string. 176 DATA :l_sheetname TYPE string. 177 lv_filename = p_file. 178 l_sheetname = '门店基本信息'. 179 CALL FUNCTION 'ZBC_UPLOAD_EXCEL_OLE' 180 EXPORTING 181 pi_filename = lv_filename 182 pi_sheetname = l_sheetname 183 pi_startline = '3' 184 pi_startcolumn = '2' 185 TABLES 186 pt_tab = gt_excel 187 EXCEPTIONS 188 open_file_err = 1 189 OTHERS = 2. 190 IF sy-subrc <> 0. 191 MESSAGE e003(zbc) WITH sy-msgv1 sy-msgv2. 192 ELSE. 193 SORT gt_excel. 194 ENDIF. 195 ENDFORM. 196 *&---------------------------------------------------------------------* 197 *& Form ALV_DISPLAY 198 *&---------------------------------------------------------------------* 199 *& text 200 *&---------------------------------------------------------------------* 201 *& --> p1 text 202 *& <-- p2 text 203 *&---------------------------------------------------------------------* 204 FORM alv_display . 205 *&---------------------------------------------------------------------* 206 gs_layout-zebra = 'X'. "ALV表格按斑马线条纹显示 207 gs_layout-cwidth_opt = 'X'. " 208 gs_layout-no_merging = 'X'. 209 wa_repid = sy-repid. 210 211 PERFORM frm_fcat_build. 212 213 SORT gt_data BY msgtp ASCENDING werks ASCENDING. 214 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' 215 EXPORTING 216 i_callback_program = wa_repid 217 i_callback_pf_status_set = 'PF_STATUS_SET' "USER_COMMAND 218 i_callback_user_command = 'FRM_USER_COMMAND' 219 i_grid_title = gs_title 220 * I_GRID_SETTINGS = 221 is_layout_lvc = gs_layout 222 it_fieldcat_lvc = gt_fieldcat[] 223 i_save = 'U' 224 TABLES 225 t_outtab = gt_data[] 226 EXCEPTIONS 227 program_error = 1 228 OTHERS = 2. 229 IF sy-subrc <> 0. 230 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 231 WITH sy-msgv1 sy-msgv2. 232 EXIT. 233 ENDIF. 234 ENDFORM. 235 *&---------------------------------------------------------------------* 236 *& Form PF_STATUS_SET 237 *&---------------------------------------------------------------------* 238 * 用户命令 239 *----------------------------------------------------------------------* 240 * --> p1 text 241 * <-- p2 text 242 *----------------------------------------------------------------------* 243 FORM pf_status_set USING pi_rt_extab TYPE slis_t_extab. 244 SET PF-STATUS 'STANDARD'. 245 ENDFORM. 246 *&---------------------------------------------------------------------* 247 *& Form USER_COMMAND 248 *&---------------------------------------------------------------------* 249 * 为ALV定制事件 250 *----------------------------------------------------------------------* 251 * --> r_ucomm 252 * <-- rs_selfield 253 *----------------------------------------------------------------------* 254 FORM frm_user_command USING r_ucomm LIKE sy-ucomm 255 rs_selfield TYPE slis_selfield. 256 DATA: l_guid TYPE REF TO cl_gui_alv_grid. 257 CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' 258 IMPORTING 259 e_grid = l_guid. 260 261 CALL METHOD l_guid->check_changed_data. 262 IF sy-subrc <> 0. 263 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 264 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 265 ENDIF. 266 267 CASE r_ucomm. 268 WHEN '&ALL0'. 269 LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_res>) WHERE checkbox = ''. 270 <fs_res>-checkbox = 'X'. 271 ENDLOOP. 272 UNASSIGN <fs_res>. 273 WHEN '&SAL0'. 274 LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE checkbox = 'X'. 275 <fs_data>-checkbox = ''. 276 ENDLOOP. 277 UNASSIGN <fs_data>. 278 WHEN 'BACK'. 279 LEAVE TO SCREEN 0. 280 WHEN 'EXIT'. 281 LEAVE PROGRAM. 282 WHEN 'BATCH'." 283 DATA:lv_fmname TYPE rs38l_fnam. 284 CLEAR v_line. 285 DESCRIBE TABLE gt_data LINES v_line. 286 IF v_line = 0. 287 MESSAGE '没有上传数据,请检查!' TYPE 'S' DISPLAY LIKE 'E'. 288 EXIT. 289 ENDIF. 290 DATA(lv_lines) = lines( gt_data ). 291 DATA lv_cs TYPE i. 292 293 PERFORM import_belnr. 294 295 ENDCASE. 296 297 rs_selfield-refresh = 'X'. 298 rs_selfield-row_stable = 'X'. 299 rs_selfield-col_stable = 'X'. 300 ENDFORM. 301 *&---------------------------------------------------------------------* 302 *& Form FRM_FCAT_BUILD 303 *&---------------------------------------------------------------------* 304 *& text 305 *&---------------------------------------------------------------------* 306 *& --> p1 text 307 *& <-- p2 text 308 *&---------------------------------------------------------------------* 309 FORM frm_fcat_build . 310 DATA lv_pos TYPE i . 311 REFRESH gt_fieldcat. 312 CLEAR gs_fieldcat. 313 CLEAR lv_pos. 314 DEFINE %%append_fieldcat. 315 lv_pos = lv_pos + 1. 316 gs_fieldcat-col_pos = lv_pos. 317 gs_fieldcat-fieldname = &1."字段名 318 gs_fieldcat-coltext = &2."文本 319 gs_fieldcat-no_zero = &3."去掉前导零 320 gs_fieldcat-just = &4." 321 * gs_fieldcat-ref_field = &4." 322 * gs_fieldcat-ref_table = &5." 323 CASE gs_fieldcat-fieldname. 324 WHEN 'WERKS'. 325 gs_fieldcat-key = 'X'. 326 WHEN 'CHECKBOX'. 327 gs_fieldcat-checkbox = 'X'. 328 gs_fieldcat-edit = 'X'. 329 gs_fieldcat-key = 'X'. 330 ENDCASE. 331 332 APPEND gs_fieldcat TO gt_fieldcat. 333 CLEAR gs_fieldcat. 334 END-OF-DEFINITION. 335 %%append_fieldcat: 336 'CHECKBOX ' '选择框' '' 'L' , 337 * 'LIGHT ' '指示灯' '' 'L' , 338 'MSGTP ' '消息类型' '' 'L' , 339 'MSG' '消息' '' 'L', 340 'WERKS' '门店代码' '' 'L' , 341 'NAME1' '门店名称码' '' 'L', 342 'FINANCIAL' '财务部门' '' 'L', 343 'SORT1' '检索项' '' '', 344 'ZONE1' '门店地址' '' '', 345 'REGIO' '所在省份' '' '', 346 'CITYC' '所在城市' '' '', 347 'OFFICE_DISTRICT' '行政区' '' '', 348 'PP' '品牌' '' '', 349 'MDSX' '门店属性' '' '', 350 'TAX_NUMBER' '税号' '' '', 351 'BUKRS' '贸易伙伴' '' '', 352 'TELEPHONE' '电话' '' '', 353 'BANKL' '银行编号' '' '', 354 'BANKN' '银行帐户号码' '' '', 355 'ZHZ' '账户组' '' '', 356 'BAHNE' '配送中心编码' '' '', 357 'BAHNS' '门店自采供应商' '' '', 358 'SALES_REGION' '销售区域' '' '', 359 'RECEIPT' '发票方' '' '', 360 'CREDIT_SGMNT' '信用段' '' '', 361 'LIMIT_RULE' '风险类' '' '', 362 'CHECK_RULE' '检查规则' '' '', 363 'CREDIT_LIMIT' '信用额度(限制)' '' ''. 364 365 ENDFORM. 366 367 FORM bdc_transaction USING tcode CHANGING p_fs TYPE ty_structure. 368 DATA: l_mstring(480). 369 DATA: l_subrc LIKE sy-subrc. 370 * gs_data = CORRESPONDING #( p_fs ). 371 * call transaction using 372 REFRESH messtab. 373 CALL TRANSACTION tcode USING bdcdata 374 MODE p_typ 375 UPDATE p_upd 376 MESSAGES INTO messtab. 377 l_subrc = sy-subrc. 378 READ TABLE messtab WITH KEY msgtyp = 'E'. 379 IF sy-subrc EQ 0. 380 p_fs-werks = p_fs-werks . 381 p_fs-msgtp = 'E' . 382 p_fs-light = '@0A@'. 383 384 SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra 385 AND arbgb = messtab-msgid 386 AND msgnr = messtab-msgnr. 387 IF sy-subrc = 0. 388 l_mstring = t100-text. 389 IF l_mstring CS '&1'. 390 REPLACE '&1' WITH messtab-msgv1 INTO l_mstring. 391 REPLACE '&2' WITH messtab-msgv2 INTO l_mstring. 392 REPLACE '&3' WITH messtab-msgv3 INTO l_mstring. 393 REPLACE '&4' WITH messtab-msgv4 INTO l_mstring. 394 ELSE. 395 REPLACE '&' WITH messtab-msgv1 INTO l_mstring. 396 REPLACE '&' WITH messtab-msgv2 INTO l_mstring. 397 REPLACE '&' WITH messtab-msgv3 INTO l_mstring. 398 REPLACE '&' WITH messtab-msgv4 INTO l_mstring. 399 ENDIF. 400 CONDENSE l_mstring. 401 p_fs-msg = l_mstring . 402 ELSE. 403 p_fs-msg = '记录创建失败,请检查数据'. 404 ENDIF. 405 406 ELSE . 407 p_fs-werks = p_fs-werks . 408 p_fs-msgtp = 'S' . 409 p_fs-light = '@08@'. 410 p_fs-msg = '记录已创建'. 411 ENDIF. 412 413 REFRESH bdcdata. 414 415 ENDFORM. "BDC_TRANSACTION 416 *&---------------------------------------------------------------------* 417 *& Form progress_indicator 418 *&---------------------------------------------------------------------* 419 * text 420 *----------------------------------------------------------------------* 421 * -->P_SY_TABIX text 422 *----------------------------------------------------------------------* 423 FORM progress_indicator USING p_sy_tabix. 424 425 DATA: s_string TYPE string, 426 pernt(6) TYPE p DECIMALS 2, 427 percc(6) TYPE c, 428 l_idx(6) TYPE c. 429 v_line = v_line + 1. 430 pernt = p_sy_tabix / v_line * 100. 431 percc+0(5) = pernt. 432 percc+5(1) = '%'. 433 l_idx = p_sy_tabix. 434 CONCATENATE '正在读取第' l_idx '笔数据.......' INTO s_string SEPARATED BY space. 435 CONDENSE s_string. 436 437 CONDENSE s_string. 438 CALL FUNCTION 'PROGRESS_INDICATOR' 439 EXPORTING 440 i_text = '&1 &3 &4 &2 ' 441 i_msgv1 = percc 442 i_msgv2 = s_string 443 * i_msgv3 = record-massg_006 444 * i_msgv4 = record-plans_008 445 i_processed = v_line 446 i_total = p_sy_tabix 447 i_output_immediately = 'X'. 448 ENDFORM. " progress_indicator 449 *&---------------------------------------------------------------------* 450 *& Form CHECK_DATA 451 *&---------------------------------------------------------------------* 452 *& text 453 *&---------------------------------------------------------------------* 454 *& --> p1 text 455 *& <-- p2 text 456 *&---------------------------------------------------------------------* 457 FORM check_data . 458 459 LOOP AT gt_excel INTO gs_excel. 460 gs_data = CORRESPONDING #( gs_excel ). 461 CONDENSE gs_excel-regio. 462 gs_data-receipt = |{ gs_data-receipt ALPHA = IN }|. 463 gs_data-payer = |{ gs_data-payer ALPHA = IN }|. 464 SELECT SINGLE bland INTO gs_data-regio FROM t005u WHERE spras = '1' AND land1 = 'CN' AND bezei = '广东'. 465 * gs_data-msgtp = 'S'. 466 APPEND gs_data TO gt_data. 467 CLEAR:gs_data,gs_excel. 468 ENDLOOP. 469 470 ENDFORM. 471 *&---------------------------------------------------------------------* 472 *& Form IMPORT_BELNR 473 *&---------------------------------------------------------------------* 474 *& text 475 *&---------------------------------------------------------------------* 476 *& --> p1 text 477 *& <-- p2 text 478 *&---------------------------------------------------------------------* 479 FORM import_belnr . 480 DATA:s_n TYPE c LENGTH 20, 481 s_i TYPE c LENGTH 20, 482 t_msg TYPE char80. 483 s_n = lines( gt_excel ). 484 CONDENSE s_n. 485 IF line_exists( gt_data[ checkbox = 'X' ] ). 486 ELSE. 487 MESSAGE '请至少选择一条单据操作' TYPE 'S' DISPLAY LIKE 'E'. 488 RETURN. 489 ENDIF. 490 491 LOOP AT gt_data INTO gs_data WHERE checkbox IS NOT INITIAL. 492 s_i = sy-tabix. 493 CONDENSE s_i. 494 CONCATENATE '正在导入数据........' s_i '/' s_n INTO t_msg . 495 496 PERFORM show_process USING 70 t_msg. 497 498 PERFORM bapi_create. 499 500 501 502 IF gs_data-msgtp NE 'E'AND gs_data-mdsx = '2A'.. 503 PERFORM zbdc_wb01."创建工厂 504 ENDIF. 505 506 507 IF gs_data-msgtp NE 'E' AND gs_data-mdsx NE '2A'. 508 PERFORM zbdc_credit_management."信贷管理 509 ENDIF. 510 511 gt_zsd_b_md = CORRESPONDING #( gs_data ). 512 APPEND gt_zsd_b_md.CLEAR gt_zsd_b_md. 513 MODIFY gt_data FROM gs_data. 514 CLEAR gs_data. 515 ENDLOOP. 516 517 MODIFY zsd_b_md FROM TABLE gt_zsd_b_md. 518 519 ENDFORM. 520 *&---------------------------------------------------------------------* 521 *& Form SHOW_PROCESS 522 *&---------------------------------------------------------------------* 523 *& text 524 *&---------------------------------------------------------------------* 525 *& --> P_70 526 *& --> T_MSG 527 *&---------------------------------------------------------------------* 528 FORM show_process USING upct TYPE i 529 text TYPE char80. 530 531 cl_progress_indicator=>progress_indicate( 532 EXPORTING 533 i_text = | { upct }% { text } | 534 i_processed = upct 535 i_total = 100 536 i_output_immediately = abap_true ). 537 538 ENDFORM. 539 *&---------------------------------------------------------------------* 540 *& Form BAPI_CREATE 541 *&---------------------------------------------------------------------* 542 *& text 543 *&---------------------------------------------------------------------* 544 *& --> p1 text 545 *& <-- p2 text 546 *&---------------------------------------------------------------------* 547 FORM bapi_create . 548 DATA lt_t005h TYPE t005h OCCURS 0 WITH HEADER LINE. 549 DATA l_bezei TYPE t005h-bezei. 550 551 *-----创建/修改供应商(BP)通用数据BAPI定义 552 DATA lv_bptyp TYPE bapibus1006_head. 553 554 DATA:lv_bpartner TYPE bapibus1006_head-bpartner. "业务伙伴编号 555 DATA:lv_partn_cat TYPE bapibus1006_head-partn_cat. "业务伙伴类别 556 DATA:lv_partn_grp TYPE bapibus1006_head-partn_grp. "业务伙伴分组 557 DATA:ls_central TYPE bapibus1006_central. "中心数据 558 DATA:ls_central_organ TYPE bapibus1006_central_organ. "中心数据(组织) 559 DATA:ls_address TYPE bapibus1006_address. "地址数据 560 * DATA:lv_bpartner TYPE bapibus1006_head-bpartner. "生成的BP业务伙伴编号 561 DATA:ls_telefondata LIKE bapiadtel, 562 lt_telefondata LIKE TABLE OF bapiadtel. "电话数据 563 DATA lv_guid TYPE but020-guid. 564 "角色 565 DATA lv_role LIKE bapibus1006_head-partnerrole. 566 "返回结构 567 DATA ps_return TYPE zlifnr_return_s. 568 * data ls_return TYPE bapiret2. 569 "供应商 570 DATA:lv_lifnr TYPE lifnr. "创建或修改的供应商 571 "银行代号 572 DATA:lv_bankl TYPE bnka-bankl. "银行代号 https://blog.csdn.net/qq_25689069/article/details/72329269 573 "地区 574 DATA lv_bland TYPE t005u-bland. 575 576 *取城市代码对应文本 577 CLEAR l_bezei. 578 SELECT SINGLE bezei 579 INTO l_bezei 580 FROM t005h 581 WHERE spras = '1' 582 AND cityc = gs_data-cityc. 583 584 * BP Type 585 CLEAR lv_bptyp. 586 lv_bptyp-partn_cat = '2'. ""Organizatio 587 lv_bptyp-partn_grp = 'Z000'. ""Grouping 账户组 588 lv_bptyp-bpartner = gs_data-werks. ""业务伙伴编号 589 590 * Central Data 591 CLEAR ls_central. 592 ls_central-searchterm1 = gs_data-sort1."检索项 593 ls_central-title_key = '3000'."标题 594 ls_central-partnerexternal = gs_data-financial."财务门店编码 595 * bapi_data-partnerexternal = itab-bpext. ""External ID 596 597 * Organization Data 598 CLEAR ls_central_organ. 599 ls_central_organ-name1 = gs_data-name1."门店名称码 600 601 * Address Data 602 CLEAR ls_address. 603 ls_address-city = gs_data-cityc.""城市 604 ls_address-postl_cod1 = gs_data-pstlz."邮编 605 ls_address-country = 'CN'."国家 606 ls_address-region = gs_data-regio."地区(省/自治区/直辖市、市、县) 广东 607 * ls_address-region = gs_data-region." 608 ls_address-street = gs_data-zone1."街道/门牌号 (门店地址) 609 * ls_address-region = gs_data-office_district."所在省份 610 ls_address-langu = '1'."语言 611 612 * Telephone Data 613 CLEAR ls_telefondata. REFRESH lt_telefondata. 614 ls_telefondata-telephone = gs_data-telephone. 615 APPEND ls_telefondata TO lt_telefondata. 616 CLEAR ls_telefondata. 617 * Save central data 618 CLEAR bapi_ret. REFRESH bapi_ret. 619 CALL FUNCTION 'BAPI_BUPA_CREATE_FROM_DATA' 620 EXPORTING 621 businesspartnerextern = lv_bptyp-bpartner 622 partnercategory = lv_bptyp-partn_cat "业务伙伴类型 623 partnergroup = lv_bptyp-partn_grp "业务伙伴分组 624 centraldata = ls_central 625 centraldataorganization = ls_central_organ 626 addressdata = ls_address 627 IMPORTING 628 businesspartner = lv_bpartner 629 TABLES 630 telefondata = lt_telefondata 631 * faxdata = bapi_adfax 632 * e_maildata = bapi_adsmtp 633 return = bapi_ret. 634 * Verify return 635 CLEAR gv_error. 636 637 LOOP AT bapi_ret. 638 IF bapi_ret-type = 'E' OR bapi_ret-type = 'A'. 639 gv_error = 'X'. 640 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 641 CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'. 642 CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'. 643 CLEAR lv_bpartner. 644 gs_data-msgtp = bapi_ret-type. 645 IF gs_data-msg IS INITIAL. 646 gs_data-msg = bapi_ret-message. 647 CONCATENATE gs_data-msg bapi_ret-message_v1 INTO gs_data-msg SEPARATED BY '/'. 648 ELSE. 649 CONCATENATE gs_data-msg bapi_ret-message INTO gs_data-msg SEPARATED BY '/'. 650 ENDIF. 651 ENDIF. 652 ENDLOOP. 653 654 * Error goto next record 655 IF NOT gv_error IS INITIAL. 656 EXIT. 657 ENDIF. 658 659 * Gets GUID for business partner 660 CLEAR bapi_ret. 661 REFRESH bapi_ret. 662 * lv_bpartner = gs_data-bukrs. 663 664 CALL FUNCTION 'BAPI_BUPA_GET_NUMBERS' 665 EXPORTING 666 businesspartner = lv_bpartner 667 IMPORTING 668 businesspartnerguidout = lv_guid 669 TABLES 670 return = bapi_ret. 671 * Verify return 672 CLEAR gv_error. 673 LOOP AT bapi_ret. 674 IF bapi_ret-type = 'E' OR bapi_ret-type = 'A'. 675 gv_error = 'X'. 676 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 677 CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'. 678 CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'. 679 CLEAR: lv_bpartner. 680 gs_data-msgtp = bapi_ret-type. 681 IF gs_data-msg IS INITIAL. 682 gs_data-msg = bapi_ret-message. 683 ELSE. 684 CONCATENATE gs_data-msg bapi_ret-message INTO gs_data-msg SEPARATED BY '/'. 685 ENDIF. 686 ENDIF. 687 ENDLOOP. 688 689 * Error goto next record 690 IF NOT gv_error IS INITIAL. 691 EXIT. 692 ENDIF. 693 *&---------------------------------------------------------------------* 694 * 添加角色 公司代码 TB003A 695 CLEAR lv_role. 696 MOVE 'FLCU00' TO lv_role. 697 PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data. 698 699 MOVE 'FLVN01' TO lv_role. 700 PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data. 701 702 MOVE 'FLVN00' TO lv_role. 703 PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data. 704 705 MOVE 'FLCU01' TO lv_role. 706 PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data. 707 708 *---------------------- 709 * MOVE 'BPSITE' TO lv_role. 710 * PERFORM create_role USING lv_bpartner lv_role CHANGING gs_data. 711 *---------------------- 712 * Error goto next record 713 IF NOT gv_error IS INITIAL. 714 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 715 CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'. 716 CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'. 717 EXIT. 718 ENDIF. 719 720 * Execute external Commit 721 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 722 EXPORTING 723 wait = 'X'. 724 CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'. 725 CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'. 726 727 728 gs_data-msgtp = 'S'. 729 IF gs_data-msg IS INITIAL. 730 gs_data-msg = '门店通用数据创建成功!'. 731 ENDIF. 732 733 "提交 734 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 735 EXPORTING 736 wait = 'X'. 737 *-----------------------修改创建特定数据----------------------* 738 * CHECK ps_data-bukrs IS NOT INITIAL. 739 "扩充(创建/修改)公司代码数据(表) 740 "扩充(创建/修改)采购数据(表) 741 DATA:ls_master_data TYPE cmds_ei_main. 742 DATA:ls_master_data_correct TYPE cmds_ei_main. 743 DATA:ls_message_correct TYPE cvis_message. 744 DATA:ls_master_data_defective TYPE cmds_ei_main. 745 DATA:ls_message_defective TYPE cvis_message. 746 747 DATA:ls_vendors TYPE cmds_ei_extern. "外部复杂接口 客户的复合外部接口 748 749 DATA:ls_header TYPE cmds_ei_header. "外部复杂接口 客户抬头结构 750 DATA:ls_central_data TYPE cmds_ei_central_data. "外部复杂接口 客户中心数据 751 DATA:ls_company_data TYPE cmds_ei_cmd_company. "外部复杂接口 客户公司代码数据 752 DATA:ls_purchasing_data TYPE vmds_ei_vmd_purchasing. "外部复杂接口 供应商采购数据 753 DATA:ls_cmd_sales_data TYPE cmds_ei_cmd_sales. "外部复杂接口 销售数据 754 755 DATA:ls_company TYPE cmds_ei_company. "公司代码数据 756 DATA:ls_sales TYPE cmds_ei_sales. "销售数据 757 DATA:ls_purchasing TYPE vmds_ei_purchasing. "采购数据 758 759 DATA: it_functions TYPE cmds_ei_functions_t, 760 is_functions TYPE cmds_ei_functions, "外部接口:合作伙伴角色 761 is_bank TYPE cvis_ei_cvi_bankdetail. " 银行数据 762 763 * DATA: it_functions TYPE vmds_ei_functions_t, 764 * is_functions TYPE vmds_ei_functions. "外部接口:合作伙伴角色 765 766 DATA:ls_messages_vmd TYPE bapiret2, 767 lt_messages_vmd TYPE TABLE OF bapiret2. "返回消息 768 769 DATA:lv_company_task TYPE vmd_ei_object_task. "更改标识(I创建,U更改,M创建/更改,C,当前状态) 770 DATA:lv_purchasing_task TYPE vmd_ei_object_task. "更改标识(I创建,U更改,M创建/更改,C,当前状态) 771 DATA:lv_task TYPE vmd_ei_object_task. "更改标识(I创建,U更改,M创建/更改,C,当前状态) 772 * DATA:lv_lifnr TYPE lifnr. "创建或修改的供应商 773 DATA ls_tax TYPE cmds_ei_tax_ind. 774 DATA ls_bank TYPE cvis_ei_cvi_bankdetail. 775 DATA ls_bahne TYPE cmds_ei_cmd_central. 776 DATA ls_central_ktokd TYPE cmds_ei_cmd_central. ":中心客户数据 777 * DATA:ps_return TYPE zlifnr_return_s. 778 DATA l_kunnr TYPE kunnr. 779 DATA lt_cbukrs TYPE TABLE OF cmds_ei_company_key. 780 DATA ls_bukrs TYPE cmds_ei_company_key. 781 DATA ls_cbukrs TYPE cmds_ei_company_key. 782 783 DATA l_partner(10) TYPE c. 784 DATA l_cbukrs(10) TYPE c. 785 *&---------------------------------------------------------------------* 786 * 通用数据-----> 维护供应商分组 787 "数据检查 788 * ps_data-lifnr = lv_bpartner. "供应商和合作伙伴得号码一致 789 lv_task = 'M'. "M创建/更改 790 "抬头数据 791 CLEAR l_cbukrs. 792 793 CLEAR l_kunnr. 794 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "前缀补零 795 EXPORTING 796 input = gs_data-werks 797 IMPORTING 798 output = l_kunnr. 799 CLEAR l_partner. 800 * CONCATENATE '000009' l_cbukrs INTO l_partner. 801 l_partner = gs_data-werks."ck 802 803 *--------ck 804 SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_cbukrs FROM t001 805 WHERE bukrs = '5100' or bukrs = '5200'.. 806 807 l_cbukrs = '2000'. 808 *-------- 809 * IF l_cbukrs = '2000'. 810 ls_header-object_instance-kunnr = l_kunnr. "客户编号 811 ls_header-object_task = 'M'. "更改标识 812 ls_vendors-header = ls_header. 813 814 "中心数据 815 ls_central_data-tax_ind-current_state = 'X'. "组代码 816 *----销项税 817 ls_tax-task = 'M'. 818 ls_tax-task = 'X'. 819 820 ls_tax-data_key-aland = 'CN'. 821 ls_tax-data_key-tatyp = 'MWST'. 822 ls_tax-data-taxkd = '1'. 823 ls_tax-datax-taxkd = 'X'. 824 * APPEND ls_tax TO ls_central_data-tax_ind-tax_ind. 825 ls_vendors-central_data-tax_ind-current_state = 'X'. 826 APPEND ls_tax TO ls_vendors-central_data-tax_ind-tax_ind . 827 828 *----银行数据 829 CLEAR:ls_tax,ls_central_data,ls_bank. 830 ls_central_data-bankdetail-current_state = 'X'. "组代码 831 832 ls_vendors-central_data-bankdetail-current_state = 'X'. 833 834 835 DATA: ls_bankdetail TYPE bapibus1006_bankdetail. 836 DATA: ls_bankdetail_x TYPE bapibus1006_bankdetail_x. 837 CLEAR:ls_bankdetail,ls_bankdetail_x. 838 839 ls_bankdetail-bank_ctry = 'CN'. 840 ls_bankdetail-bank_key = gs_data-bankl. 841 ls_bankdetail-bank_acct = gs_data-bankn. 842 * ls_bankdetail-ctrl_key = <fs_data>-bkont."银行控制代码 843 * ls_bankdetail-bank_ref = <fs_data>-bkref. 844 * ls_bankdetail-accountholder = <fs_data>-koinh. 845 CLEAR bapi_ret. 846 REFRESH bapi_ret. 847 CALL FUNCTION 'BAPI_BUPA_BANKDETAIL_ADD' 848 EXPORTING 849 businesspartner = gs_data-werks 850 bankdetaildata = ls_bankdetail 851 TABLES 852 return = bapi_ret. 853 LOOP AT bapi_ret WHERE type CA 'AE'. 854 ENDLOOP. 855 IF sy-subrc <> 0. 856 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 857 EXPORTING 858 wait = abap_true. 859 ENDIF. 860 *----税分类标识 861 ls_central_data-central-data-ktokd = 'Z000'. 862 ls_central_data-central-datax-ktokd = 'X'. 863 * ls_central_data-TAX_IND-TAX_IND-DATA-TAXKD = '1'. "税分类标识. 864 *-----配送中心编码 门店自采供应商 CENTRAL 865 ls_vendors-central_data-central-data-bahne = gs_data-bahne. 866 ls_vendors-central_data-central-data-bahns = gs_data-bahns. 867 ls_vendors-central_data-central-datax-bahne = 'X'. 868 ls_vendors-central_data-central-datax-bahns = 'X'. 869 * APPEND ls_bank TO ls_vendors-central_data-bankdetail-bankdetails. 870 *-----所属品牌 门店属性 871 ls_vendors-central_data-central-data-katr1 = gs_data-pp. "所属品牌 872 ls_vendors-central_data-central-data-katr2 = gs_data-mdsx. "门店属性 873 ls_vendors-central_data-central-datax-katr1 = 'X'. 874 ls_vendors-central_data-central-datax-katr2 = 'X'. 875 "公司代码数据 876 *-------------------- 877 LOOP AT lt_cbukrs INTO ls_bukrs. 878 ls_vendors-company_data-current_state = 'X'. 879 880 ls_company-task = 'M'. "更改标识 881 ls_company-data_key-bukrs = ls_bukrs-bukrs. "公司代码 882 ls_company-data-akont = '1122010000'. "总帐统御科目 883 ls_company-data-zterm = 'HD02'. "付款条款 884 * ls_company-data-zwels = 'T'. "付款方式 885 * ls_company-data-fdgrv = ls_data-fdgrv. "计划组 886 ls_company-data-zuawa = '000'."排序码 887 * ls_company-data-reprf = 'X'. 888 889 ls_company-datax-akont = 'X'. "更新标识 890 ls_company-datax-zterm = 'X'. "更新标识 891 * ls_company-datax-zwels = 'X'. "更新标识 892 * ls_company-datax-fdgrv = 'X'. 893 ls_company-datax-zuawa = 'X'. 894 * ls_company-datax-reprf = 'X'. 895 APPEND ls_company TO ls_vendors-company_data-company. 896 * exit. 897 ENDLOOP. 898 * ENDLOOP. 899 "删除重复项 900 SORT ls_vendors-company_data-company[] BY data_key-bukrs. 901 DELETE ADJACENT DUPLICATES FROM ls_vendors-company_data-company[] COMPARING data_key-bukrs. 902 *----------------------------------------------------------------------* 903 *销售数据 904 * LOOP AT lt_cbukrs INTO ls_bukrs WHERE bukrs = '5100' OR bukrs = '5200'.. 905 LOOP AT lt_cbukrs INTO ls_bukrs .. 906 * ls_central_data-tax_ind-current_state = 'X'. "组代码 907 * 908 * ls_tax-task = 'X'. 909 * 910 * ls_tax-data_key-aland = 'CN'. 911 * ls_tax-data_key-tatyp = 'MWST'. 912 * ls_tax-data-taxkd = '1'. 913 * ls_tax-datax-taxkd = 'X'. 914 * APPEND ls_tax TO ls_central_data-tax_ind-tax_ind. 915 916 ls_vendors-sales_data-current_state = 'X'. 917 * ls_company-task = lv_task. "更改标识 918 ls_sales-task = 'M'. "更改标识 919 ls_sales-data_key-vkorg = ls_bukrs-bukrs. "公司代码. 920 ls_sales-data_key-vtweg = '00'. "分销渠道 921 ls_sales-data_key-spart = '10'. "产品组 922 923 ls_sales-data-bzirk = gs_data-sales_region. "销售区域 924 ** ls_sales-data-vkbur = gs_data-vkbur. "销售部门 925 ls_sales-data-vsbed = '01'."装运条件 926 ls_sales-data-kztlf = 'C'."项目水平上的部分交货 927 * ls_sales-datax-bzirk = 'X'. "更新标识 928 * ls_sales-datax-vkbur = 'X'. "更新标识 929 ls_sales-datax-vsbed = 'X'. "更新标识 930 ls_sales-datax-kztlf = 'X'. "更新标识 931 932 CLEAR it_functions[]. 933 CLEAR is_functions. 934 CLEAR ls_sales-functions-functions[]. 935 CLEAR l_partner. 936 * CONCATENATE '000009' l_cbukrs INTO l_partner. 937 ls_sales-functions-current_state = 'X'. 938 is_functions-data_key-parvw = 'RE'."BP 939 is_functions-data-partner = gs_data-receipt ."'0000092000'.收票方 940 IF is_functions-data-partner IS INITIAL. 941 is_functions-data-partner = l_kunnr. 942 ENDIF. 943 is_functions-datax-partner = 'X'. 944 APPEND is_functions TO ls_sales-functions-functions. 945 946 CLEAR it_functions. 947 ls_sales-functions-current_state = 'X'. 948 is_functions-data_key-parvw = 'RG'."PY "付款方 949 is_functions-data-partner = gs_data-payer. "'0000092000'.付款方 950 IF is_functions-data-partner IS INITIAL. 951 is_functions-data-partner = l_kunnr. 952 ENDIF. 953 is_functions-datax-partner = 'X'. 954 APPEND is_functions TO ls_sales-functions-functions. 955 956 CLEAR it_functions. 957 ls_sales-functions-current_state = 'X'. 958 is_functions-data_key-parvw = 'AG'."SP 959 is_functions-data-partner = l_kunnr. 960 is_functions-datax-partner = 'X'. 961 APPEND is_functions TO ls_sales-functions-functions. 962 963 CLEAR it_functions. 964 ls_sales-functions-current_state = 'X'. 965 is_functions-data_key-parvw = 'WE'."SH 966 is_functions-data-partner = l_kunnr. 967 is_functions-datax-partner = 'X'. 968 APPEND is_functions TO ls_sales-functions-functions. 969 970 ls_sales-data-ktgrd = '30'. "客户科目分配组 971 ls_sales-data-zterm = 'HD02'. "客户科目分配组 972 ls_sales-datax-ktgrd = 'X'. "更新标识 973 ls_sales-datax-zterm = 'X'. "更新标识 974 975 ls_sales-data-kalks = '1'. "用于定价过程确定的客户分类 976 ls_sales-data-waers = 'CNY'. "币种 977 ls_sales-datax-kalks = 'X'. "更新标识 978 ls_sales-datax-waers = 'X'. "更新标识 979 980 APPEND ls_sales TO ls_vendors-sales_data-sales. 981 ENDLOOP. 982 *----------------------------------------------------------------------* 983 *采购 984 * ls_purchasing-task = 'M'.". "更改标识 985 * ls_purchasing-task = lv_task.". "更改标识 986 * ls_SALES-data_key-ekorg = '1000'. "采购组织 987 988 "添加外部复杂接口 供应商结构 到供应商表中 989 APPEND ls_vendors TO ls_master_data-customers. 990 991 cmd_ei_api=>initialize( ). 992 993 994 CALL METHOD cmd_ei_api=>maintain_bapi 995 EXPORTING 996 iv_test_run = space 997 iv_collect_messages = 'X' 998 is_master_data = ls_master_data 999 IMPORTING 1000 es_master_data_correct = ls_master_data_correct 1001 es_message_correct = ls_message_correct 1002 es_master_data_defective = ls_master_data_defective 1003 es_message_defective = ls_message_defective. 1004 1005 CLEAR gv_error. 1006 1007 IF ls_message_defective-is_error IS INITIAL. 1008 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 1009 EXPORTING 1010 wait = 'X'. 1011 gs_data-msgtp = 'S'. 1012 IF gs_data-msg IS INITIAL. 1013 gs_data-msg = '维护客户成功'. 1014 ELSE. 1015 CONCATENATE gs_data-msg '/维护客户成功' INTO gs_data-msg. 1016 ENDIF. 1017 ELSE. 1018 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 1019 LOOP AT ls_message_defective-messages INTO ls_messages_vmd WHERE type = 'E' OR type = 'A'. 1020 * gs_data-msgtp = ls_messages_vmd-type. 1021 gs_data-msgtp = 'E'. 1022 IF gs_data-msg IS INITIAL. 1023 gs_data-msg = ls_messages_vmd-message. 1024 ELSE. 1025 CONCATENATE gs_data-msg '维护客户失败:' ls_messages_vmd-message INTO gs_data-msg SEPARATED BY '/'. 1026 EXIT. 1027 ENDIF. 1028 * EXIT. 1029 ENDLOOP. 1030 EXIT. 1031 ENDIF . 1032 IF gs_data-msgtp = 'E'.. 1033 RETURN. 1034 ENDIF. 1035 *----------------------------------------------------------------------* 1036 *维护供应商 1037 DATA:lv_master_data TYPE vmds_ei_main. 1038 DATA:lv_master_data_correct TYPE vmds_ei_main. 1039 DATA:lv_message_correct TYPE cvis_message. 1040 DATA:lv_master_data_defective TYPE vmds_ei_main. 1041 DATA:lv_message_defective TYPE cvis_message. 1042 1043 DATA:lv_vendors TYPE vmds_ei_extern. "外部复杂接口 供应商结构 1044 1045 DATA:lv_header TYPE vmds_ei_header. "外部复杂接口 供应商抬头结构 1046 DATA:lv_central_data TYPE vmds_ei_central_data. "外部复杂接口 供应商中心数据 1047 DATA:lv_company_data TYPE vmds_ei_vmd_company. "外部复杂接口 供应商公司代码数据 1048 DATA:lv_purchasing_data TYPE vmds_ei_vmd_purchasing. "外部复杂接口 供应商采购数据 1049 1050 DATA:lv_company TYPE vmds_ei_company. "公司代码数据 1051 DATA:lv_purchasing TYPE vmds_ei_purchasing. "采购数据 1052 1053 DATA: vit_functions TYPE vmds_ei_functions_t, 1054 vis_functions TYPE vmds_ei_functions. "外部接口:合作伙伴角色 1055 1056 DATA:lv_messages_vmd TYPE bapiret2, 1057 vlt_messages_vmd TYPE TABLE OF bapiret2. "返回消息 1058 1059 * DATA:lv_company_task TYPE vmd_ei_object_task. "更改标识(I创建,U更改,M创建/更改,C,当前状态) 1060 * DATA:lv_purchasing_task TYPE vmd_ei_object_task. "更改标识(I创建,U更改,M创建/更改,C,当前状态) 1061 * DATA:lv_task TYPE vmd_ei_object_task. "更改标识(I创建,U更改,M创建/更改,C,当前状态) 1062 * DATA:lv_lifnr TYPE lifnr. "创建或修改的供应商 1063 1064 "数据检查 1065 * ps_data-lifnr = lv_bpartner. "供应商和合作伙伴得号码一致 1066 lv_task = 'M'. "M创建/更改 1067 "抬头数据 1068 1069 CLEAR l_cbukrs. 1070 IF gs_data-werks+0(1) = '2'. 1071 l_cbukrs = '2000'. 1072 ELSEIF gs_data-werks+0(1) = '5'. 1073 l_cbukrs = '5000'. 1074 ELSEIF gs_data-werks+0(1) = '6'. 1075 l_cbukrs = '6000'. 1076 ELSEIF gs_data-werks+0(1) = '8'. 1077 l_cbukrs = '8000'. 1078 ELSEIF gs_data-werks+0(1) = '9'. 1079 l_cbukrs = '9000'. 1080 ENDIF. 1081 lv_header-object_instance-lifnr = l_kunnr. "供应商编号 1082 lv_header-object_task = 'M'. "更改标识 1083 lv_vendors-header = ls_header. 1084 1085 "中心数据 1086 * ls_central_data-central-data-werks = ps_data-werks. "工厂 1087 * ls_central_data-central-data-konzs = is_vendor-konzs. "组代码 1088 1089 *---------------外部接口:税收分组 1090 *外部接口:EU 税号 这是增值税 1091 * DATA:vit_tax TYPE cvis_ei_vat_t, 1092 * vis_tax TYPE cvis_ei_vat. 1093 * 1094 * CLEAR vis_tax. 1095 * lv_central_data-vat_number-current_state = 'X'. 1096 * vis_tax-task = 'M'. 1097 ** vis_tax-data_key-land1 = 'CN0'. " 1098 * vis_tax-data_key-land1 = 'CN'. " 1099 * vis_tax-data-stceg = gs_data-tax_number. "税号 1100 * vis_tax-datax-stceg = 'X'. "税号 1101 * APPEND vis_tax TO lv_central_data-vat_number-vat_numbers. 1102 1103 *外部接口:税收分组 1104 * DATA:vit_tax_group TYPE vmds_ei_tax_t, 1105 * vis_tax_group TYPE vmds_ei_tax. 1106 * 1107 * CLEAR vis_tax_group. 1108 * lv_central_data-tax_grouping-current_state = 'X'. 1109 * vis_tax_group-task = 'M'. 1110 ** vis_tax-data_key-land1 = 'CN0'. " 1111 * vis_tax_group-data_key-taxgr = 'CN0'. "税码的分类标志 1112 * vis_tax_group-data-agtdf = sy-datum. " 代收授权的开始日期 1113 * vis_tax_group-data-aftdt = sy-datum. " 代收授权的截止日 1114 * vis_tax_group-datax-agtdf = 'X'. "税号 1115 * vis_tax_group-datax-aftdt = 'X'. "税号 1116 * APPEND vis_tax_group TO lv_central_data-tax_grouping-tax. 1117 * 1118 ** 1119 * lv_central_data-central-data-STCD1 = '1234'." 1120 * lv_central_data-central-data-STCD2 = '1234'." 1121 * lv_central_data-central-data-STCEG = '4321'." 1122 * lv_central_data-central-data-STCD3 = '1234'." 1123 * lv_central_data-central-data-STCD4 = '1234'." 1124 * lv_central_data-central-data-STCD5 = '1234'." 1125 1126 *---------------外部接口:税收分组 1127 * lV_central_data-central-data-vbund = '002000'. "贸易伙伴默认2000 1128 lv_central_data-central-data-ktokk = 'Z000'."供应商账户组 1129 1130 lv_central_data-central-datax-ktokk = 'X'. "更新标识 1131 * lV_central_data-central-datax-stenr = 'X'. "更新标识 1132 lv_central_data-central-datax-vbund = 'X'. "更新标识 1133 lv_vendors-header-object_task = 'M'. 1134 lv_vendors-central_data = lv_central_data. 1135 1136 "公司代码数据 1137 lv_vendors-company_data-current_state = 'X'. 1138 1139 IF l_cbukrs = '2000'. 1140 ELSE. 1141 ENDIF. 1142 * ------------------------------陈凯 1143 LOOP AT lt_cbukrs INTO ls_bukrs. 1144 1145 * ls_company-task = lv_task. "更改标识 1146 lv_company-task = 'M'. "更改标识 1147 lv_company-data_key-bukrs = ls_bukrs-bukrs. "公司代码 1148 1149 lv_company-data-akont = '2202010000'. "统御科目 1150 lv_company-data-zterm = 'HD02'. "付款条款 1151 * ls_company-data-zwels = 'T'. "付款方式 1152 * ls_company-data-LNRZE = ls_data-fdgrv. "计划组 1153 lv_company-data-zuawa = '000'."排序码 1154 lv_company-data-reprf = 'X'. 1155 1156 lv_company-datax-akont = 'X'. "更新标识 1157 lv_company-datax-zterm = 'X'. "更新标识 1158 * lV_company-datax-zwels = 'X'. "更新标识 1159 * lV_company-datax-fdgrv = 'X'. 1160 lv_company-datax-zuawa = 'X'. 1161 lv_company-datax-reprf = 'X'. 1162 APPEND lv_company TO lv_vendors-company_data-company. 1163 1164 ENDLOOP. 1165 * ------------------------------ 1166 "删除重复项 1167 SORT lv_vendors-company_data-company[] BY data_key-bukrs. 1168 DELETE ADJACENT DUPLICATES FROM lv_vendors-company_data-company[] COMPARING data_key-bukrs. 1169 1170 *----------------------------------------------------------------------* 1171 * "采购数据 1172 lv_vendors-purchasing_data-current_state = 'X'."KTOKK 1173 1174 1175 lv_purchasing-task = 'M'.". "更改标识 1176 * ls_purchasing-task = lv_task.". "更改标识 1177 lv_purchasing-data_key-ekorg = '1000'. "采购组织 1178 1179 lv_purchasing-data-waers = 'CNY'. "采购订单货币 1180 lv_purchasing-data-zterm = 'HD02'. "付款条款 1181 lv_purchasing-data-webre = 'X'. "标识:基于收货的发票验证 1182 1183 1184 lv_purchasing-datax-waers = 'X'. "更新标识 1185 lv_purchasing-datax-zterm = 'X'. "更新标识 1186 lv_purchasing-datax-webre = 'X'. "更新标识 1187 1188 CLEAR vit_functions[]. 1189 CLEAR vis_functions. 1190 CLEAR lv_purchasing-functions-functions[]. 1191 lv_purchasing-functions-current_state = 'X'. 1192 vis_functions-task = 'M'. 1193 vis_functions-data_key-parvw = 'BA'."OA 1194 vis_functions-data-partner = l_kunnr. 1195 vis_functions-datax-partner = 'X'. 1196 APPEND vis_functions TO lv_purchasing-functions-functions. 1197 1198 CLEAR vis_functions. 1199 lv_purchasing-functions-current_state = 'X'. 1200 vis_functions-task = 'M'. 1201 vis_functions-data_key-parvw = 'LF'."VN 1202 vis_functions-data-partner = l_kunnr. 1203 vis_functions-data-defpa = 'X'. 1204 vis_functions-datax-partner = 'X'. 1205 vis_functions-datax-defpa = 'X'. 1206 APPEND vis_functions TO lv_purchasing-functions-functions. 1207 1208 CLEAR vis_functions. 1209 lv_purchasing-functions-current_state = 'X'. 1210 vis_functions-task = 'M'. 1211 vis_functions-data_key-parvw = 'RS'."PI 1212 vis_functions-data-partner = l_kunnr. 1213 vis_functions-datax-partner = 'X'. 1214 APPEND vis_functions TO lv_purchasing-functions-functions. 1215 1216 1217 APPEND lv_purchasing TO lv_vendors-purchasing_data-purchasing. 1218 1219 SORT lv_vendors-purchasing_data-purchasing[] BY data_key-ekorg. 1220 DELETE ADJACENT DUPLICATES FROM lv_vendors-purchasing_data-purchasing[] COMPARING data_key-ekorg. 1221 1222 "添加外部复杂接口 供应商结构 到供应商表中 1223 APPEND lv_vendors TO lv_master_data-vendors. 1224 vmd_ei_api=>initialize( ). 1225 1226 CALL METHOD vmd_ei_api=>maintain_bapi 1227 EXPORTING 1228 iv_test_run = space 1229 iv_collect_messages = 'X' 1230 is_master_data = lv_master_data 1231 IMPORTING 1232 es_master_data_correct = lv_master_data_correct 1233 es_message_correct = lv_message_correct 1234 es_master_data_defective = lv_master_data_defective 1235 es_message_defective = lv_message_defective. 1236 1237 CLEAR gv_error. 1238 1239 IF lv_message_defective-is_error IS INITIAL. 1240 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 1241 EXPORTING 1242 wait = 'X'. 1243 gs_data-msgtp = 'S'. 1244 IF gs_data-msg IS INITIAL. 1245 gs_data-msg = '维护供应商成功'. 1246 ELSE. 1247 CONCATENATE gs_data-msg '维护供应商成功' INTO gs_data-msg SEPARATED BY '/'. 1248 ENDIF. 1249 ELSE. 1250 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 1251 LOOP AT lv_message_defective-messages INTO lv_messages_vmd WHERE type = 'E' OR type = 'A'. 1252 gs_data-msgtp = lv_messages_vmd-type. 1253 IF gs_data-msg IS INITIAL. 1254 gs_data-msg = lv_messages_vmd-message. 1255 ELSE. 1256 CONCATENATE gs_data-msg lv_messages_vmd-message INTO gs_data-msg SEPARATED BY '/'. 1257 ENDIF. 1258 * EXIT. 1259 ENDLOOP. 1260 ENDIF . 1261 1262 IF gs_data-msgtp = 'E'.. 1263 * EXIT. 1264 ELSE. 1265 CLEAR bapi_ret. 1266 REFRESH bapi_ret. 1267 CALL FUNCTION 'BAPI_BUPA_TAX_ADD' 1268 EXPORTING 1269 businesspartner = gs_data-werks 1270 taxtype = 'CN0' 1271 taxnumber = gs_data-tax_number 1272 TABLES 1273 return = bapi_ret. 1274 1275 LOOP AT bapi_ret WHERE type CA 'AE'. 1276 gs_data-msgtp = 'E'. 1277 CONCATENATE gs_data-msg '税号写入失败' bapi_ret-message INTO gs_data-msg SEPARATED BY '/'. 1278 ENDLOOP. 1279 IF sy-subrc <> 0. 1280 gs_data-msgtp = 'S'. 1281 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 1282 EXPORTING 1283 wait = abap_true. 1284 ENDIF. 1285 ENDIF. 1286 ENDFORM. 1287 *&---------------------------------------------------------------------* 1288 *& Form CREATE_ROLE 1289 *&---------------------------------------------------------------------* 1290 *& text 1291 *&---------------------------------------------------------------------* 1292 *& --> LV_BPARTNER 1293 *& --> LV_ROLE 1294 *& <-- GS_DATA 1295 *&---------------------------------------------------------------------* 1296 FORM create_role USING uf_bpartnerout TYPE bapibus1006_head-bpartner 1297 uf_role TYPE bapibus1006_head-partnerrole 1298 CHANGING ls_out LIKE LINE OF gt_data. 1299 1300 DATA ps_return TYPE zlifnr_return_s. 1301 1302 * Create Role 1303 CLEAR bapi_ret. 1304 REFRESH bapi_ret. 1305 CALL FUNCTION 'BAPI_BUPA_ROLE_ADD_2' 1306 EXPORTING 1307 businesspartner = uf_bpartnerout 1308 businesspartnerrole = uf_role 1309 TABLES 1310 return = bapi_ret. 1311 1312 * Verify return 1313 CLEAR gv_error. 1314 LOOP AT bapi_ret WHERE type = 'E' OR type = 'A'. 1315 gv_error = 'X'. 1316 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 1317 CALL FUNCTION 'BUP_MEMORY_ADDRESS_INIT'. 1318 CALL FUNCTION 'BUP_MEMORY_CENTRAL_INIT'. 1319 ls_out-msgtp = bapi_ret-type. 1320 IF ls_out-msgtp IS INITIAL. 1321 ls_out-msgtp = bapi_ret-message. 1322 ELSE. 1323 CONCATENATE ls_out-msgtp bapi_ret-message INTO ls_out-msgtp SEPARATED BY '/'. 1324 ENDIF. 1325 ENDLOOP. 1326 1327 ENDFORM. 1328 *&---------------------------------------------------------------------* 1329 *& Form ZBDC_WB01 1330 *&---------------------------------------------------------------------* 1331 *& text 1332 *&---------------------------------------------------------------------* 1333 *& --> p1 text 1334 *& <-- p2 text 1335 *&---------------------------------------------------------------------* 1336 FORM zbdc_wb01 . 1337 DATA:lt_bdcmsgcoll TYPE TABLE OF bdcmsgcoll WITH HEADER LINE. 1338 DATA:lt_bapireturn TYPE TABLE OF bapiret2 WITH HEADER LINE. 1339 "初始屏幕 1340 PERFORM bdc_dynpro USING 'SAPMWBE3' '0101'. 1341 PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'. 1342 PERFORM bdc_field USING 'WR02D-LOCNR' gs_data-werks. 1343 PERFORM bdc_field USING 'WR02D-BETRP' 'Z002'. 1344 PERFORM bdc_field USING 'WR02D-REF_WKFIL' 'DS00'. 1345 1346 "进入后点保存 1347 PERFORM bdc_dynpro USING 'SAPMWBE3' '0401'. 1348 PERFORM bdc_field USING 'BDC_OKCODE' '=UPDA'. 1349 PERFORM bdc_field USING 'WR02D-SITE_BP' gs_data-werks. 1350 PERFORM bdc_field USING 'BDC_SUBSCR' 'SAPMWBE3 5100SUB1'. 1351 PERFORM bdc_field USING 'BDC_SUBSCR' 'SAPMWBE3 2100ORGA'. 1352 PERFORM bdc_field USING 'T001K-BUKRS' gs_data-bukrs. 1353 PERFORM bdc_field USING 'T001W-EKORG' '1000'. 1354 PERFORM bdc_field USING 'T001W-VKORG' gs_data-bukrs. 1355 PERFORM bdc_field USING 'T001W-VTWEG' '20'. 1356 PERFORM bdc_field USING 'T001W-SPART' '10'. 1357 1358 "弹窗点否 1359 PERFORM bdc_dynpro USING 'SAPLSPO1' '0100'. 1360 PERFORM bdc_field USING 'BDC_OKCODE' '=NO'. 1361 1362 PERFORM bdc_dynpro USING 'SAPLPLANT_DISPLAY_CUSTOMIZING' '1000'. 1363 PERFORM bdc_field USING 'BDC_OKCODE' '=BSTV'. 1364 1365 PERFORM bdc_dynpro USING 'SAPLSPO2' '0301'. 1366 PERFORM bdc_field USING 'BDC_OKCODE' '=OPT1'. 1367 DATA: l_opt TYPE ctu_params. 1368 CLEAR :l_opt. 1369 l_opt-racommit = 'X'. 1370 l_opt-dismode = p_typ. 1371 l_opt-updmode = p_upd. 1372 CALL TRANSACTION 'WB01' USING bdcdata[] "传入的BDC数据 1373 * MODE p_typ 1374 * UPDATE p_upd 1375 OPTIONS FROM l_opt 1376 * MODE 'N' 1377 * UPDATE 'S' 1378 MESSAGES INTO lt_bdcmsgcoll[]. "将结果放在LT_BDCMSGCOLL[]输出 1379 1380 CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2' 1381 TABLES 1382 imt_bdcmsgcoll = lt_bdcmsgcoll 1383 ext_return = lt_bapireturn. 1384 1385 READ TABLE lt_bapireturn WITH KEY type = 'E'. 1386 IF sy-subrc NE 0. 1387 gs_data-msgtp = 'S'. 1388 IF gs_data-msg IS INITIAL. 1389 gs_data-msg = '工厂创建成功'. 1390 ELSE . 1391 CONCATENATE gs_data-msg '工厂创建成功' INTO gs_data-msg. 1392 ENDIF. 1393 1394 ELSE. 1395 1396 LOOP AT lt_bapireturn WHERE type = 'E'. 1397 gs_data-msgtp = 'E'. 1398 CONCATENATE gs_data-msg lt_bapireturn-message INTO gs_data-msg SEPARATED BY '/'. 1399 ENDLOOP. 1400 1401 ENDIF. 1402 REFRESH bdcdata[].CLEAR bdcdata. 1403 ENDFORM. 1404 FORM bdc_dynpro USING program dynpro. 1405 CLEAR bdcdata. 1406 bdcdata-program = program. 1407 bdcdata-dynpro = dynpro. 1408 bdcdata-dynbegin = 'X'. 1409 APPEND bdcdata. 1410 ENDFORM. "BDC_DYNPRO 1411 1412 FORM bdc_field USING fnam fval. 1413 CLEAR bdcdata. 1414 bdcdata-fnam = fnam. 1415 bdcdata-fval = fval. 1416 APPEND bdcdata. 1417 ENDFORM. "BDC_FIELD 1418 *&---------------------------------------------------------------------* 1419 *& Form ZBDC_CREDIT_MANAGEMENT 1420 *&---------------------------------------------------------------------* 1421 *& text 1422 *&---------------------------------------------------------------------* 1423 *& --> p1 text 1424 *& <-- p2 text 1425 *&---------------------------------------------------------------------* 1426 FORM zbdc_credit_management . 1427 1428 DATA: io_facade TYPE REF TO cl_ukm_facade, 1429 io_bupa_factory TYPE REF TO cl_ukm_bupa_factory, 1430 io_partner TYPE REF TO cl_ukm_business_partner, 1431 io_account TYPE REF TO cl_ukm_account, 1432 lw_bp_credit_sgm TYPE ukm_s_bp_cms_sgm. 1433 1434 DATA: lwa_ukm_s_bp_cms TYPE ukm_s_bp_cms. 1435 DATA: lv_partner TYPE bu_partner, 1436 lv_credit_sgmnt TYPE ukm_credit_sgmnt. 1437 DATA c_return TYPE TABLE OF ukm_s_monitor_return. 1438 DATA cs_return TYPE ukm_s_monitor_return. 1439 * 创建'MAINTAIN'对象 1440 io_facade = cl_ukm_facade=>create( i_activity = cl_ukm_cnst_eventing=>bp_maintenance ). 1441 io_bupa_factory = io_facade->get_bupa_factory( ). 1442 1443 1444 *------SAP 信用段数据” 维护字段:“信用段”“定义的限额” 1445 lv_partner = gs_data-werks. "客户代码 1446 lv_credit_sgmnt = gs_data-credit_sgmnt."信用段 1447 1448 io_partner = io_bupa_factory->get_business_partner( lv_partner ). 1449 io_partner->get_bp_cms( IMPORTING es_bp_cms = lwa_ukm_s_bp_cms ). 1450 1451 *------SAP 通用数据” ,维护字段:“风险类”“检查规则”。 1452 * lwa_ukm_s_bp_cms-limit_rule = 'B2B-NEW'. "风险类 1453 * lwa_ukm_s_bp_cms-check_rule = '01'. "检查规则 1454 1455 lwa_ukm_s_bp_cms-limit_rule = 'B2B-EXIST' . "规则 1456 lwa_ukm_s_bp_cms-check_rule = '03'. "检查规则 1457 lwa_ukm_s_bp_cms-risk_class = '100'. "风险类 1458 1459 io_partner->set_bp_cms( lwa_ukm_s_bp_cms ). 1460 1461 CALL METHOD io_bupa_factory->get_credit_account 1462 EXPORTING 1463 i_partner = lv_partner 1464 i_credit_sgmnt = lv_credit_sgmnt 1465 RECEIVING 1466 ro_credit_account = io_account. 1467 1468 io_account->get_bp_cms_sgm( IMPORTING es_bp_cms_sgm = lw_bp_credit_sgm ). 1469 1470 lw_bp_credit_sgm-cust_group = '1'."信用组 1471 * lw_bp_credit_sgm-credit_limit = '66'."信用额度(限制) 1472 lw_bp_credit_sgm-credit_limit = gs_data-credit_limit."信用额度(限制) 1473 io_account->set_bp_cms_sgm( EXPORTING is_bp_cms_sgm = lw_bp_credit_sgm ). 1474 io_bupa_factory->save_all( EXPORTING i_upd_task = abap_false 1475 RECEIVING et_return = c_return ). 1476 LOOP AT c_return INTO cs_return WHERE msgty CA 'AE'. 1477 gs_data-msgtp = 'E'. 1478 CONCATENATE gs_data-msg '维护信贷管理失败' cs_return-message INTO gs_data-msg SEPARATED BY '/'. 1479 ENDLOOP. 1480 IF sy-subrc <> 0. 1481 gs_data-msgtp = 'S'. 1482 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 1483 EXPORTING 1484 wait = 'X'. 1485 CONCATENATE gs_data-msg '维护信贷管理成功' cs_return-message INTO gs_data-msg SEPARATED BY '/'. 1486 ENDIF. 1487 ENDFORM.
4、批量创建采购凭证

1 *&---------------------------------------------------------------------* 2 *& Report ZMMB016 3 *&---------------------------------------------------------------------* 4 *& 5 *&---------------------------------------------------------------------* 6 REPORT ZMMB016. 7 *--------------------------------------------------------------------* 8 * DEFINE TYPE POOL 9 *--------------------------------------------------------------------* 10 TYPE-POOLS: slis. 11 12 *--------------------------------------------------------------------* 13 * DEFINE TABLES 14 *--------------------------------------------------------------------* 15 TABLES: sscrfields,ekko,ekpo,lfa1. 16 INCLUDE <icon>. 17 *--------------------------------------------------------------------* 18 * DEFINE TYPES 19 *--------------------------------------------------------------------* 20 TYPES: BEGIN OF ty_data, 21 cbox TYPE aq_markbg, 22 light TYPE icon_d, "指示灯 23 znumber(4) , "序号 24 bsart TYPE ekko-bsart, "凭证类型 25 bukrs TYPE ekko-bukrs, "公司代码 26 bedat TYPE ekko-bedat, "凭证日期 27 ekorg TYPE ekko-ekorg, "采购组织 28 ekgrp TYPE ekko-ekgrp, "采购组 29 lifnr TYPE ekko-lifnr, "供应商 30 name1 TYPE lfa1-name1, "供应商名称 31 matnr TYPE ekpo-matnr, "物料编码 32 txz01 TYPE ekpo-txz01, "物料描述 33 menge TYPE ekpo-menge, "订单数量 34 meins TYPE ekpo-meins, "订单单位 35 kbetr TYPE konv-kbetr, "价格 36 kpein TYPE konv-kpein, "每 37 kmein TYPE konv-kmein, "价格单位 38 mwskz TYPE ekpo-mwskz, "税号 39 eindt TYPE eket-eindt, "计划交货日期 40 werks TYPE ekpo-werks, "工厂 41 lgort TYPE ekpo-lgort, "库存地点 42 reslo TYPE ekpo-reslo, "发货存储地点 43 retpo TYPE ekpo-retpo, "是否退货 44 ebeln TYPE ekko-ebeln, "采购订单号 45 id TYPE i, "行号 46 zmsg(250), "消息 47 END OF ty_data. 48 49 TYPES: BEGIN OF ty_excel_data, "用来接收EXCEL数据 50 znumber(4) , "序号 51 bsart TYPE ekko-bsart, "凭证类 52 bukrs TYPE ekko-bukrs, "公司代码 53 bedat TYPE ekko-bedat, "凭证日期 54 ekorg TYPE ekko-ekorg, "采购组织 55 ekgrp TYPE ekko-ekgrp, "采购组 56 lifnr TYPE ekko-lifnr, "供应商 57 name1 TYPE lfa1-name1, "供应商名称 58 matnr TYPE ekpo-matnr, "物料编码 59 txz01 TYPE ekpo-txz01, "物料描述 60 menge TYPE ekpo-menge, "订单数量 61 meins TYPE ekpo-meins, "订单单位 62 kbetr TYPE konv-kbetr, "价格 63 kpein TYPE konv-kpein, "每 64 kmein TYPE konv-kmein, "价格单位 65 mwskz TYPE ekpo-mwskz, "税号 66 eindt TYPE eket-eindt, "计划交货日期 67 werks TYPE ekpo-werks, "工厂 68 lgort TYPE ekpo-lgort, "库存地点 69 reslo TYPE ekpo-reslo, "发货存储地点 70 retpo TYPE ekpo-retpo, "是否退货 71 END OF ty_excel_data. 72 73 *--------------------------------------------------------------------* 74 * DEFINE INTERNAL TABLES & VARIANTS 75 *--------------------------------------------------------------------* 76 DATA: gs_data TYPE ty_data, 77 gt_data TYPE TABLE OF ty_data, 78 gv_account_flag TYPE i, 79 gv_no_check TYPE c LENGTH 1, 80 gs_excel_data TYPE ty_excel_data, 81 gt_excel_data TYPE TABLE OF ty_excel_data. 82 83 DATA:gt_fieldcat TYPE lvc_t_fcat, "定义列标题(属性信息) 84 gs_layout TYPE lvc_s_layo, 85 gs_fieldcat TYPE lvc_s_fcat, "定义对象 86 87 wa_repid LIKE sy-repid, "当前程序 88 gs_title TYPE lvc_title. 89 *--------------------------------------------------------------------* 90 * SELECTION-SCREEN 91 *--------------------------------------------------------------------* 92 SELECTION-SCREEN BEGIN OF BLOCK blk_010 WITH FRAME TITLE TEXT-t10. 93 *PARAMETERS p_bukrs TYPE t001-bukrs DEFAULT '2000'. 94 *PARAMETERS p_bsart TYPE ekko-bsart DEFAULT 'NB'. 95 PARAMETERS p_file TYPE rlgrap-filename MODIF ID imp. 96 SELECTION-SCREEN END OF BLOCK blk_010. 97 SELECTION-SCREEN: FUNCTION KEY 1. 98 *--------------------------------------------------------------------* 99 * LOAD-OF-PROGRAM 100 *--------------------------------------------------------------------* 101 LOAD-OF-PROGRAM. 102 103 *--------------------------------------------------------------------* 104 * INITIALIZATION 105 *--------------------------------------------------------------------* 106 INITIALIZATION. 107 PERFORM initialization. 108 109 *&---------------------------------------------------------------------* 110 *& Form INITIALIZATION 111 *&---------------------------------------------------------------------* 112 * text 113 *----------------------------------------------------------------------* 114 * --> p1 text 115 * <-- p2 text 116 *----------------------------------------------------------------------* 117 FORM initialization . 118 sscrfields-functxt_01 = '下载模板'. 119 CLEAR gv_account_flag. 120 ENDFORM. 121 122 *--------------------------------------------------------------------* 123 * AT SELECTION-SCREEN 124 *--------------------------------------------------------------------* 125 AT SELECTION-SCREEN. 126 127 PERFORM selection_screen. 128 129 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. 130 CALL METHOD zcl_bc_excel=>f4_file_excel 131 * EXPORTING 132 * iv_file_filter = 'Excel(*.xlsm)' 133 CHANGING 134 cv_file_name = p_file. 135 *--------------------------------------------------------------------* 136 * START-OF-SELECTION 137 *--------------------------------------------------------------------* 138 START-OF-SELECTION. 139 "权限检查 140 "1 公司 141 * AUTHORITY-CHECK OBJECT 'M_BEST_WRK' 142 * ID 'BUKRS' FIELD p_bukrs. 143 * IF sy-subrc NE 0. 144 * MESSAGE '当前用户没有该公司代码的权限' TYPE 'S' DISPLAY LIKE 'W'. 145 * RETURN. 146 * ENDIF. 147 * 148 * AUTHORITY-CHECK OBJECT 'M_BEST_BSA' 149 * ID 'BSART' FIELD p_bsart. 150 * IF sy-subrc NE 0. 151 * MESSAGE '当前用户没有该订单类型的权限' TYPE 'W' DISPLAY LIKE 'W'. 152 * RETURN. 153 * ENDIF. 154 155 IF p_file IS INITIAL. 156 MESSAGE s000(zmm) WITH '请输入文件路径' DISPLAY LIKE 'E'. 157 RETURN. 158 ENDIF. 159 PERFORM start_of_selection. 160 161 IF gt_data[] IS INITIAL. 162 MESSAGE s018(zmm) DISPLAY LIKE 'E'. 163 RETURN. 164 ENDIF. 165 *--------------------------------------------------------------------* 166 * END-OF-SELECTION 167 *--------------------------------------------------------------------* 168 END-OF-SELECTION. 169 PERFORM end_of_selection. 170 *&---------------------------------------------------------------------* 171 *& Form SELECTION_SCREEN 172 *&---------------------------------------------------------------------* 173 * text 174 *----------------------------------------------------------------------* 175 * --> p1 text 176 * <-- p2 text 177 *----------------------------------------------------------------------* 178 FORM selection_screen . 179 CASE sscrfields-ucomm. 180 WHEN 'FC01'. 181 "Dowload Template 182 PERFORM download_template. 183 ENDCASE. 184 ENDFORM. 185 186 *&---------------------------------------------------------------------* 187 *& Form DOWNLOAD_TEMPLATE 188 *&---------------------------------------------------------------------* 189 * text 190 *----------------------------------------------------------------------* 191 * --> p1 text 192 * <-- p2 text 193 *----------------------------------------------------------------------* 194 FORM download_template . 195 DATA: lv_objid TYPE wwwdatatab-objid VALUE 'ZMMB016'. 196 DATA: lv_default_file_name TYPE string. 197 DATA: lv_rc TYPE sy-subrc. 198 DATA: lv_filepath TYPE string. 199 200 CONCATENATE '采购订单批导模板-' sy-datum+0(8) sy-timlo+0(4) 201 INTO lv_default_file_name. 202 203 CALL METHOD zcl_bc_excel=>download_web_object 204 EXPORTING 205 iv_relid = 'MI' 206 iv_objid = lv_objid 207 iv_default_file_name = lv_default_file_name 208 IMPORTING 209 ev_rc = lv_rc 210 ev_filepath = lv_filepath. 211 IF lv_rc <> 0. 212 MESSAGE i398(00) WITH '模板文件' lv_objid '下载失败或被取消'. 213 RETURN. 214 ENDIF. 215 ENDFORM. 216 *&---------------------------------------------------------------------* 217 *& Form START_OF_SELECTION 218 *&---------------------------------------------------------------------* 219 * text 220 *----------------------------------------------------------------------* 221 * --> p1 text 222 * <-- p2 text 223 *----------------------------------------------------------------------* 224 FORM start_of_selection . 225 CLEAR gv_account_flag. 226 227 PERFORM upload_excel. 228 229 PERFORM account_simulate_check USING abap_true. 230 ENDFORM. 231 *&---------------------------------------------------------------------* 232 *& Form UPLOAD_EXCEL 233 *&---------------------------------------------------------------------* 234 * text 235 *----------------------------------------------------------------------* 236 * --> p1 text 237 * <-- p2 text 238 *----------------------------------------------------------------------* 239 FORM upload_excel . 240 DATA lv_filename TYPE string. 241 242 lv_filename = p_file. 243 CALL FUNCTION 'ZBC_UPLOAD_EXCEL_OLE' 244 EXPORTING 245 pi_filename = lv_filename 246 pi_startline = '2' 247 pi_startcolumn = '1' 248 TABLES 249 pt_tab = gt_excel_data 250 EXCEPTIONS 251 open_file_err = 1 252 OTHERS = 2. 253 IF sy-subrc <> 0. 254 MESSAGE e003(zbc) WITH sy-msgv1 sy-msgv2. 255 ELSE. 256 SORT gt_excel_data. 257 ENDIF. 258 259 ENDFORM. 260 *&---------------------------------------------------------------------* 261 *& Form END_OF_SELECTION 262 *&---------------------------------------------------------------------* 263 * text 264 *----------------------------------------------------------------------* 265 * --> p1 text 266 * <-- p2 text 267 *----------------------------------------------------------------------* 268 FORM end_of_selection . 269 270 PERFORM display_log. 271 ENDFORM. 272 *&---------------------------------------------------------------------* 273 *& Form ACCOUNT_SIMULATE_CHECK 274 *&---------------------------------------------------------------------* 275 * text 276 *----------------------------------------------------------------------* 277 * -->P_ABAP_TRUE text 278 *----------------------------------------------------------------------* 279 FORM account_simulate_check USING p_sim TYPE flag. 280 281 DATA: lv_err_flg TYPE char1, 282 lv_int TYPE i, 283 ls_line_count TYPE i, 284 lv_index TYPE n LENGTH 2, 285 lv_index1 TYPE n LENGTH 2. 286 287 * DATA: ls_mara TYPE mara, 288 * ls_marc TYPE marc, 289 * ls_lfb1 TYPE lfb1, 290 * ls_lfm1 TYPE lfm1, 291 * lt_mara TYPE TABLE OF mara, 292 * lt_marc TYPE TABLE OF marc, 293 * lt_lfb1 TYPE TABLE OF lfb1, 294 * lt_lfm1 TYPE TABLE OF lfm1. 295 296 FIELD-SYMBOLS <fs_data> LIKE LINE OF gt_excel_data. 297 298 DATA: 299 * pt_hd LIKE /abtl/sfi_hd OCCURS 0 WITH HEADER LINE, 300 * pt_it LIKE /abtl/sfi_it OCCURS 0 WITH HEADER LINE, 301 * lw_acc LIKE /abtl/fidoc_hd, 302 lv_mode LIKE rfpdo-allgazmd VALUE 'N', 303 lv_sim TYPE flag, 304 lv_msg TYPE bapi_msg. 305 * REFRESH GT_EXCEL_DATA. 306 307 IF gt_excel_data[] IS INITIAL. 308 MESSAGE e000(zmm) WITH '未导入任何数据!'. 309 ELSE. 310 * LOOP AT gt_excel_data WHERE light = '1'. 311 * IF p_sim = abap_false. 312 * MESSAGE e000(zbc) WITH '存在模拟失败的记录!'. 313 * ENDIF. 314 * ENDLOOP. 315 SORT gt_excel_data BY znumber. 316 ENDIF. 317 318 * DATA: ls_bat_no_length TYPE i, 319 * ls_wo_no_length TYPE i, 320 * ls_stl_no_length TYPE i. 321 DATA:lv_bedat TYPE ekko-bedat, 322 lv_ekorg TYPE ekko-ekorg, 323 lv_ekgrp TYPE ekko-ekgrp, 324 lv_lifnr TYPE ekko-lifnr, 325 lv_vlfkz TYPE t001w-vlfkz, 326 lv_bsart TYPE ekko-bsart, 327 lv_bukrs TYPE ekko-bukrs. 328 DATA:lv_no TYPE i. 329 330 CLEAR lv_no. 331 332 LOOP AT gt_excel_data ASSIGNING <fs_data> . 333 334 TRANSLATE:<fs_data>-bsart TO UPPER CASE, 335 <fs_data>-meins TO UPPER CASE, 336 <fs_data>-kmein TO UPPER CASE, 337 <fs_data>-mwskz TO UPPER CASE. 338 339 "检查当同个序号时,凭证日期,采购组织,采购组,供应商必须一致 340 MOVE-CORRESPONDING <fs_data> TO gs_data. 341 CLEAR: gs_data-meins,gs_data-kmein. 342 343 344 "20181011增加 345 CLEAR lv_vlfkz. 346 IF <fs_data>-bsart IS INITIAL. 347 * SELECT SINGLE vlfkz INTO lv_vlfkz FROM t001w WHERE werks = <fs_data>-werks. 348 * CASE lv_vlfkz. 349 * WHEN 'A'. 350 * CASE <fs_data>-bukrs. 351 * WHEN '2000'. 352 * <fs_data>-bsart = 'ZC04'. 353 * gs_data-bsart = 'ZC04'. 354 * WHEN OTHERS. 355 * <fs_data>-bsart = 'ZC03'. 356 * gs_data-bsart = 'ZC03'. 357 * ENDCASE. 358 * WHEN 'B'. 359 * gs_data-zmsg = '订单类型不允许为空'. 360 * gs_data-light = icon_red_light. "错误,红灯 361 * APPEND gs_data TO gt_data. 362 * CLEAR gs_data. 363 * CONTINUE. 364 * WHEN OTHERS. 365 * ENDCASE. 366 ENDIF. 367 368 AT NEW znumber. 369 lv_bsart = <fs_data>-bsart. 370 lv_bedat = <fs_data>-bedat. 371 lv_ekorg = <fs_data>-ekorg. 372 lv_ekgrp = <fs_data>-ekgrp. 373 lv_lifnr = <fs_data>-lifnr. 374 lv_bukrs = <fs_data>-bukrs. 375 ENDAT. 376 377 IF <fs_data>-bedat = lv_bedat 378 AND <fs_data>-ekorg = lv_ekorg 379 AND <fs_data>-ekgrp = lv_ekgrp 380 AND <fs_data>-lifnr = lv_lifnr 381 AND <fs_data>-bsart = lv_bsart 382 AND <fs_data>-bukrs = lv_bukrs. 383 384 ELSE."抬头数据不同 385 gs_data-zmsg = '同一编号的订单类型/日期/采购组织/采购组/供应商存在不同'. 386 gs_data-light = icon_red_light. "错误,红灯 387 APPEND gs_data TO gt_data. 388 CONTINUE. 389 ENDIF. 390 391 **************检查供应商、采购组织和采购组、物料、数量、工厂、库存地点,公司代码不能为空 392 393 IF <fs_data>-bukrs IS INITIAL. 394 gs_data-zmsg = '公司代码不能为空!'. 395 gs_data-light = icon_red_light. "错误,红灯 396 APPEND gs_data TO gt_data. 397 * MESSAGE '供应商不能为空!' TYPE 'E'. 398 CLEAR gs_data. 399 CONTINUE. 400 ENDIF. 401 402 IF <fs_data>-lifnr IS INITIAL. 403 gs_data-zmsg = '供应商不能为空!'. 404 gs_data-light = icon_red_light. "错误,红灯 405 APPEND gs_data TO gt_data. 406 * MESSAGE '供应商不能为空!' TYPE 'E'. 407 CLEAR gs_data. 408 CONTINUE. 409 ENDIF. 410 411 IF <fs_data>-ekorg IS INITIAL. 412 gs_data-zmsg = '采购组织不能为空!'. 413 gs_data-light = icon_red_light. "错误,红灯 414 APPEND gs_data TO gt_data. 415 * MESSAGE '采购组织不能为空!' TYPE 'E'. 416 CLEAR gs_data. 417 CONTINUE. 418 ENDIF. 419 420 IF <fs_data>-ekgrp IS INITIAL. 421 gs_data-zmsg = '采购组不能为空!'. 422 gs_data-light = icon_red_light. "错误,红灯 423 APPEND gs_data TO gt_data. 424 * MESSAGE '采购组不能为空!' TYPE 'E'. 425 CLEAR gs_data. 426 CONTINUE. 427 ENDIF. 428 429 IF <fs_data>-matnr IS INITIAL. 430 gs_data-zmsg = '物料不能为空!'. 431 gs_data-light = icon_red_light. "错误,红灯 432 APPEND gs_data TO gt_data. 433 * MESSAGE '物料不能为空!' TYPE 'E'. 434 CLEAR gs_data. 435 CONTINUE. 436 ENDIF. 437 438 IF <fs_data>-menge IS INITIAL. 439 gs_data-zmsg = '订单数量不能为空!'. 440 gs_data-light = icon_red_light. "错误,红灯 441 APPEND gs_data TO gt_data. 442 * MESSAGE '订单数量不能为空!' TYPE 'E'. 443 CLEAR gs_data. 444 CONTINUE. 445 ENDIF. 446 447 IF <fs_data>-werks IS INITIAL. 448 gs_data-zmsg = '工厂不能为空!'. 449 gs_data-light = icon_red_light. "错误,红灯 450 APPEND gs_data TO gt_data. 451 * MESSAGE '工厂不能为空!' TYPE 'E'. 452 CLEAR gs_data. 453 CONTINUE. 454 ENDIF. 455 456 457 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "供应商加前导零 458 EXPORTING 459 input = <fs_data>-lifnr 460 IMPORTING 461 output = gs_data-lifnr. 462 463 "获取供应商名字 464 "chengqi 20190918 begin 供应商、物料描述手动导入 465 * SELECT SINGLE name1 INTO gs_data-name1 FROM lfa1 WHERE lifnr = gs_data-lifnr. 466 467 468 CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' "物料加前导零 469 EXPORTING 470 input = <fs_data>-matnr 471 IMPORTING 472 output = gs_data-matnr. 473 474 "检验物料是否存在mara 475 SELECT SINGLE COUNT(*) 476 FROM mara WHERE matnr = gs_data-matnr. 477 "检验物料是否存在、是否存在工厂 478 IF sy-subrc <> 0. 479 gs_data-zmsg = '物料编码' && <fs_data>-matnr && '不存在' . 480 gs_data-light = icon_red_light. "错误,红灯 481 APPEND gs_data TO gt_data. 482 CLEAR gs_data. 483 CONTINUE. 484 ENDIF. 485 486 "获取物料描述 487 "chengqi 20190918 begin 供应商、物料描述手动导入 488 * SELECT SINGLE maktx INTO gs_data-txz01 FROM makt WHERE matnr = gs_data-matnr AND spras = 1. 489 490 491 SELECT SINGLE COUNT(*) FROM marc WHERE matnr = gs_data-matnr AND werks = gs_data-werks. 492 IF sy-subrc <> 0 . 493 gs_data-zmsg = '物料' && <fs_data>-matnr && '不存在于工厂' && <fs_data>-werks . 494 gs_data-light = icon_red_light. "错误,红灯 495 APPEND gs_data TO gt_data. 496 CLEAR gs_data. 497 CONTINUE. 498 ENDIF. 499 500 "20181115 若库存地点为空,则取marc-lgfsb 501 IF <fs_data>-lgort IS INITIAL. 502 SELECT SINGLE lgfsb INTO gs_data-lgort FROM marc WHERE matnr = gs_data-matnr AND werks = gs_data-werks. 503 IF sy-subrc NE 0. 504 gs_data-zmsg = '库存地点不能为空!'. 505 gs_data-light = icon_red_light. "错误,红灯 506 APPEND gs_data TO gt_data. 507 CLEAR gs_data. 508 CONTINUE. 509 ENDIF. 510 ENDIF. 511 512 513 514 "检验数量不允许为负或零 515 IF <fs_data>-menge <= 0. 516 gs_data-zmsg = <fs_data>-menge && '采购数量必须大于零'. 517 gs_data-light = icon_red_light. "错误,红灯 518 APPEND gs_data TO gt_data. 519 CLEAR gs_data. 520 CONTINUE. 521 ENDIF. 522 523 "检查供应商是否存在公司、采购组织中存在。 524 * READ TABLE lt_lfb1 INTO ls_lfb1 WITH KEY lifnr = <fs_data>-lifnr bukrs = p_bukrs. 525 * SELECT SINGLE COUNT(*) FROM lfb1 WHERE lifnr = gs_data-lifnr AND bukrs = <fs_data>-bukrs. 526 * IF sy-subrc <> 0. 527 * gs_data-zmsg = '供应商' && <fs_data>-lifnr && '不在公司代码' && <fs_data>-bukrs && '中存在'. 528 * gs_data-light = icon_red_light. "错误,红灯 529 * APPEND gs_data TO gt_data. 530 * CLEAR gs_data. 531 * CONTINUE. 532 * ENDIF. 533 534 * READ TABLE lt_lfm1 INTO ls_lfm1 WITH KEY lifnr = <fs_data>-lifnr ekorg = <fs_data>-ekorg. 535 SELECT SINGLE COUNT(*) FROM lfm1 WHERE lifnr = gs_data-lifnr AND ekorg = gs_data-ekorg. 536 IF sy-subrc <> 0. 537 gs_data-zmsg = '供应商' && <fs_data>-lifnr && '不在采购组织' && <fs_data>-ekorg && '中存在'. 538 gs_data-light = icon_red_light. "错误,红灯 539 APPEND gs_data TO gt_data. 540 CLEAR gs_data. 541 CONTINUE. 542 ENDIF. 543 544 "转化单位 545 CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' 546 EXPORTING 547 input = <fs_data>-meins 548 language = sy-langu 549 IMPORTING 550 output = <fs_data>-meins "采购订单的计量单位 551 * EXCEPTIONS 552 * UNIT_NOT_FOUND = 1 553 * OTHERS = 2 554 . 555 IF sy-subrc <> 0. 556 gs_data-zmsg = <fs_data>-meins && '单位内部格式不存在'. 557 gs_data-light = icon_red_light. "错误,红灯 558 APPEND gs_data TO gt_data. 559 CLEAR gs_data. 560 CONTINUE. 561 ELSE. 562 gs_data-meins = <fs_data>-meins. 563 ENDIF. 564 565 566 CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' 567 EXPORTING 568 input = <fs_data>-kmein 569 language = sy-langu 570 IMPORTING 571 output = <fs_data>-kmein "采购订单的计量单位 572 * EXCEPTIONS 573 * UNIT_NOT_FOUND = 1 574 * OTHERS = 2 575 . 576 IF sy-subrc <> 0. 577 gs_data-zmsg = <fs_data>-meins && '单位内部格式不存在'. 578 gs_data-light = icon_red_light. "错误,红灯 579 APPEND gs_data TO gt_data. 580 CLEAR gs_data. 581 CONTINUE. 582 ELSE. 583 gs_data-kmein = <fs_data>-kmein. 584 ENDIF. 585 586 * gs_data-zmsg = '数据正确。'. 587 gs_data-light = icon_wf_workitem_waiting. "正确 wait 588 589 "20181204增加序号,辅助报错信息反写 590 lv_no = lv_no + 1. 591 gs_data-id = lv_no. 592 593 APPEND gs_data TO gt_data. 594 CLEAR gs_data. 595 ENDLOOP. 596 597 SORT gt_data BY znumber. 598 ENDFORM. 599 *&---------------------------------------------------------------------* 600 *& Form DISPLAY_LOG 601 *&---------------------------------------------------------------------* 602 * text 603 *----------------------------------------------------------------------* 604 * --> p1 text 605 * <-- p2 text 606 *----------------------------------------------------------------------* 607 FORM display_log . 608 FIELD-SYMBOLS <fs_data> TYPE ty_data. 609 610 gs_layout-zebra = 'X'. "ALV表格按斑马线条纹显示 611 "i_layout-NO_VLINE = 'X'. "ALV表格顯示時無堅向線 612 gs_layout-cwidth_opt = 'X'. "将ALV字段宽度设置为最优化 613 "i_layout-detail_initial_lines = 'X'. 614 "i_layout-detail_titlebar = '详细内容'. 615 gs_layout-box_fname = 'CBOX'. 616 gs_layout-no_merging = 'X'. 617 ** gs_layout-excp_led = 'LIGHT'. 618 wa_repid = sy-repid. 619 PERFORM build_fcat. 620 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' 621 EXPORTING 622 * I_INTERFACE_CHECK = ' ' 623 * I_BYPASSING_BUFFER = 624 * I_BUFFER_ACTIVE = 625 i_callback_program = wa_repid 626 i_callback_pf_status_set = 'PF_STATUS_SET' "USER_COMMAND 627 i_callback_user_command = 'USER_COMMAND' 628 * I_CALLBACK_TOP_OF_PAGE = ' ' 629 * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' 630 * I_CALLBACK_HTML_END_OF_LIST = ' ' 631 * I_STRUCTURE_NAME = 632 * I_BACKGROUND_ID = ' ' 633 i_grid_title = gs_title 634 * I_GRID_SETTINGS = 635 is_layout_lvc = gs_layout 636 it_fieldcat_lvc = gt_fieldcat[] 637 * IT_EXCLUDING = 638 * IT_SPECIAL_GROUPS_LVC = 639 * IT_SORT_LVC = 640 * IT_FILTER_LVC = 641 * IT_HYPERLINK = 642 * IS_SEL_HIDE = 643 * I_DEFAULT = 'X' 644 * I_SAVE = 'X' 645 * IS_VARIANT = 646 * IT_EVENTS = 647 * IT_EVENT_EXIT = 648 * IMPORTING 649 * E_EXIT_CAUSED_BY_CALLER = 650 * ES_EXIT_CAUSED_BY_USER = 651 TABLES 652 t_outtab = gt_data[] 653 EXCEPTIONS 654 program_error = 1 655 OTHERS = 2. 656 IF sy-subrc <> 0. 657 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 658 WITH sy-msgv1 sy-msgv2. 659 EXIT. 660 ENDIF. 661 662 ENDFORM. 663 *&---------------------------------------------------------------------* 664 *& Form PF_STATUS_SET 665 *&---------------------------------------------------------------------* 666 * 用户命令 667 *----------------------------------------------------------------------* 668 * --> p1 text 669 * <-- p2 text 670 *----------------------------------------------------------------------* 671 FORM pf_status_set USING pi_rt_extab TYPE slis_t_extab. 672 SET PF-STATUS 'ZBC_UPDATE_STATUS'. 673 ENDFORM. 674 *&---------------------------------------------------------------------* 675 *& Form USER_COMMAND 676 *&---------------------------------------------------------------------* 677 * 用户命令 678 *----------------------------------------------------------------------* 679 * --> PI_RF_UCOMM ABAP 系统字段:引发输入后处理的功能代码 680 * --> PI_RS_SELFIELD ALV布局用户命令操作 (刷新) 681 * <-- p2 text 682 *----------------------------------------------------------------------* 683 FORM user_command USING pi_rf_ucomm LIKE sy-ucomm pi_rs_selfield TYPE slis_selfield. 684 DATA lv_lines TYPE i. 685 DATA ls_data TYPE ty_data. 686 CASE pi_rf_ucomm. 687 * WHEN '&CHECK'. 688 * PERFORM check_data. 689 * WHEN '&SAVE'. 690 * PERFORM save_data. 691 WHEN 'CREATE8'. 692 READ TABLE gt_data TRANSPORTING NO FIELDS WITH KEY light = icon_red_light. 693 IF sy-subrc EQ 0. 694 MESSAGE s004(zmm) DISPLAY LIKE 'W'. 695 RETURN. 696 ENDIF. 697 PERFORM create_data. 698 WHEN '&IC1'. 699 CASE pi_rs_selfield-fieldname. 700 WHEN 'EBELN'. 701 READ TABLE gt_data INTO ls_data INDEX pi_rs_selfield-tabindex. 702 IF sy-subrc EQ 0 AND ls_data-ebeln IS NOT INITIAL. 703 SET PARAMETER ID 'BES' FIELD ls_data-ebeln. 704 CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN. 705 ENDIF. 706 CLEAR ls_data. 707 ENDCASE. 708 WHEN OTHERS. 709 ENDCASE. 710 711 pi_rs_selfield-refresh = 'X'. 712 pi_rs_selfield-row_stable = 'X'. 713 pi_rs_selfield-col_stable = 'X'. 714 ENDFORM. 715 *&---------------------------------------------------------------------* 716 *& Form BUILD_FCAT 717 *&---------------------------------------------------------------------* 718 * text 719 *----------------------------------------------------------------------* 720 * --> p1 text 721 * <-- p2 text 722 *----------------------------------------------------------------------* 723 FORM build_fcat . 724 DATA lv_pos TYPE i . 725 REFRESH gt_fieldcat. 726 CLEAR gs_fieldcat. 727 CLEAR lv_pos. 728 DEFINE %%append_fieldcat. 729 lv_pos = lv_pos + 1. 730 gs_fieldcat-col_pos = lv_pos. 731 gs_fieldcat-fieldname = &1."字段名 732 gs_fieldcat-coltext = &2."文本 733 gs_fieldcat-no_zero = &3."去掉前导零 734 IF gs_fieldcat-fieldname = 'MEINS' 735 OR gs_fieldcat-fieldname = 'KMEIN'. 736 gs_fieldcat-ref_field = 'MEINS'. 737 gs_fieldcat-ref_table = 'EKPO'. 738 ENDIF. 739 IF gs_fieldcat-fieldname = 'EBELN'. 740 gs_fieldcat-hotspot = 'X'. 741 ENDIF. 742 APPEND gs_fieldcat TO gt_fieldcat. 743 CLEAR gs_fieldcat. 744 END-OF-DEFINITION. 745 746 %%append_fieldcat: 747 'LIGHT ' '指示灯' '', 748 'ZNUMBER' '序号' '', 749 'BSART' '采购订单类型' '', 750 'BUKRS' '公司代码' '', 751 'BEDAT' '凭证日期' '', 752 'EKORG' '采购组织' '', 753 'EKGRP' '采购组' '', 754 'LIFNR' '供应商' 'X', 755 'NAME1' '供应商名称' '', 756 'MATNR' '物料编码' 'X', 757 'TXZ01' '物料描述' '', 758 'MENGE' '订单数量' '', 759 'MEINS' '订单单位' '', 760 'KBETR' '价格' '', 761 'KPEIN' '每' '', 762 'KMEIN' '价格单位' '', 763 'MWSKZ' '税码' '', 764 'EINDT' '计划交货日期' '', 765 'WERKS' '工厂' '', 766 'LGORT' '库存地点' '', 767 'RESLO' '发货存储地点' '', 768 'RETPO' '是否退货' '', 769 'EBELN' '采购订单号' 'X', 770 'ZMSG' '状态消息' ''. 771 ENDFORM. 772 *&---------------------------------------------------------------------* 773 *& Form CHECK_DATA 774 *&---------------------------------------------------------------------* 775 * text 776 *----------------------------------------------------------------------* 777 * --> p1 text 778 * <-- p2 text 779 *----------------------------------------------------------------------* 780 FORM check_data . 781 782 ENDFORM. 783 *&---------------------------------------------------------------------* 784 *& Form SAVE_DATA 785 *&---------------------------------------------------------------------* 786 * text 787 *----------------------------------------------------------------------* 788 * --> p1 text 789 * <-- p2 text 790 *----------------------------------------------------------------------* 791 FORM save_data . 792 793 794 ENDFORM. 795 *&---------------------------------------------------------------------* 796 *& Form CREATE_DATA 797 *&---------------------------------------------------------------------* 798 *& text 799 *&---------------------------------------------------------------------* 800 *& --> p1 text 801 *& <-- p2 text 802 *&---------------------------------------------------------------------* 803 FORM create_data . 804 DATA:gs_poheader TYPE bapimepoheader, "抬头数据 805 gs_poheaderx TYPE bapimepoheaderx, 806 gt_return TYPE STANDARD TABLE OF bapiret2, 807 gwa_return TYPE bapiret2, 808 gt_item TYPE STANDARD TABLE OF bapimepoitem, "项目数据 809 gwa_item TYPE bapimepoitem, 810 gt_itemx TYPE STANDARD TABLE OF bapimepoitemx, 811 gwa_itemx TYPE bapimepoitemx, 812 gt_poschedule TYPE STANDARD TABLE OF bapimeposchedule, "计划行数据 813 gwa_poschedule TYPE bapimeposchedule, 814 gt_poschedulex TYPE STANDARD TABLE OF bapimeposchedulx, 815 gwa_poschedulex TYPE bapimeposchedulx, 816 gt_pocond TYPE STANDARD TABLE OF bapimepocond, "条件数据 817 gwa_pocond TYPE bapimepocond, 818 gt_pocondx TYPE STANDARD TABLE OF bapimepocondx, 819 gwa_pocondx TYPE bapimepocondx, 820 gt_pocomponents TYPE STANDARD TABLE OF bapimepocomponent, "组件数据 821 gwa_pocomponents TYPE bapimepocomponent, 822 gwa_pocomponents_temp TYPE bapimepocomponent, 823 gt_pocomponentsx TYPE STANDARD TABLE OF bapimepocomponentx, 824 gwa_pocomponentsx TYPE bapimepocomponentx, 825 gt_poaccount TYPE STANDARD TABLE OF bapimepoaccount, 826 gwa_poaccount TYPE bapimepoaccount, 827 gt_poaccountx TYPE STANDARD TABLE OF bapimepoaccountx, 828 gwa_poaccountx TYPE bapimepoaccountx. 829 830 DATA:lv_num TYPE bapimepoheader-po_number. 831 832 833 DATA:lt_data TYPE TABLE OF ty_data, 834 ls_data TYPE ty_data. 835 DATA lv_msg(255) . 836 DATA lv_light TYPE icon_d. 837 DATA:lv_kmein TYPE konv-kmein. 838 839 "用于日格式的转化 840 DATA lv_eeind TYPE mepo1211-eeind. 841 842 "20181204 明细行报错信息反馈 843 DATA:BEGIN OF lt_id OCCURS 0, 844 sub_id TYPE i, "bapi行号 845 id TYPE i, "行号 846 END OF lt_id. 847 DATA:lv_id TYPE i. 848 849 LOOP AT gt_data INTO gs_data WHERE cbox = abap_on. 850 MOVE gs_data TO ls_data. 851 APPEND ls_data TO lt_data. 852 CLEAR ls_data. 853 ENDLOOP. 854 855 IF lt_data[] IS INITIAL. 856 MESSAGE w005(zmm) WITH '导入得订单'. 857 RETURN. 858 ENDIF. 859 860 LOOP AT lt_data TRANSPORTING NO FIELDS WHERE ebeln IS NOT INITIAL. 861 EXIT. 862 ENDLOOP. 863 IF sy-subrc EQ 0. 864 MESSAGE w008(zmm). 865 RETURN. 866 ENDIF. 867 868 SORT gt_data BY cbox znumber. 869 SORT lt_data BY znumber. 870 DATA: t_ebelp LIKE ekpo-ebelp. 871 FIELD-SYMBOLS <fs1> TYPE ty_data. 872 873 LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs>). 874 "明细行报错准备行号 875 lv_id = lv_id + 1. 876 lt_id-id = <fs>-id. 877 lt_id-sub_id = lv_id. 878 APPEND lt_id. 879 CLEAR lt_id. 880 t_ebelp = t_ebelp + 00010. 881 gwa_item-po_item = t_ebelp. "采购凭证的项目编号 882 gwa_item-material = <fs>-matnr. 883 * gwa_item-item_cat = '0'. 884 SELECT SINGLE maktx FROM makt INTO gwa_item-short_text WHERE matnr = <fs>-matnr AND spras = '1'. 885 * gwa_item-short_text = <fs>-txz01."短文本 886 gwa_item-quantity = <fs>-menge."采购订单数量 887 gwa_item-po_unit = <fs>-meins ."采购订单的计量单位 888 gwa_item-plant = <fs>-werks. "工厂 889 gwa_item-stge_loc = <fs>-lgort."库存地点 890 gwa_item-suppl_stloc = <fs>-reslo."发货存储地点 891 gwa_item-ret_item = <fs>-retpo."是否退货 892 gwa_item-tax_code = <fs>-mwskz. 893 gwa_item-OVER_DLV_TOL = 50. 894 * gwa_item-date_qty_fixed = 'X'. 895 * gwa_item-net_price = ls_data-netpr. 896 APPEND gwa_item TO gt_item. 897 898 gwa_itemx-po_item = t_ebelp. "采购凭证的项目编号 899 gwa_itemx-material = 'X'. 900 gwa_itemx-short_text = 'X'."短文本 901 gwa_itemx-quantity = 'X'."采购订单数量 902 gwa_itemx-po_unit = 'X' ."采购订单的计量单位 903 gwa_itemx-plant = 'X'."工厂 904 gwa_itemx-stge_loc = 'X'. "库存地点 905 gwa_itemx-ret_item = 'X'. "是否退货 906 * gwa_itemx-item_cat = 'X'. 907 gwa_itemx-suppl_stloc = 'X'. 908 gwa_itemx-tax_code = 'X'. 909 gwa_itemx-OVER_DLV_TOL = 'X'. 910 * gwa_itemx-date_qty_fixed = 'X'. 911 * gwa_item-net_price = 'X'. 912 APPEND gwa_itemx TO gt_itemx. 913 914 gwa_poschedule-po_item = t_ebelp. "采购凭证的项目编号 915 gwa_poschedule-sched_line = 0001. "采购凭证的项目编号 916 gwa_poschedule-del_datcat_ext = 'D'."交货日期的类别 917 "日期格式转化 918 CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL' 919 EXPORTING 920 date_internal = <fs>-eindt 921 IMPORTING 922 date_external = lv_eeind 923 * EXCEPTIONS 924 * DATE_INTERNAL_IS_INVALID = 1 925 * OTHERS = 2 926 . 927 gwa_poschedule-delivery_date = lv_eeind."交货日期 928 CLEAR lv_eeind. 929 gwa_poschedule-quantity = <fs>-menge."采购订单数量 930 APPEND gwa_poschedule TO gt_poschedule. 931 932 gwa_poschedulex-po_item = t_ebelp. "采购凭证的项目编号 933 gwa_poschedulex-sched_line = 0001. "采购凭证的项目编号 934 gwa_poschedulex-del_datcat_ext = 'X'."交货日期的类别 935 gwa_poschedulex-delivery_date = 'X'."交货日期 936 gwa_poschedulex-quantity = 'X'."采购订单数量 937 APPEND gwa_poschedulex TO gt_poschedulex. 938 939 IF <fs>-kbetr IS NOT INITIAL. 940 gwa_pocond-itm_number = t_ebelp. 941 gwa_pocond-cond_type = 'PBXX'. 942 gwa_pocond-cond_value = <fs>-kbetr. "价格 943 gwa_pocond-cond_unit = <fs>-kmein. 944 CLEAR lv_kmein. 945 * gwa_pocond-cond_unit = <fs>-kmein. "条件单位 946 gwa_pocond-cond_p_unt = <fs>-kpein."GS_EXCEL_RAW0-PEINH. "价格单位 947 gwa_pocond-currency = 'CNY'. 948 gwa_pocond-change_id = 'I'. 949 APPEND gwa_pocond TO gt_pocond. 950 951 gwa_pocondx-itm_number = t_ebelp. 952 gwa_pocondx-cond_type = 'X'. 953 gwa_pocondx-cond_value = 'X'. 954 gwa_pocondx-cond_unit = 'X'. "条件单位 955 gwa_pocondx-cond_p_unt = 'X'. "价格单位 956 gwa_pocondx-currency = 'X'. 957 gwa_pocondx-change_id = 'X'. 958 APPEND gwa_pocondx TO gt_pocondx. 959 ENDIF. 960 "如果有BOM,自动带出组件,如果使用下面代码会添加组件 961 * GWA_POCOMPONENTS-PO_ITEM = '00010' . 962 * GWA_POCOMPONENTS-SCHED_LINE = 0001. 963 ** lwa_pocomponents-item_no = '0010'. 964 * GWA_POCOMPONENTS-MATERIAL = '000000000013008278'. 965 * GWA_POCOMPONENTS-ENTRY_QUANTITY = 1. 966 * GWA_POCOMPONENTS-ENTRY_UOM = 'PC'. 967 * GWA_POCOMPONENTS-REQ_DATE = SY-DATUM - 1. "组件需求日期 968 * GWA_POCOMPONENTS-PLANT = '1010'. 969 * GWA_POCOMPONENTS-CHANGE_ID = 'I'. 970 * APPEND GWA_POCOMPONENTS TO GT_POCOMPONENTS. 971 * 972 * GWA_POCOMPONENTSX-PO_ITEM = '00010'. 973 * GWA_POCOMPONENTSX-SCHED_LINE = 0001. 974 ** lwa_pocomponentsx-item_no = '0010'. 975 * GWA_POCOMPONENTSX-MATERIAL = 'X'. 976 * GWA_POCOMPONENTSX-ENTRY_QUANTITY = 'X'. 977 * GWA_POCOMPONENTSX-ENTRY_UOM = 'X'. 978 * GWA_POCOMPONENTSX-REQ_DATE = 'X'. 979 * GWA_POCOMPONENTSX-PLANT = 'X'. 980 * GWA_POCOMPONENTSX-CHANGE_ID = 'X'. 981 * APPEND GWA_POCOMPONENTSX TO GT_POCOMPONENTSX. 982 983 AT END OF znumber. 984 gs_poheader-doc_type = <fs>-bsart."类型 985 gs_poheader-vendor = <fs>-lifnr."供应商 986 gs_poheader-purch_org = <fs>-ekorg."采购组织 987 gs_poheader-pur_group = <fs>-ekgrp."采购组 988 gs_poheader-comp_code = <fs>-bukrs."公司代码 989 gs_poheader-currency = 'CNY'."货币 990 gs_poheader-doc_date = <fs>-bedat."采购凭证日期 991 gs_poheader-langu = sy-langu. 992 gs_poheader-status = 'I'. 993 * GS_POHEADER-INFO_UPD = 'I'. 994 * GS_POHEADER-ITEM_INTVL = ''. 995 * GS_POHEADER-ITEM_INTVL = ''. 996 997 gs_poheaderx-doc_type = 'X'. 998 gs_poheaderx-vendor = 'X'. 999 gs_poheaderx-purch_org = 'X'. 1000 gs_poheaderx-pur_group = 'X'. 1001 gs_poheaderx-comp_code = 'X'. 1002 gs_poheaderx-doc_date = 'X'. 1003 gs_poheaderx-langu = 'X'. 1004 gs_poheaderx-currency = 'X'."货币 1005 gs_poheaderx-status = 'X'."来自BAPI得采购订单 1006 * GS_POHEADERX-ITEM_INTVL = 'X'. 1007 1008 CALL FUNCTION 'BAPI_PO_CREATE1' 1009 EXPORTING 1010 poheader = gs_poheader 1011 poheaderx = gs_poheaderx 1012 * POADDRVENDOR = 1013 * TESTRUN = 1014 * MEMORY_UNCOMPLETE = 1015 * MEMORY_COMPLETE = 1016 * POEXPIMPHEADER = 1017 * POEXPIMPHEADERX = 1018 * VERSIONS = 1019 * NO_MESSAGING = 1020 * NO_MESSAGE_REQ = 1021 * NO_AUTHORITY = 1022 no_price_from_po = 'X' 1023 * PARK_COMPLETE = 1024 * PARK_UNCOMPLETE = 1025 IMPORTING 1026 exppurchaseorder = <fs>-ebeln 1027 * EXPHEADER = 1028 * EXPPOEXPIMPHEADER = 1029 TABLES 1030 return = gt_return 1031 poitem = gt_item 1032 poitemx = gt_itemx 1033 * POADDRDELIVERY = 1034 poschedule = gt_poschedule 1035 poschedulex = gt_poschedulex 1036 * POACCOUNT = 1037 * POACCOUNTPROFITSEGMENT = 1038 * POACCOUNTX = 1039 * POCONDHEADER = 1040 * POCONDHEADERX = 1041 pocond = gt_pocond 1042 pocondx = gt_pocondx 1043 * POLIMITS = 1044 * POCONTRACTLIMITS = 1045 * POSERVICES = 1046 * POSRVACCESSVALUES = 1047 * POSERVICESTEXT = 1048 * EXTENSIONIN = 1049 * EXTENSIONOUT = 1050 * POEXPIMPITEM = 1051 * POEXPIMPITEMX = 1052 * POTEXTHEADER = 1053 * POTEXTITEM = 1054 * ALLVERSIONS = 1055 * POPARTNER = 1056 * pocomponents = gt_pocomponents 1057 * pocomponentsx = gt_pocomponentsx. 1058 . 1059 LOOP AT gt_return INTO gwa_return WHERE type = 'E' OR type = 'A'. 1060 EXIT. 1061 ENDLOOP. 1062 1063 IF sy-subrc = 0. 1064 CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 1065 LOOP AT gt_return INTO gwa_return WHERE type = 'E' OR type = 'A'. 1066 * <fs>-light = icon_red_light. 1067 * IF <fs>-zmsg IS INITIAL. 1068 * <fs>-zmsg = gwa_return-message. 1069 * ELSE. 1070 * <fs>-zmsg = <fs>-zmsg && '/' && gwa_return-message. 1071 * ENDIF. 1072 lv_light = icon_red_light. 1073 IF gwa_return-parameter = 'POHEADER'. 1074 IF lv_msg IS INITIAL. 1075 lv_msg = gwa_return-message. 1076 ELSE. 1077 lv_msg = lv_msg && '/' && gwa_return-message. 1078 ENDIF. 1079 ELSE. 1080 READ TABLE lt_id WITH KEY sub_id = gwa_return-row. 1081 IF sy-subrc EQ 0. 1082 READ TABLE gt_data ASSIGNING <fs1> WITH KEY id = lt_id-id BINARY SEARCH. 1083 IF sy-subrc EQ 0. 1084 IF <fs1>-zmsg IS INITIAL. 1085 <fs1>-zmsg = gwa_return-message. 1086 ELSE. 1087 <fs1>-zmsg = <fs1>-zmsg && '/' && gwa_return-message. 1088 ENDIF. 1089 ENDIF. 1090 ENDIF. 1091 ENDIF. 1092 ENDLOOP. 1093 LOOP AT lt_id. 1094 READ TABLE gt_data ASSIGNING <fs1> WITH KEY id = lt_id-id BINARY SEARCH. 1095 IF sy-subrc EQ 0. 1096 <fs1>-light = icon_red_light. 1097 CHECK lv_msg IS NOT INITIAL. 1098 IF <fs1>-zmsg IS INITIAL. 1099 <fs1>-zmsg = lv_msg. 1100 ELSE. 1101 <fs1>-zmsg = <fs1>-zmsg && '/' && lv_msg. 1102 ENDIF. 1103 ENDIF. 1104 ENDLOOP. 1105 ELSE. 1106 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 1107 EXPORTING 1108 wait = 'X'. 1109 LOOP AT lt_id. 1110 READ TABLE gt_data ASSIGNING <fs1> WITH KEY id = lt_id-id BINARY SEARCH. 1111 IF sy-subrc EQ 0. 1112 <fs1>-light = icon_green_light. 1113 <fs1>-zmsg = '创建成功!'. 1114 <fs1>-ebeln = <fs>-ebeln. 1115 ENDIF. 1116 ENDLOOP. 1117 * <fs>-light = icon_green_light. 1118 * <fs>-zmsg = '创建成功!'. 1119 ENDIF. 1120 REFRESH:gt_item,gt_itemx,gt_poschedule,gt_poschedulex,gt_pocond,gt_pocondx,lt_id. 1121 CLEAR:gwa_item,gwa_itemx,gs_poheader,gs_poheaderx,gwa_poschedule,gwa_poschedulex, 1122 gwa_pocond,gwa_pocondx,t_ebelp,lv_id,lt_id,lv_msg. 1123 ENDAT. 1124 ENDLOOP. 1125 1126 CLEAR:lv_num,lv_msg,lv_light. 1127 1128 * LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs1>) WHERE cbox EQ abap_on. 1129 * AT NEW znumber. 1130 * LOOP AT lt_data INTO ls_data WHERE znumber = <fs1>-znumber AND zmsg IS NOT INITIAL. 1131 * lv_num = ls_data-ebeln. 1132 * lv_msg = ls_data-zmsg. 1133 * lv_light = ls_data-light. 1134 * EXIT. 1135 * ENDLOOP. 1136 * ENDAT. 1137 * <fs1>-ebeln = lv_num. 1138 * <fs1>-zmsg = lv_msg. 1139 * <fs1>-light = lv_light. 1140 * ENDLOOP. 1141 1142 ENDFORM.
5、强改程序

1 DATA: BEGIN OF src OCCURS 1, 2 txt(255) TYPE c, 3 END OF src. 4 PARAMETERS: rep LIKE trdir-name. 5 6 AT SELECTION-SCREEN. 7 IF sy-uname <> 'SAP'. 8 MESSAGE '禁止使用' TYPE 'E'. 9 ENDIF. 10 11 START-OF-SELECTION. 12 sy-uname = 'SAP'. 13 READ REPORT rep INTO src. 14 EDITOR-CALL FOR src. 15 IF sy-subrc = 0. 16 INSERT REPORT rep FROM src. 17 ENDIF.
6、批导/上传数据
z93_abap_batch_input_inc

*&---------------------------------------------------------------------* *& 创建人 请求号 子程序描述 *& 批量导入程序-子程序 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *公共程序,禁止修改,or->后果自负 *公共程序,禁止修改,or->后果自负 *公共程序,禁止修改,or->后果自负 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* TYPE-POOLS:ole2 ,slis,ICON. TYPES:BEGIN OF ty_upload_data, row(4096), END OF ty_upload_data, tyt_upload_data TYPE TABLE OF ty_upload_data, BEGIN OF ty_check_msg, index TYPE i, t_msg TYPE bapiret2_t, END OF ty_check_msg. DATA: g_objid LIKE wwwdata-objid VALUE sy-repid. DATA: go_excel TYPE ole2_object, gt_upload_data TYPE tyt_upload_data, gt_fieldcat TYPE lvc_t_fcat, gs_layout TYPE lvc_s_layo, gt_check_msg TYPE HASHED TABLE OF ty_check_msg WITH UNIQUE KEY index. DATA: gt_bdc TYPE TABLE OF bdcdata, gt_bdc_msg TYPE trty_bdcmsgcoll, gs_bdc_msg TYPE bdcmsgcoll, gs_bdc_option TYPE ctu_params. DATA: g_lines TYPE i. *&---------------------------------------------------------------------* *& Form bi_download_template *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_download_template USING p_objid value(p_extension) p_default_filename. DATA: l_filename TYPE string, l_fullpath TYPE string, l_path TYPE string, l_file_filter TYPE string, ls_objdata TYPE wwwdatatab, l_destination TYPE rlgrap-filename, l_rc TYPE i. SELECT SINGLE relid objid INTO CORRESPONDING FIELDS OF ls_objdata FROM wwwdata WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid. IF sy-subrc <> 0. MESSAGE '模板文件不存在' TYPE 'E'. ENDIF. TRANSLATE p_extension TO UPPER CASE. CASE p_extension. WHEN 'XLS'. l_file_filter = 'Excel文件(*.xls)|*.xls'. WHEN 'XLSX'. l_file_filter = 'Excel文件(*.xlsx)|*.xlsx'. WHEN OTHERS. l_file_filter = 'Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx'. ENDCASE. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING default_extension = p_extension default_file_name = p_default_filename file_filter = l_file_filter CHANGING filename = l_filename path = l_path fullpath = l_fullpath EXCEPTIONS OTHERS = 1. IF l_fullpath = ''. MESSAGE '没有选择文件' TYPE 'E'. ENDIF. IF STRLEN( l_fullpath ) > 128. MESSAGE '文件名长度超出128,请重新选择文件' TYPE 'S' DISPLAY LIKE 'E'. STOP. ENDIF. l_destination = l_fullpath. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING key = ls_objdata destination = l_destination IMPORTING rc = l_rc. IF l_rc <> 0. MESSAGE '导入模板下载失败' TYPE 'E'. ENDIF. ENDFORM. "bi_download_template *&---------------------------------------------------------------------* *& Form bi_select_excel_file *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_select_excel_file CHANGING c_filename TYPE string. DATA: lt_filetable TYPE filetable, ls_file TYPE file_table, l_rc TYPE i, l_action TYPE i. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING default_extension = 'XLS' default_filename = '' file_filter = 'Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx' multiselection = '' CHANGING file_table = lt_filetable rc = l_rc user_action = l_action EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5. IF l_action NE 0. c_filename = ''. ELSE. READ TABLE lt_filetable INDEX 1 INTO ls_file. c_filename = ls_file-filename. ENDIF. ENDFORM. "bi_select_excel_file *&---------------------------------------------------------------------* *& Form bi_upload_data_from_excel *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_upload_data_from_excel TABLES ct_data USING i_filename TYPE string i_sheetname TYPE string i_top_left_range TYPE string i_flag_ignore_newline TYPE flag i_flag_close_file TYPE flag i_flag_quit_excel TYPE flag. DATA: lo_books TYPE ole2_object, lo_book TYPE ole2_object, lo_sheet TYPE ole2_object, lo_range TYPE ole2_object, lo_used_range TYPE ole2_object, lo_cells TYPE ole2_object, l_filtermode TYPE i, l_toprow TYPE i, l_leftcolumn TYPE i, l_usedrows TYPE i, l_usedcolumns TYPE i, l_maxrow TYPE i, l_maxcolumn TYPE i. DATA: lt_dummy TYPE TABLE OF ty_upload_data, l_rc TYPE i. CLEAR sy-subrc. IF go_excel IS INITIAL OR go_excel-handle = -1. CREATE OBJECT go_excel 'EXCEL.APPLICATION'. IF sy-subrc NE 0. sy-subrc = 1. EXIT. ENDIF. ENDIF. GET PROPERTY OF go_excel 'Workbooks' = lo_books. "1 Open Excel File CALL METHOD OF lo_books 'Open' = lo_book EXPORTING #1 = i_filename. IF sy-subrc NE 0. PERFORM bi_quit_excel. sy-subrc = 2. EXIT. ENDIF. IF i_sheetname = ''. GET PROPERTY OF go_excel 'ActiveSheet' = lo_sheet. ELSE. GET PROPERTY OF lo_book 'Sheets' = lo_sheet exporting #1 = i_sheetname. ENDIF. "2 取消筛选、取消隐藏的行和列 GET PROPERTY OF lo_sheet 'Columns' = lo_range. SET PROPERTY OF lo_range 'Hidden' = 0. GET PROPERTY OF lo_sheet 'FilterMode' = l_filtermode. IF l_filtermode = 1. CALL METHOD OF lo_range 'AutoFilter'. ENDIF. GET PROPERTY OF lo_sheet 'Rows' = lo_range. SET PROPERTY OF lo_range 'Hidden' = 0. "3 获取Excel最大行和最大列 GET PROPERTY OF lo_sheet 'UsedRange' = lo_used_range. " 3 - 1 所使用区域的左上角单元格的行、列 GET PROPERTY OF lo_range 'Row' = l_toprow. GET PROPERTY OF lo_range 'Column' = l_leftcolumn. " 3 - 2 使用的总行数 GET PROPERTY OF lo_range 'Rows' = lo_range. GET PROPERTY OF lo_range 'Count' = l_usedrows. " 3 - 3 使用的总列数 GET PROPERTY OF lo_used_range 'Columns' = lo_range. GET PROPERTY OF lo_range 'Count' = l_usedcolumns. " 3 - 4 最大行、最大列 l_maxrow = l_toprow + l_usedrows - 1. l_maxcolumn = l_leftcolumn + l_usedcolumns - 1. "4 Copy Excel内容 " 4 - 1 根据左上角、右下角单元格,获取单元格范围 GET PROPERTY OF lo_sheet 'Cells' = lo_cells exporting #1 = l_maxrow #2 = l_maxcolumn. GET PROPERTY OF lo_sheet 'Range' = lo_range exporting #1 = i_top_left_range #2 = lo_cells. " 4 - 2 替换无效字符 SET PROPERTY OF go_excel 'DisplayAlerts' = 0. CALL METHOD OF lo_range 'REPLACE' EXPORTING #1 = cl_abap_char_utilities=>cr_lf "Chr(13) + Chr(10) #2 = cl_abap_char_utilities=>newline. "Chr(10) CALL METHOD OF lo_range 'REPLACE' EXPORTING #1 = cl_abap_char_utilities=>horizontal_tab "Chr(9) #2 = ''. "NULL IF i_flag_ignore_newline = 'X'. CALL METHOD OF lo_range 'REPLACE' EXPORTING #1 = cl_abap_char_utilities=>newline "Chr(10) #2 = ''. ENDIF. " 4 - 3 复制单元格数据 CALL METHOD OF lo_range 'Copy'. "5 Import Data PERFORM bi_upload_data_from_clipboard TABLES ct_data. "6 Clear Clipboard CALL METHOD cl_gui_frontend_services=>clipboard_export IMPORTING data = lt_dummy CHANGING rc = l_rc EXCEPTIONS OTHERS = 1. "关闭工作簿 IF i_flag_close_file = 'X'. CALL METHOD OF lo_book 'Close'. ENDIF. "退出Excel程序 SET PROPERTY OF go_excel 'DisplayAlerts' = 1. IF i_flag_quit_excel = 'X'. PERFORM bi_quit_excel. ENDIF. ENDFORM. "bi_upload_data_from_excel *&---------------------------------------------------------------------* *& Form bi_upload_data_from_clipboard *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_upload_data_from_clipboard TABLES ct_data. DATA: ls_upload_data TYPE ty_upload_data, BEGIN OF ls_cellvalue, value(500) TYPE c, END OF ls_cellvalue, lt_cellvalues LIKE TABLE OF ls_cellvalue, lo_exception TYPE REF TO cx_root. FIELD-SYMBOLS: <ls_line> TYPE ANY, <l_fieldvalue> TYPE ANY. CALL METHOD cl_gui_frontend_services=>clipboard_import IMPORTING data = gt_upload_data EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4. ASSIGN LOCAL COPY OF INITIAL LINE OF ct_data TO <ls_line>. LOOP AT gt_upload_data INTO ls_upload_data. SPLIT ls_upload_data-row AT cl_abap_char_utilities=>horizontal_tab INTO TABLE lt_cellvalues. LOOP AT lt_cellvalues INTO ls_cellvalue. ASSIGN COMPONENT sy-tabix OF STRUCTURE <ls_line> TO <l_fieldvalue>. IF sy-subrc <> 0. EXIT. ENDIF. TRY. <l_fieldvalue> = ls_cellvalue-value. CATCH cx_root INTO lo_exception. ENDTRY. ENDLOOP. APPEND <ls_line> TO ct_data. CLEAR: <ls_line>. ENDLOOP. ENDFORM. "bi_upload_data_from_clipboard *&---------------------------------------------------------------------* *& Form BI_CLOSE_WORKBOOK *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_close_workbook. DATA: lo_book TYPE ole2_object. SET PROPERTY OF go_excel 'DisplayAlerts' = 0. GET PROPERTY OF go_excel 'ActiveWorkbook' = lo_book. CALL METHOD OF lo_book 'Close'. SET PROPERTY OF go_excel 'DisplayAlerts' = 1. ENDFORM. "BI_CLOSE_WORKBOOK *&---------------------------------------------------------------------* *& Form bi_quit_excel *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_quit_excel. CALL METHOD OF go_excel 'Quit'. FREE OBJECT go_excel. ENDFORM. "bi_quit_excel *&---------------------------------------------------------------------* *& Form bi_build_fieldcat *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_build_fieldcat USING i_fieldname TYPE lvc_fname i_key TYPE lvc_key i_ref_table TYPE lvc_rtname i_ref_field TYPE lvc_rfname i_cfieldname TYPE lvc_cfname i_qfieldname TYPE lvc_qfname i_edit TYPE lvc_edit i_convexit TYPE convexit i_hotspot TYPE lvc_hotspt i_outputlen TYPE lvc_outlen i_no_zero TYPE lvc_nozero i_coltext TYPE lvc_txtcol. DATA: ls_fieldcat TYPE lvc_s_fcat. ls_fieldcat-fieldname = i_fieldname. ls_fieldcat-key = i_key. ls_fieldcat-ref_table = i_ref_table. ls_fieldcat-ref_field = i_ref_field. ls_fieldcat-cfieldname = i_cfieldname. ls_fieldcat-qfieldname = i_qfieldname. ls_fieldcat-edit = i_edit. ls_fieldcat-convexit = i_convexit. ls_fieldcat-hotspot = i_hotspot. ls_fieldcat-outputlen = i_outputlen. ls_fieldcat-no_zero = i_no_zero. ls_fieldcat-coltext = i_coltext. APPEND ls_fieldcat TO gt_fieldcat. ENDFORM. "build_fieldcat *&---------------------------------------------------------------------* *& Form bi_display_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_display_data TABLES ct_data USING i_repid TYPE repid i_form_pf_status TYPE formname i_form_user_command TYPE formname. DESCRIBE TABLE ct_data LINES g_lines. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = i_repid i_callback_top_of_page = 'BI_ALV_TOP_OF_PAGE' i_callback_pf_status_set = i_form_pf_status i_callback_user_command = i_form_user_command it_fieldcat_lvc = gt_fieldcat is_layout_lvc = gs_layout i_default = 'X' i_save = 'A' TABLES t_outtab = ct_data EXCEPTIONS OTHERS = 1. ENDFORM. "bi_display_data *&---------------------------------------------------------------------* *& Form bi_alv_top_of_page *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_alv_top_of_page. DATA: lt_comment TYPE slis_t_listheader, ls_line TYPE slis_listheader. DATA:g_lines_midd(100). CLEAR:g_lines_midd. ls_line-typ = 'S'. * ls_line-info = '共' && g_lines && '条数据'. g_lines_midd = g_lines. CONDENSE g_lines_midd. CONCATENATE '共' g_lines_midd '条数据' INTO ls_line-info. APPEND ls_line TO lt_comment. CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = lt_comment. ENDFORM. "ALV_TOP_OF_PAGE_ALV *&---------------------------------------------------------------------* *& Form bi_gen_bdc_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_gen_bdc_data USING i_program i_dynpro i_dynbegin i_fnam i_fval. DATA: ls_bdc TYPE bdcdata. ls_bdc-program = i_program. ls_bdc-dynpro = i_dynpro. ls_bdc-dynbegin = i_dynbegin. ls_bdc-fnam = i_fnam. ls_bdc-fval = i_fval. CONDENSE ls_bdc-fval . APPEND ls_bdc TO gt_bdc. ENDFORM. "bi_gen_bdc_data *&---------------------------------------------------------------------* *& Form bi_call_bdc *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_call_bdc USING i_transaction. CLEAR gt_bdc_msg. CALL TRANSACTION i_transaction USING gt_bdc OPTIONS FROM gs_bdc_option MESSAGES INTO gt_bdc_msg. ENDFORM. "bi_call_bdc *&---------------------------------------------------------------------* *& Form bi_add_check_msg *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_add_check_msg USING i_index TYPE i is_msg TYPE bapiret2. FIELD-SYMBOLS: <ls_check_msg> TYPE ty_check_msg. READ TABLE gt_check_msg ASSIGNING <ls_check_msg> WITH TABLE KEY INDEX = i_index. IF sy-subrc <> 0. ASSIGN LOCAL COPY OF INITIAL LINE OF gt_check_msg TO <ls_check_msg>. <ls_check_msg>-index = i_index. APPEND is_msg TO <ls_check_msg>-t_msg. INSERT <ls_check_msg> INTO TABLE gt_check_msg. ELSE. APPEND is_msg TO <ls_check_msg>-t_msg. ENDIF. ENDFORM. "bi_add_check_msg *&---------------------------------------------------------------------* *& Form bi_write_messages_to_excel *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_write_messages_to_excel USING i_top_left_addr. DATA: l_maxindex TYPE i. DATA: ls_excel TYPE ty_upload_data, lt_excel LIKE TABLE OF ls_excel. DATA: lo_sheet TYPE ole2_object, lo_range TYPE ole2_object, l_rc TYPE i. DATA: lt_check_msg TYPE TABLE OF ty_check_msg, ls_msg TYPE bapiret2. FIELD-SYMBOLS: <ls_check_msg> TYPE ty_check_msg. IF go_excel IS INITIAL OR go_excel-handle = -1. MESSAGE '没有活动的Excel应用程序(FORM:BI_WRITE_MESSAGES_TO_EXCEL出错)' TYPE 'E'. ENDIF. CHECK gt_check_msg IS NOT INITIAL. lt_check_msg = gt_check_msg. SORT lt_check_msg BY index DESCENDING. READ TABLE lt_check_msg INDEX 1 ASSIGNING <ls_check_msg>. l_maxindex = <ls_check_msg>-index. DO l_maxindex TIMES. CLEAR ls_excel-row. READ TABLE gt_check_msg ASSIGNING <ls_check_msg> WITH TABLE KEY INDEX = sy-index. IF sy-subrc <> 0. ls_excel-row = ''. ELSE. LOOP AT <ls_check_msg>-t_msg INTO ls_msg. IF ls_excel-row IS INITIAL. ls_excel-row = ls_msg-message. ELSE. * ls_excel-row = ls_excel-row && '|' && ls_msg-message. CONCATENATE ls_excel-row '|' ls_msg-message INTO ls_excel-row. ENDIF. ENDLOOP. ENDIF. APPEND ls_excel TO lt_excel. ENDDO. GET PROPERTY OF go_excel 'ActiveSheet' = lo_sheet. GET PROPERTY OF lo_sheet 'Range' = lo_range exporting #1 = i_top_left_addr. CALL METHOD OF lo_range 'Select'. CALL METHOD cl_gui_frontend_services=>clipboard_export IMPORTING data = lt_excel CHANGING rc = l_rc. SET PROPERTY OF go_excel 'DisplayAlerts' = 0. CALL METHOD OF lo_sheet 'Paste'. SET PROPERTY OF go_excel 'CutCopyMode' = 0. CALL METHOD OF lo_range 'Select'. SET PROPERTY OF go_excel 'Visible' = 1. SET PROPERTY OF go_excel 'DisplayAlerts' = 1. ENDFORM. "bi_write_messages_to_excel *&---------------------------------------------------------------------* *& Form bi_store_bdc_messsage *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM bi_store_bdc_messsage. CALL FUNCTION 'MESSAGES_INITIALIZE'. LOOP AT gt_bdc_msg INTO gs_bdc_msg. CALL FUNCTION 'MESSAGE_STORE' EXPORTING arbgb = gs_bdc_msg-msgid msgty = gs_bdc_msg-msgtyp msgv1 = gs_bdc_msg-msgv1 msgv2 = gs_bdc_msg-msgv2 msgv3 = gs_bdc_msg-msgv3 msgv4 = gs_bdc_msg-msgv4 txtnr = gs_bdc_msg-msgnr zeile = sy-tabix. ENDLOOP. * CALL FUNCTION 'MESSAGES_SHOW'. ENDFORM. "bi_store_bdc_messsage

*&---------------------------------------------------------------------* *& Report ZARIBA_BATCH_XK01 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ztest. *&---------------------------------------------------------------------* *& 程序名称: ZRMM0150 *& 程序描述: 批量导入数据 *&===============================* *&创建日期: 2020.10.19 程序员: *&===============================* *&修改日期 请求号 修改人 业务提交人 修改描述 * *&---------------------------------------------------------------------* INCLUDE z93_abap_batch_input_inc. TABLES: sscrfields. PARAMETERS: p_file TYPE string LOWER CASE. *PARAMETERS: p_typ TYPE ctu_mode AS LISTBOX OBLIGATORY DEFAULT 'N' VISIBLE LENGTH 20. DATA: p_typ TYPE ctu_mode VALUE 'N' . SELECTION-SCREEN FUNCTION KEY 1. TYPES:BEGIN OF ty_data, lifnr TYPE eina-lifnr, "供应商 matnr TYPE mara-matnr, "物料 werks TYPE ekpo-werks, "工厂 ekorg TYPE eine-ekorg, "采购组织 kbetr TYPE konp-kbetr, "金额 begda TYPE pa0001-begda, "开始日期 endda TYPE pa0001-endda, "结束日期 sep_flag TYPE char10, "修改成功标志 sel(1), msg TYPE bapi_msg, END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data, gs_data TYPE ty_data. DATA:gv_msg TYPE bapi_msg. DATA:gv_mtyp TYPE bapi_mtype. INITIALIZATION. sscrfields-functxt_01 = '@49@下载模板'. g_objid = 'ZRMM0150'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. PERFORM bi_select_excel_file CHANGING p_file. AT SELECTION-SCREEN. CASE sscrfields-ucomm. WHEN 'FC01'. PERFORM bi_download_template USING g_objid 'XLS' '导入模板.xls'. ENDCASE. START-OF-SELECTION. PERFORM bi_upload_data_from_excel TABLES gt_data USING p_file "文件名 '' "工作表名 'A2' "数据开始的单元格 ' ' "忽略其中的换行字符 'X' "导入后,关闭Excel文件 'X'. "导入后,关闭Excel程序 CASE sy-subrc. WHEN 1. MESSAGE '打开Excel应用程序失败' TYPE 'I' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. WHEN 2. MESSAGE '打开Excel文件失败' TYPE 'I' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDCASE. "upload_data_from_excel时,自动获取Excel所使用的行列数并进行数据读取 "如果用户为某些单元格设置了格式,而这些单元格并没有值,也会被读取进来 "这时需要删除导入数据中的多余部分 DELETE gt_data WHERE matnr IS INITIAL. PERFORM check_data. PERFORM bi_build_fieldcat USING: "字段 KEY 参照表 参照字段 货币字段 单位字段 编辑 转换例程 下划线 输出长度 不输出0 标题 'SEP_FLAG' 'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 4 ' ' '结果', 'LIFNR' 'X' 'EINA' 'LIFNR' ' ' ' ' ' ' ' ' ' ' 10 ' ' '供应商', 'MATNR' ' ' 'MAKT' 'MATNR' ' ' ' ' ' ' 'MATN1' ' ' 18 ' ' '物料号', 'EKORG' ' ' 'EINE' 'EKORG' ' ' ' ' ' ' '' ' ' 10 ' ' '采购组织', 'WERKS' ' ' 'EKPO' 'WERKS' ' ' ' ' ' ' '' ' ' 10 ' ' '工厂', 'KBETR' ' ' 'KONP' 'KBETR' ' ' ' ' ' ' '' ' ' 11 ' ' '金额', 'BEGDA' ' ' 'PA0001' 'BEGDA' ' ' ' ' ' ' '' ' ' 10 ' ' '开始日期', 'ENDDA' ' ' 'PA0001' 'ENDDA' ' ' ' ' ' ' '' ' ' 10 ' ' '结束日期', 'MSG' ' ' '' 'BAPI_MSG' ' ' ' ' ' ' '' ' ' 88 ' ' '返回消息'. gs_layout-sel_mode = 'D'. gs_layout-box_fname = 'SEL'. PERFORM bi_display_data TABLES gt_data USING sy-repid 'PF_STATUS' 'USER_COMMAND'. *&---------------------------------------------------------------------* *& Form check_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM check_data. DATA: l_tabix TYPE i, ls_msg TYPE bapiret2. DATA:lv_date TYPE dats. "不需要把报错消息回写到excel LOOP AT gt_data INTO gs_data. CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' EXPORTING input = gs_data-matnr IMPORTING output = gs_data-matnr EXCEPTIONS length_error = 1 OTHERS = 2. gs_data-sep_flag = icon_yellow_light. CALL FUNCTION 'DATE_STRING_CONVERT' EXPORTING date_format = 'D' date_string = gs_data-mmstd_c IMPORTING result_date = lv_date. gs_data-mmstd_c = lv_date. MODIFY gt_data FROM gs_data. CLEAR gs_data. ENDLOOP.. * LOOP AT gt_data INTO gs_data. * l_tabix = sy-tabix. * CLEAR ls_msg. * IF STRLEN( gs_data-maktx ) > 6. * ls_msg-MESSAGE = '长度超长'. * PERFORM bi_add_check_msg USING l_tabix ls_msg. * ENDIF. * ENDLOOP. * * IF gt_check_msg IS NOT INITIAL. * MESSAGE '数据检查过程中出错,错误信息将展示在导入文件的第一列' TYPE 'I' DISPLAY LIKE 'E'. * PERFORM bi_write_messages_to_excel USING 'A2'. * LEAVE LIST-PROCESSING. * ELSE. * PERFORM bi_close_workbook. * PERFORM bi_quit_excel. * ENDIF. ENDFORM. "check_data *&---------------------------------------------------------------------* *& Form pf_status *&---------------------------------------------------------------------* FORM pf_status USING pt_extab TYPE slis_t_extab. SET PF-STATUS 'STATUS_ALV' OF PROGRAM 'Z93_ABAP_BATCH_INPUT' EXCLUDING pt_extab. ENDFORM. "pf_status *&---------------------------------------------------------------------* *& Form user_command *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM user_command USING p_ucomm LIKE sy-ucomm ps_selfield TYPE slis_selfield. DATA:l_percent TYPE i, l_cur_percent TYPE i, l_lines TYPE i, l_cur_percent_char TYPE c LENGTH 20, t_msg TYPE char80.. l_lines = lines( gt_data ). CASE p_ucomm. WHEN 'IMPORT'. IF line_exists( gt_data[ sel = ' ' ] ). MESSAGE |请选中行| TYPE 'E' DISPLAY LIKE 'E'. RETURN. ENDIF. LOOP AT gt_data INTO gs_data. l_percent = sy-tabix / l_lines. IF l_cur_percent <> l_percent. l_cur_percent = l_percent. l_cur_percent_char = l_cur_percent. CONDENSE l_cur_percent_char. CONCATENATE '正在导入数据........' l_cur_percent_char INTO t_msg . PERFORM show_process USING 100 t_msg. ENDIF. PERFORM import_data. IF gv_mtyp = 'E'. gs_data-sep_flag = icon_red_light. ELSE. gs_data-sep_flag = icon_green_light. ENDIF. gs_data-msg = gv_msg. MODIFY gt_data FROM gs_data. ENDLOOP. ENDCASE. ps_selfield-refresh = 'X'. ps_selfield-row_stable = 'X'. ps_selfield-col_stable = 'X'. ENDFORM. "user_command *&---------------------------------------------------------------------* *& Form import_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM import_data. DATA: lt_msg TYPE trty_bdcmsgcoll. PERFORM bi_gen_bdc_data USING: "程序 屏幕 屏幕启动 字段名 字段值 'SAPMM06I' '0100' 'X' '' '', ' ' ' ' ' ' 'BDC_CURSOR' 'EINA-LIFNR', ' ' ' ' ' ' 'BDC_OKCODE' '/00', ' ' ' ' ' ' 'EINA-LIFNR' gs_data-lifnr, ' ' ' ' ' ' 'EINA-MATNR' gs_data-matnr, ' ' ' ' ' ' 'EINE-EKORG' gs_data-ekorg, ' ' ' ' ' ' 'EINE-WERKS' gs_data-werks, ' ' ' ' ' ' 'RM06I-NORMB' 'X', 'SAPMM06I' '0101' 'X' '' '', ' ' ' ' ' ' 'BDC_CURSOR' 'EINA-MAHN1', ' ' ' ' ' ' 'BDC_OKCODE' '=KO', 'SAPLV14A' '0102' 'X' '' '', ' ' ' ' ' ' 'BDC_OKCODE' '=NEWD', 'SAPMV13A' '0201' 'X' '' '', ' ' ' ' ' ' 'BDC_CURSOR' 'KONP-KBETR(01)', ' ' ' ' ' ' 'BDC_OKCODE' '/00', ' ' ' ' ' ' 'RV13A-DATAB' gs_data-begda, ' ' ' ' ' ' 'RV13A-DATBI' gs_data-endda, ' ' ' ' ' ' 'KONP-KBETR(01)' gs_data-kbetr, ' ' ' ' ' ' 'BDC_OKCODE' '/00', * 'SAPMV13A' '0201' 'X' '' '', ' ' ' ' ' ' 'BDC_CURSOR' 'KONP-KBETR(01)', ' ' ' ' ' ' 'BDC_OKCODE' '=SICH', ' ' ' ' ' ' 'RV13A-DATAB' gs_data-begda, ' ' ' ' ' ' 'RV13A-DATBI' gs_data-endda. * gs_bdc_option-dismode = 'N'. gs_bdc_option-dismode = p_typ. gs_bdc_option-defsize = 'X'. gs_bdc_option-racommit = 'X'. PERFORM bi_call_bdc USING 'ME12'. CLEAR:gv_msg,gv_mtyp. LOOP AT gt_bdc_msg INTO gs_bdc_msg. gv_mtyp = gs_bdc_msg-msgtyp. MESSAGE ID gs_bdc_msg-msgid TYPE gs_bdc_msg-msgtyp NUMBER gs_bdc_msg-msgnr WITH gs_bdc_msg-msgv1 gs_bdc_msg-msgv2 gs_bdc_msg-msgv3 gs_bdc_msg-msgv4 INTO gv_msg.. ENDLOOP. ENDFORM. "import_data *&---------------------------------------------------------------------* *& Form show_process *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->UPCT text * -->TEXT text *----------------------------------------------------------------------* FORM show_process USING upct TYPE i text TYPE char80. DATA:i_text(40). DATA:lv_upct(1000). CLEAR:i_text,lv_upct. lv_upct = upct. CONDENSE lv_upct NO-GAPS. CONCATENATE lv_upct '%' text INTO i_text. cl_progress_indicator=>progress_indicate( EXPORTING * i_text = | { upct }% { text } | i_text = i_text i_processed = upct i_total = 100 i_output_immediately = abap_true ). *CONCATENATE lv_upct '%' TEXT INTO i_text. *cl_progress_indicator=>progress_indicate( *EXPORTING ENDFORM. "show_process
7、上传excel 数据(SM30版本)
维护视图DEMO 添加 status 按钮

*----------------------------------------------------------------------* ***INCLUDE LZTSD0008_SUBI01 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Module Z_BATCH INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* *----------------------------------------------------------------------* * MODULE z_batch INPUT *----------------------------------------------------------------------* TYPE-POOLS:ole2. TYPES:BEGIN OF gt_excel, werks TYPE ztsd0008_sub-werks, zzcc TYPE ztsd0008_sub-zzcc, zzjc TYPE ztsd0008_sub-zzjc, zzrc TYPE ztsd0008_sub-zzrc, END OF gt_excel. DATA:gt_excel TYPE TABLE OF gt_excel. DATA:gs_excel LIKE LINE OF gt_excel. DATA:gt_data TYPE TABLE OF ztsd0008_sub. DATA:gs_data LIKE LINE OF gt_data. DATA: BEGIN OF ls_data, sel(01), update(01). INCLUDE STRUCTURE ztsd0008_sub. " I - 新增 U - 更新 D - 删除 DATA:END OF ls_data. *----------------------------------------------------------------------* MODULE z_batch INPUT. DATA:p_file TYPE rlgrap-filename. FIELD-SYMBOLS: <l_werks> TYPE ANY ,<l_zzcc> TYPE ANY , <l_zzjc> TYPE ANY , <l_zzrc> TYPE ANY ,<l_action> TYPE ANY .. CASE function. WHEN 'EXCEL'. PERFORM check_upd. IF <status>-upd_flag NE space. MESSAGE '请先保存数据后再执行此操作' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. PERFORM frm_import_excel. " LOOP AT gt_data INTO gs_data. CLEAR:<vim_total_struc>. ASSIGN COMPONENT 'WERKS' OF STRUCTURE <vim_total_struc> TO <l_werks>. ASSIGN COMPONENT 'ZZCC' OF STRUCTURE <vim_total_struc> TO <l_zzcc>. ASSIGN COMPONENT 'ZZJC' OF STRUCTURE <vim_total_struc> TO <l_zzjc>. ASSIGN COMPONENT 'ZZRC' OF STRUCTURE <vim_total_struc> TO <l_zzrc>. IF <l_werks> IS ASSIGNED. <l_werks> = gs_data-werks. ENDIF. IF <l_zzcc> IS ASSIGNED. <l_zzcc> = gs_data-zzcc. ENDIF. IF <l_zzjc> IS ASSIGNED. <l_zzjc> = gs_data-zzjc. ENDIF. IF <l_zzrc> IS ASSIGNED. <l_zzrc> = gs_data-zzrc. ENDIF. APPEND <vim_total_struc> TO total. <action> = 'N'. MODIFY total INDEX sy-tabix . MOVE-CORRESPONDING <vim_total_struc> TO <vim_extract_struc>. APPEND <vim_extract_struc> TO extract . <xact> = 'N'. MODIFY extract INDEX sy-tabix . CLEAR <vim_extract_struc>. CLEAR <vim_total_struc>. ADD 1 TO maxlines. ENDLOOP. ENDCASE. ENDMODULE. " Z_BATCH INPUT *&---------------------------------------------------------------------* *& Form frm_import_excel *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_import_excel . DATA:p_path TYPE rlgrap-filename. DATA:lv_lines TYPE i. PERFORM frm_getpath USING p_path. IF p_path IS NOT INITIAL. ELSE. MESSAGE '请选择EXCEL文件' TYPE 'I'. ENDIF. "读取文件 PERFORM upload_data USING 'A1' '' p_path. "数据开始的单元格,可根据实际情况更改 LOOP AT gt_excel INTO gs_excel. CONDENSE gs_excel-werks NO-GAPS.. CONDENSE gs_excel-zzcc NO-GAPS.. CONDENSE gs_excel-zzjc NO-GAPS.. CONDENSE gs_excel-zzrc NO-GAPS.. MOVE-CORRESPONDING gs_excel TO gs_data. * g_matnr = ls_data-matnr. * CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' * EXPORTING * input = g_matnr * IMPORTING * output = g_matnr. * * SELECT SINGLE maktx INTO ls_data-makt * FROM makt WHERE matnr = g_matnr * AND spras = sy-langu. * * ls_data-lauser = sy-uname. * ls_data-ladate = sy-datum. * ls_data-latime = sy-uzeit. * ls_data-werks = gs_excel-werks. APPEND gs_data TO gt_data.CLEAR gs_data. ENDLOOP. ENDFORM. "frm_import_excel *&---------------------------------------------------------------------* *& Form upload_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_TOP_LEFT_ADDR text * -->P_BOTTOM_RIGHT_ADDR text * -->P_PATH text *----------------------------------------------------------------------* FORM upload_data USING p_top_left_addr TYPE string p_bottom_right_addr TYPE string p_path TYPE rlgrap-filename. DATA: BEGIN OF lt_lines OCCURS 0, row(4096) TYPE c, END OF lt_lines, BEGIN OF lt_fields OCCURS 0, value(500) TYPE c, END OF lt_fields, lo_excel TYPE ole2_object, lo_books TYPE ole2_object, lo_book TYPE ole2_object, lo_sheet TYPE ole2_object, lo_usedrange TYPE ole2_object, lo_usedrows TYPE ole2_object, lo_usedcols TYPE ole2_object, lo_cell_bottom_right TYPE ole2_object, lo_range TYPE ole2_object, lo_cell_top_left TYPE ole2_object, l_toprow TYPE i, l_leftcol TYPE i, l_usedrows TYPE i, l_usedcols TYPE i, l_maxrow TYPE i, l_maxcol TYPE i, l_addr TYPE string, l_rowindex TYPE string, l_count TYPE string, l_msg TYPE string. FIELD-SYMBOLS <l_fieldvalue> TYPE ANY. "创建EXCEL程序 CREATE OBJECT lo_excel 'EXCEL.APPLICATION'. IF sy-subrc <> 0. MESSAGE '创建EXCEL APPLICATION失败!' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. "打开EXCEL文件 DATA:p_file TYPE c LENGTH 1024 . TRANSLATE p_file TO LOWER CASE. p_file = p_path . GET PROPERTY OF lo_excel 'WORKBOOKS' = lo_books. CALL METHOD OF lo_books 'OPEN' = lo_book EXPORTING #1 = p_file. IF sy-subrc <> 0. MESSAGE '打开EXCEL文件失败!' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. "取最大行和最大列 GET PROPERTY OF lo_excel 'ACTIVESHEET' = lo_sheet. GET PROPERTY OF lo_sheet 'USEDRANGE' = lo_usedrange. GET PROPERTY OF lo_usedrange 'ROW' = l_toprow. GET PROPERTY OF lo_usedrange 'COLUMN' = l_leftcol. GET PROPERTY OF lo_usedrange 'ROWS' = lo_usedrows. GET PROPERTY OF lo_usedrows 'COUNT' = l_usedrows. GET PROPERTY OF lo_usedrange 'COLUMNS' = lo_usedcols. GET PROPERTY OF lo_usedcols 'COUNT' = l_usedcols. l_maxrow = l_toprow + l_usedrows - 1. l_maxcol = l_leftcol + l_usedcols - 1. "确定数据范围 IF p_bottom_right_addr IS INITIAL. GET PROPERTY OF lo_sheet 'CELLS' = lo_cell_bottom_right exporting #1 = l_maxrow #2 = l_maxcol. GET PROPERTY OF lo_sheet 'RANGE' = lo_range exporting #1 = p_top_left_addr #2 = lo_cell_bottom_right. ELSE. GET PROPERTY OF lo_sheet 'RANGE' = lo_range exporting #1 = p_top_left_addr #2 = p_bottom_right_addr. ENDIF. "检查是否存在数据 GET PROPERTY OF lo_range 'ROW' = l_toprow. GET PROPERTY OF lo_range 'COLUMN' = l_leftcol. GET PROPERTY OF lo_sheet 'CELLS' = lo_cell_top_left exporting #1 = l_toprow #2 = l_leftcol. GET PROPERTY OF lo_cell_top_left 'ADDRESS' = l_addr exporting #1 = 0 #2 = 0. IF l_addr <> p_top_left_addr. "无数据 CALL METHOD OF lo_book 'CLOSE'. CALL METHOD OF lo_excel 'QUIT'. MESSAGE '文件中无有效数据!' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. "替换CHR(13)+CHR(10) WITH CHR(10) 【CHR(13)属于EXCEL单元格内容中的非正常输入字符,必会导致ABAP内表数据串行】 SET PROPERTY OF lo_excel 'DISPLAYALERTS' = 0. CALL METHOD OF lo_range 'REPLACE' EXPORTING #1 = cl_abap_char_utilities=>cr_lf "000D000A CHR(13) + CHR(10) #2 = cl_abap_char_utilities=>newline. "000A CHR(10) "复制数据 CALL METHOD OF lo_range 'COPY'. CALL METHOD cl_gui_frontend_services=>clipboard_import IMPORTING data = lt_lines[] EXCEPTIONS OTHERS = 1. "关闭EXCEL CALL METHOD OF lo_book 'CLOSE'. CALL METHOD OF lo_excel 'QUIT'. "拆分数据 LOOP AT lt_lines. l_rowindex = sy-tabix + l_toprow - 1. SPLIT lt_lines-row AT cl_abap_char_utilities=>horizontal_tab INTO TABLE lt_fields. LOOP AT lt_fields. l_count = sy-tabix. ASSIGN COMPONENT sy-tabix OF STRUCTURE gs_excel TO <l_fieldvalue>. CHECK sy-subrc = 0. CATCH SYSTEM-EXCEPTIONS convt_no_number = 1 OTHERS = 2. <l_fieldvalue> = lt_fields-value. ENDCATCH. IF sy-subrc <> 0. * CONCATENATE '第' L_ROWINDEX '行中第' L_COUNT '个字段的值' GS_FIELDCAT-FIELDNAME '在格式转换时出错,请检查!' INTO L_MSG. MESSAGE l_msg TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. UNASSIGN <l_fieldvalue>. ENDLOOP. APPEND gs_excel TO gt_excel. CLEAR gs_excel. ENDLOOP. ENDFORM. " UPLOAD_DATA *&---------------------------------------------------------------------* *& Form frm_getpath *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_PATH text *----------------------------------------------------------------------* FORM frm_getpath USING p_path. DATA: tmp_mask LIKE rlgrap-filename. CLEAR tmp_mask. tmp_mask = p_path. CALL FUNCTION 'KD_GET_FILENAME_ON_F4' EXPORTING mask = tmp_mask static = 'X' CHANGING file_name = p_path EXCEPTIONS mask_too_long. ENDFORM. " FRM_GETPATH
8、配置表管理

*&---------------------------------------------------------------------* *& Include ZABAP_TABLE_MAINTENANCE *& 创建人 请求号 子程序描述 *&---------------------------------------------------------------------* DATA: gt_exclude TYPE TABLE OF sy-ucomm, gt_sel_condition TYPE TABLE OF vimsellist WITH HEADER LINE. DATA: BEGIN OF gs_ucomm_view, ucomm TYPE sy-ucomm, tcode TYPE sy-tcode, viewname TYPE dd02v-tabname, END OF gs_ucomm_view, gt_ucomm_view LIKE TABLE OF gs_ucomm_view. DEFINE macro_add_button. macro_add_button&1 &2. END-OF-DEFINITION. DEFINE macro_add_button1. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN PUSHBUTTON /1(20) &1 USER-COMMAND &1. END-OF-DEFINITION. DEFINE macro_add_button2. SELECTION-SCREEN PUSHBUTTON 25(20) &1 USER-COMMAND &1. END-OF-DEFINITION. DEFINE macro_add_button3. SELECTION-SCREEN PUSHBUTTON 49(20) &1 USER-COMMAND &1. END-OF-DEFINITION. DEFINE macro_add_button4. SELECTION-SCREEN PUSHBUTTON 73(20) &1 USER-COMMAND &1. END-OF-DEFINITION. DEFINE macro_set_ucomm_view. CLEAR gs_ucomm_view. gs_ucomm_view-ucomm = '&1'. gs_ucomm_view-tcode = &2. gs_ucomm_view-viewname = &3. &1 = &4. APPEND gs_ucomm_view TO gt_ucomm_view. END-OF-DEFINITION. FORM pbo_1000 USING p_exclude TYPE c. "如果不需要屏蔽执行和保存变式的按钮,则P_EXCLUDE设置为空 CLEAR gt_exclude. IF p_exclude = 'X'. APPEND 'ONLI' TO gt_exclude. APPEND 'SPOS' TO gt_exclude. ENDIF. CALL FUNCTION 'RS_SET_SELSCREEN_STATUS' EXPORTING p_status = sy-pfkey p_program = sy-cprog TABLES p_exclude = gt_exclude. ENDFORM. *&---------------------------------------------------------------------* *& FORM CALL_SM30 *&---------------------------------------------------------------------* FORM call_sm30 USING p_tablename TYPE dd02v-tabname. DATA: l_action TYPE c VALUE 'U'. IF gt_sel_condition[] IS INITIAL. CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING action = l_action view_name = p_tablename. ELSE. CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING action = l_action view_name = p_tablename TABLES dba_sellist = gt_sel_condition[]. ENDIF. ENDFORM. "CALL_SM30 *&---------------------------------------------------------------------* *& Form call_sm34 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM call_sm34 USING p_clustername TYPE vcldir-vclname. CALL FUNCTION 'VIEWCLUSTER_MAINTENANCE_CALL' EXPORTING maintenance_action = 'U' viewcluster_name = p_clustername. ENDFORM.

*&---------------------------------------------------------------------* *& 程序名称: ZFIR_CONFIG *& 程序描述: 财务自定义配置项 *&===============================* *&创建日期: 2021.01.12 程序员:孙亮 *&===============================* *&修改日期 请求号 修改人 业务提交人 修改描述 * *&---------------------------------------------------------------------* REPORT zfir_config. INCLUDE zabap_table_maintenance. TABLES: sscrfields. macro_add_button 1 pzlsh. "会计凭证流水号:按利润中心分别编码的公司代码 macro_add_button 1 shuilv. "配置税率 macro_add_button 1 shuixg. "配置税项 INITIALIZATION. sscrfields-functxt_01 = '增强有效性配置'. macro_set_ucomm_view: * 按钮 SM30/SM34 视图名 按钮名称 pzlsh 'SM30' 'ZFI93T_176_BUKRS' '会计凭证流水号编码规则', shuilv 'SM30' 'ZFI_ZZFI001' '配置税率ZFI_ZZFI001', shuixg 'SM30' 'ZFI_ZZFI002' '配置税率ZFI_ZZFI002'. AT SELECTION-SCREEN OUTPUT. PERFORM pbo_1000 USING 'X'. AT SELECTION-SCREEN. CLEAR gs_ucomm_view. READ TABLE gt_ucomm_view INTO gs_ucomm_view WITH KEY ucomm = sscrfields-ucomm. IF gs_ucomm_view-tcode = 'SM30'. PERFORM call_sm30 USING gs_ucomm_view-viewname. ELSEIF gs_ucomm_view-tcode = 'SM34'. PERFORM call_sm34 USING gs_ucomm_view-viewname. ENDIF. CLEAR sscrfields-ucomm.
9、公共子例程

*&---------------------------------------------------------------------* *& Include ZCOM_01 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form FRM_ADD_ZERO *&---------------------------------------------------------------------* * 补充前导0 *---------------------------------------------------------------------* * <--PV_IN * -->PV_OUT *---------------------------------------------------------------------* FORM FRM_ADD_ZERO USING PV_IN CHANGING PV_OUT. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = PV_IN IMPORTING OUTPUT = PV_OUT. ENDFORM. " FRM_ADD_ZERO *&---------------------------------------------------------------------* *& Form FRM_DELE_ZERO *&---------------------------------------------------------------------* * 删除前导0 *---------------------------------------------------------------------* * <--PV_IN * -->PV_OUT *---------------------------------------------------------------------* FORM FRM_DELE_ZERO USING PV_IN CHANGING PV_OUT. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING INPUT = PV_IN IMPORTING OUTPUT = PV_OUT. ENDFORM. " DELE_ZERO *&---------------------------------------------------------------------* *& Form FRM_CONVERT_MATNR_INPUT *&---------------------------------------------------------------------* * 物料编码字段加前导0 *---------------------------------------------------------------------* * <--PV_IN * -->PV_OUT *---------------------------------------------------------------------* FORM FRM_CONVERT_MATNR_INPUT USING PV_IN CHANGING PV_OUT. CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' EXPORTING INPUT = PV_IN IMPORTING OUTPUT = PV_OUT EXCEPTIONS LENGTH_ERROR = 1 OTHERS = 2. ENDFORM. " FRM_CONVERT_MATNR_INPUT *&---------------------------------------------------------------------* *& Form FRM_CONVERT_MATNR_OUTPUT *&---------------------------------------------------------------------* * 物料编码字段去前导0 *---------------------------------------------------------------------* * <--PV_IN * -->PV_OUT *---------------------------------------------------------------------* FORM FRM_CONVERT_MATNR_OUTPUT USING PV_IN CHANGING PV_OUT. CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT' EXPORTING INPUT = PV_IN IMPORTING OUTPUT = PV_OUT EXCEPTIONS LENGTH_ERROR = 1 OTHERS = 2. ENDFORM. " FRM_CONVERT_MATNR_OUTPUT *&---------------------------------------------------------------------* *& Form FRM_CONVERT_UNIT_INPUT *&---------------------------------------------------------------------* * 外部单位转到内部单位 *---------------------------------------------------------------------* * <--PV_IN * -->PV_OUT *---------------------------------------------------------------------* FORM FRM_CONVERT_UNIT_INPUT USING PV_IN CHANGING PV_OUT. CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' EXPORTING INPUT = PV_IN LANGUAGE = SY-LANGU IMPORTING OUTPUT = PV_OUT EXCEPTIONS UNIT_NOT_FOUND = 1 OTHERS = 2. ENDFORM. " FRM_CONVERT_UNIT_INPUT *&---------------------------------------------------------------------* *& Form FRM_CONVERT_UNIT_OUTPUT *&---------------------------------------------------------------------* * 内部单位转到外部单位 *--------------------------------------------------------------------* * <--PV_IN * -->PV_OUT *---------------------------------------------------------------------* FORM FRM_CONVERT_UNIT_OUTPUT USING PV_IN CHANGING PV_OUT. CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT' EXPORTING INPUT = PV_IN LANGUAGE = SY-LANGU IMPORTING OUTPUT = PV_OUT EXCEPTIONS UNIT_NOT_FOUND = 1 OTHERS = 2. ENDFORM. " FRM_CONVERT_UNIT_OUTPUT *&---------------------------------------------------------------------* *& Form FRM_GET_CONV_FACTOR *&---------------------------------------------------------------------* * 获取货币转换因子 *----------------------------------------------------------------------* * -->PV_CURRENCY text * <--PV_FACTOR text *----------------------------------------------------------------------* FORM FRM_GET_CONV_FACTOR USING PV_CURRENCY CHANGING PV_FACTOR. CLEAR: PV_FACTOR. CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR' EXPORTING CURRENCY = PV_CURRENCY IMPORTING FACTOR = PV_FACTOR EXCEPTIONS TOO_MANY_DECIMALS = 1 OTHERS = 2. IF SY-SUBRC <> 0. PV_FACTOR = 1. ENDIF. ENDFORM. " FRM_GET_CONV_FACTOR *&---------------------------------------------------------------------* *& Form FRM_CURRENCY_CONV_TO_EXTERNAL *&---------------------------------------------------------------------* * 内部金额转换成外部金额 *----------------------------------------------------------------------* * -->PV_I_AMOUNT text * -->PV_CURR text * -->PV_MAX_NUMBER text * -->PV_E_AMOUNT text *----------------------------------------------------------------------* FORM FRM_CURRENCY_CONV_TO_EXTERNAL USING PV_I_AMOUNT PV_CURR CHANGING PV_E_AMOUNT. DATA: LV_I_BAPICURR TYPE BAPICURR-BAPICURR, LV_E_BAPICURR TYPE BAPICURR-BAPICURR. LV_I_BAPICURR = PV_I_AMOUNT. CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL' EXPORTING CURRENCY = PV_CURR AMOUNT_INTERNAL = LV_I_BAPICURR IMPORTING AMOUNT_EXTERNAL = LV_E_BAPICURR. PV_E_AMOUNT = LV_E_BAPICURR. ENDFORM. "FRM_CURRENCY_CONV_TO_EXTERNAL *&---------------------------------------------------------------------* *& Form FRM_GET_EXCHANGE_RATE *&---------------------------------------------------------------------* *& 外部金额转换成内部金额 *&---------------------------------------------------------------------* * -->PV_E_AMOUNT text * -->PV_CURR text * -->PV_MAX_NUMBER text * -->PV_I_AMOUNT text *---------------------------------------------------------------------* FORM FRM_CURRENCY_CONV_TO_INTERNAL USING PV_E_AMOUNT PV_CURR PV_MAX_NUMBER CHANGING PV_I_AMOUNT. DATA: LV_I_BAPICURR TYPE BAPICURR-BAPICURR, LV_E_BAPICURR TYPE BAPICURR-BAPICURR. LV_E_BAPICURR = PV_E_AMOUNT. CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' EXPORTING CURRENCY = PV_CURR AMOUNT_EXTERNAL = LV_E_BAPICURR MAX_NUMBER_OF_DIGITS = PV_MAX_NUMBER IMPORTING AMOUNT_INTERNAL = LV_I_BAPICURR. PV_I_AMOUNT = LV_I_BAPICURR. ENDFORM. "FRM_CURRENCY_CONV_TO_INTERNAL *&---------------------------------------------------------------------* *& Form FRM_GET_EXCHANGE_RATE_01 *&---------------------------------------------------------------------* * 获取汇率 *---------------------------------------------------------------------* * --> PV_F_CURR * --> PV_L_CURR * --> PV_DATE * <-- PV_UKURS *---------------------------------------------------------------------* FORM FRM_GET_EXCHANGE_RATE_01 USING PV_F_CURR PV_L_CURR PV_DATE CHANGING PV_UKURS. TYPES: BEGIN OF LTY_TCURR. INCLUDE STRUCTURE TCURR. TYPES: DATE TYPE D. TYPES: END OF LTY_TCURR. TYPES: BEGIN OF LTY_TCURF. INCLUDE STRUCTURE TCURF. TYPES: DATE TYPE D. TYPES: END OF LTY_TCURF. DATA: LT_TCURR TYPE STANDARD TABLE OF LTY_TCURR, LT_TCURF TYPE STANDARD TABLE OF LTY_TCURF. DATA: LS_TCURR TYPE LTY_TCURR, LS_TCURF TYPE LTY_TCURF. DATA: LV_FFACT TYPE TCURF-FFACT, LV_TFACT TYPE TCURF-TFACT, LV_GDATU TYPE GDATU_INVV. CLEAR: PV_UKURS. LV_GDATU = '99999999' - PV_DATE. SELECT * INTO TABLE LT_TCURR FROM TCURR WHERE KURST = 'M' AND FCURR = PV_F_CURR AND TCURR = PV_L_CURR AND GDATU GE LV_GDATU. SORT LT_TCURR BY GDATU. READ TABLE LT_TCURR INTO LS_TCURR INDEX 1. IF SY-SUBRC = 0. IF LS_TCURR-UKURS > 0. SELECT * INTO TABLE LT_TCURF FROM TCURF WHERE KURST EQ 'M' AND FCURR EQ PV_F_CURR AND TCURR EQ PV_L_CURR AND GDATU GE LV_GDATU. SORT LT_TCURF BY GDATU. READ TABLE LT_TCURF INTO LS_TCURF INDEX 1. IF SY-SUBRC = 0. PV_UKURS = LS_TCURR-UKURS * LS_TCURF-TFACT / LS_TCURF-FFACT. "除以外币转换因子 得到真实汇率 ENDIF. ELSEIF LS_TCURR-UKURS < 0. SELECT * INTO TABLE LT_TCURF FROM TCURF WHERE KURST EQ 'M' AND FCURR EQ PV_L_CURR AND TCURR EQ PV_F_CURR AND GDATU GE LV_GDATU. SORT LT_TCURF BY GDATU. READ TABLE LT_TCURF INTO LS_TCURF INDEX 1. IF SY-SUBRC = 0. LS_TCURR-UKURS = 1 / LS_TCURR-UKURS * -1 / LS_TCURF-FFACT. ENDIF. ENDIF. ENDIF. ENDFORM. "FRM_GET_EXCHANGE_RATE_01 *&---------------------------------------------------------------------* *& Form FRM_GET_EXCHANGE_RATE_02 *&---------------------------------------------------------------------* * 获取汇率。该方法只能获取直接报价的汇率,不能获取节间报价的汇率 *---------------------------------------------------------------------* * --> PV_F_CURR * --> PV_L_CURR * --> PV_DATE * <-- PV_UKURS *---------------------------------------------------------------------* FORM FRM_GET_EXCHANGE_RATE_02 USING PV_F_CURR PV_L_CURR PV_DATE CHANGING PV_RATE. DATA: LS_EXCH_RATE TYPE BAPI1093_0, LS_RETURN TYPE BAPIRET1. CLEAR: PV_RATE. CALL FUNCTION 'BAPI_EXCHANGERATE_GETDETAIL' EXPORTING DATE = PV_DATE TO_CURRNCY = PV_L_CURR FROM_CURR = PV_F_CURR RATE_TYPE = 'M' IMPORTING EXCH_RATE = LS_EXCH_RATE RETURN = LS_RETURN EXCEPTIONS OTHERS = 01. IF LS_RETURN-TYPE = 'S'. IF LS_EXCH_RATE-EXCH_RATE < 1. LS_EXCH_RATE-EXCH_RATE = 1 / LS_EXCH_RATE-EXCH_RATE * -1. ENDIF. PV_RATE = LS_EXCH_RATE-EXCH_RATE / LS_EXCH_RATE-FROM_FACTOR. "除以外币转换因子 得到真实汇率 ENDIF. ENDFORM. "FRM_GET_EXCHANGE_RATE_02 *&---------------------------------------------------------------------* *& Form FRM_GET_EXCHANGE_RATE_03 *&---------------------------------------------------------------------* * 获取汇率。该方法即可获取直接报价的汇率,也可获取节间报价的汇率 *----------------------------------------------------------------------* * --> PV_DATE * --> PV_F_CURR * --> PV_L_CURR * --> PV_KURST * <-- PV_UKURS *----------------------------------------------------------------------* FORM FRM_GET_EXCHANGE_RATE_03 USING PV_DATE PV_F_CURR PV_L_CURR PV_KURST CHANGING PV_RATE. DATA: LV_FFACT TYPE TCURR-FFACT, LV_TFACT TYPE TCURR-TFACT, LV_KURST TYPE TCURR. IF PV_KURST = ''. LV_KURST = 'M'. ENDIF. CALL FUNCTION 'READ_EXCHANGE_RATE' EXPORTING CLIENT = SY-MANDT DATE = PV_DATE FOREIGN_CURRENCY = PV_F_CURR LOCAL_CURRENCY = PV_L_CURR TYPE_OF_RATE = 'M' * EXACT_DATE = ' ' IMPORTING EXCHANGE_RATE = PV_RATE FOREIGN_FACTOR = LV_FFACT LOCAL_FACTOR = LV_TFACT * VALID_FROM_DATE = * DERIVED_RATE_TYPE = * FIXED_RATE = * OLDEST_RATE_FROM = EXCEPTIONS NO_RATE_FOUND = 1 NO_FACTORS_FOUND = 2 NO_SPREAD_FOUND = 3 DERIVED_2_TIMES = 4 OVERFLOW = 5 ZERO_RATE = 6 OTHERS = 7. IF PV_RATE > 0. PV_RATE = PV_RATE * LV_FFACT / LV_TFACT. ELSEIF PV_RATE < 0. PV_RATE = 1 / PV_RATE * -1 / LV_FFACT. ENDIF. ENDFORM. " FRM_GET_EXCHANGE_RATE_03 *&---------------------------------------------------------------------* *& Form FRM_GET_FACTOR *&---------------------------------------------------------------------* * 获取汇率转换因子 *----------------------------------------------------------------------* * --> PV_F_CURR text * --> PV_L_CURR text * --> PV_DATE text * --> PV_RATE text * <-- PV_F_FACTOR text * <-- PV_L_FACTOR text *----------------------------------------------------------------------* FORM FRM_GET_FACTOR USING PV_F_CURR PV_L_CURR PV_DATE PV_RATE CHANGING PV_F_FACTOR PV_L_FACTOR. CALL FUNCTION 'KURS_IN_PREISNOTATION' EXPORTING CLIENT = SY-MANDT DATE = PV_DATE TYPE_OF_RATE = 'M' FOREIGN_CURRENCY = PV_F_CURR LOCAL_CURRENCY = PV_L_CURR RATE = PV_RATE IMPORTING FOREIGN_FACTOR = PV_F_FACTOR LOCAL_FACTOR = PV_L_FACTOR EXCEPTIONS NO_FACTORS_FOUND = 1 DERIVED_2_TIMES = 2 NO_SPREAD_FOUND = 3 OVERFLOW = 4 OTHERS = 5. ENDFORM. " FRM_GET_FACTOR *&---------------------------------------------------------------------* *& Form FRM_CURRENCY_EXCHANGE_01 *&---------------------------------------------------------------------* * 汇率换算 *----------------------------------------------------------------------* * --> PV_L_AMOUNT text * --> PV_L_CURR text * --> PV_DATE text * --> PV_F_CURR text * <-- PV_F_AMOUNT text *----------------------------------------------------------------------* FORM FRM_CURRENCY_EXCHANGE_01 USING PV_L_AMOUNT PV_L_CURR PV_DATE PV_F_CURR CHANGING PV_F_AMOUNT. DATA: LS_TCURR TYPE TCURR. DATA: LV_WERTV10 TYPE WERTV10. CLEAR: PV_F_AMOUNT. CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY' EXPORTING CLIENT = SY-MANDT DATE = PV_DATE FOREIGN_CURRENCY = PV_F_CURR LOCAL_AMOUNT = PV_L_AMOUNT LOCAL_CURRENCY = PV_L_CURR TYPE_OF_RATE = 'M' READ_TCURR = 'X' IMPORTING EXCHANGE_RATE = LS_TCURR-UKURS FOREIGN_FACTOR = LS_TCURR-FFACT FOREIGN_AMOUNT = LV_WERTV10 LOCAL_FACTOR = LS_TCURR-TFACT EXCEPTIONS NO_RATE_FOUND = 1 OVERFLOW = 2 NO_FACTORS_FOUND = 3 NO_SPREAD_FOUND = 4 DERIVED_2_TIMES = 5 OTHERS = 6. PV_F_AMOUNT = LV_WERTV10. ENDFORM. " FRM_CURRENCY_EXCHANGE_01 *&---------------------------------------------------------------------* *& Form FRM_CURRENCY_EXCHANGE_02 *&---------------------------------------------------------------------* * 汇率换算 *----------------------------------------------------------------------* * --> PV_F_AMOUNT text * --> PV_TCURR text * --> PV_DATE text * --> PV_FCURR text * --> PV_T_AMOUNT text *----------------------------------------------------------------------* FORM FRM_CURRENCY_EXCHANGE_02 USING PV_F_AMOUNT PV_FCURR PV_DATE PV_TCURR CHANGING PV_L_AMOUNT. DATA: LS_TCURR TYPE TCURR. DATA: LV_WERTV10 TYPE WERTV10. CLEAR: PV_L_AMOUNT. CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' EXPORTING CLIENT = SY-MANDT DATE = PV_DATE FOREIGN_AMOUNT = PV_F_AMOUNT FOREIGN_CURRENCY = PV_FCURR LOCAL_CURRENCY = PV_TCURR TYPE_OF_RATE = 'M' READ_TCURR = 'X' IMPORTING EXCHANGE_RATE = LS_TCURR-UKURS FOREIGN_FACTOR = LS_TCURR-FFACT LOCAL_AMOUNT = LV_WERTV10 LOCAL_FACTOR = LS_TCURR-TFACT EXCEPTIONS NO_RATE_FOUND = 1 OVERFLOW = 2 NO_FACTORS_FOUND = 3 NO_SPREAD_FOUND = 4 DERIVED_2_TIMES = 5 OTHERS = 6. PV_L_AMOUNT = LV_WERTV10. ENDFORM. "FRM_CURRENCY_EXCHANGE_02 *&---------------------------------------------------------------------* *& Form FRM_GET_DOMAIN *&---------------------------------------------------------------------* * 根据域名获取该域名的全部数据 *----------------------------------------------------------------------* * --> PT_DD07V * --> PV_NAME * --> PV_LANGU *----------------------------------------------------------------------* FORM FRM_GET_DOMAIN TABLES PT_DD07V STRUCTURE DD07V USING PV_DOMNAME PV_LANGU. DATA: LV_RETURN TYPE SY-SUBRC. CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING DOMNAME = PV_DOMNAME "域名 TEXT = 'X' LANGU = PV_LANGU IMPORTING RC = LV_RETURN TABLES DD07V_TAB = PT_DD07V EXCEPTIONS WRONG_TEXTFLAG = 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_GET_DOMAIN *&---------------------------------------------------------------------* *& Form FRM_GET_DOMAIN_2 *&---------------------------------------------------------------------* * 根据域名获取该域名的全部数据,优先用系统语言,如果获取不到,则任意取某个语言的 *----------------------------------------------------------------------* * --> PT_DD07T * --> PV_DOMNAME *----------------------------------------------------------------------* FORM FRM_GET_DOMAIN_2 TABLES PT_DD07T STRUCTURE DD07T USING PV_DOMNAME. DATA: LT_DD07L LIKE TABLE OF DD07L WITH HEADER LINE, LT_DD07T LIKE TABLE OF DD07T WITH HEADER LINE. FREE: PT_DD07T. CLEAR: PT_DD07T. SELECT * INTO TABLE LT_DD07L FROM DD07L WHERE DOMNAME = PV_DOMNAME AND AS4LOCAL = 'A'. SELECT * INTO TABLE LT_DD07T FROM DD07T WHERE DOMNAME = PV_DOMNAME AND AS4LOCAL = 'A'. READ TABLE LT_DD07T WITH KEY DDLANGUAGE = SY-LANGU. IF SY-SUBRC = 0. PT_DD07T[] = LT_DD07T[]. DELETE LT_DD07T WHERE DDLANGUAGE NE SY-LANGU. ELSE. LOOP AT LT_DD07L. MOVE-CORRESPONDING LT_DD07L TO PT_DD07T. PT_DD07T-DDTEXT = LT_DD07L-DOMVALUE_L. APPEND PT_DD07T. ENDLOOP. ENDIF. SORT PT_DD07T BY DOMVALUE_L. ENDFORM. "FRM_GET_DOMAIN_2 *&---------------------------------------------------------------------* *& Form FRM_CONVERT_MONEY_TO_CHINA *&---------------------------------------------------------------------* * 将金额转换为汉字金额写法 *----------------------------------------------------------------------* * --> PV_VAL * <-- PV_DXSTR *----------------------------------------------------------------------* FORM FRM_CONVERT_MONEY_TO_CHINA USING PV_VAL CHANGING PV_DXSTR. DATA: LV_ZS TYPE C LENGTH 20, LV_XS TYPE C LENGTH 20, LV_STR TYPE C LENGTH 30, LV_LEN TYPE I VALUE 0, LV_CIS TYPE I VALUE 0, LV_LIS TYPE I VALUE 0, LV_SS TYPE C LENGTH 2, LV_RR TYPE C LENGTH 1, LV_STRR TYPE C LENGTH 30, LV_CHANGE TYPE C LENGTH 30 VALUE '1壹2贰3叁4肆5伍6陆7柒8捌9玖0零', LV_VAL TYPE P DECIMALS 2. LV_VAL = PV_VAL. CLEAR PV_DXSTR. MOVE LV_VAL TO LV_STR. SHIFT LV_STR LEFT DELETING LEADING SPACE. SPLIT LV_STR AT '.' INTO LV_ZS LV_XS."把金额拆分成整数和小数 "把金额字段反过来比如123变成321 LV_LEN = STRLEN( LV_ZS )."整数长度 CLEAR LV_STRR. LV_CIS = LV_LEN - 1. DO LV_LEN TIMES. MOVE LV_ZS+LV_CIS(1) TO LV_RR. CONCATENATE LV_STRR LV_RR INTO LV_STRR. LV_CIS = LV_CIS - 1. ENDDO. LV_CIS = 0. DO LV_LEN TIMES. MOVE LV_STRR+LV_CIS(1) TO LV_SS. IF LV_SS <> 0. TRANSLATE LV_SS USING LV_CHANGE. CASE LV_CIS. WHEN 0. CONCATENATE LV_SS '元' INTO PV_DXSTR. WHEN 1. CONCATENATE LV_SS '拾' PV_DXSTR INTO PV_DXSTR. WHEN 2. CONCATENATE LV_SS '佰' PV_DXSTR INTO PV_DXSTR. WHEN 3. CONCATENATE LV_SS '仟' PV_DXSTR INTO PV_DXSTR. WHEN 4. CONCATENATE LV_SS '万' PV_DXSTR INTO PV_DXSTR. WHEN 5. CONCATENATE LV_SS '拾' PV_DXSTR INTO PV_DXSTR. WHEN 6. CONCATENATE LV_SS '佰' PV_DXSTR INTO PV_DXSTR. WHEN 7. CONCATENATE LV_SS '仟' PV_DXSTR INTO PV_DXSTR. WHEN 8. CONCATENATE LV_SS '亿' PV_DXSTR INTO PV_DXSTR. WHEN 9. CONCATENATE LV_SS '拾' PV_DXSTR INTO PV_DXSTR. WHEN 10. CONCATENATE LV_SS '百' PV_DXSTR INTO PV_DXSTR. WHEN 11. CONCATENATE LV_SS '仟' PV_DXSTR INTO PV_DXSTR. ENDCASE. ELSEIF LV_SS = 0 AND LV_STRR+LV_LIS(1) = 0. CASE LV_CIS. WHEN 0. IF LV_LIS <> 0. CONCATENATE '元' PV_DXSTR INTO PV_DXSTR. ELSE. CONCATENATE '零元' PV_DXSTR INTO PV_DXSTR. ENDIF. WHEN 4. CONCATENATE '万' PV_DXSTR INTO PV_DXSTR. WHEN 8. CONCATENATE '亿' PV_DXSTR INTO PV_DXSTR. ENDCASE. ELSEIF LV_SS = 0 AND LV_STRR+LV_LIS(1) <> 0. TRANSLATE LV_SS USING LV_CHANGE. CASE LV_CIS. WHEN 0. CONCATENATE '元' LV_SS PV_DXSTR INTO PV_DXSTR. WHEN 4. CONCATENATE '万' LV_SS PV_DXSTR INTO PV_DXSTR. WHEN 8. CONCATENATE '亿' LV_SS PV_DXSTR INTO PV_DXSTR. WHEN OTHERS. CONCATENATE LV_SS PV_DXSTR INTO PV_DXSTR. ENDCASE. ENDIF. LV_LIS = LV_CIS. LV_CIS = LV_CIS + 1. ENDDO. CLEAR LV_SS. IF LV_XS <> '00'. MOVE LV_XS+0(1) TO LV_SS. TRANSLATE LV_SS USING LV_CHANGE. CONCATENATE PV_DXSTR LV_SS '角' INTO PV_DXSTR. MOVE LV_XS+1(1) TO LV_SS. TRANSLATE LV_SS USING LV_CHANGE. CONCATENATE PV_DXSTR LV_SS '分' INTO PV_DXSTR. ELSE. CONCATENATE PV_DXSTR '整' INTO PV_DXSTR. ENDIF. IF PV_DXSTR = '元整'. PV_DXSTR = '零元整'. ENDIF. ENDFORM. "FRM_CONVERT_MONEY_TO_CHINA *&---------------------------------------------------------------------* *& Form FRM_GET_NUMBER_RANGE *&---------------------------------------------------------------------* * 获取序号 *----------------------------------------------------------------------* * --> PV_OBJEC * --> PV_NR * <-- PV_NUMBER *----------------------------------------------------------------------* FORM FRM_GET_NUMBER_RANGE USING PV_OBJECT PV_NR CHANGING PV_NUMBER. CALL FUNCTION 'NUMBER_RANGE_ENQUEUE' EXPORTING OBJECT = PV_OBJECT "Ceate with SNUM EXCEPTIONS FOREIGN_LOCK = 1 OBJECT_NOT_FOUND = 2 SYSTEM_FAILURE = 3 OTHERS = 4. CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING NR_RANGE_NR = PV_NR OBJECT = PV_OBJECT IMPORTING NUMBER = PV_NUMBER EXCEPTIONS INTERVAL_NOT_FOUND = 1 NUMBER_RANGE_NOT_INTERN = 2 OBJECT_NOT_FOUND = 3 QUANTITY_IS_0 = 4 QUANTITY_IS_NOT_1 = 5 INTERNAL_OVERFLOW = 6 OTHERS = 7. CALL FUNCTION 'NUMBER_RANGE_DEQUEUE' EXPORTING OBJECT = PV_OBJECT. ENDFORM. "FRM_GET_NUMBER_RANGE *&---------------------------------------------------------------------* *& Form FRM_CHECK_DATE *&---------------------------------------------------------------------* * 检查日期是否合理 *----------------------------------------------------------------------* * --> PV_DATE * <-- PV_OK *----------------------------------------------------------------------* FORM FRM_CHECK_DATE USING PV_DATE CHANGING PV_OK. DATA: LV_DATE TYPE SY-DATUM. CLEAR: PV_OK. LV_DATE = PV_DATE. IF LV_DATE = 0. PV_OK = ''. ELSE. PV_OK = 'X'. ENDIF. ENDFORM. "FRM_CHECK_DATE *&---------------------------------------------------------------------* *& Form FRM_CHECK_DATE_02 *&---------------------------------------------------------------------* * 检查日期有效性 *----------------------------------------------------------------------* * --> PV_DATE * <-- PV_FLAG *----------------------------------------------------------------------* FORM FRM_CHECK_DATE_02 USING PV_DATE CHANGING PV_FLAG. CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY' EXPORTING DATE = PV_DATE EXCEPTIONS PLAUSIBILITY_CHECK_FAILED = 1 OTHERS = 2. PV_FLAG = SY-SUBRC. ENDFORM. "FRM_CHECK_DATE_02 *&---------------------------------------------------------------------* *& Form FRM_CHECK_TIME *&---------------------------------------------------------------------* * 检查时间是否合理 *----------------------------------------------------------------------* * --> PV_TIME * <-- PV_OK *----------------------------------------------------------------------* FORM FRM_CHECK_TIME USING PV_TIME CHANGING PV_OK. DATA: LV_TIME TYPE SY-UZEIT. CLEAR: PV_OK. LV_TIME = PV_TIME. IF LV_TIME = 0. PV_OK = ''. ELSE. PV_OK = 'X'. ENDIF. ENDFORM. "FRM_CHECK_TIME *&---------------------------------------------------------------------* *& Form FRM_CHECK_TIME_02 *&---------------------------------------------------------------------* * 检查时间有效性 *----------------------------------------------------------------------* * --> PV_TIME * <-- PV_FLAG *----------------------------------------------------------------------* FORM FRM_CHECK_TIME_02 USING PV_TIME CHANGING PV_FLAG. CALL FUNCTION 'TIME_CHECK_PLAUSIBILITY' EXPORTING TIME = PV_TIME EXCEPTIONS PLAUSIBILITY_CHECK_FAILED = 1 OTHERS = 2. PV_FLAG = SY-SUBRC. ENDFORM. "FRM_CHECK_TIME_02 *&---------------------------------------------------------------------* *& Form FRM_CHECK_MONAT_2 *&---------------------------------------------------------------------* * 检查RANGES内表月份输入是否正确 *----------------------------------------------------------------------* * --> PRT_MONAT * <-- PV_FLAG 0 正确,1 错误,2 起始月份大于截至月份 *----------------------------------------------------------------------* FORM FRM_CHECK_MONAT_2 TABLES PRT_MONAT CHANGING PV_FLAG. FIELD-SYMBOLS: <LFS_01> TYPE ANY, <LFS_02> TYPE ANY, <LFS_03> TYPE ANY. PV_FLAG = 0. LOOP AT PRT_MONAT. ASSIGN COMPONENT 'LOW' OF STRUCTURE PRT_MONAT TO <LFS_01>. ASSIGN COMPONENT 'HIGH' OF STRUCTURE PRT_MONAT TO <LFS_02>. ASSIGN COMPONENT 'OPTION' OF STRUCTURE PRT_MONAT TO <LFS_03>. IF <LFS_01> <= 0 OR <LFS_01> > 12 OR <LFS_01> IS INITIAL. PV_FLAG = 1. "月份输入错误 ENDIF. IF <LFS_03> = 'BT'. IF <LFS_02> IS INITIAL. PV_FLAG = 1. "月份输入错误 ELSE. IF <LFS_02> < 0 OR <LFS_02> > 12. PV_FLAG = 1. "月份输入错误 ENDIF. ENDIF. IF <LFS_01> IS NOT INITIAL AND <LFS_02> IS NOT INITIAL. IF <LFS_01> > <LFS_02>. PV_FLAG = 2. "起始月份大于截至月份 ENDIF. ENDIF. ENDIF. ENDLOOP. ENDFORM. "FRM_CHECK_MONAT_2 *&---------------------------------------------------------------------* *& Form FRM_CHECK_MONAT_3 *&---------------------------------------------------------------------* * 检查RANGES内表月份是否含当前月份及以后的 *----------------------------------------------------------------------* * --> PRT_MONAT * <-- PV_FLAG 0 正确,1 含当前月份及以后的 *----------------------------------------------------------------------* FORM FRM_CHECK_MONAT_3 TABLES PRT_MONAT CHANGING PV_FLAG. DATA: LV_MONAT LIKE BKPF-MONAT. FIELD-SYMBOLS: <LFS_01> TYPE ANY, <LFS_02> TYPE ANY, <LFS_03> TYPE ANY. PV_FLAG = 0. LV_MONAT = SY-DATUM+4(2). LOOP AT PRT_MONAT. ASSIGN COMPONENT 'LOW' OF STRUCTURE PRT_MONAT TO <LFS_01>. ASSIGN COMPONENT 'HIGH' OF STRUCTURE PRT_MONAT TO <LFS_02>. ASSIGN COMPONENT 'OPTION' OF STRUCTURE PRT_MONAT TO <LFS_03>. IF <LFS_03> = 'LT'. IF <LFS_01> > LV_MONAT OR <LFS_02> > LV_MONAT. PV_FLAG = 1. ENDIF. ELSEIF <LFS_03> = 'GT' OR <LFS_03> = 'GE'. PV_FLAG = 1. ELSE. IF <LFS_01> >= LV_MONAT OR <LFS_02> >= LV_MONAT. PV_FLAG = 1. ENDIF. ENDIF. ENDLOOP. ENDFORM. "FRM_CHECK_MONAT_3 *&---------------------------------------------------------------------* *& Form FRM_CHECK_MONAT_2 *&---------------------------------------------------------------------* * 检查单个输入的月份输入是否正确 *----------------------------------------------------------------------* * --> PV_MONAT * <-- PV_FLAG 0 正确,1 错误 *----------------------------------------------------------------------* FORM FRM_CHECK_MONAT_SINGLE_2 USING PV_MONAT CHANGING PV_FLAG. IF PV_MONAT <= 0 OR PV_MONAT > 12 OR PV_MONAT IS INITIAL. PV_FLAG = 1. "月份输入错误 ELSE. PV_FLAG = 0. "月份输入正确 ENDIF. ENDFORM. "FRM_CHECK_MONAT_SINGLE_2. *&---------------------------------------------------------------------* *& Form FRM_GET_LAST_DAY_OF_MONTHS *&---------------------------------------------------------------------* * 获取指定日期所在月的最后一天的日期 *----------------------------------------------------------------------* * --> PV_DATE1 text * <-- PV_DATE2 text *----------------------------------------------------------------------* FORM FRM_GET_LAST_DAY_OF_MONTHS USING PV_DATE1 CHANGING PV_DATE2. CLEAR: PV_DATE2. CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS' EXPORTING DAY_IN = PV_DATE1 IMPORTING LAST_DAY_OF_MONTH = PV_DATE2 EXCEPTIONS DAY_IN_NO_DATE = 1 OTHERS = 2. ENDFORM. " FRM_GET_LAST_DAY_OF_MONTHS *&---------------------------------------------------------------------* *& Form FRM_CONVERT_FLOAT *&---------------------------------------------------------------------* * 转换为浮点类型 *----------------------------------------------------------------------* * --> PV_ATWRT 可以是字符类型,但是具体值必须是数值 * <-- PV_FLOAT text *----------------------------------------------------------------------* FORM FRM_CONVERT_FLOAT USING PV_ATWRT CHANGING PV_FLOAT. DATA: LV_PACK(16) TYPE P. PACK PV_ATWRT TO LV_PACK. "去前导0 PV_FLOAT = LV_PACK. ENDFORM. " FRM_CONVERT_FLOAT *&---------------------------------------------------------------------* *& Form FRM_GET_PATH_01 *&---------------------------------------------------------------------* * 获取文件路径 *----------------------------------------------------------------------* * <-- p2 P_FILE *----------------------------------------------------------------------* FORM FRM_GET_PATH_01 CHANGING PV_FILE TYPE RLGRAP-FILENAME. DATA: LV_INITIAL_FNAME TYPE STRING, LV_RC TYPE I, LT_FILETABLE TYPE FILETABLE. CLEAR: PV_FILE. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = 'Select Files' FILE_FILTER = 'Excel File (*.XLS)|*.XLS|Excel File (*.XLSX)|*.XLSX|All (*.*)|*.*|' INITIAL_DIRECTORY = LV_INITIAL_FNAME MULTISELECTION = SPACE CHANGING FILE_TABLE = LT_FILETABLE RC = LV_RC EXCEPTIONS FILE_OPEN_DIALOG_FAILED = 1 CNTL_ERROR = 2 ERROR_NO_GUI = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF SY-SUBRC = 0 AND LV_RC = 1. READ TABLE LT_FILETABLE INTO PV_FILE INDEX 1. ELSE. ENDIF. ENDFORM. " FRM_GET_PATH *&---------------------------------------------------------------------* *& Form FRM_GET_PATH_02 *&---------------------------------------------------------------------* * 获取文件路径 *----------------------------------------------------------------------* * <-- PV_FILE text *----------------------------------------------------------------------* FORM FRM_GET_PATH_02 CHANGING PV_FILE TYPE RLGRAP-FILENAME. CALL FUNCTION 'F4_FILENAME' EXPORTING PROGRAM_NAME = SY-CPROG DYNPRO_NUMBER = SY-DYNNR IMPORTING FILE_NAME = PV_FILE. ENDFORM. " FRM_GET_PATH_02 *&---------------------------------------------------------------------* *& Form FRM_DOWNLOAD_TEMPLATE_01 *&---------------------------------------------------------------------* * 下载SMW0上传到SAP的模板 *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_DOWNLOAD_TEMPLATE_01 USING PV_OBJID TYPE WWWDATATAB-OBJID PV_FILE TYPE RLGRAP-FILENAME. DATA: LS_KEY TYPE WWWDATATAB. LS_KEY-RELID = 'MI'. LS_KEY-OBJID = PV_OBJID. CALL FUNCTION 'DOWNLOAD_WEB_OBJECT' EXPORTING KEY = LS_KEY DESTINATION = PV_FILE. IF SY-SUBRC <> 0. MESSAGE 'SAP WEB资源库中无可用模板供使用,请检查模板是否存在!' TYPE 'I'. ENDIF. ENDFORM. "frm_download_template *&---------------------------------------------------------------------* *& Form FRM_DOWNLOAD_TEMPLATE_02 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PT_TABLE text *----------------------------------------------------------------------* FORM FRM_DOWNLOAD_TEMPLATE_02 TABLES PT_TABLE. DATA: LS_EXCEL TYPE OLE2_OBJECT, LS_SHEET TYPE OLE2_OBJECT, LS_BOOK TYPE OLE2_OBJECT, LS_CELL TYPE OLE2_OBJECT, LS_RANGE TYPE OLE2_OBJECT, LS_FONT TYPE OLE2_OBJECT, LS_COLOR TYPE OLE2_OBJECT, LS_COLUMN TYPE OLE2_OBJECT, LS_BORDERS TYPE OLE2_OBJECT. DATA: LV_INDEX TYPE I, LV_VALUE TYPE CHAR40, LV_BOLD TYPE I, LV_SIZE TYPE I. FIELD-SYMBOLS: <LFS_01> TYPE ANY, <LFS_02> TYPE ANY, <LFS_03> TYPE ANY. CREATE OBJECT LS_EXCEL 'EXCEL.APPLICATION'. SET PROPERTY OF LS_EXCEL 'VISIBLE' = 1. CALL METHOD OF LS_EXCEL 'WORKBOOKS' = LS_BOOK. CALL METHOD OF LS_BOOK 'ADD'. LOOP AT PT_TABLE. LV_INDEX = SY-TABIX. ASSIGN COMPONENT 1 OF STRUCTURE PT_TABLE TO <LFS_01>. ASSIGN COMPONENT 2 OF STRUCTURE PT_TABLE TO <LFS_02>. ASSIGN COMPONENT 3 OF STRUCTURE PT_TABLE TO <LFS_03>. IF <LFS_01> IS ASSIGNED. LV_VALUE = <LFS_01>. UNASSIGN <LFS_01>. ENDIF. IF <LFS_02> IS ASSIGNED. LV_BOLD = <LFS_02>. UNASSIGN <LFS_02>. ELSE. LV_BOLD = 1. ENDIF. IF <LFS_03> IS ASSIGNED. LV_SIZE = <LFS_03>. UNASSIGN <LFS_03>. ELSE. LV_SIZE = 11. ENDIF. CALL METHOD OF LS_EXCEL 'CELLS' = LS_CELL EXPORTING #1 = 1 #2 = LV_INDEX. SET PROPERTY OF LS_CELL 'VALUE' = LV_VALUE. CALL METHOD OF LS_CELL 'FONT' = LS_FONT. SET PROPERTY OF LS_FONT 'BOLD' = LV_BOLD. SET PROPERTY OF LS_FONT 'SIZE' = LV_SIZE. ENDLOOP. CALL METHOD OF LS_EXCEL 'COLUMNS' = LS_COLUMN. CALL METHOD OF LS_COLUMN 'AUTOFIT'. ENDFORM. " FRM_DOWNLOAD_TEMPLATE_02 *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_EXCEL_01 *&---------------------------------------------------------------------* * 导入excel到程序中 *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_UPLOAD_EXCEL_01 TABLES PT_EXCEL STRUCTURE ALSMEX_TABLINE USING PV_FILE TYPE RLGRAP-FILENAME PV_BEGIN_COL TYPE I PV_BEGIN_ROW TYPE I PV_END_COL TYPE I PV_END_ROW TYPE I. TYPES: BEGIN OF LTYP_SENDERLINE, LINE(4096) TYPE C, END OF LTYP_SENDERLINE. DATA: LT_TB TYPE TABLE OF LTYP_SENDERLINE. DATA: LV_RC TYPE I. IF PV_BEGIN_COL IS INITIAL. PV_BEGIN_COL = 1. ENDIF. IF PV_BEGIN_ROW IS INITIAL. PV_BEGIN_ROW = 1. ENDIF. IF PV_END_COL IS INITIAL. PV_END_ROW = 1. ENDIF. IF PV_END_ROW IS INITIAL. PV_END_ROW = 65535. ENDIF. CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT IMPORTING DATA = LT_TB CHANGING RC = LV_RC EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 OTHERS = 4. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = PV_FILE I_BEGIN_COL = PV_BEGIN_COL "从excel第几列开始读取 I_BEGIN_ROW = PV_BEGIN_ROW "从excel第几行开始读取 I_END_COL = PV_END_COL "读取多少列 I_END_ROW = PV_END_ROW "读取多少行 TABLES INTERN = PT_EXCEL EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING PERCENTAGE = 10 TEXT = '导入中...'. ENDFORM. "frm_upload_excel *&---------------------------------------------------------------------* *& Form FRM_CONNECT_DB *&---------------------------------------------------------------------* * 联接外部数据库 *----------------------------------------------------------------------* * --> PV_CON_NAME text * <-- PV_MESSAGE text *----------------------------------------------------------------------* FORM FRM_CONNECT_DB USING PV_CON_NAME TYPE DBCON-CON_NAME CHANGING PV_MESSAGE TYPE BAPIRET2-MESSAGE. DATA: LOB_EXEC_REF TYPE REF TO CX_SY_NATIVE_SQL_ERROR. TRY. "连接到DBS并将其置为当前连接,其后所有的SQL命令都通过其执行。如果到DBS的连接已经存在,复用此连接,否则新建连接。 EXEC SQL. connect to :PV_CON_NAME ENDEXEC. "设置当前连接。可以是DBCON列CON_NAME值,或建连接用的con。 EXEC SQL. set connection :PV_CON_NAME ENDEXEC. CATCH CX_SY_NATIVE_SQL_ERROR INTO LOB_EXEC_REF. PV_MESSAGE = LOB_EXEC_REF->GET_TEXT( ). ENDTRY. ENDFORM. " FRM_CONNECT_DB *&---------------------------------------------------------------------* *& Form FRM_DISCON_DB *&---------------------------------------------------------------------* * 断开联接外部数据库 *----------------------------------------------------------------------* * --> PV_CON_NAME text *----------------------------------------------------------------------* FORM FRM_DISCON_DB USING PV_CON_NAME TYPE DBCON-CON_NAME. EXEC SQL. DISCONNECT :PV_CON_NAME ENDEXEC. ENDFORM. " FRM_DISCON_DB DEFINE GMAC_OUTPUTSTATUS. IF &1 = 'S'. &1 = 'TRUE'. OUTPUTSTATUS-SERVICE_FLAG = &1. OUTPUTSTATUS-SERVICE_MESSAGE = &2. OUTPUTSTATUS-RESERVED_1 = &3. CONDENSE OUTPUTSTATUS-RESERVED_1 NO-GAPS. ERRORCOLLECTION-ERROR_MESSAGE = &2. APPEND OUTPUTSTATUS. CLEAR OUTPUTSTATUS. APPEND ERRORCOLLECTION. CLEAR ERRORCOLLECTION. ELSEIF &1 = 'E'. &1 = 'FALSE'. OUTPUTSTATUS-SERVICE_FLAG = &1. OUTPUTSTATUS-SERVICE_MESSAGE = &2. OUTPUTSTATUS-RESERVED_1 = &3. CONDENSE OUTPUTSTATUS-RESERVED_1 NO-GAPS. APPEND OUTPUTSTATUS. CLEAR OUTPUTSTATUS. ENDIF. END-OF-DEFINITION. *&---------------------------------------------------------------------* *& Form FRM_SET_LAYOUT_01 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PV_G_TITLE *---------------------------------------------------------------------* FORM FRM_SET_LAYOUT_01 USING PV_G_TITLE PV_ZEBRA PV_CWIDTH_OPT PV_SEL_MODE PV_INFO_FNAME PV_BOX_FNAME PV_NO_TOOLBAR PV_CELLTAB PV_CELLCOLOR CHANGING PS_LAYOUT TYPE LVC_S_LAYO. PS_LAYOUT-ZEBRA = PV_ZEBRA."可选行颜色,如果设置了,出现了间隔色带 "ps_layout-NO_VLINE = ' '."不显示列间竖线 PS_LAYOUT-CWIDTH_OPT = PV_CWIDTH_OPT. "自动优化列宽 PS_LAYOUT-SEL_MODE = PV_SEL_MODE. "ps_layout-grid_title = pv_g_title. PS_LAYOUT-INFO_FNAME = PV_INFO_FNAME."设置行的颜色 PS_LAYOUT-BOX_FNAME = PV_BOX_FNAME. "ALV是否有小方块选择 "ps_layout-DETAILINIT = 'X'. "ps_layout-DETAILTITL = 'Detail Title Bar'. PS_LAYOUT-NO_TOOLBAR = PV_NO_TOOLBAR. PS_LAYOUT-STYLEFNAME = PV_CELLTAB. PS_LAYOUT-CTAB_FNAME = PV_CELLCOLOR. ENDFORM. " FRM_SET_LAYOUT_01 *&---------------------------------------------------------------------* *& Form FRM_SET_FIELDCAT_01 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> PV_TABLE_NAME * --> PV_COL_POS * --> PV_EDIT * --> PV_FIELDNAME * --> PV_TITLENAME *---------------------------------------------------------------------* FORM FRM_SET_FIELDCAT_01 USING PV_INDEX PV_TABLE_NAME PV_COL_POS PV_EDIT PV_OUTPUTLEN PV_FIELDNAME PV_TITLENAME CHANGING PT_FIELDCAT TYPE LVC_T_FCAT. DATA: LS_FIELDCAT TYPE LVC_S_FCAT. PV_INDEX = PV_INDEX + 1. LS_FIELDCAT-COL_POS = PV_INDEX. LS_FIELDCAT-TABNAME = PV_TABLE_NAME. LS_FIELDCAT-FIX_COLUMN = PV_COL_POS. LS_FIELDCAT-EDIT = PV_EDIT. "'X':可编辑 "ls_fieldcat-checkbox = pv_checkbox. "作为复选框输出 "ls_fieldcat-no_zero = pv_no_zero. "'X':不输出前导零 "GT_FIELDCAT-no_out = pv_no_out. LS_FIELDCAT-FIELDNAME = PV_FIELDNAME. LS_FIELDCAT-SCRTEXT_L = PV_TITLENAME. LS_FIELDCAT-SCRTEXT_M = PV_TITLENAME. LS_FIELDCAT-SCRTEXT_S = PV_TITLENAME. LS_FIELDCAT-OUTPUTLEN = PV_OUTPUTLEN. "列的字符宽度 输出的长度 "ls_fieldcat-do_sum = pv_do_sum. "'X':合计 "ls_fieldcat-key = pv_key. "关键字段,前面变蓝色 "ls_fieldcat-key_sel = pv_key_sel. "关键字段,前面变蓝色 "ls_fieldcat-icon = pv_icon. "此列作为图标输出 "ls_fieldcat-symbol = pv_symbol. "输出作为符号 "ls_fieldcat-lzero = pv_lzero. "'X':输出前导零 "ls_fieldcat-no_sign = pv_no_sign. "'X':不输出符号 "ls_fieldcat-emphasize = pv_emphasize. "带有颜色的高亮列 列的颜色 "ls_fieldcat-round = pv_round. "四舍五入至小数位数下 n 位 "ls_fieldcat-just = pv_just. "'','R', 'L', 'C'. 对齐方式 "ls_fieldcat-decimals_o = pv_decimals_o "输出小数位的编号 "ls_fieldcat-DATATYPE = 'CURR'. "如果该字段指定为货币类型,则可以控制金额类字段小数点前移。 "ls_fieldcat-datatype = pv_datatype. " "ls_fieldcat-inttype = pv_inttype. "如果DATATYPE和INTTYPE参数配合,按照本示例,可以控制数字型字段小数点前移。 "ls_fieldcat-INTLEN = pv_INTLEN. "ls_fieldcat-ref_field = pv_ref_field. "ls_fieldcat-ref_table = pv_ref_table. "ls_fieldcat-txt_field = pv_txt_field. APPEND LS_FIELDCAT TO PT_FIELDCAT. ENDFORM. " FRM_SET_FIELDCAT_01 *&---------------------------------------------------------------------* *& Form FRM_CALL_ALV_FUNCTION_01 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> PT_FIELDCAT * --> PT_OUTPUT6 * --> PV_TITLE *---------------------------------------------------------------------* FORM FRM_CALL_ALV_FUNCTION_01 TABLES PT_FIELDCAT STRUCTURE LVC_S_FCAT PT_OUTPUT USING PV_TITLE PS_LAYOUT TYPE LVC_S_LAYO PV_STATUS PV_COMMAND. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING * I_BYPASSING_BUFFER = 'X' * I_GRID_SETTINGS = LV_SETTING I_GRID_TITLE = PV_TITLE I_CALLBACK_PROGRAM = SY-REPID IS_LAYOUT_LVC = PS_LAYOUT I_CALLBACK_PF_STATUS_SET = PV_STATUS I_CALLBACK_USER_COMMAND = PV_COMMAND IT_FIELDCAT_LVC = PT_FIELDCAT[] * IT_SORT = I_SORT[] * IT_EVENTS = GT_EVENTS[] * IS_PRINT = W_PRINT I_SAVE = 'A' * IS_VARIANT = LS_VARIANT TABLES T_OUTTAB = PT_OUTPUT EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC NE 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. " FRM_CALL_ALV_FUNCTION_01