SAP Activities
Versión: 1.0.5 · ID: zoan-packages-sap · Autor: Zoan Software
El paquete SAP automatiza SAP GUI for Windows, el cliente de escritorio de SAP. El bot entra al sistema, lanza transacciones, llena campos, pulsa botones y lee lo que SAP muestra —campos, barra de estado, tablas ALV, listas clásicas— igual que una persona frente a la pantalla, pero sin cansarse y a cualquier hora.
Por debajo usa SAP GUI Scripting, la interfaz de automatización oficial de SAP. No trabaja por coordenadas ni reconociendo imágenes: cada campo y cada botón tiene un identificador que genera el propio SAP (por ejemplo wnd[0]/usr/ctxtDATABROWSE-TABLENAME), estable entre ejecuciones, usuarios y equipos.
Requisitos
Sección titulada «Requisitos»El robot corre en Windows con SAP GUI for Windows instalado. Además, el scripting tiene que estar habilitado en los dos extremos:
| Dónde | Qué activar |
|---|---|
| Servidor SAP | El parámetro de perfil sapgui/user_scripting = TRUE (se consulta y cambia con la transacción RZ11). Normalmente lo hace el equipo de Basis. |
| Cliente SAP GUI | En SAP GUI: Options → Accessibility & Scripting → Scripting → Enable scripting. |
Si falta cualquiera de los dos, las actividades fallan con un mensaje que lo dice: SAP GUI responde pero no entrega el motor de scripting.
Además:
- SAP Logon tiene que estar en ejecución (
saplogon.exe). SAP — Attach necesita además una sesión ya iniciada; SAP — Log on abre la conexión por sí solo, pero no lanza el programa: ábrelo antes, por ejemplo con Open App. - El robot y SAP GUI corren en la misma sesión de Windows: el scripting solo ve las ventanas de SAP GUI del usuario con el que corre el robot.
Concepto 1: la sesión
Sección titulada «Concepto 1: la sesión»Todas las actividades trabajan sobre una sesión de SAP (ZoanSapSession): una ventana de SAP GUI ya dentro del sistema. Hay dos formas de conseguirla:
| SAP — Log on | SAP — Attach | |
|---|---|---|
| Qué hace | Abre una conexión del SAP Logon e inicia sesión con usuario y contraseña. | Se engancha a una sesión que ya está abierta. |
| Credenciales | La contraseña sale de una credencial de Zoan Cloud. | No toca credenciales. |
| Cómo elige | Por el nombre de la entrada del SAP Logon (o una cadena /H/servidor/S/3200). | Por sistema (system) y mandante (client); si no pones nada, la primera sesión abierta. |
| Al terminar | Cierra la conexión que abrió (salvo con keepOpen). | Se desengancha y deja SAP abierto tal como estaba. |
| Ideal para | Robots desatendidos que no pueden depender de que alguien deje SAP abierto. | Flujos asistidos, o equipos donde el inicio de sesión lo hace una persona o el SSO. |
Como en Desktop, hay dos maneras de pasar la sesión a las demás actividades:
Opción A — con body (sesión del ámbito)
Sección titulada «Opción A — con body (sesión del ámbito)»Las actividades que pongas dentro del body de SAP — Log on o SAP — Attach heredan la sesión automáticamente; no configuras session en ninguna.
SAP Attach system = "DEV" client = "001" └─ body: SAP Run Transaction code = "SE16" SAP Get Text selector = "wnd[0]/titl" → output: tituloOpción B — sesión en una variable
Sección titulada «Opción B — sesión en una variable»Sin body, la actividad devuelve la sesión en su salida. Luego la pasas en el parámetro session de cada actividad.
SAP Attach system = "DEV" client = "001" → output: sapSAP Run Transaction session = sap code = "SE16"Concepto 2: los selectores de SAP
Sección titulada «Concepto 2: los selectores de SAP»El selector de una actividad de SAP es el id de scripting del elemento, siempre relativo a la sesión. Se lee de izquierda a derecha, de la ventana al control:
| Parte | Qué es |
|---|---|
wnd[0] | La ventana principal. wnd[1], wnd[2]… son ventanas modales (diálogos) encima. |
usr | El área de trabajo de la pantalla (campos, botones, tablas). |
tbar[0] | La barra estándar, donde está el campo de comandos (okcd). |
tbar[1] | La barra de la aplicación (por ejemplo, el botón Ejecutar btn[8]). |
sbar | La barra de estado. |
mbar | La barra de menús. |
El prefijo del último tramo indica el tipo de control: txt/ctxt (campos de texto), btn (botón), chk (casilla), rad (radio), cmb (desplegable), lbl (etiqueta), tbl (tabla clásica), shell (ALV, árboles). Por ejemplo, wnd[0]/usr/ctxtDATABROWSE-TABLENAME es el campo “Table Name” de la transacción SE16.
Tienes dos formas de indicar el selector:
- Capturarlo con el botón de captura del editor de selectores del Designer, señalando el elemento en la ventana de SAP GUI (funciona igual que en UI Discover › Modo escritorio; el Designer detecta que la ventana es de SAP y le pregunta a SAP GUI Scripting).
- Escribirlo o pegarlo como texto, desde
wnd[...]en adelante. Así puedes reutilizar ids que ya tengas, por ejemplo de una grabación del propio SAP GUI.
Si pegas un id absoluto, con el prefijo de conexión y sesión (/app/con[0]/ses[0]/wnd[0]/…, como lo dan el Scripting Tracker o una grabación de SAP GUI), la actividad quita ese prefijo y lo interpreta relativo a la sesión del robot: el número de conexión y de sesión cambia de un equipo a otro, y la sesión ya la eligió SAP — Attach o SAP — Log on. La única excepción: si el prefijo completo apunta a otra sesión que está abierta en ese momento, la actividad falla en lugar de escribir en la sesión equivocada. El Designer también avisa cuando un selector lleva ese prefijo.
Concepto 3: esperas
Sección titulada «Concepto 3: esperas»Las actividades ya esperan por su cuenta, en dos niveles:
- SAP ocupado. Antes y después de cada acción, esperan a que SAP termine de procesar (hasta 60 segundos). No tienes que añadir pausas después de pulsar Enter o un botón.
- El elemento. Las actividades que buscan un elemento por selector lo buscan cada 200 ms hasta que aparece: hasta
elementTimeoutsegundos, que se fija una vez en SAP — Log on o SAP — Attach y viaja con la sesión. Si no lo fijas, vale el tiempo de espera de la configuración del proyecto y, si el proyecto tampoco lo define, 30 segundos. Cada una de esas actividades tiene además su propio parámetrotimeout(en segundos, admite decimales) que manda sobre el del ámbito.
Si SAP sigue ocupado pasados los 60 segundos, la actividad falla con La sesión de SAP sigue ocupada después de 60000 ms.
Con elementTimeout = 0 (o timeout = 0) la actividad falla al primer intento, que es lo que conviene mientras estás depurando un selector.
Concepto 4: la barra de estado
Sección titulada «Concepto 4: la barra de estado»SAP informa de casi todo por la barra de estado: errores, avisos y confirmaciones. Las actividades que disparan acciones (SAP — Press button, SAP — Press toolbar button, SAP — Send key, SAP — ALV toolbar, SAP — Run transaction, entre otras) la leen después de actuar:
- Mensajes de tipo E (error) o A (cancelación): la actividad falla con el texto de SAP.
- Cualquier otro tipo (S, W, I): se registra en el log y el flujo sigue.
Ojo: SAP anuncia cosas importantes con tipo S (éxito), como “No table entries found for specified key”. Si tu flujo depende de eso, léelo con SAP — Read status bar y decide con un If.
Ids fijos que usan las actividades
Sección titulada «Ids fijos que usan las actividades»Algunas actividades trabajan sobre controles estándar de SAP GUI cuyo id es siempre el mismo. Conocerlos ayuda a entender un error o a conducir a mano un diálogo parecido:
| Id | Qué es | Lo usan |
|---|---|---|
wnd[0]/tbar[0]/okcd | Campo de comandos | SAP — Run transaction, SAP — Export list (%pc) |
wnd[0]/sbar | Barra de estado | Todas las que leen la barra de estado |
wnd[0]/mbar | Barra de menús | SAP — Select menu con path |
wnd[0]/usr/txtRSYST-MANDT · txtRSYST-BNAME · pwdRSYST-BCODE · txtRSYST-LANGU | Mandante, usuario, contraseña e idioma de la pantalla de acceso | SAP — Log on |
wnd[1]/usr/radMULTI_LOGON_OPT1 … OPT3 | Opciones del diálogo de inicio de sesión múltiple | SAP — Log on |
wnd[1]/usr/ctxtDY_PATH · ctxtDY_FILENAME · ctxtDY_FILE_ENCODING | Carpeta, nombre y codificación del diálogo “Save File” | SAP — Save file dialog y las de exportación |
wnd[1]/tbar[0]/btn[0] · btn[11] | Botones Generar y Reemplazar del diálogo “Save File” | SAP — Save file dialog |
Errores comunes a todas las actividades
Sección titulada «Errores comunes a todas las actividades»Estos mensajes pueden salir en cualquier actividad que trabaje sobre una sesión. Los textos son los que ve un robot configurado en español; con un robot en inglés salen en inglés. Para manejarlos, envuelve el tramo en un Try / Catch (y deja evidencia con SAP — Screenshot en el catch) o reintenta con Retry.
| Mensaje | Causa y solución |
|---|---|
No hay sesión de SAP. Mete las actividades dentro de un sap-attach o pasa una sesión en el parámetro 'session'. | La actividad está fuera del body de SAP — Attach o SAP — Log on y no recibió session. Muévela dentro del body o pásale la sesión. |
El componente '…' no existe en la sesión de SAP. Se esperó … s a que apareciera. La pantalla actual es … dynpro … (transacción …). Comprueba que la transacción llegó a la pantalla que esperabas. | El selector no apareció en el plazo. Mira el programa, el dynpro y la transacción del mensaje: casi siempre la sesión está en otra pantalla (un diálogo delante, un paso que no se dio). |
'selector' es obligatorio. | El selector llegó vacío. |
El selector apunta a otra sesión de SAP abierta (…), no a la del robot (…). Quita el prefijo '/app/con[..]/ses[..]' para usar la sesión del robot, o conéctate a esa sesión. | El id lleva un prefijo /app/con[N]/ses[M] de otra sesión abierta. Quita el prefijo. |
La sesión de SAP sigue ocupada después de 60000 ms. El servidor no ha devuelto el control. | SAP no terminó de procesar en un minuto (un reporte muy pesado, un bloqueo del servidor). Reduce la selección o reintenta más tarde. |
SAP respondió [E …]: … | Tras la acción, la barra de estado mostró un mensaje de tipo E o A. El texto es el de SAP; corrige el dato o la pantalla y vuelve a intentar. |
'…' debe ser true o false; se recibió '…'. | Un parámetro booleano recibió una expresión que no da true ni false. |
Grabar en lugar de construir
Sección titulada «Grabar en lugar de construir»El botón Grabar del Designer también graba en SAP GUI. Mientras grabas, trabaja en SAP con normalidad: cada acción se convierte en una actividad dentro de un SAP — Attach con el sistema y el mandante de la sesión en la que actuaste. Se graban transacciones (SAP — Run transaction), escritura en campos (SAP — Set text), botones (SAP — Press button), casillas (SAP — Set checkbox), radios (SAP — Select radio), pestañas (SAP — Select tab), desplegables (SAP — Select from dropdown) y teclas de función (SAP — Send key), incluidas las F con Shift o Ctrl y atajos como Ctrl+F o Ctrl+S.
Las contraseñas no se graban: el Designer te avisa para que rellenes ese paso con una credencial. Y como la grabación empieza con SAP — Attach, si el robot va a correr desatendido suele convenir cambiarlo después por un SAP — Log on.
Ventanas modales
Sección titulada «Ventanas modales»Muchas pantallas de SAP abren ventanas modales encima de la principal (wnd[1]): confirmaciones, avisos, mensajes del sistema. Mientras hay una abierta, la ventana principal no responde; por ejemplo, SAP — Run transaction no encuentra el campo de comandos.
SAP — Log on atiende por sí solo el diálogo de inicio de sesión múltiple y se detiene si SAP exige cambiar la contraseña. Cualquier otro diálogo, como los mensajes del sistema tras el inicio de sesión, lo deja abierto y lo avisa en el log, para no aceptar algo que nadie ha leído. Ciérralo con SAP — Close modal.
Actividades
Sección titulada «Actividades»Sesión y navegación
Sección titulada «Sesión y navegación»| Actividad | Tipo | Salida | Qué hace |
|---|---|---|---|
| SAP — Log on | sap-logon | ZoanSapSession | Abre una conexión del SAP Logon e inicia sesión |
| SAP — Attach | sap-attach | ZoanSapSession | Se engancha a una sesión abierta |
| SAP — Run transaction | sap-run-transaction | — | Lanza una transacción por su código y comprueba que se abrió |
| SAP — Send key | sap-send-key | — | Envía una tecla de función (Enter, F3, F8…) |
| SAP — Select menu | sap-select-menu | — | Elige una entrada de la barra de menús |
| SAP — Select tab | sap-select-tab | — | Cambia de pestaña |
| SAP — Close modal | sap-close-modal | boolean | Cierra una ventana modal, si la hay |
| SAP — Maximize | sap-maximize | — | Maximiza la ventana de SAP |
Interactuar
Sección titulada «Interactuar»| Actividad | Tipo | Salida | Qué hace |
|---|---|---|---|
| SAP — Set text | sap-set-text | — | Escribe un valor en un campo |
| SAP — Press button | sap-press-button | — | Pulsa un botón de la pantalla |
| SAP — Press toolbar button | sap-press-toolbar-button | — | Pulsa un botón de la barra estándar o de la aplicación |
| SAP — Set checkbox | sap-set-checkbox | — | Marca o desmarca una casilla |
| SAP — Select radio | sap-select-radio | — | Selecciona un radio |
| SAP — Select from dropdown | sap-select-combo | — | Elige una entrada de un desplegable, por clave |
Leer y esperar
Sección titulada «Leer y esperar»| Actividad | Tipo | Salida | Qué hace |
|---|---|---|---|
| SAP — Get text | sap-get-text | string | Lee el texto de un campo o etiqueta |
| SAP — Element exists | sap-element-exists | boolean | ¿Existe el elemento en la pantalla actual? |
| SAP — Wait for element | sap-wait-for-element | — | Espera a que un elemento exista en la pantalla |
| SAP — Read status bar | sap-read-status-bar | Dictionary<string,object> | Tipo y texto del mensaje de la barra de estado |
| SAP — Screenshot | sap-screenshot | string | Guarda una imagen de la ventana de SAP |
Tablas, listas y árboles
Sección titulada «Tablas, listas y árboles»| Actividad | Tipo | Salida | Qué hace |
|---|---|---|---|
| SAP — Read table | sap-read-table | List<Dictionary<string,object>> | Lee un ALV o una tabla clásica a una lista de filas |
| SAP — Set cell | sap-set-cell | — | Escribe un valor en una celda |
| SAP — Select rows | sap-select-row | — | Selecciona filas de un ALV |
| SAP — ALV toolbar | sap-grid-toolbar | List<string> | Pulsa un botón de la barra de un ALV, o lista los que tiene |
| SAP — Read classic list | sap-read-list | List<Dictionary<string,object>> | Lee una lista clásica de reporte como filas de texto |
| SAP — Expand tree node | sap-tree-expand | — | Expande un nodo de un árbol |
| SAP — Select tree node | sap-tree-select | — | Selecciona un nodo de un árbol |
| SAP — Read tree | sap-tree-read | List<Dictionary<string,object>> | Lee los nodos de un árbol |
Exportar
Sección titulada «Exportar»| Actividad | Tipo | Salida | Qué hace |
|---|---|---|---|
| SAP — Export list | sap-export-list | string | Exporta la lista clásica de la pantalla a un archivo |
| SAP — Export ALV grid | sap-grid-export | boolean | Dispara la exportación de un ALV |
| SAP — Save file dialog | sap-save-file-dialog | string | Rellena y confirma el diálogo “Save File” de SAP |
Un flujo típico
Sección titulada «Un flujo típico»Iniciar sesión, cerrar el mensaje del sistema si aparece, consultar la tabla T000 en la SE16 y exportarla:
SAP Logon connection = "DEVELOP" client = "001" user = credential("sap-dev")["user"] password = credential("sap-dev") └─ body: SAP Close Modal SAP Run Transaction code = "SE16" SAP Set Text selector = "wnd[0]/usr/ctxtDATABROWSE-TABLENAME" value = "T000" SAP Send Key key = Enter SAP Press Toolbar Button selector = "wnd[0]/tbar[1]/btn[8]" SAP Export List path = "C:\salidas\" fileName = "t000.txt" → output: archivoSiguientes pasos
Sección titulada «Siguientes pasos»- SAP — Log on y SAP — Attach — el punto de partida.
- SAP — Run transaction — navegar por código de transacción.
- SAP — Read table y SAP — Export list — sacar datos de SAP.