GrailsLearner
GrailsLearner

Reputation: 525

SAP GUI scripting inside Java

I am following the example below to work on sapguiscripting from Java https://blogs.sap.com/2012/11/01/how-to-use-sap-gui-scripting-inside-java/.

Obj = new ActiveXComponent(Session.invoke("FindById",
      "wnd[0]/usr/txtRSYST-BNAME").toDispatch());
        Obj.setProperty("Text", "BCUSER");

      //-Set GUIPasswordField Password------------------------------
      //-
      //- session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = _
      //-   "minisap"
      //-
      //------------------------------------------------------------
        Obj = new ActiveXComponent(Session.invoke("FindById",
          "wnd[0]/usr/pwdRSYST-BCODE").toDispatch());
        Obj.setProperty("Text", "minisap");

Even though I passed the parameters username and password I am still not able to launch the SAP application from java. What else do I need to modify to make it work?

Upvotes: 0

Views: 1979

Answers (1)

aminator
aminator

Reputation: 481

To complete the logon process from scratch you need to add 2 actions:

  1. starting the saplogon.exe as new process

  2. opening the connection to the desired sap server. For this step the desired connection needs to be configured within the saplogon already.

  3. now you can run your code to execute the login.

code for 1.:

    //Opening the SAP Logon
    //this string should point to the saplogon.exe on your system.
    String sapLogonPath = "C:\\Program Files (x86)\\SAP\\FrontEnd\\SAPgui\\saplogon.exe";
    Process p;
    try {
        p = Runtime.getRuntime().exec(sapLogonPath);
        //the sleep is to let the system wait until the sap logon has fully loaded. You might reduce the time of the sleep depending on the performance of your system
        Thread.sleep(7000);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

code for 2.:

        //SAP Connection Name
        //this string is the name of the connection configured in SAP Logon
        String sapConnectionName = "SAPServer"; 
        Connection = new ActiveXComponent(
        GUIApp.invoke("OpenConnection",sapConnectionName).toDispatch());

code for a complete stand alone working example:

Below is the code from your link + all modifications required so that the SAP Logon is launched, the connection is opened and the user is logged in.

package com.sapguiscripting;

import java.io.IOException;

//-Begin----------------------------------------------------------------
//-
//- How to use SAP GUI Scripting inside Java
//- Example: Logon to an SAP system
//-
//-
//----------------------------------------------------------------------
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class SAPGUIScriptingLogon {



    public static void main(String[] args) {

    //-Variables------------------------------------------------------
    ActiveXComponent SAPROTWr, GUIApp, Connection, Session, Obj;
    Dispatch ROTEntry;
    Variant ScriptEngine;

    ComThread.InitSTA();



    //Opening the SAP Logon
    String sapLogonPath = "C:\\Program Files (x86)\\SAP\\FrontEnd\\SAPgui\\saplogon.exe";
    Process p;
    try {
        p = Runtime.getRuntime().exec(sapLogonPath);
        Thread.sleep(7000);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    //-Set SapGuiAuto = GetObject("SAPGUI")---------------------------
    SAPROTWr = new ActiveXComponent("SapROTWr.SapROTWrapper");
    try {
        ROTEntry = SAPROTWr.invoke("GetROTEntry", "SAPGUI").toDispatch();
        //-Set application = SapGuiAuto.GetScriptingEngine------------
        ScriptEngine = Dispatch.call(ROTEntry, "GetScriptingEngine");
        GUIApp = new ActiveXComponent(ScriptEngine.toDispatch());


        //SAP Connection Name
        String sapConnectionName = "SAPServer"; //this is the name of the connection in SAP Logon
        Connection = new ActiveXComponent(
        GUIApp.invoke("OpenConnection",sapConnectionName).toDispatch());


        //-Set connection = application.Children(0)-------------------
        //Connection = new ActiveXComponent(GUIApp.invoke("Children", 0).toDispatch());

        //-Set session = connection.Children(0)-----------------------
        Session = new ActiveXComponent(
        Connection.invoke("Children", 0).toDispatch());

        //-Set GUITextField Client------------------------------------
        //-
        //- session.findById("wnd[0]/usr/txtRSYST-MANDT").text = "000"
        //-
        //------------------------------------------------------------
        Obj = new ActiveXComponent(Session.invoke("FindById","wnd[0]/usr/txtRSYST-MANDT").toDispatch());
        Obj.setProperty("Text", "000");

        //-Set GUITextField User--------------------------------------
        //-
        //- session.findById("wnd[0]/usr/txtRSYST-BNAME").text = _
        //-   "BCUSER"
        //-
        //------------------------------------------------------------
          Obj = new ActiveXComponent(Session.invoke("FindById",
            "wnd[0]/usr/txtRSYST-BNAME").toDispatch());
          Obj.setProperty("Text", "SAP*");

        //-Set GUIPasswordField Password------------------------------
        //-
        //- session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = _
        //-   "minisap"
        //-
        //------------------------------------------------------------
          Obj = new ActiveXComponent(Session.invoke("FindById",
            "wnd[0]/usr/pwdRSYST-BCODE").toDispatch());
          Obj.setProperty("Text", "Down1oad");

        //-Set GUITextField Language----------------------------------
        //-
        //- session.findById("wnd[0]/usr/txtRSYST-LANGU").text = "DE"
        //-
        //------------------------------------------------------------
          Obj = new ActiveXComponent(Session.invoke("FindById",
            "wnd[0]/usr/txtRSYST-LANGU").toDispatch());
          Obj.setProperty("Text", "EN");

        //-Press enter------------------------------------------------
        //-
        //- session.findById("wnd[0]").sendVKey 0
        //-
        //------------------------------------------------------------
          Obj = new ActiveXComponent(Session.invoke("FindById",
            "wnd[0]").toDispatch());
          Obj.invoke("sendVKey", 0);

    }

    catch (Exception e) {

    }

    finally {
      ComThread.Release();
      System.exit(0);
    }

  }

}

//-End------------------------------------------------------------------

Upvotes: 2

Related Questions