|
Avisos a usuarios que estén ejecutando una transacción
REPORT ZAVISO_GENERAL .
*Lista de usuarios activos utilizando una transación
TABLES:
TSTC,
TSTCT.
DATA: OPCODE TYPE X,
MSG_LENGTH like sy-index,
LOC_CUT_BLANKS TYPE X VALUE 1.
DATA: BEGIN OF USR_TABL OCCURS 10.
INCLUDE STRUCTURE UINFO.
INCLUDE STRUCTURE rfchosts.
DATA: END OF USR_TABL.
DATA: BEGIN OF USR_LISTE OCCURS 10.
INCLUDE STRUCTURE UINFO.
DATA: END OF USR_LISTE.
DATA: BEGIN OF desti OCCURS 100.
INCLUDE STRUCTURE rfchosts.
DATA: END OF desti.
data: begin of g_aviso occurs 0.
include structure zaviso.
data: end of g_aviso.
SELECT-OPTIONS: S_TCODE FOR TSTC-TCODE.
PARAMETERS: P_MSG(128) DEFAULT 'Mensaje...' lower case.
START-OF-SELECTION.
CLEAR USR_TABL.
FREE USR_TABL.
* Buscamos los destinos lógicos del sistema.
CALL FUNCTION 'RFC_GET_LOCAL_DESTINATIONS'
TABLES
localdest = desti.
* Por cada destino buscamos los usuarios conectados
loop at desti.
REFRESH usr_liste. CLEAR usr_liste.
CALL FUNCTION 'THUSRINFO' DESTINATION desti
TABLES usr_tabl = usr_liste
EXCEPTIONS communication_failure = 17
system_failure = 17.
if sy-subrc eq 0.
loop at usr_liste.
move-corresponding usr_liste to usr_tabl.
usr_tabl-rfcdest = desti-rfcdest.
append usr_tabl.
endloop.
endif.
endloop.
* Recorremos la tabla interna para la transacción dada por pantalla
describe field p_msg length msg_length.
LOOP AT USR_TABL WHERE TCODE IN S_TCODE.
* Mandamos un mensaje a cada uno de los usuairos que este conectado.
g_aviso-mandt = sy-mandt.
g_aviso-usr = usr_tabl-bname.
g_aviso-msg = p_msg.
g_aviso-msg_leng = msg_length.
append g_aviso.
ENDLOOP.
IF SY-SUBRC <> 0.
MESSAGE I001(38) WITH 'NO SE HAN ENCONTRADO USUARIOS CONECTADOS'
' A ESTA TRANSACCIÓN'.
else.
loop at g_aviso.
insert into zaviso values g_aviso.
COMMIT WORK AND WAIT.
endloop.
* Esta función la he tenido que crear yo para poder llamarla con el parámetro
* destination y poder especificarle la máquina en la que quiero que se ejecute.
CALL FUNCTION 'ZSEND_POP_UP' DESTINATION usr_tabl-RFCDEST.
ENDIF.
* La función debe ser Módulo de acceso remoto para poder llamarla con el parámetro
* Destination, lo he hecho accediendo a una tabla de base de datos porque no me salía
* cargando parametros de memoria, y por lo visto estas funciones no dejan pasarle parámetros
* de import.
FUNCTION ZSEND_POP_UP.
*"----------------------------------------------------------------------
*"*"Interfase local
*"----------------------------------------------------------------------
DATA: V_POP_UP(1) TYPE X VALUE 31,
V_CUT_BLANKS TYPE X VALUE 1.
Data: begin of g_zaviso occurs 0.
include structure zaviso.
Data: end of g_zaviso.
SELECT *
appending corresponding fields of table g_zaviso
FROM zaviso.
loop at g_zaviso.
CALL 'ThUsrInfo' ID 'OPCODE' FIELD v_pop_up
ID 'CLIENT' FIELD g_zaviso-mandt
ID 'USR' FIELD g_zaviso-usr
ID 'MSG' FIELD g_zaviso-msg
ID 'MSG_LEN' FIELD g_zaviso-msg_leng
ID 'CUT_BLANKS' FIELD v_cut_blanks.
endloop.
delete zaviso from table g_zaviso.
ENDFUNCTION.
|