SAP中发消息报表程序

时间:2022-12-13 11:59:29


* Pop a Message to specific SAP users * * How to get a list of all the currently logged on users? * How to popup an instant message on a user';s monitor? * How to get a specific user';s details? * Usage of ';POPUP_GET_VALUES'; function module to get data from user * without having to write GUI code * * Submitted by : SAP Basis, ABAP Programming and Other IMG Stuff *              ​ * REPORT ZPOPUP NO STANDARD PAGE HEADING. INCLUDE <ICON>. DATA:       BEGIN OF USR_TABL OCCURS 0.                 INCLUDE STRUCTURE UINFO. DATA:       END OF USR_TABL. DATA:       L_LENGTH        TYPE I,             T_ABAPLIST      LIKE ABAPLIST OCCURS 0 WITH HEADER LINE,             BEGIN OF T_USER OCCURS 0,                 COUNTER     TYPE I,                 SELECTION   TYPE C,                 MANDT       LIKE SY-MANDT,                 BNAME       LIKE SY-UNAME,                 NAME_FIRST  LIKE V_ADRP_CP-NAME_FIRST,                 NAME_LAST   LIKE V_ADRP_CP-NAME_LAST,                 DEPARTMENT  LIKE V_ADRP_CP-DEPARTMENT,                 TEL_NUMBER  LIKE V_ADRP_CP-TEL_NUMBER,             END OF T_USER,             L_CLIENT        LIKE SY-MANDT,             L_USERID        LIKE UINFO-BNAME,             L_OPCODE        TYPE X,             L_FUNCT_CODE(1) TYPE C,             L_TEST(200)     TYPE C. L_OPCODE = 2. CALL ';ThUsrInfo'; ID ';OPCODE'; FIELD L_OPCODE     ID ';TAB'; FIELD USR_TABL-*SYS*. CLEAR T_USER. REFRESH T_USER. LOOP AT USR_TABL.     T_USER-MANDT = USR_TABL-MANDT.     T_USER-BNAME = USR_TABL-BNAME.     APPEND T_USER. ENDLOOP. SORT T_USER. DELETE ADJACENT DUPLICATES FROM T_USER. LOOP AT T_USER.     T_USER-COUNTER = SY-TABIX.     SELECT V~NAME_FIRST            V~NAME_LAST            V~DEPARTMENT            V~TEL_NUMBER         INTO (T_USER-NAME_FIRST,               T_USER-NAME_LAST,               T_USER-DEPARTMENT,               T_USER-TEL_NUMBER)         FROM USR21 AS U             JOIN V_ADRP_CP AS V               ON U~PERSNUMBER = V~PERSNUMBER AND                  U~ADDRNUMBER = V~ADDRNUMBER         WHERE U~BNAME = T_USER-BNAME.     ENDSELECT.     MODIFY T_USER. ENDLOOP. SORT T_USER BY DEPARTMENT NAME_LAST. PERFORM DISPLAY_LIST. TOP-OF-PAGE.     PERFORM DISPLAY_MENU. * End of top-of-page TOP-OF-PAGE DURING LINE-SELECTION.     PERFORM DISPLAY_MENU. * End of top-of-page during line-selection AT LINE-SELECTION.   IF SY-CUROW = 2.     IF SY-CUCOL < 19.         T_USER-SELECTION = ';X';.         MODIFY T_USER TRANSPORTING SELECTION WHERE SELECTION = ';';.         PERFORM DISPLAY_LIST.     ELSEIF SY-CUCOL < 36.         CLEAR T_USER-SELECTION.         MODIFY T_USER TRANSPORTING SELECTION WHERE SELECTION = ';X';.         PERFORM DISPLAY_LIST.     ELSEIF SY-CUCOL < 50.         PERFORM TRANSFER_SELECTION.         PERFORM POPUP_MSG.     ELSEIF SY-CUCOL < 67.         PERFORM TRANSFER_SELECTION.         SORT T_USER BY NAME_LAST.         PERFORM DISPLAY_LIST.     ELSEIF SY-CUCOL < 81.         PERFORM TRANSFER_SELECTION.         SORT T_USER BY NAME_FIRST.         PERFORM DISPLAY_LIST.     ELSEIF SY-CUCOL < 93.         PERFORM TRANSFER_SELECTION.         SORT T_USER BY MANDT.         PERFORM DISPLAY_LIST.     ENDIF.   ENDIF. * End of line-selection *&---------------------------------------------------------------------* *&      Form  DISPLAY_LIST *&---------------------------------------------------------------------* FORM DISPLAY_LIST. SY-LSIND = 0. FORMAT COLOR COL_NORMAL INTENSIFIED OFF. LOOP AT T_USER.     WRITE: / SY-VLINE, T_USER-SELECTION AS CHECKBOX,              SY-VLINE, T_USER-MANDT,              SY-VLINE, T_USER-BNAME,              SY-VLINE, T_USER-NAME_FIRST(15),              SY-VLINE, T_USER-NAME_LAST(15),              SY-VLINE, T_USER-DEPARTMENT(20),              SY-VLINE, T_USER-TEL_NUMBER(20), SY-VLINE.     HIDE: T_USER-COUNTER, T_USER-SELECTION. ENDLOOP. FORMAT COLOR OFF. WRITE: /(108) SY-ULINE. ENDFORM.                    " DISPLAY_LIST *&---------------------------------------------------------------------* *&      Form  DISPLAY_MENU *&---------------------------------------------------------------------* FORM DISPLAY_MENU.     FORMAT COLOR COL_HEADING HOTSPOT.     WRITE:   (91) SY-ULINE,        / SY-VLINE NO-GAP, (4) ICON_SELECT_ALL NO-GAP,    ';Select All';,          SY-VLINE NO-GAP, (4) ICON_DESELECT_ALL NO-GAP,  ';Deselect All';,          SY-VLINE NO-GAP, (4) ICON_SHORT_MESSAGE NO-GAP, ';Send Popup';,          SY-VLINE NO-GAP, (4) ICON_SORT_UP NO-GAP, ';Last Name'; NO-GAP,          SY-VLINE NO-GAP, (4) ICON_SORT_UP NO-GAP, ';First Name'; NO-GAP,          SY-VLINE NO-GAP, (4) ICON_SORT_UP NO-GAP, ';Client'; NO-GAP,          SY-VLINE,        /(91) SY-ULINE,        /(108) SY-ULINE.    FORMAT HOTSPOT OFF.    WRITE: / SY-VLINE, '; ';,             SY-VLINE, ';Cli';,             SY-VLINE, ';User        ';,             SY-VLINE, ';First Name     ';,             SY-VLINE, ';Last Name      ';,             SY-VLINE, ';Department          ';,             SY-VLINE, ';Telephone           ';,             SY-VLINE,           /(108) SY-ULINE.     FORMAT COLOR OFF. ENDFORM.                    " DISPLAY_MENU *&---------------------------------------------------------------------* *&      Form  TRANSFER_SELECTION *&---------------------------------------------------------------------* FORM TRANSFER_SELECTION.     DO.         READ LINE SY-INDEX FIELD VALUE T_USER-SELECTION.         IF SY-SUBRC <> 0.             EXIT.         ENDIF.         MODIFY T_USER TRANSPORTING SELECTION                WHERE COUNTER = T_USER-COUNTER.     ENDDO.     CLEAR T_USER. ENDFORM.                    " TRANSFER_SELECTION *&---------------------------------------------------------------------* *&      Form  POPUP_MSG *&---------------------------------------------------------------------* FORM POPUP_MSG.     DATA: L_MSG      LIKE SM04DIC-POPUPMSG VALUE ';Experimental Message';,           L_LEN      TYPE I,           L_RET      TYPE C.     LOOP AT T_USER WHERE SELECTION = ';X';.         PERFORM GET_MESSAGE CHANGING L_MSG L_RET.         EXIT.     ENDLOOP.     IF L_RET = ';A';.            "User cancelled the message         EXIT.     ENDIF. *   Get the message text     L_LEN = STRLEN( L_MSG ).     LOOP AT T_USER WHERE SELECTION = ';X';.             CALL FUNCTION ';TH_POPUP';                  EXPORTING                       CLIENT         = T_USER-MANDT                       USER           = T_USER-BNAME                       MESSAGE        = L_MSG                       MESSAGE_LEN    = L_LENGTH *                     CUT_BLANKS     = '; ';                  EXCEPTIONS                       USER_NOT_FOUND = 1                       OTHERS         = 2.             IF SY-SUBRC <> 0.                 WRITE: ';User ';, T_USER-BNAME, ';not found.';.             ENDIF.     ENDLOOP.     IF SY-SUBRC <> 0. *       Big error! No user has been selected.         MESSAGE ID ';AT'; TYPE ';E'; NUMBER ';315'; WITH               ';No user selected!';.         EXIT.     ENDIF. ENDFORM.                    " POPUP_MSG *&---------------------------------------------------------------------* *&      Form  GET_MESSAGE *&---------------------------------------------------------------------* FORM GET_MESSAGE CHANGING P_L_MSG LIKE SM04DIC-POPUPMSG                           P_RETURNCODE TYPE C. DATA: BEGIN OF FIELDS OCCURS 1.         INCLUDE STRUCTURE SVAL. DATA: END OF FIELDS,       RETURNCODE TYPE C.     FIELDS-TABNAME = ';SM04DIC';.     FIELDS-FIELDNAME = ';POPUPMSG';.     FIELDS-FIELDTEXT = ';Message :';.     CONCATENATE '; - Msg from'; SY-UNAME ';.'; INTO FIELDS-VALUE SEPARATED             BY '; ';.     APPEND FIELDS.     CALL FUNCTION ';POPUP_GET_VALUES';         EXPORTING POPUP_TITLE     = ';Supply the popup message';         IMPORTING RETURNCODE      = P_RETURNCODE         TABLES    FIELDS          = FIELDS.     IF P_RETURNCODE = ';A';.         EXIT.     ELSE.         READ TABLE FIELDS INDEX 1.         P_L_MSG = FIELDS-VALUE.     ENDIF. ENDFORM.                    " GET_MESSAGE *-- End of Program