Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
antonio_puebla
Explorer

Hola :smile: , este es mi primer aporte, a ver que les parece.

A veces es interesante poder enviar "popups" inmediatos a un cierto usuario conectado a SAP y que además se muestran por encima de otras pantallas en Windows que tenga abiertas. Por ejemplo para el aviso de una tarea en un ciclo o acción que deba realizar de inmediato.

ABAP tiene la función estándar "TH_POPUP" para este proceso. La función es sumamente sencilla, se pueden ver todo los parámetros con la se37 "Function Builder" y hacer un test. Esta función sólo enviará el mensaje en el popup, si el usuario destinatario está conectado a SAP, es decir, si no está conectado no hay un aviso posterior del mensaje enviado al abrir sesión en SAP.

Los parámetros esenciales de llamada son los siguientes:

CALL FUNCTION 'TH_POPUP' DESTINATION servidor_del_usuario_logado

  EXPORTING

      client = sy-mandt

      user = ID_usuario_destino

      MESSAGE = texto

      cut_blanks = 'X'

EXCEPTIONS

      user_not_found = 3.

Saber si se ha logrado mostrar el popup es sencillo con la excepción "user_not_found". Si no está conectado se le puede enviar un email externo o interno en SAP por ejemplo.

Lo complicado es como encontrar el usuario si está conectado si tenemos varios servidores SAP que permiten logarse. Si sólo tenemos un servidor de login con la llamada a la función “'TH_POPUP'” serviría y sin usar "DESTINATION" funcionaría en todos los casos.

Cuando tenemos varios servidores para decidir el servidor al que enviaremos el mensaje se usa el parámetro "DESTINATION", si no lo indicamos lo enviará al servidor en el que corre el proceso que desencadena la llamada de la función. Por lo que si el usuario está en el mismo servidor le llegará el mensaje y sino no.

Por ejemplo tenemos los servidores SAP1 y SAP2 con distribución de logins, un usuario puede estar en cualquiera de los dos. Si enviamos el mensaje al usuario correcto pero en el servidor erróneo el mensaje no le llegará.

Para encontrar donde está logado un usuario concreto se debe hacer un muestreo de los servidores para averiguar donde se logó, si es que está logado.

Primero debemos saber cuántos servidores posibles tenemos, mediante la función "RFC_GET_LOCAL_DESTINATIONS". Nos dará los nombres en “localdest” como una lista.

CALL FUNCTION 'RFC_GET_LOCAL_DESTINATIONS'

TABLES

      localdest = servidores_destino.

Lo siguiente es averiguar en cual de la lista de servidores destino está logado. Para ello podemos usar la función "THUSRINFO" añadiendo los servidores de destino que encontramos anteriormente en “DESTINATION” al llamar a la función "THUSRINFO". La función nos da una lista de usuarios conectados con la estructura "UINFO", donde nos interesa el campo "BNAME" que contiene el "ID de usuario" y el campo "TYPE" que sea igual a 4 para que sea una sesión de diálogo. En el campo "MAN" tendremos también el mandante donde está logado por si se necesita, creo que con un simple sy-mandt en la función serviría para cualquier caso.

Ejemplo sencillo para ver la estructura del programa:

ID_usuario_buscado es el ID del usuario que buscamos.

servidor_donde_esta_logado = 'NO_ENCONTRADO".

CALL FUNCTION 'RFC_GET_LOCAL_DESTINATIONS'

TABLES

      localdest = servidores_destino.

LOOP AT servidores_destino.

     CALL FUNCTION 'THUSRINFO' DESTINATION servidores_destino-RFCDEST

          TABLES

          usr_tabl = lista_usuarios_en_el_servidor.

  

     LOOP AT lista_usuarios_en_el_servidor where BNAME = ID_usuario_buscado AND TYPE = 4.

          servidor_donde_esta_logado = servidores_destino-RFCDEST.

     ENDLOOP.

ENDLOOP.

if servidor_donde_esta_logado <> 'NO_ENCONTRADO".

*Mensaje al ID de usuario

     CALL FUNCTION 'TH_POPUP' DESTINATION servidor_donde_esta_logado

          EXPORTING

          client = sy-mandt

          user = ID_usuario_buscado

          MESSAGE = texto_mensaje

          cut_blanks = 'X'

     EXCEPTIONS

          user_not_found = 3.

  

if sy-subrc = 3.

*Por alguna razón no se pudo mostrar el popup

*EJEMPLO LLAMADA AL ENVIO DE EMAIL.

else.

*No hay existe el usuario con el ID de usuario buscado logado

*LLAMADA AL ENVIO DE EMAIL.

endif.

2 Comments