【ABAP】SAP用户登陆日志

实现功能:记录和查询用户登录日志

一:用户登录日志表:ZUSERLOGIN

主键用户登录日志ID弄成流水号形式了,也就是自动编号,函数代码会调用。怎么创建看这篇文章

【ABAP】自动编号维护SNRO

二:创建登陆日志函数

SE37创建一个函数:ZUSERLOGIN_001

FUNCTION zuserlogin_001.
*"----------------------------------------------------------------------
*"*"本地接口:
*"----------------------------------------------------------------------


  INCLUDE ole2incl.
  DATA win32 TYPE ole2_object.
  DATA macip TYPE string.

  DATAwa_zuserlogin TYPE zuserlogin.
  CLEARwa_zuserlogin.

  DATAopcode_usr_attr(1TYPE VALUE 5,
        terminal           TYPE usr41-terminal.
  DATA:ip TYPE string.

  DATAitype  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'.
  CLEARreturn.
  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-POOLSicon.
TYPE-POOLS slis.

TYPESBEGIN OF typ_output.
    INCLUDE STRUCTURE zuserlogin.
TYPESicon       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.

TYPESBEGIN OF typ_uname,
         uname TYPE zuserlogin-uname,
         sname TYPE pa0001-sname,
       END OF typ_uname.

DATAwa_uname TYPE typ_uname,
      it_uname LIKE STANDARD TABLE OF wa_uname.

DATAwa_output TYPE typ_output,
      it_output LIKE STANDARD TABLE OF wa_output.

DATAis_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"程序名

DATAis_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"程序名

TABLESzuserlogin.

SELECT-OPTIONSs_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.

  DATAl_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.
      CLEARwa_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 LEFT JOIN adrp AS 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'.

  DATAde_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

 

给TA打赏
共{{data.count}}人
人已打赏
ABAPSAP

【ABAP】自动编号维护SNRO

2021-2-11 1:58:06

ABAPSAP

【SAP】去掉重复登录检查

2021-3-4 18:46:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索