c# - net - sapnco
¿Cómo automatizo SAP GUI con c# (3)
Me gustaría automatizar una ventana de la GUI de SAP usando el lenguaje C #. Puedo hacerlo en VBScript pero la reutilización del código es horrible. Además, me gustaría usar subprocesos en lugar de tener 80 o más procesos ejecutándose ¿Dónde puedo encontrar documentación y ejemplos de cómo hacer esto? Aquí está el código con el que estoy trabajando. Básicamente, el problema al que me enfrento es: ¿cómo puedo hacer una conexión a la GUI de SAP y luego crear una GUI de SAP sobre la marcha y luego comenzar a hacer transacciones e ingresar texto en algunos campos?
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using White.Core.Factory;
using White.Core.UIItems.Finders;
using White.Core.InputDevices;
using System.Threading;
using System.Diagnostics;
using SAP.Connector;
using SAP;
namespace SAP_Automation
{
class Program
{
public static void Main(string[] args)
{
string ExeSourceFile = @"C:/Program Files/SAP/SapSetup/setup/SAL/SapLogon.s8l";
White.Core.Application _application;
White.Core.UIItems.WindowItems.Window _mainWindow;
var c = SAP.Connector.Connection.GetConnection("**");
var c = new SAPConnection("ASHOST=*; GWHOST=*; GWSERV=*; ASHOST=*; SYSNR=00;USER=user; PASSWD=**;");
c.Open();
}
}
}
}
Como puede ver, puedo crear una conexión pero no sé cómo crear una sesión en la GUI y comenzar a ingresar texto en los campos. Cualquier ejemplo y muestra sería apreciado.
Aquí es muy importante entender qué puede hacer UI Automation y cuáles son sus limitaciones. Fue diseñado para automatizar las capacidades de una interfaz de usuario. Puede hacer clic en los botones, ingresar texto en un cuadro de texto, mover ventanas, etc., lo que el usuario pueda hacer con el mouse y el teclado.
Lo que no puede hacer es salvar el alto muro que el sistema operativo pone entre los procesos. Un muro que impide que un proceso acceda a la memoria de otro proceso. Esta es una característica de seguridad muy importante. Por una parte, evita que un proceso acceda a datos que deberían ser privados para un proceso. Como una contraseña. Y, por otro lado, evita que un proceso de bloqueo afecte a otros procesos que se ejecutan en la máquina. Puede matar un proceso con el Administrador de tareas y todo sigue avanzando felizmente como si nada hubiera pasado.
Una consecuencia de esto es que crear un objeto SAPConnection en su programa es una conexión que solo su programa puede usar. No hay ningún mecanismo para pasar de alguna manera este objeto a otro proceso con UI Automation. En el mejor de los casos, puede utilizar los datos que recupera de la conexión para afectar los botones en los que hace clic.
El tipo de interoperabilidad de procesos que permitiría compartir datos entre procesos está bien soportado en .NET. Los enfoques de bajo nivel son socket y tuberías con nombre, los de alto nivel son Remoting y WCF. Los programas más antiguos tienen soporte de automatización COM, Office es un buen ejemplo de eso. Sin embargo, eso requiere dos para el tango, ambos programas deben estar escritos para aprovecharlo.
Por lo tanto, si está intentando automatizar una aplicación SAP existente y esta aplicación no admite explícitamente la automatización, del tipo que un programa de Office admite, entonces se queda estancado con solo rellenar los cuadros de texto y hacer clic en los botones.
Esto podría ser necro-threading pero estaba en una situación similar donde trabajo. Necesitábamos SAP GUI Automation para realizar pruebas que pudieran integrarse con el resto de nuestra plataforma de automatización local escrita en C #. Ayudé a crear una propuesta para una solución que aprovechaba una biblioteca provista por SAP para la automatización de GUI que podía usarse como base para una capa de automatización para SAP.
¿Existe el siguiente archivo en su instalación de archivos SAP? x: / Archivos de programa / SAP / FrontEnd / SAPGui / sapfewse.ocx?
Si es así, agréguelo a Visual Studio (o al IDE que esté usando) como referencia. Básicamente es una biblioteca de clases que contiene un montón de objetos específicos de SAP que te permitirán interactuar con ellos. Es muy efectivo porque expone la mayor parte de lo que necesita de la GUI de SAP. Descubrimos en otros intentos que muchos de los objetos en SAP no estaban disponibles.
Esta es una prueba temprana de concepto que hice. Inicie SAP con una cadena de conexión, ingrese las credenciales, navegue a un código de transacción.
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using SAPFEWSELib;
namespace SAPGuiAutomated
{
//created a class for the SAP app, connection, and session objects as well as for common methods.
public class SAPActive
{
public static GuiApplication SapGuiApp { get; set; }
public static GuiConnection SapConnection { get; set; }
public static GuiSession SapSession { get; set; }
public static void openSap(string env)
{
SAPActive.SapGuiApp = new GuiApplication();
string connectString = null;
if (env.ToUpper().Equals("DEFAULT"))
{
connectString = "1.0 Test ERP (DEFAULT)";
}
else
{
connectString = env;
}
SAPActive.SapConnection = SAPActive.SapGuiApp.OpenConnection(connectString, Sync: true); //creates connection
SAPActive.SapSession = (GuiSession)SAPActive.SapConnection.Sessions.Item(0); //creates the Gui session off the connection you made
}
public void login(string myclient, string mylogin, string mypass, string mylang)
{
GuiTextField client = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-MANDT", "GuiTextField");
GuiTextField login = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BNAME", "GuiTextField");
GuiTextField pass = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-BCODE", "GuiPasswordField");
GuiTextField language = (GuiTextField)SAPActive.SapSession.ActiveWindow.FindByName("RSYST-LANGU", "GuiTextField");
client.SetFocus();
client.text = myclient;
login.SetFocus();
login.Text = mylogin;
pass.SetFocus();
pass.Text = mypass;
language.SetFocus();
language.Text = mylang;
//Press the green checkmark button which is about the same as the enter key
GuiButton btn = (GuiButton)SapSession.FindById("/app/con[0]/ses[0]/wnd[0]/tbar[0]/btn[0]");
btn.SetFocus();
btn.Press();
}
}
//--------------------------//
//main method somewhere else
public static void Main(string[] args)
{
SAPActive.openSAP("my connection string");
SAPActive.login("10", "jdoe", "password", "EN");
SAPActive.SapSession.StartTransaction("VA03");
}
Tienes razón, no hay mucha documentación sobre este tema. A continuación hay algunas fuentes que me ayudaron a comenzar
-Fuente original de nuestro plan http://scn.sap.com/thread/1729689
-Documentación en la API (para VB y javascript, pero las reglas y los objetos generales son idénticos). Definitivamente lea la parte en la jerarquía de SAP GUI Runtime. Responderá muchas preguntas. http://www.synactive.com/download/sap%20gui%20scripting/sap%20gui%20scripting%20api.pdf
Puede automatizar cualquier tipo de aplicación (navegador, escritorio, java, etc.) con UiPath . Aquí hay un tutorial sobre cómo automatizar el ingreso de datos, la navegación del menú y el raspado de la pantalla en SAP.
Usted puede
- Utilízalo desde el código (SDK). Cuenta con una herramienta que genera automáticamente código C #.
- cree y ejecute flujos de trabajo (automatización visual) directamente desde UiPath Studio .
Aquí hay una muestra del código generado automáticamente por C #:
// Attach window menu
UiNode wnd3 = UiFactory.Instance.NewUiNode().FromSelector("<wnd app=''sap business one.exe'' cls=''#32768'' idx=''1'' />");
// Click ''Business Pa...'' menu
UiNode uiClickBusinessPamenu_3 = wnd3.FindFirst(UiFindScope.UI_FIND_DESCENDANTS, "<ctrl name=''Business Partners'' role=''popup menu'' /><ctrl automationid=''2561'' />");
uiClickBusinessPamenu_3.Click(88, 9, UiClickType.UI_CLICK_SINGLE, UiMouseButton.UI_BTN_LEFT, UiInputMethod.UI_HARDWARE_EVENTS);
// Attach window ''SAP Business''
UiNode wnd4 = UiFactory.Instance.NewUiNode().FromSelector("<wnd app=''sap business one.exe'' cls=''TMFrameClass'' title=''SAP Business One 9.0 - OEC Computers'' />");
// Click ''Add'' button
UiNode uiClickAddbutton_4 = wnd4.FindFirst(UiFindScope.UI_FIND_DESCENDANTS, "<wnd cls=''ToolbarWindow32'' title=''View'' /><ctrl name=''View'' role=''tool bar'' /><ctrl name=''Add'' role=''push button'' />");
uiClickAddbutton_4.Click(13, 24, UiClickType.UI_CLICK_SINGLE, UiMouseButton.UI_BTN_LEFT, UiInputMethod.UI_HARDWARE_EVENTS);
Así es como se ve la automatización del flujo de trabajo de los menús, botones o tipos de escritura de SAP Business One:
Y finalmente, la documentación del SDK se encuentra here ... en caso de que no quiera utilizar flujos de trabajo.
Nota: trabajo en UiPath. También debe probar otras herramientas de automatización, como Automation Anywhere, WinAutomation, Jacada, Selenium, Ranorex, utilícelas una al lado de la otra y elija la que mejor se adapte a sus necesidades.