需求:在MIRO界面当中增加两个按钮,按钮功能为:可以将对应的行项目信息导出和导入,因为实际业务中,可能存在大批量采购订单开票的情况,无法做到数据对账,所以用此功能来解决问题。
效果截图:
此方法用到修改了标准屏幕,一般没啥影响,胆子小或者经常升级的可以酌情考虑是否做这样的需求(要给SAP去魅,再厉害的软件终究是软件,没什么不能做的)
第一步:找到程序及屏幕
Se93->miro:确认程序为SAPLMR1M
第二步:SE80输入程序,确认一下具体的屏幕6310
别问我怎么找到这个屏幕的,你指定到行项目,试试F1瞅瞅
第三步:给标准屏幕增加两个按钮(放心改,领导同意了,怕啥)
点击格式,修改,增加按钮,给按钮命名
第四步:找一下屏幕的增强位置,双击6310屏幕中的MODULE fcode_6310.
第五步:在fcode_6310(LMR1MI30)里面找一下增强点
第六步:找到对应的位置创建增强,大概在这个位置吧
第七步:码上增强代码(天下代码一大抄,抄抄抄)
ENHANCEMENT 1 ZTEST_004. "active version
TYPES:
* 内容
BEGIN OF TYP_DRSEG,
RBLGP TYPE DRSEG-RBLGP,"项目
WRBTR TYPE DRSEG-WRBTR,"金额
MENGE TYPE DRSEG-MENGE,"数量
MEINS TYPE DRSEG-MEINS,"单位
EBELN TYPE DRSEG-EBELN,"采购订单
EBELP TYPE DRSEG-EBELP,"采购订单项目
TXZ01 TYPE DRSEG-TXZ01,"描述
LFBNR TYPE DRSEG-LFBNR,"参考凭证
MATNR TYPE DRSEG-MATNR,"物料号
MWSKZ TYPE DRSEG-MWSKZ,"税码
BPMNG TYPE DRSEG-BPMNG,"订单单价数量
BPRME TYPE DRSEG-BPRME,"采购订单价格单位
BUDAT TYPE MKPF-BUDAT,"过账日期
END OF TYP_DRSEG,
* 表头行
BEGIN OF TYP_HEAD,
NAME(20),
END OF TYP_HEAD.
* 临时数据
DATA:
ls_drsegt TYPE typ_drseg,
LT_drsegt TYPE TABLE OF typ_drseg,
LS_HEAD TYPE TYP_HEAD,
LT_HEAD TYPE TABLE OF TYP_HEAD,
LS_MKPF TYPE MKPF.
DATA: WA_OBJDATA LIKE WWWDATATAB,
LV_FILENAME TYPE STRING VALUE 'ZMIR7' ,
LV_FULLPATH TYPE STRING,
LV_PATH TYPE STRING.
IF ok-code = 'ZEXPORT'.
CLEAR ok-code.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
EXPORTING
DEFAULT_EXTENSION = 'XLS'
DEFAULT_FILE_NAME = LV_FILENAME
CHANGING
FILENAME = LV_FILENAME
PATH = LV_PATH
FULLPATH = LV_FULLPATH
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF LV_FULLPATH = ''.
MESSAGE E001(ZMM4001) WITH TEXT-M13.
"文件路径错误
ENDIF.
*
IF SY-SUBRC = 0.
CLEAR LT_HEAD.
LS_HEAD-NAME = '项目(不允许修改)'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '金额'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '数量'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '订单单位'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '采购订单'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '采购订单项目'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '采购订单文本'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '参考凭证'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '物料号'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '税码'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '订单单价数量'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '采购订单价格单位'.
APPEND LS_HEAD TO LT_HEAD.
LS_HEAD-NAME = '过账日期'.
APPEND LS_HEAD TO LT_HEAD.
REFRESH lt_drsegt.
LOOP AT ydrseg.
MOVE-CORRESPONDING ydrseg to ls_drsegt.
SELECT SINGLE * FROM MKPF INTO LS_MKPF WHERE MBLNR = ydrseg-LFBNR.
ls_drsegt-BUDAT = LS_MKPF-BUDAT.
APPEND ls_drsegt TO lt_drsegt.
CLEAR ls_drsegt.
ENDLOOP.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
FILENAME = LV_FULLPATH
* FILETYPE = 'ASC'
* APPEND = ' '
WRITE_FIELD_SEPARATOR = 'X'
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* WK1_N_FORMAT = ' '
* WK1_N_SIZE = ' '
* WK1_T_FORMAT = ' '
* WK1_T_SIZE = ' '
* WRITE_LF_AFTER_LAST_LINE = ABAP_TRUE
* SHOW_TRANSFER_STATUS = ABAP_TRUE
* VIRUS_SCAN_PROFILE = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = lt_drsegt
FIELDNAMES = LT_HEAD
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6
HEADER_NOT_ALLOWED = 7
SEPARATOR_NOT_ALLOWED = 8
FILESIZE_NOT_ALLOWED = 9
HEADER_TOO_LONG = 10
DP_ERROR_CREATE = 11
DP_ERROR_SEND = 12
DP_ERROR_WRITE = 13
UNKNOWN_DP_ERROR = 14
ACCESS_DENIED = 15
DP_OUT_OF_MEMORY = 16
DISK_FULL = 17
DP_TIMEOUT = 18
FILE_NOT_FOUND = 19
DATAPROVIDER_EXCEPTION = 20
CONTROL_FLUSH_ERROR = 21
OTHERS = 22 .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDIF.
IF ok-code = 'ZIMPORT'.
CLEAR ok-code.
DATA: L_FILETAB TYPE FILETABLE,
L_RC TYPE I.
DATA PC_FILE(80).
CLEAR L_FILETAB.
REFRESH L_FILETAB.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
DEFAULT_FILENAME = '*.xls'
INITIAL_DIRECTORY = 'D:\'
MULTISELECTION = ''
CHANGING
FILE_TABLE = L_FILETAB
RC = L_RC
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
CHECK L_RC EQ 1.
READ TABLE L_FILETAB INDEX 1 INTO PC_FILE.
TYPES:truxs_t_text_data2(4096) type c occurs 0.
* 临时变量
DATA:lv_index TYPE sy-tabix,
LIT_RAW TYPE TRUXS_T_TEXT_DATA2,
LV_FILE TYPE RLGRAP-FILENAME.
LV_FILE = PC_FILE.
REFRESH lt_drsegt.
* 读取文件数据
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
I_LINE_HEADER = 'X'
I_TAB_RAW_DATA = LIT_RAW
I_FILENAME = LV_FILE
TABLES
I_TAB_CONVERTED_DATA = lt_drsegt
EXCEPTIONS
CONVERSION_FAILED = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO DISPLAY LIKE 'E'
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
LEAVE LIST-PROCESSING.
ENDIF.
CHECK lt_drsegt[] IS NOT INITIAL.
LOOP AT ydrseg.
lv_index = sy-tabix.
READ TABLE lt_drsegt INTO lS_drsegt WITH KEY RBLGP = ydrseg-RBLGP.
IF SY-SUBRC <> 0.
DELETE ydrseg index lv_index.
ELSE.
ydrseg-WRBTR = lS_drsegt-WRBTR."金额
ydrseg-MENGE = lS_drsegt-MENGE."数量
MODIFY ydrseg INDEX lv_index
TRANSPORTING WRBTR
MENGE.
ENDIF.
ENDLOOP.
ENDIF.
ENDENHANCEMENT.