SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Chat with other, logged-on SAP users (like the unix talk)



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Security and Monitoring
View previous topic :: View next topic  
Author Message
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1639

PostPosted: Sun Nov 25, 2007 12:34 pm    Post subject: Chat with other, logged-on SAP users (like the unix talk) Reply with quote

Chat with other, logged-on SAP users (like the unix talk or write) implemented in ABAP - terminal module

Code:
REPORT ZPOPUPDE.
************************************************************************
* The programs ZPOPUP and ZPOPUPDE implement a talk utility -
* - similar to the UNIX talk or write commands.
* The two instances of zpopups will negotiate the communication
* parameters and call zpopupde, the terminal module. Using the
* terminal window's buttons you can chat, get help or exit.
************************************************************************
TABLES: USR02, SSCRFIELDS, INDX.
DATA: C12(12), Q(12), LINE(90).
DATA: FIRST_TIME VALUE '1'.
DATA: I_AM.
DATA: A_NAME(22), B_NAME(22), AB_NAME(22), BA_NAME(22), MY_NAME(22).
DATA: MY_TURN.
DATA: MESSAGE(30) VALUE '   Waiting for an answer'.
DATA: NO_HELP_SCROLL.
* Selection screen begin
INITIALIZATION.
* Receive area
  SET PF-STATUS 'ZCLEAR'.
  SELECTION-SCREEN BEGIN OF BLOCK A WITH FRAME.
  SELECTION-SCREEN BEGIN OF LINE.SELECTION-SCREEN POSITION 1.
  PARAMETERS: REMOTE(12) MODIF ID ABB.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: A(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: B(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: C(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: D(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: E(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: F(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
* Send area
  SELECTION-SCREEN BEGIN OF LINE.SELECTION-SCREEN POSITION 1.
  PARAMETERS: LOCAL(12) MODIF ID ABB.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: G(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: H(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: I(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: J(45) MODIF ID ABC LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: K(45) MODIF ID ABD LOWER CASE.
  SELECTION-SCREEN END OF LINE.
  selection-screen begin of line.selection-screen position 1.
  PARAMETERS: L(45) MODIF ID ABD LOWER CASE.
  SELECTION-SCREEN END OF LINE.
* Buttons
  SELECTION-SCREEN SKIP 2.
  SELECTION-SCREEN PUSHBUTTON 1(13) TEXT-010 USER-COMMAND SND.
  SELECTION-SCREEN PUSHBUTTON 17(13) TEXT-011 USER-COMMAND EXI.
  SELECTION-SCREEN PUSHBUTTON 33(13) TEXT-012 USER-COMMAND HLP.
  SELECTION-SCREEN END OF BLOCK A.
* End of selection screen

* When a button is pressed
AT SELECTION-SCREEN.
* The SEND button or ENTER was pressed
  IF SSCRFIELDS-UCOMM = 'SND' OR SSCRFIELDS-UCOMM IS INITIAL
     OR SSCRFIELDS-UCOMM = 'AAAA'.
    IF I_AM = 'I'.        " I am an initiator
      LINE = K. LINE+45(45) = L.
      EXPORT LINE TO DATABASE INDX(ST) ID AB_NAME.
      COMMIT WORK AND WAIT.
      MY_TURN = '0'.
    ELSEIF I_AM = 'R'.    " I am a responder
      LINE = K. LINE+45(45) = L.
      EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
      COMMIT WORK AND WAIT.
      MY_TURN = '0'.
    ENDIF.
* The exit button was pressed (or green or yellow arrow, or red cross)
  ELSEIF SSCRFIELDS-UCOMM = 'EXI'
      OR SSCRFIELDS-UCOMM = 'BBBB'
      OR SSCRFIELDS-UCOMM = 'CCCC'
      OR SSCRFIELDS-UCOMM = 'DDDD'.
* Send the exit message to the partner and exit.
    LINE = 'EXITEXITEXITEXITEXIT'.
    EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
    EXPORT LINE TO DATABASE INDX(ST) ID AB_NAME.
    COMMIT WORK AND WAIT.
    LEAVE PROGRAM.
* If the HELP button was pressed
  ELSEIF SSCRFIELDS-UCOMM = 'HLP'.
    NO_HELP_SCROLL = '1'.
    CALL FUNCTION 'POPUP_TO_INFORM'
         EXPORTING
         TITEL = 'HELP'
         TXT1  = 'Enter the message using the input lines at the bottom'
         TXT2  = 'Press ENTER or the SEND button to send the message'
         TXT3  = 'Wait for the answer'
         TXT4  = 'Press EXIT to close the connection'.
  ENDIF.
* End: when a button is pressed

* Prepare the selection screen for output
AT SELECTION-SCREEN OUTPUT.
* When the display module runs the first time: import the communication
* parameters
  IF FIRST_TIME = 1.
    IMPORT I_AM A_NAME B_NAME AB_NAME BA_NAME FROM MEMORY ID 'AAA'.
    IF I_AM = 'I'.
      LOCAL = A_NAME.
      REMOTE = B_NAME.
      MY_TURN = '1'.
    ELSEIF I_AM = 'R'.
      LOCAL = B_NAME.
      REMOTE = A_NAME.
      MY_TURN = '0'.
    ENDIF.
    FIRST_TIME = 0.
  ENDIF.                               " First time
* Wait for an answer (my_turn = '0')
  IF MY_TURN = '0'.                    " Wait for the partner
    CLEAR LINE.
    IF I_AM = 'I'.                     " Listen on BA
      DO.
        IMPORT LINE FROM DATABASE INDX(ST) ID BA_NAME.
* Horray, a message has arrived
        IF NOT LINE IS INITIAL.
          DELETE FROM INDX WHERE RELID = 'ST' AND
                                 SRTFD = BA_NAME.
          COMMIT WORK AND WAIT.
          MY_TURN = '1'.
          EXIT.
        ENDIF.
* No message yet: display a progress indicator
        SHIFT MESSAGE CIRCULAR RIGHT.
        CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
             EXPORTING
                  PERCENTAGE = ''
                  TEXT       = MESSAGE.
      ENDDO.
* Wait for an answer (my_turn = '0')
    ELSEIF I_AM = 'R'.                 " Listen on AB
      DO.
        IMPORT LINE FROM DATABASE INDX(ST) ID AB_NAME.
* Horray, a message has arrived
        IF NOT LINE IS INITIAL.        " An answer came
          DELETE FROM INDX WHERE RELID = 'ST' AND
                                 SRTFD = AB_NAME.
          COMMIT WORK AND WAIT.
          MY_TURN = '1'.
          EXIT.
        ENDIF.
* No message yet: display a progress indicator
        SHIFT MESSAGE CIRCULAR RIGHT.
        CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
             EXPORTING
                  PERCENTAGE = ''
                  TEXT       = MESSAGE.
      ENDDO.
    ENDIF.
  ENDIF.
* my_turn = '1'
* An exit message come: free up the communication area and exit
  IF LINE = 'EXITEXITEXITEXITEXIT'.
    DELETE FROM INDX WHERE RELID = 'ST' AND
                           SRTFD = AB_NAME.
    DELETE FROM INDX WHERE RELID = 'ST' AND
                           SRTFD = BA_NAME.
    COMMIT WORK AND WAIT.
    CALL FUNCTION 'POPUP_TO_INFORM'
         EXPORTING
              TITEL = 'INFORMATION'
              TXT1  = 'Partner closed the connection'
              TXT2  = ''.
    LEAVE PROGRAM.
  ENDIF.
* Prepare the selection screen fields for output
  LOOP AT SCREEN.
    IF SCREEN-GROUP1 = 'ABC' OR SCREEN-GROUP1 = 'ABB'.
      SCREEN-INPUT = '0'.
      MODIFY SCREEN.
    ENDIF.
    IF SCREEN-GROUP1 = 'ABB'.
      SCREEN-INTENSIFIED = '1'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
* Scroll the input and output lines
  IF NO_HELP_SCROLL <> '1'.
    G = I. H = J.
    I = K. J = L.
    CLEAR K. CLEAR L. CLEAR NO_HELP_SCROLL.
  ENDIF.
  IF NOT LINE IS INITIAL.              " Refresh the receive lines.
    A = C. B = D.
    C = E. D = F.
    E = LINE(45). F = LINE+45(45).
  ENDIF.


Chat with other, logged-on SAP users (like the unix talk or write) implemented in ABAP - communication module
Code:

REPORT ZPOPUP NO STANDARD PAGE HEADING.
************************************************************************
* The programs ZPOPUP and ZPOPUPDE implement a talk utility -
* - similar to the UNIX talk or write commands. When zpopup is
* started via a transaction (i.e. ZPOP) it displays the active users.
* By double-clicking on the username the remote user will receive
* a popup window inviting him for a chat. The remote user starts ZPOP
* as well, and the two instances of zpops will negotiate the
* communication parameters and call zpopupde, the terminal module.
* The terminal module will enable them to send and receive the messages.
* To make these programs work, you have to assign zpopup to transaction
* code ZPOP and create status ZCLEAR for zpopupde with only the
* enter(AAAA), green arrow(BBBB), yellow arrow(CCCC) and red cross(DDDD)
************************************************************************
DATA: ESTABLISHED.
DATA: I_AM.
DATA: LINE(90).
DATA: A_NAME(22), B_NAME(22), AB_NAME(22), BA_NAME(22), MY_NAME(22).
DATA: INDXKEY LIKE INDX-SRTFD.
TABLES INDX.
DATA: CURR_TIM LIKE SY-UZEIT.
DATA: TEMP_TIM TYPE T.
DATA: MESSAGE(128).
DATA: OPCODE TYPE X VALUE 2.
DATA: BEGIN OF USR_TABL OCCURS 10.
        INCLUDE STRUCTURE UINFO.
DATA: END OF USR_TABL.
DATA: A(61).
DATA: TIM LIKE SY-UZEIT, N TYPE I VALUE 30, DTIM LIKE SY-UZEIT.

START-OF-SELECTION.
* Find out, if I am an initializator (A) or a responder (B)
  MY_NAME = SY-UNAME.
  INDXKEY = MY_NAME.
  IMPORT LINE FROM DATABASE INDX(ST) ID INDXKEY.
  IF SY-SUBRC <> 0.               "Nothing there: I am an initializator
    I_AM = 'I'.
    A_NAME = SY-UNAME.
* Get the list of logged on users
    CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
        ID 'TAB' FIELD USR_TABL-*SYS*.
    WRITE: / 'Recently no one is waiting for you to connect.'.
    WRITE: / 'Doubleclick on a name of an active user, to establish'.
    WRITE: / 'a conversation or choose the green arrow to exit.'.
    SKIP.
    WRITE: /2(8)  'CLIENT',
           10(14) 'USER NAME',
           24(14) 'TRANSACTION',
           38(24) 'LAST DIALOG STEP(AGO)'.
    SKIP.
    SORT USR_TABL BY MANDT BNAME.
    LOOP AT USR_TABL.
      IF NOT USR_TABL-BNAME IS INITIAL AND USR_TABL-BNAME <> SY-UNAME
         AND USR_TABL-MANDT = SY-MANDT.
        TEMP_TIM = USR_TABL-ZEIT.
        CURR_TIM = SY-UZEIT - TEMP_TIM.
        WRITE: /2(8)  USR_TABL-MANDT,
               10(14) USR_TABL-BNAME,
               24(14) USR_TABL-TCODE,
               38(24) CURR_TIM.
        HIDE: USR_TABL-BNAME, USR_TABL-MANDT.
      ENDIF.
    ENDLOOP.
    CLEAR USR_TABL.
  ELSE.                                "I am a responder
    I_AM = 'R'.
    A_NAME = LINE.
    B_NAME = SY-UNAME.
    AB_NAME = A_NAME.
    AB_NAME+11 = B_NAME.
    CONDENSE AB_NAME NO-GAPS.
    BA_NAME = B_NAME.
    BA_NAME+11 = A_NAME.
    CONDENSE BA_NAME NO-GAPS.
* B sends an answer to A
    DELETE FROM INDX WHERE RELID = 'ST' AND
                           SRTFD = B_NAME.
    CLEAR LINE.
    EXPORT LINE TO DATABASE INDX(ST) ID AB_NAME.
    LINE = 'How are you?'.
    EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
    COMMIT WORK AND WAIT.
* B calls the display program
    EXPORT I_AM A_NAME B_NAME AB_NAME BA_NAME TO MEMORY ID 'AAA'.
    SUBMIT ZPOPUPDE VIA SELECTION-SCREEN.
  ENDIF.                               "responder/initializator

* When a user is selected:
AT LINE-SELECTION.
* Double click
  IF NOT USR_TABL-BNAME IS INITIAL.    " When a partner is selected
* Set up my variables
    B_NAME = USR_TABL-BNAME.
    AB_NAME = A_NAME.
    AB_NAME+11 = B_NAME.
    CONDENSE AB_NAME NO-GAPS.
    BA_NAME = B_NAME.
    BA_NAME+11 = A_NAME.
    CONDENSE BA_NAME NO-GAPS.
* Construct the popup message
    MESSAGE = 'User'.
    MESSAGE+5(12) = SY-UNAME.
    MESSAGE+18(44) = 'would like to start a conversation with you.'.
    MESSAGE+63(34) = 'Please run transaction ZPOP. Time:'.
    MESSAGE+98(2) = SY-UZEIT.
    MESSAGE+100(1) = ':'.
    MESSAGE+101(2) = SY-UZEIT+2(2).
    MESSAGE+103(1) = ':'.
    MESSAGE+104(2) = SY-UZEIT+4(2).
    MESSAGE+106(10) = ' (Pacific)'.
* A sends the popup window to B
    CALL FUNCTION 'TH_POPUP'
         EXPORTING
              CLIENT         = USR_TABL-MANDT
              USER           = USR_TABL-BNAME
              MESSAGE        = MESSAGE
         EXCEPTIONS
              USER_NOT_FOUND = 1.
* A initializes the comunication: write to B, AB, BA.
    LINE = A_NAME.
    EXPORT LINE TO DATABASE INDX(ST) ID B_NAME.
    LINE = 'HELLO'.
    EXPORT LINE TO DATABASE INDX(ST) ID AB_NAME.
    CLEAR LINE.
    EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
    COMMIT WORK AND WAIT.
* Wait for the reply for 60 seconds, display a status and check INDX
    TIM = SY-UZEIT.
    TIM = TIM + 60.
    DO.
      GET TIME.
      DTIM = TIM - SY-UZEIT.
      IF TIM < SY-UZEIT.
* No answer from B: clean INDX
        DELETE FROM INDX WHERE RELID = 'ST' AND
                               SRTFD = B_NAME.
        DELETE FROM INDX WHERE RELID = 'ST' AND
                               SRTFD = AB_NAME.
        DELETE FROM INDX WHERE RELID = 'ST' AND
                               SRTFD = BA_NAME.
        COMMIT WORK AND WAIT.
        EXIT.
      ENDIF.
* A displays a progress indicator while waiting
      A = 'Waiting for'.
      A+12(12) = USR_TABL-BNAME.
      A+25(27) = 'to respond. Remaining time:'.
      A+53(8) = DTIM.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
           EXPORTING
                PERCENTAGE = ''
                TEXT       = A.
* A waits for the answer of B: reading BA
      IMPORT LINE FROM DATABASE INDX(ST) ID BA_NAME.
* An answer has come from B
      IF NOT LINE IS INITIAL.
        CLEAR LINE.
        EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
        EXPORT LINE TO DATABASE INDX(ST) ID BA_NAME.
        COMMIT WORK AND WAIT.
        ESTABLISHED = '1'.
        EXIT.
      ENDIF.
    ENDDO.
* Answer has come: wait for 4 seconds, the start the terminal module
    IF ESTABLISHED = '1'.
      TIM = SY-UZEIT.
      TIM = TIM + 4.
      DO.
        GET TIME.
        DTIM = TIM - SY-UZEIT.
        IF TIM < SY-UZEIT.
          EXIT.
        ENDIF.
      ENDDO.
      EXPORT I_AM A_NAME B_NAME AB_NAME BA_NAME TO MEMORY ID 'AAA'.
      SUBMIT ZPOPUPDE VIA SELECTION-SCREEN.
* No answer has come
    ELSE.
      WRITE: / 'Partner does not answer.'.
    ENDIF.
  ENDIF.
  CLEAR USR_TABL.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> Security and Monitoring All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.