实现功能:记录和查询用户登录日志
一:用户登录日志表:ZUSERLOGIN
主键用户登录日志ID弄成流水号形式了,也就是自动编号,函数代码会调用。怎么创建看这篇文章
二:创建登陆日志函数
SE37创建一个函数:ZUSERLOGIN_001
FUNCTION zuserlogin_001. *"---------------------------------------------------------------------- *"*"本地接口: *"---------------------------------------------------------------------- INCLUDE ole2incl. DATA win32 TYPE ole2_object. DATA macip TYPE string. DATA: wa_zuserlogin TYPE zuserlogin. CLEAR: wa_zuserlogin. DATA: opcode_usr_attr(1) TYPE x VALUE 5, terminal TYPE usr41-terminal. DATA:ip TYPE string. DATA: itype TYPE i, return TYPE char50. wa_zuserlogin-mandt = sy-mandt. CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = '01' "编号 object = 'ZLOGINID' "这里是第一步说的自动编号SNRO的名字 * QUANTITY = '1' * SUBOBJECT = ' ' * TOYEAR = '0000' * IGNORE_BUFFER = ' ' IMPORTING number = wa_zuserlogin-zuserloginid * QUANTITY = * RETURNCODE = EXCEPTIONS interval_not_found = 1 number_range_not_intern = 2 object_not_found = 3 quantity_is_0 = 4 quantity_is_not_1 = 5 interval_overflow = 6 buffer_overflow = 7 OTHERS = 8. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. wa_zuserlogin-uname = sy-uname. wa_zuserlogin-datum = sy-datum. wa_zuserlogin-uzeit = sy-uzeit. * 获取终端名 OPCODE 码在 TSKHINCL 252行 CALL 'ThUsrInfo' ID 'OPCODE' FIELD opcode_usr_attr ID 'TERMINAL' FIELD terminal. wa_zuserlogin-zpcname = terminal. "获取登陆IP地址 CALL METHOD cl_gui_frontend_services=>get_ip_address RECEIVING ip_address = ip. wa_zuserlogin-zpcip = ip. *********调用本在DLL,取得MAC地址 CREATE OBJECT win32 '{46A24614-B415-46FE-9B60-78D92C9F9B03}'. CALL METHOD OF win32 'MACIP' = macip EXPORTING #1 = ip. " IF sy-subrc <> 0. wa_zuserlogin-zpcmac = ''. * MESSAGE '请先按装用户登录控件' TYPE 'S' DISPLAY LIKE 'E'. ELSE. CONDENSE macip. wa_zuserlogin-zpcmac = macip. ENDIF. FREE win32. "取得电脑用户名 itype = '5'. CLEAR: return. CALL FUNCTION 'GUI_GET_DESKTOP_INFO' EXPORTING type = itype CHANGING return = return. wa_zuserlogin-zpcuser = return. MODIFY zuserlogin FROM wa_zuserlogin. * COMMIT WORK AND WAIT. ENDFUNCTION.
三:记录用户登录增强程序
事务码【CMOD】创建增强对象ZLOGON
添加增强名称 SUSR0001,激活增强
找到出口函数EXIT_SAPLSUSF_001
双击创建包含程序 ZXUSRU01,在其中进行逻辑编写
如果提示程序名称 ZX... 为函数组蕴含保留 不用理会,意思就是字面意思,回车就可以创建了
调用第二部创建的函数名就行
四:用户登录日志查询报表
源代码
REPORT ZUSERLOGIN. TYPE-POOLS: icon. TYPE-POOLS slis. TYPES: BEGIN OF typ_output. INCLUDE STRUCTURE zuserlogin. TYPES: icon TYPE icon-name, zsel TYPE char1, " tcode TYPE zusertcode-tcode, " objecttype TYPE zusertcode-objecttype, " objectname TYPE zusertcode-objectname, sname TYPE pa0001-sname, END OF typ_output. TYPES: BEGIN OF typ_uname, uname TYPE zuserlogin-uname, sname TYPE pa0001-sname, END OF typ_uname. DATA: wa_uname TYPE typ_uname, it_uname LIKE STANDARD TABLE OF wa_uname. DATA: wa_output TYPE typ_output, it_output LIKE STANDARD TABLE OF wa_output. DATA: is_layout TYPE slis_layout_alv, "ALV输出样式 it_fieldcat TYPE slis_t_fieldcat_alv, "ALV输出的头项目(内表) wa_fieldcat TYPE slis_fieldcat_alv, "ALV输出的头项目(工作区) wa_repid LIKE sy-repid. "程序名 DATA: is_layout2 TYPE slis_layout_alv, "ALV输出样式 it_fieldcat2 TYPE slis_t_fieldcat_alv, "ALV输出的头项目(内表) wa_fieldcat2 TYPE slis_fieldcat_alv, "ALV输出的头项目(工作区) wa_repid2 LIKE sy-repid. "程序名 TABLES: zuserlogin. SELECT-OPTIONS: s_uname FOR zuserlogin-uname, s_datum FOR zuserlogin-datum, s_uzeit FOR zuserlogin-uzeit, s_zpcna FOR zuserlogin-zpcname, s_zpcip FOR zuserlogin-zpcip, s_zpcus FOR zuserlogin-zpcuser . *PARAMETERS: R1 RADIOBUTTON GROUP G1 DEFAULT 'X', * R2 RADIOBUTTON GROUP G1. INITIALIZATION. PERFORM frm_init. * START-OF-SELECTION. PERFORM frm_get_data. * END-OF-SELECTION. PERFORM frm_show_data. *&---------------------------------------------------------------------* *& Form FRM_INIT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_init . s_datum-low = sy-datum. s_datum-sign = 'I'. s_datum-option = 'EQ'. APPEND s_datum. ENDFORM. " FRM_INIT *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_get_data . SELECT * FROM zuserlogin INTO CORRESPONDING FIELDS OF TABLE it_output WHERE uname IN s_uname AND datum IN s_datum AND uzeit IN s_uzeit AND zpcname IN s_zpcna AND zpcip IN s_zpcip AND zpcuser IN s_zpcus. DATA: l_pernr TYPE pa0001-pernr. SORT it_output BY uname. LOOP AT it_output INTO wa_output. READ TABLE it_uname WITH KEY uname = wa_output-uname INTO wa_uname. IF sy-subrc = 0. wa_output-sname = wa_uname-sname. ELSE. CLEAR: wa_uname. wa_uname-uname = wa_output-uname. l_pernr = wa_output-uname. SELECT SINGLE sname FROM pa0001 INTO wa_uname-sname WHERE pernr EQ l_pernr. IF sy-subrc = 0. ELSE. SELECT SINGLE b~name_text FROM usr21 AS a LEFT JOIN adrp AS b ON b~persnumber = a~persnumber INTO wa_uname-sname WHERE a~bname EQ wa_output-uname. ENDIF. wa_output-sname = wa_uname-sname. APPEND wa_uname TO it_uname. ENDIF. MODIFY it_output FROM wa_output TRANSPORTING sname. ENDLOOP. * LOOP AT it_output INTO wa_output. * IF wa_output-type = 'S'. * wa_output-icon = icon_green_light. * ENDIF. * IF wa_output-type = 'E'. * wa_output-icon = icon_red_light. * ENDIF. * IF wa_output-type = 'W'. * wa_output-icon = icon_yellow_light. * ENDIF. * MODIFY it_output FROM wa_output TRANSPORTING icon. * ENDLOOP. ENDFORM. " FRM_GET_DATA *&---------------------------------------------------------------------* *& Form FRM_SHOW_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_show_data . wa_repid = sy-repid. "得到程序名 is_layout-zebra = 'X'. "颜色相间显示 is_layout-colwidth_optimize = 'X'. "优化列宽选项 is_layout-box_fieldname = 'ZSEL'. DATA: de_pos TYPE i. * DE_POS = DE_POS + 1. * CLEAR WA_FIELDCAT. * WA_FIELDCAT-COL_POS = DE_POS. ** WA_FIELDCAT-KEY = 'X'. * WA_FIELDCAT-FIELDNAME = 'ICON'. * WA_FIELDCAT-ICON = 'X'. * WA_FIELDCAT-SELTEXT_L = ''. * WA_FIELDCAT-SELTEXT_M = ''. * WA_FIELDCAT-SELTEXT_S = ''. * WA_FIELDCAT-DDICTXT = 'L'. * APPEND WA_FIELDCAT TO IT_FIELDCAT. * DE_POS = DE_POS + 1. * CLEAR WA_FIELDCAT. * WA_FIELDCAT-COL_POS = DE_POS. ** WA_FIELDCAT-KEY = 'X'. * WA_FIELDCAT-FIELDNAME = 'ZUSERLOGINID'. * WA_FIELDCAT-REF_TABNAME = 'ZUSERLOGIN'. * WA_FIELDCAT-REF_FIELDNAME = 'ZUSERLOGINID'. * WA_FIELDCAT-SELTEXT_L = '用户登录日志ID'. * WA_FIELDCAT-SELTEXT_M = '用户登录日志ID'. * WA_FIELDCAT-SELTEXT_S = '用户登录日志ID'. * WA_FIELDCAT-DDICTXT = 'L'. * APPEND WA_FIELDCAT TO IT_FIELDCAT. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'UNAME'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'UNAME'. wa_fieldcat-seltext_l = '用户名'. wa_fieldcat-seltext_m = '用户名'. wa_fieldcat-seltext_s = '用户名'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'SNAME'. wa_fieldcat-ref_tabname = 'PA0001'. wa_fieldcat-ref_fieldname = 'SNAME'. wa_fieldcat-seltext_l = '用户名称'. wa_fieldcat-seltext_m = '用户名称'. wa_fieldcat-seltext_s = '用户名称'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'DATUM'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'DATUM'. wa_fieldcat-seltext_l = '登录日期'. wa_fieldcat-seltext_m = '登录日期'. wa_fieldcat-seltext_s = '登录日期'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'UZEIT'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'UZEIT'. wa_fieldcat-seltext_l = '登录时间'. wa_fieldcat-seltext_m = '登录时间'. wa_fieldcat-seltext_s = '登录时间'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'ZPCNAME'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'ZPCNAME'. wa_fieldcat-seltext_l = '电脑名'. wa_fieldcat-seltext_m = '电脑名'. wa_fieldcat-seltext_s = '电脑名'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'ZPCIP'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'ZPCIP'. wa_fieldcat-seltext_l = 'IP地址'. wa_fieldcat-seltext_m = 'IP地址'. wa_fieldcat-seltext_s = 'IP地址'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'ZPCMAC'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'ZPCMAC'. wa_fieldcat-seltext_l = 'MAC地址'. wa_fieldcat-seltext_m = 'MAC地址'. wa_fieldcat-seltext_s = 'MAC地址'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. de_pos = de_pos + 1. CLEAR wa_fieldcat. wa_fieldcat-col_pos = de_pos. * WA_FIELDCAT-KEY = 'X'. wa_fieldcat-fieldname = 'ZPCUSER'. wa_fieldcat-ref_tabname = 'ZUSERLOGIN'. wa_fieldcat-ref_fieldname = 'ZPCUSER'. wa_fieldcat-seltext_l = '电脑用户名'. wa_fieldcat-seltext_m = '电脑用户名'. wa_fieldcat-seltext_s = '电脑用户名'. wa_fieldcat-ddictxt = 'L'. APPEND wa_fieldcat TO it_fieldcat. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' i_callback_program = wa_repid * I_CALLBACK_PF_STATUS_SET = 'SET_STATUS' * i_callback_user_command = 'USER_COMMAND' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = is_layout = is_layout it_fieldcat = it_fieldcat * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' * I_SAVE = ' ' * IS_VARIANT = * IT_EVENTS = * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES t_outtab = it_output EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " FRM_SHOW_DATA *&---------------------------------------------------------------------* *& Form SET_STATUS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->RT_EXTAB text *----------------------------------------------------------------------* FORM set_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'MENU' EXCLUDING rt_extab. ENDFORM. "SET_STATUS *&---------------------------------------------------------------------* *& Form USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->RF_UCOMM text * -->RS_SELFIELD text *----------------------------------------------------------------------* FORM user_command USING rf_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. CASE rf_ucomm. WHEN '&IC1'. ENDCASE. *如果前面把内表的数据修改了,通过这个就会自到更新数据 rs_selfield-refresh = 'X'. ENDFORM. "USER_COMMAND