Ir al contenido

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.

El robot corre en Windows con SAP GUI for Windows instalado. Además, el scripting tiene que estar habilitado en los dos extremos:

DóndeQué activar
Servidor SAPEl 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 GUIEn 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.

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 onSAP — Attach
Qué haceAbre 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.
CredencialesLa contraseña sale de una credencial de Zoan Cloud.No toca credenciales.
Cómo eligePor 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 terminarCierra la conexión que abrió (salvo con keepOpen).Se desengancha y deja SAP abierto tal como estaba.
Ideal paraRobots 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: titulo

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: sap
SAP Run Transaction session = sap code = "SE16"

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:

ParteQué es
wnd[0]La ventana principal. wnd[1], wnd[2]… son ventanas modales (diálogos) encima.
usrEl á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]).
sbarLa barra de estado.
mbarLa 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.

Las actividades ya esperan por su cuenta, en dos niveles:

  1. 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.
  2. El elemento. Las actividades que buscan un elemento por selector lo buscan cada 200 ms hasta que aparece: hasta elementTimeout segundos, 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ámetro timeout (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.

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.

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:

IdQué esLo usan
wnd[0]/tbar[0]/okcdCampo de comandosSAP — Run transaction, SAP — Export list (%pc)
wnd[0]/sbarBarra de estadoTodas las que leen la barra de estado
wnd[0]/mbarBarra de menúsSAP — Select menu con path
wnd[0]/usr/txtRSYST-MANDT · txtRSYST-BNAME · pwdRSYST-BCODE · txtRSYST-LANGUMandante, usuario, contraseña e idioma de la pantalla de accesoSAP — Log on
wnd[1]/usr/radMULTI_LOGON_OPT1 … OPT3Opciones del diálogo de inicio de sesión múltipleSAP — Log on
wnd[1]/usr/ctxtDY_PATH · ctxtDY_FILENAME · ctxtDY_FILE_ENCODINGCarpeta, 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

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.

MensajeCausa 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.

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.

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.

ActividadTipoSalidaQué hace
SAP — Log onsap-logonZoanSapSessionAbre una conexión del SAP Logon e inicia sesión
SAP — Attachsap-attachZoanSapSessionSe engancha a una sesión abierta
SAP — Run transactionsap-run-transaction—Lanza una transacción por su código y comprueba que se abrió
SAP — Send keysap-send-key—Envía una tecla de función (Enter, F3, F8…)
SAP — Select menusap-select-menu—Elige una entrada de la barra de menús
SAP — Select tabsap-select-tab—Cambia de pestaña
SAP — Close modalsap-close-modalbooleanCierra una ventana modal, si la hay
SAP — Maximizesap-maximize—Maximiza la ventana de SAP
ActividadTipoSalidaQué hace
SAP — Set textsap-set-text—Escribe un valor en un campo
SAP — Press buttonsap-press-button—Pulsa un botón de la pantalla
SAP — Press toolbar buttonsap-press-toolbar-button—Pulsa un botón de la barra estándar o de la aplicación
SAP — Set checkboxsap-set-checkbox—Marca o desmarca una casilla
SAP — Select radiosap-select-radio—Selecciona un radio
SAP — Select from dropdownsap-select-combo—Elige una entrada de un desplegable, por clave
ActividadTipoSalidaQué hace
SAP — Get textsap-get-textstringLee el texto de un campo o etiqueta
SAP — Element existssap-element-existsboolean¿Existe el elemento en la pantalla actual?
SAP — Wait for elementsap-wait-for-element—Espera a que un elemento exista en la pantalla
SAP — Read status barsap-read-status-barDictionary<string,object>Tipo y texto del mensaje de la barra de estado
SAP — Screenshotsap-screenshotstringGuarda una imagen de la ventana de SAP
ActividadTipoSalidaQué hace
SAP — Read tablesap-read-tableList<Dictionary<string,object>>Lee un ALV o una tabla clásica a una lista de filas
SAP — Set cellsap-set-cell—Escribe un valor en una celda
SAP — Select rowssap-select-row—Selecciona filas de un ALV
SAP — ALV toolbarsap-grid-toolbarList<string>Pulsa un botón de la barra de un ALV, o lista los que tiene
SAP — Read classic listsap-read-listList<Dictionary<string,object>>Lee una lista clásica de reporte como filas de texto
SAP — Expand tree nodesap-tree-expand—Expande un nodo de un árbol
SAP — Select tree nodesap-tree-select—Selecciona un nodo de un árbol
SAP — Read treesap-tree-readList<Dictionary<string,object>>Lee los nodos de un árbol
ActividadTipoSalidaQué hace
SAP — Export listsap-export-liststringExporta la lista clásica de la pantalla a un archivo
SAP — Export ALV gridsap-grid-exportbooleanDispara la exportación de un ALV
SAP — Save file dialogsap-save-file-dialogstringRellena y confirma el diálogo “Save File” de SAP

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: archivo