Como lider de proyecto, hay situaciones en las cuales requerimos enviar un mensaje a un usuario pero por alguna circustancia no tenemos manera de comunicarnos con él. Para ello, les dejo mi código ABAP que hace uso de la función TH_POPUP que permite envÃar un mensaje POP-UP a un usuario en particular que se encuentre dentro del mismo mandante y ambiente.
Por ejemplo, si requieres modificar valores de una tabla Z por medio de la transacción SM30 pero hay otro usuario que tiene bloqueados los datos (Esta dentro de la transacción SM30 modificando los datos), podemos enviarle un mensaje solicitando el favor de finalizar su modificación para asà poder modificarlos nosotros.
Para ejecutar el programa, solo copia el siguiente codigo en SAP bajo el nombre ZMENSAJES
*&---------------------------------------------------------------------*
*& Proyecto...: Envio de mensajes entre usuarios *
*& Programa...: ZMENSAJES *
*& Autor......: Luis Alberto Rojas Ayllón *
*& Detalle....: El programa permite seleccionar los usuarios a los *
*& que se les desea enviar un mensaje, asi como tambien *
*& visualizar los distintos modos activos que tiene en *
*& el momento. *
*&---------------------------------------------------------------------*
REPORT ZMENSAJES.
TYPE-POOLS:
icon,
rsfs,
rsds,
slis.
TABLES:
sscrfields, "Campos en las Imagenes de Seleccion
t000, "Mandantes
usr01. "Maestro de usuarios
*----------------------------------------------------------------------*
* PARAMETROS
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE tit1.
SELECTION-SCREEN: BEGIN OF LINE.
* Boton de seleccion de usuario en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 1(40) btn USER-COMMAND sel
VISIBLE LENGTH 15.
* Boton de borrar texto en la DYNPRO.
SELECTION-SCREEN: PUSHBUTTON 20(60) btn1 USER-COMMAND clr
VISIBLE LENGTH 1.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: SKIP.
SELECTION-SCREEN: BEGIN OF LINE,
COMMENT 1(15) text1,
POSITION 20.
PARAMETERS: p_popmsg LIKE sm04dic-popupmsg "Texto ventana diálogo
LOWER CASE.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE,
COMMENT 1(15) text2,
POSITION 20.
PARAMETERS: p_cant(1) TYPE n. "Cantidad de mensajes
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK blk1.
*-----------------------------------------------------------------------
* DEFINICION DE VARIABLES, ESTRUCTURAS Y TABLAS INTERNAS.
*-----------------------------------------------------------------------
DATA: BEGIN OF ti_out OCCURS 0,
sel LIKE sy-input,
tid LIKE uinfo-tid,
zeit LIKE uinfo-zeit,
mandt LIKE sy-prefx, "uinfo-mandt,
bname LIKE uinfo-bname,
name_first LIKE adrp-name_first,
name_last LIKE adrp-name_last,
term LIKE uinfo-term,
tcode LIKE uinfo-tcode,
extmodi LIKE uinfo-extmodi,
END OF ti_out.
* Copia de la tabla de usuarios.
DATA: BEGIN OF ti_out1 OCCURS 0,
sel LIKE sy-input,
tid LIKE uinfo-tid,
zeit LIKE uinfo-zeit,
mandt LIKE sy-prefx, "uinfo-mandt,
bname LIKE uinfo-bname,
name_first LIKE adrp-name_first,
name_last LIKE adrp-name_last,
term LIKE uinfo-term,
tcode LIKE uinfo-tcode,
extmodi LIKE uinfo-extmodi,
END OF ti_out1.
DATA:
ti_uinfo LIKE uinfo OCCURS 0 WITH HEADER LINE,
ti_modos LIKE uinfo2 OCCURS 0 WITH HEADER LINE.
*********************************************************************
* DEFINICION DE Estructuras y tablas para ALV (FM).
*********************************************************************
*====================================================================
DATA:
wa_cat TYPE slis_fieldcat_alv, " WA catálogo
ti_cat TYPE slis_t_fieldcat_alv, " TI catálogo
ti_cat1 TYPE slis_t_fieldcat_alv, " TI catálogo
wa_sort TYPE slis_sortinfo_alv, " WA sort
ti_sort TYPE slis_t_sortinfo_alv, " TI sort
wa_layout TYPE slis_layout_alv, " WA opciones lista
wa_events TYPE slis_alv_event, " WA eventos lista
ti_events TYPE slis_t_event, " TI eventos lista
wa_header TYPE slis_listheader, " WA cabecera lista
ti_header TYPE slis_t_listheader. " TI cabecera lista
*-----------------------------------------------------------------------
* INICIALIZACION DE VARIABLES
*-----------------------------------------------------------------------
INITIALIZATION.
* Creo la visualizacion del boton de seleccion de usuario en la
* DYNPRO.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = icon_select_block
text = 'Sel. Usuario'
info = 'Sel. Usuario'
IMPORTING
RESULT = btn
EXCEPTIONS
OTHERS = 0.
* Creo la visualizacion del boton de borrar texto en la
* DYNPRO.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = icon_delete
text = 'Borrar texto'
info = 'Borrar texto'
IMPORTING
RESULT = btn1
EXCEPTIONS
OTHERS = 0.
tit1 = 'Envio de mensajes:'.
text1 = 'Texto'.
text2 = 'Cant.mensajes'.
p_cant = 1.
*-----------------------------------------------------------------------
* AT SELECTION-SCREEN
*-----------------------------------------------------------------------
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'SEL'.
PERFORM value_req.
WHEN 'CLR'.
* Borro el texto cargado.
CLEAR p_popmsg.
WHEN OTHERS.
* Do Nothing !!.
ENDCASE.
*-----------------------------------------------------------------------
* TRATAMIENTO DE DATOS DEL PROGRAMA PRINCIPAL
*-----------------------------------------------------------------------
START-OF-SELECTION.
PERFORM validar_datos.
PERFORM enviar_msg.
*----------------------------------------------------------------------*
* DECLARACION DE SUBRUTINAS
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form validar_datos
*&---------------------------------------------------------------------*
* Valido los datos.
*----------------------------------------------------------------------*
FORM validar_datos .
* Verifico si ingresaron algun texto.
IF p_popmsg IS INITIAL.
MESSAGE s893(pz) WITH 'Ingrese texto.'.
STOP.
ENDIF.
* Verifico si ingresaron cantidad.
IF p_cant IS INITIAL.
MESSAGE s893(pz) WITH 'Ingrese cantidad.'.
STOP.
ENDIF.
IMPORT ti_out FROM MEMORY ID sy-repid.
READ TABLE ti_out WITH KEY sel = 'X'.
IF ti_out[] IS INITIAL OR sy-subrc NE 0.
MESSAGE s893(pz) WITH 'Seleccione usuarios.'.
STOP.
ENDIF.
ENDFORM. " validar_datos
*&---------------------------------------------------------------------*
*& Form enviar_msg
*&---------------------------------------------------------------------*
* Armo el POP-UP para los usuarios seleccionados.
*----------------------------------------------------------------------*
FORM enviar_msg .
DATA:
l_cant TYPE i,
l_user TYPE string,
l_text TYPE string.
CLEAR l_cant.
* Elimino los usuarios repetidos.
SORT ti_out BY bname sel.
DELETE ADJACENT DUPLICATES FROM ti_out COMPARING bname sel.
DO p_cant TIMES.
ADD 1 TO l_cant.
LOOP AT ti_out WHERE sel EQ 'X'.
SELECT SINGLE *
FROM t000
WHERE mandt EQ ti_out-mandt.
* Verifico si el mandante es correcto.
CHECK sy-subrc EQ 0.
SELECT SINGLE *
FROM usr01
CLIENT SPECIFIED
WHERE mandt EQ ti_out-mandt
AND bname EQ ti_out-bname.
* Verifico si el usuario es correcto.
CHECK sy-subrc EQ 0.
CALL FUNCTION 'TH_POPUP'
EXPORTING
client = ti_out-mandt
user = ti_out-bname
MESSAGE = p_popmsg
EXCEPTIONS
user_not_found = 1
OTHERS = 2.
CHECK sy-subrc IS INITIAL.
CHECK l_cant EQ 1.
CONCATENATE ti_out-bname l_user INTO l_user SEPARATED BY space.
CONCATENATE 'Enviado a:' l_user INTO l_text SEPARATED BY space.
PERFORM progress USING l_text.
ENDLOOP.
ENDDO.
MESSAGE s208(00) WITH l_text.
ENDFORM. " enviar_msg
*&---------------------------------------------------------------------*
*& Form value_req
*&---------------------------------------------------------------------*
* Visualizo la lista de usuario.
*----------------------------------------------------------------------*
FORM value_req .
DATA:
l_repid LIKE sy-repid.
l_repid = sy-repid.
PERFORM obtener_usuarios.
PERFORM construir_catalogo.
PERFORM definir_layout USING 'TI_OUT'
CHANGING wa_layout.
PERFORM construir_eventos.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = l_repid
is_layout = wa_layout
it_fieldcat = ti_cat
i_default = 'X'
i_save = 'A'
it_events = ti_events
TABLES
t_outtab = ti_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
EXPORT ti_out TO MEMORY ID sy-repid.
ENDFORM. " value_req
*&---------------------------------------------------------------------*
*& Form construir_catalogo
*&---------------------------------------------------------------------*
* Construir catalogo de campos para ALV
*----------------------------------------------------------------------*
FORM construir_catalogo .
DATA:
l_repid LIKE sy-repid.
REFRESH: ti_cat.
l_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = l_repid
i_internal_tabname = 'TI_OUT'
i_inclname = l_repid
CHANGING
ct_fieldcat = ti_cat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
* Asignar atributos de campo en el catalogo de reporte ALV
PERFORM asignar_campo_a_catalogo TABLES ti_cat
USING:
'SEL' 'X' 'X' 'X' 'X' ' ' 'Sel',
'MANDT' 'X' ' ' ' ' ' ' ' ' 'Mandante',
'BNAME' 'X' ' ' ' ' ' ' 'X' ' ',
'NAME_FIRST' 'X' ' ' ' ' ' ' 'X' ' ',
'NAME_LAST' 'X' ' ' ' ' ' ' 'X' ' ',
'TERM' ' ' ' ' ' ' ' ' ' ' ' ',
'TID' ' ' ' ' ' ' ' ' ' ' ' ',
'TCODE' ' ' ' ' ' ' ' ' 'X' ' ',
'EXTMODI' ' ' ' ' ' ' ' ' ' ' ' ',
'ZEIT' ' ' ' ' ' ' ' ' ' ' ' '.
ENDFORM. " construir_catalogo
*&---------------------------------------------------------------------*
*& Form asignar_campo_a_catalogo
*&---------------------------------------------------------------------*
* Asignar campo al catalogo ALV
*----------------------------------------------------------------------*
* -->P_FIELDNAME Nombre de campo en el reporte
* -->P_KEY Indicador 'campo clave'
* -->P_COL_POS N° columna
*----------------------------------------------------------------------*
FORM asignar_campo_a_catalogo TABLES pt_cat STRUCTURE wa_cat
USING p_fieldname LIKE wa_cat-fieldname
p_key LIKE wa_cat-key
p_col_pos TYPE c
p_input LIKE wa_cat-input
p_checkbox LIKE wa_cat-checkbox
p_hotspot LIKE wa_cat-hotspot
p_reptext_ddic LIKE wa_cat-reptext_ddic.
STATICS l_col_pos LIKE sy-cucol.
* Asignar atributos de campo en el catalogo de cabecera ALV
CLEAR wa_cat.
READ TABLE pt_cat INTO wa_cat
WITH KEY fieldname = p_fieldname.
CHECK sy-subrc EQ 0.
CLEAR wa_cat-tech.
IF NOT p_reptext_ddic IS INITIAL.
wa_cat-seltext_l = wa_cat-seltext_m =
wa_cat-seltext_s = wa_cat-reptext_ddic = p_reptext_ddic.
ENDIF.
IF p_col_pos EQ 'X'.
* Inicializo el conteo para ordenar las columnas.
l_col_pos = 1.
ELSE.
ADD 1 TO l_col_pos.
ENDIF.
wa_cat-fieldname = p_fieldname.
wa_cat-key = p_key.
wa_cat-col_pos = l_col_pos.
wa_cat-edit = wa_cat-input = p_input.
wa_cat-checkbox = p_checkbox.
wa_cat-hotspot = p_hotspot.
MODIFY pt_cat FROM wa_cat INDEX sy-tabix.
ENDFORM. " asignar_campo_a_catalogo
*&---------------------------------------------------------------------*
*& Form definir_layout
*&---------------------------------------------------------------------*
* Definir atributos del layout de reporte
*----------------------------------------------------------------------*
FORM definir_layout USING p_tabla
CHANGING p_layout TYPE slis_layout_alv .
CLEAR p_layout.
p_layout-zebra = 'X'.
* Marco el campo para la selecion.
p_layout-box_fieldname = 'SEL'.
p_layout-box_tabname = p_tabla.
p_layout-colwidth_optimize = 'X'.
p_layout-no_vline = ' '.
p_layout-no_colhead = ' '.
p_layout-lights_condense = 'X'.
p_layout-detail_popup = 'X'.
p_layout-detail_initial_lines = 'X'.
p_layout-flexible_key = ' '.
p_layout-key_hotspot = ' '.
ENDFORM. " definir_layout
*&---------------------------------------------------------------------*
*& Form construir_eventos
*&---------------------------------------------------------------------*
* Asignar eventos soportados
*----------------------------------------------------------------------*
FORM construir_eventos.
DATA:
l_type(1) TYPE n.
REFRESH: ti_events.
CLEAR: wa_events.
* ALV Simple.
l_type = 0.
* Buscar secciones para eventos
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = l_type
IMPORTING
et_events = ti_events.
* Leer evento 'TOP_OF_PAGE'
READ TABLE ti_events WITH KEY name = slis_ev_top_of_page
INTO wa_events.
* Asignar Rutina FORM 'TOP_OF_PAGE' a evento
IF sy-subrc = 0.
MOVE slis_ev_top_of_page TO wa_events-form.
MODIFY ti_events FROM wa_events INDEX sy-tabix.
ENDIF.
* Leer evento 'USER_COMMAND'
READ TABLE ti_events WITH KEY name = slis_ev_user_command
INTO wa_events.
* Asignar Rutina FORM 'USER_COMMAND' a evento
IF sy-subrc = 0.
MOVE slis_ev_user_command TO wa_events-form.
MODIFY ti_events FROM wa_events INDEX sy-tabix.
ENDIF.
ENDFORM. " construir_eventos
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
* Mostrar cabecera de pagina
*----------------------------------------------------------------------
FORM top_of_page.
* Construir encabezado del reporte
PERFORM llenar_header.
* Mostrar cabecera
PERFORM show_header.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form llenar_header
*&---------------------------------------------------------------------*
* Construir cabecera del reporte
*----------------------------------------------------------------------*
* Valores para TYP ( H = Header, S = Selection, A = Action )
* Cuando TYP = 'H' --> Indicar texto en INFO
* Cuando TYP = 'S' --> Indicar texto con Parámetro en KEY
* Indicar texto con valor en INFO
*----------------------------------------------------------------------*
FORM llenar_header.
REFRESH: ti_header.
CLEAR: wa_header.
wa_header-typ = 'H'.
wa_header-info = 'Seleccione el/los usuario/s:'.
APPEND wa_header TO ti_header.
ENDFORM. " llenar_header
*&---------------------------------------------------------------------*
*& Form show_header
*&---------------------------------------------------------------------*
* Mostrar cabecera
*----------------------------------------------------------------------*
FORM show_header.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = ti_header.
ENDFORM. " show_header
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* Evaluar acciones del usuario
*----------------------------------------------------------------------
FORM user_command USING ucomm LIKE sy-ucomm
sfields TYPE slis_selfield.
DATA: l_objectname TYPE tstc-tcode.
* Rescatar el registro seleccionado.
IF sfields-tabname EQ 'TI_OUT'.
READ TABLE ti_out INDEX sfields-tabindex.
ELSEIF sfields-tabname EQ 'TI_MODOS'.
READ TABLE ti_modos INDEX sfields-tabindex.
ENDIF.
* Seleccion de opcion
CASE ucomm.
* DOUBLE CLICK.
WHEN '&IC1' OR '&ICM'.
* Evaluar valor de campo seleccionado.
CHECK NOT sfields-value IS INITIAL.
CASE sfields-fieldname.
* ########################################################
* ##### Usuario. #####
* ########################################################
WHEN 'BNAME'.
PERFORM obtener_modos.
PERFORM construir_catalogo1.
PERFORM mostrar_listado.
* ########################################################
* ##### Transaccion. #####
* ########################################################
WHEN 'TCODE'.
MOVE sfields-value TO l_objectname.
* Visualizo la transaccion.
CALL FUNCTION 'RS_TRANSACTION_SHOW'
EXPORTING
objectname = l_objectname
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
WHEN OTHERS.
* DO NOTHING !!!
ENDCASE.
WHEN OTHERS.
* DO NOTHING !!!
ENDCASE.
IF sfields-tabname EQ 'TI_OUT'.
* Hago el refresh de los usuarios en el ALV.
PERFORM obtener_usuarios.
sfields-refresh = 'X'.
ENDIF.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*& Form obtener_modos
*&---------------------------------------------------------------------*
* Obtengo los modos correspondientes al usuario y mandante.
*----------------------------------------------------------------------*
FORM obtener_modos .
REFRESH ti_modos.
CALL FUNCTION 'TH_LONG_USR_INFO'
EXPORTING
user = ti_out-bname
TABLES
user_info = ti_modos.
* Elimino los mandantes que no corresponden.
DELETE ti_modos WHERE client NE ti_out-mandt
OR terminal NE ti_out-term.
ENDFORM. " obtener_modos
*&---------------------------------------------------------------------*
*& Form construir_catalogo1
*&---------------------------------------------------------------------*
* Construir catalogo de campos para ALV
*----------------------------------------------------------------------*
FORM construir_catalogo1 .
DATA:
l_repid LIKE sy-repid.
REFRESH: ti_cat1.
l_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = l_repid
i_internal_tabname = 'TI_MODOS'
i_inclname = l_repid
CHANGING
ct_fieldcat = ti_cat1
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
* Asignar atributos de campo en el catalogo de reporte ALV
PERFORM asignar_campo_a_catalogo TABLES ti_cat1
USING:
'SESSION' 'X' 'X' ' ' ' ' ' ' ' ',
'CLIENT' 'X' ' ' ' ' ' ' ' ' ' ',
'USER' 'X' ' ' ' ' ' ' ' ' ' ',
'TERMINAL' ' ' ' ' ' ' ' ' ' ' ' ',
'MODE' ' ' ' ' ' ' ' ' ' ' ' ',
'TCODE' ' ' ' ' ' ' ' ' 'X' ' ',
'TIME' ' ' ' ' ' ' ' ' ' ' 'Hora',
'LANG' ' ' ' ' ' ' ' ' ' ' ' '.
ENDFORM. " construir_catalogo1
*&---------------------------------------------------------------------*
*& Form mostrar_listado
*&---------------------------------------------------------------------*
* Visualizo los modos del usuario.
*----------------------------------------------------------------------*
FORM mostrar_listado .
DATA:
l_repid LIKE sy-repid,
l_selfield TYPE slis_selfield,
l_exit.
l_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
EXPORTING
i_title = 'Modos:'
i_selection = ' '
i_zebra = 'X'
i_tabname = 'TI_MODOS'
it_fieldcat = ti_cat1
i_callback_program = l_repid
i_callback_user_command = 'USER_COMMAND'
IMPORTING
es_selfield = l_selfield
e_exit = l_exit
TABLES
t_outtab = ti_modos
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " mostrar_listado
*&---------------------------------------------------------------------*
*& Form progress
*&---------------------------------------------------------------------*
* Visualizo el mensaje de texto.
*----------------------------------------------------------------------*
* -->P_TEXT Texto
*----------------------------------------------------------------------*
FORM progress USING p_text TYPE string.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = p_text.
ENDFORM. " progress
*&---------------------------------------------------------------------*
*& Form obtener_usuarios
*&---------------------------------------------------------------------*
* Obtengo los usuarios logueados en el sistema.
*----------------------------------------------------------------------*
FORM obtener_usuarios .
DATA: BEGIN OF lt_user OCCURS 0,
mandt TYPE usr21-mandt,
bname TYPE usr21-bname,
persnumber TYPE usr21-persnumber,
name_first TYPE adrp-name_first,
name_last TYPE adrp-name_last,
END OF lt_user.
IMPORT ti_out FROM MEMORY ID sy-repid.
ti_out1[] = ti_out[].
CLEAR ti_out.
REFRESH: ti_out, ti_uinfo.
* Obtengo la lista de usuarios conectados por mandante.
CALL FUNCTION 'TH_USER_LIST'
TABLES
list = ti_uinfo.
IF ti_uinfo[] IS NOT INITIAL.
* Obtengo los nombres de los usuarios.
SELECT a~mandt a~bname a~persnumber b~name_first b~name_last
INTO CORRESPONDING FIELDS OF TABLE lt_user
FROM usr21 AS a INNER JOIN adrp AS b
ON a~persnumber = b~persnumber
AND a~mandt = b~client
CLIENT SPECIFIED
FOR ALL ENTRIES IN ti_uinfo
WHERE a~mandt EQ ti_uinfo-mandt
AND a~bname EQ ti_uinfo-bname.
ENDIF.
LOOP AT ti_uinfo.
CLEAR ti_out.
MOVE-CORRESPONDING ti_uinfo TO ti_out.
READ TABLE ti_out1 WITH KEY tid = ti_out-tid
mandt = ti_out-mandt
bname = ti_out-bname
term = ti_out-term
sel = 'X'.
* Marco los usuarios marcados con anterioridad.
IF sy-subrc IS INITIAL.
MOVE 'X' TO ti_out-sel.
ELSE.
CLEAR ti_out-sel.
ENDIF.
* Cargo el nombre del usuario.
READ TABLE lt_user WITH KEY mandt = ti_out-mandt
bname = ti_out-bname.
IF sy-subrc IS INITIAL.
MOVE:
lt_user-name_first TO ti_out-name_first,
lt_user-name_last TO ti_out-name_last.
ENDIF.
APPEND ti_out.
ENDLOOP.
SORT ti_out BY mandt bname.
ENDFORM. " obtener_usuarios
Una vez creado el programa, presionas F8 para ejecutarlo y les aparecera la siguiente pantalla:
Para seleccionar uno o mas usuarios al cual deseamos enviarle un mensaje, presionamos el botón Sel. Usuario
Nos aparecera una pantalla con todos los usuarios conectados, ubicamos el usuario que deseamos enviar el mensaje y marcamos el check box como indica la figura. (Si se desea enviar a mas de uno, marcamos los otros usuarios)
Si hacemos doble click en el usuario, nos aparecera una pantalla donde nos indica los modos activos que tiene el usuario.
Una vez, seleccionado el o los usuarios deseados, presionamos la flecha de retorno (Según imagen) para regresar a la pantalla principal.
Acto seguido, presionamos F8 o el botón de ejecutar. Con ello, el programa procedera a enviar los mensajes.
A través de estos mensajes, podemos avisar de tareas de mantenimiento, actualizaciones, problemas con algún módulo o cualquier aspecto relevante para que sea conocido por todos los usuarios del sistema. El mensaje se muestra como una ventana emergente cuando el usuario interactua con el sistema Sap.