2012-12-05 36 views
7

devo migrare un programma VB6 a C# .NET 3.5 l'utente inizia accesso SAP e autentica, poi si può utilizzare lo strumento per recuperare e inserire i dati utilizzando lo strumento il problema: posso creare un nuovo GuiApplication con la riflessione, ma non può recuperare GuiSessions attualmente aperte con esso:/ qui è la parte VB6 del codice che viene attualmente aperto GuiApplication con tutti GuiSessions aperteottenere GuiApplication di esecuzione VB6 accesso Sap a C#

Dim obj As Object 
    Set obj = CreateObject("SAPGUI") 
    Set obj = obj.GetScriptingEngine 

    If TypeName(obj) = "GuiApplication" Then 
     Set SapAutomationObject = obj 
     SapAutomationObject.AllowSystemMessages = False 

     Debug.Print "SAP Automation OK" 
    End If 

l'ho provato con la riflessione:

GuiApplication Application = (GuiApplication)System.Activator.CreateInstance(Type.GetTypeFromProgID("SapGui.S‌​criptingCtrl.1")); 

ho ottenuto un grado, ma nessun sessioni esistenti

risposta

7
public static void testConnection() 
     { 
      SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
      object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
      object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod, 
       null, SapGuilRot, null); 
      SAPconnection.sapGuiApp = engine as GuiApplication; 
      GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection; 
      GuiSession session = connection.Children.ElementAt(0) as GuiSession; 
      MessageBox.Show(session.Info.User + " !!||!! " + session.Info.Transaction); 


     } 

utilizzare questo metodo, si deve fare riferimento SapROTWr.DLL, che si trova nella cartella SAPGUI dell'installazione SAP.

+0

grazie, lo verificherò, se funziona segnerà come risposta –

+0

Mi ha aiutato. Apprezzo davvero il tuo tempo. –

1

assumendo che SAPGUI è un oggetto COM allora si dovrebbe essere in grado di prendere un riferimento ad esso e creare come un nuovo oggetto senza l'utilizzo di riflessione. vale a dire utilizzare l'associazione anticipata e non tardiva anche se il codice VB6 originale sta usando 'tardiva'

In secondo luogo, supponendo che l'associazione tardiva, non dovrebbe il frammento Type.GetTypeFromProgID("SapGui.S‌criptingCtrl.1") essere Type.GetTypeFromProgID("SapGui") per abbinare il VB6 originale? potrebbe essere necessario verificare il modello a oggetti per SAPGUI per assicurarsi di fare riferimento all'oggetto giusto.

+0

il problema è che io non voglio creare un nuovo oggetto, voglio ottenere il saplogon.exe attualmente in esecuzione sessioni come per Type.GetTypeFromProgID ("SapGui") non riesco nemmeno a ottenere GuiApplication (ottengo null), con SapGui.ScriptingCtrl.1 ottengo il saplogon.exe associato ma non le sessioni:/ –

+0

Sicuramente la chiamata GetScriptingEngine nel VB6 si connette a l'istanza attualmente in esecuzione? Non c'è nient'altro nel codice VB6 che potrebbe equivalere ad esso. Quindi useresti la stessa chiamata nel tuo codice .NET. O c'è qualcos'altro che non è mostrato nella tua domanda? –

+0

lo chiamo vb6 code atm e mi dà la guiapplicazione con tutte le connessioni e sessioni se faccio lo stesso (reflection + get motore di scripting e consenti messaggi di sistema) ottengo solo guiapplicazione senza le connessioni e senza le sessioni memorizzate nelle connessioni , dopo averlo avviato ho accesso al motore di scripting, ma per me non è abbastanza triste (requisiti per le applicazioni: /) –

0

l'unica soluzione che ho trovato a lavorare con le sessioni di esercizio è di caricare il codice in una DLL e accedervi via C#

0

SAP rilasciato connettore SAP .NET per fornire modo standartized di interagire con il sistema SAP dall'interno di Applicazione .NET. Guardate http://service.sap.com/connectors, è necessario essere socio di SAP per essere in grado di accedere alla pagina

+0

quindi, se apro le sessioni in accesso Sap e riempio tutti i dati, quando uso sap .net connettore posso accedere ai dati? –

+1

@Goran Štuc se i dati verranno salvati in DB - sì. Se sarà solo sullo schermo - no. Con l'aiuto di .NET Connector è possibile chiamare facilmente il modulo funzionale dal lato SAP, ma non è possibile accedere allo schermo di saplogon. In questo caso sarai responsabile della creazione di GUiT intero –

+1

grazie, ciò significa che ho bisogno di qualche altra soluzione:/ –

2

Questo funziona per me (SAP 730/Win7):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SAPFEWSELib; 
using SapROTWr; 

namespace FIT.SapHelper 
{ 
    public static class stcSapHelper 
    { 
     public static void testConnection() 
     { 
      SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
      object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
      object engine = SapGuilRot.GetType().InvokeMember("GetScriptingEngine", System.Reflection.BindingFlags.InvokeMethod, null, SapGuilRot, null); 
      GuiConnection connection = (engine as GuiApplication).OpenConnection("BOX DESCRIPTION"); 
      GuiSession session = connection.Children.ElementAt(0) as GuiSession; 
     } 
    } 
} 
+0

Grazie mille per il mio lavoro – user2682809