Recursos y curiosidades de la programación CL - Parte II
Conozca una de las herramientas en la programación CL para la comunicación entre programas y usuarios de AS400: Comando SNDUSRMSG.
En muchas ocasiones, durante la ejecución de un programa es necesario solicitar datos al usuario para alimentar al programa con determinada información. El comando SNDUSRMSG es una excelente alternativa de comunicación entre un programa y el usuario que lo ejecuta. Posee parámetros que permiten realizar el envío de mensajes con características variadas, solicitando respuesta y validándola . Este comando sólo puede utilizarse dentro de programas CL (no puede ser ejecutado desde línea de comandos). Utilizando SNDUSRMSG se puede enviar mensajes tanto a usuarios como a la cola de mensajes externa (*EXT) facilitando la comunicación con los programas. Algunas de sus posibilidades son (los conceptos relacionados serán ampliados en la siguiente sección):
- Envío de mensajes improvisados o predefinidos.El tipo de mensaje a enviar puede ser informativo o solicitar una respuesta.
- El destino de los mensajes puede ser un usuario, una cola de mensajes en particular, o la cola de mensajes *EXT.
- Puede capturarse la respuesta a un mensaje, definir las respuestas válidas, y también la respuesta default. Esta es una de sus posibilidades más destacadas. A través de mensajes de consulta, se puede solicitar información al usuario y procesarla dentro del programa.
En otras secciones del presente tip se ejemplificará el uso de SNDUSRMSG.
Conceptos importantes sobre envío de mensajes con SNDUSRMSG
Existe una serie de conceptos que es importante clarificar para poder utilizar el comando SNDUSRMSG con todas sus posibilidades. Estos son:
- Mensajes improvisados y mensajes predefinidos: Los mensajes improvisados son aquellos cuyo texto está contenido dentro del programa que envía el mensaje. Cuando se necesita modificar el texto del mensaje, es necesario también recompilar el programa.
- Tipo de mensaje: todo mensaje que se envía tiene un tipo asociado ( palabra clave MSGTYPE). Pueden enviarse mensajes de tipo *INFO (informativos) o *INQ (solicitan una respuesta).
- Destinos del mensaje: Entre los destinos permitidos para los mensajes existen:
- colas de mensajes almacenadas como objetos de tipo *MSGQ dentro de cualquier biblioteca.
- colas de mensajes *EXT.
Para el caso de las primeras, las posibilidades son: enviar mensajes a un usuario determinado, a una cola de mensajes en particular o al operador del sistema (valor *SYSOPR). Los parámetros que habilitan estas opciones son A cola de mensajes (palabra clave TOMSGQ) y A perfil de usuario (palabra clave TOUSR).
La cola de mensajes externa o *EXT es creada por el sistema, una para cada trabajo activo, y eliminada cuando el trabajo finaliza. Pueden enviarse a ella tanto mensajes de tipo *INFO y también *INQ. Cuando se envía un mensaje a la cola de mensajes *EXT desde un programa que se ejecuta de manera interactiva, se interrumpe la ejecución del programa, aparece la pantalla 'Visualizar mensajes de programa' y si el mensaje enviado es de tipo *INQ, se abre una línea para ingresar la respuesta deseada. Para enviar mensajes a la cola de mensajes externa, se utiliza el parámetro A cola de mensajes (palabra clave TOMSGQ) con valor *EXT.
Todo mensaje que se envía a esta cola de mensajes (informativo o de consulta), junto con la respuesta dada, quedan almacenados en esta cola de mensajes y también en la joblog. El envío de mensajes a la cola de mensajes externa es una excelente herramienta para documentar a través de la joblog, tanto el envío del mensaje como la respuesta ingresada por el usuario.
En las siguientes secciones se ejemplificará el uso del mandato SNDUSRMSG.
El comando SNDUSRMSG
La siguiente pantalla muestra tres ejemplos de utilización del comando SNDUSRMSG dentro de un programa CL:
En los ejemplos que se detallarán, se explicarán distintos usos del comando SNDUSRMSG: mensajes improvisados y predefinidos, de tipo informativo o consulta, con variables dentro del texto y hacia diferentes destinos.
La primer parte del programa realiza las declaraciones de las variables que se utilizarán posteriormente. En el primer párrafo se recupera la fecha del sistema, se le agregan los separadores, y por último se recupera el nombre del usuario que ejecuta el programa.
En el segundo párrafo se envía un mensaje predefinido, a la cola de mensajes externa, y la respuesta se almacena en la variable &RESP. La creación de archivos de mensajes se realiza con el comando CRTMSGF. Luego se puede proceder a incorporar definiciones dentro de él. El mensaje predefinido de código USR0006 fue incorporado al archivo de mensajes con el comando:
ADDMSGD MSGID(USR0006) MSGF(TEKTCL/MENSAJES)
MSG('Confirma el comienzo de la operación de backup ? (S/N)')LEN(1)
VALUES(S N 's' 'n') DFT(N)
Cuando el mensaje anterior se envía a la cola de mensajes externa, se detiene la ejecución del programa, aparece el mensaje y se solicita la respuesta al usuario. En la misma pantalla se valida la respuesta según los atributos de respuesta válidas definidos para el mensaje. Si el usuario no responde al mensaje y presiona F3 o F12 o Intro, automáticamente se contestará con la respuesta default. Es importante observar que el programa no deberá encargarse de la validación de la respuesta, sólo procesará las respuestas ya validadas previamente en la pantalla anterior.
Luego se comienza a procesar la respuesta almacenada en la variable &RESP.
En el tercer párrafo, también se envía un mensaje predefinido, de tipo informativo y a la cola de mensajes externa. El mensaje predefinido de código USR0007 fue incorporado al archivo de mensajes con el comando:
ADDMSGD MSGID(USR0007) MSGF(TEKTCL/MENSAJES)
MSG('Operación de backup no confirmada en la fecha &1 por el usuario &2') FMT((*CHAR 8) (*CHAR 10)) TYPE(*NONE) LEN(*NONE)
El mensaje predefinido de código USR0007 no solicita respuesta, pero tiene dentro de su texto variables (&1 y &2) que deberán ser "cargadas" en el momento del envío. El parámetro FMT define el tipo y longitud de cada una de las variables instanciadas. La información que se desea relacionar con estas variables se ingresa en forma de constantes o variables del programa CL dentro del mandato SNDUSRMSG en el parámetro MSGDTA.
En el cuarto párrafo, se utiliza SNDUSRMSG para enviar un mensaje improvisado. A través del parámetro VALUES se definen las respuestas que serán aceptadas como válidas y con DFT la respuesta default. La respuesta se almacenará en la variable &RESP y el destinatario es el operador del sistema. Cuando este mensaje se envía, la pantalla queda inhibida y al pie de la pantalla aparece el mensaje 'Está esperándose una respuesta al mensaje en la cola de mensajes QSYSOPR'. Con petición de sistema y opción 6 se responde al mensaje, y luego la ejecución del programa continúa. Todo mensaje que se envía a la cola de mensajes del operador y la respuesta ingresada, queda documentada en el history log.
Como se puede observar en los ejemplos anteriores, el mandato SNDUSRMSG es una herramienta sencilla de usar. A través de los parámetros que ofrece, se puede implementar el envío de mensajes que soliciten respuestas sin necesidad de definir una pantalla (recordar que en un programa CL se puede declarar solamente un archivo); si la definición del comando está provista de atributos de validación de respuesta, el programa no necesitará realizar esta tarea; y el destinatario puede ser un usuario a seleccionar o la cola de mensajes externa.
Para tener en cuenta...
- Cuando se utilizan mensajes improvisados, debe considerar que al cambiar el texto del mensaje escrito dentro del fuente del programa, deberá luego recompilarse el programa.
- Los comandos SNDMSG y SNDBRKMSG pueden utilizarse dentro de programas CL, pero están orientados al envío de mensajes entre usuarios.
- Si se solicitan datos desde un programa a través de una pantalla, el objeto de tipo *FILE con atributo DSPF deberá declararse. Sólo un archivo puede declararse por programa CL.
- La modificación del texto de un mensaje predefinido no necesita la recompilación de los programas que lo utilicen.
- El parámetro Tabla de conversión permite traducir la respuesta válida ingresada. La tabla que se utiliza por omisión, QSYSTRNTBL de la biblioteca QSYS, permite traducir de minúsculas a mayúsculas. De esta manera, el programa sólo chequea valores en mayúsculas.
Observar que cuando se envía un mensaje predefinido que posee variables en su texto, los valores se caragarán en el parámetro MSGDTA y relacionándolos con el operador de cadena de caracteres *CAT.
Copyright Teknoda S.A.
IMPORTANTE: “Notas técnicas de AS/400 - IBM i" se envía con frecuencia variable y sin cargo como servicio a nuestros clientes IBM i - AS/400. Contiene notas/tutoriales/artículos técnicos desarrollados en forma totalmente objetiva e independiente. NS iTech - Teknoda es una organización de servicios de tecnología informática y NO comercializa hardware, software ni otros productos. |