2012-12-05 5 views
7

muszę migrować programu vb6 do C# .NET 3.5 użytkownik rozpoczyna logowania i uwierzytelnia SAP wtedy może użyć narzędzia do pobierania i wstawić dane za pomocą narzędzia problem: mogę utworzyć nowy GuiApplication z refleksji, ale nie mogę pobrać aktualnie otwartego GuiSessions z nim:/ tutaj jest częścią VB6 kodu, który pobiera aktualnie otwartego GuiApplication ze wszystkich otwartych GuiSessionsdostać GuiApplication prowadzenia Sap logowania VB6 do 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 

próbowałem go z odbiciem:

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

mam instancję ale żadne istniejące sesje

Odpowiedz

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); 


     } 

Korzystanie Metoda ta, trzeba odwołać SapROTWr.DLL który jest w folderze SAPGUI swojej instalacji SAP.

+0

dzięki, sprawdzi to, czy działa Oznaczone jako odpowiedź –

+0

Pomogło mi to. Naprawdę doceniam twój czas. –

1

Zakładając, że SAPGUI jest obiektem COM, to powinieneś być w stanie podjąć odniesienie do niej i utworzyć go jako nowego obiektu bez użycia refleksji. tj. użyć wiązania wczesnego i wiązania późnego, nawet jeśli oryginalny kod VB6 stosuje "późne wiązanie", po drugie, zakładając późne wiązanie, czy fragment nie powinien być Type.GetTypeFromProgID("SapGui") dopasowany do oryginalnego VB6? może być konieczne sprawdzenie modelu obiektu dla SAPGUI, aby upewnić się, że odwołujesz się do odpowiedniego obiektu.

+0

problemem jest to, że nie chcę, aby utworzyć nowy obiekt, chcę dostać aktualnie działającej saplogon.exe Sesje jak dla Type.GetTypeFromProgID ("SapGui") nie otrzymuję nawet GuiApplication (otrzymuję zero), z SapGui.ScriptingCtrl.1 otrzymuję plik saplogon.exe, ale nie sesje:/ –

+0

Z pewnością połączenie GetScriptingEngine w VB6 łączy się z aktualnie działająca instancja? W kodzie VB6 nie ma nic więcej, co mogłoby się z tym równać. W ten sposób możesz użyć tego samego połączenia w swoim kodzie .NET. Czy jest jeszcze coś, czego nie ma w twoim pytaniu? –

+0

nazywam ten kod atm vb6 i daje mi guiaplikację ze wszystkimi połączeniami i sesjami jeśli zrobię to samo (odbicie + otrzymam silnik skryptowy i zezwalam na komunikaty systemowe) otrzymuję tylko guiaplikacja bez połączeń i bez sesji przechowywanych w połączeniach , po uruchomieniu mam dostęp do silnika skryptów, ale to mi niestety nie wystarcza (wymagania dla aplikacji: /) –

0

jedynym rozwiązaniem, które znalazłem do pracy z sesjami Bieganie jest załadować ten kod w DLL i do niego dostęp za pośrednictwem C#

0

SAP wydany złącze .NET SAP w celu zapewnienia standartized sposób interakcji z systemem SAP od wewnątrz z Aplikacja .NET. Spójrz na http://service.sap.com/connectors, trzeba być partnerem SAP, aby móc dostęp do strony

+0

tak, jeśli otworzę sesje w logu SAP i wypełnię wszystkie dane, kiedy używam sap .net złącze mogę uzyskać dostęp do danych? –

+1

@Goran Štuc, jeśli dane zostaną zapisane do DB - tak. Jeśli będzie to tylko na ekranie - nie. Za pomocą .NET Connector można łatwo wywołać moduł funkcjonalny od strony SAP, ale nie można uzyskać dostępu do ekranu saplogon. W tym przypadku będziesz odpowiedzialny za stworzenie całego GUIT –

+1

dzięki, to oznacza, że ​​potrzebuję innego rozwiązania:/ –

2

Działa to dla mnie (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

Dziękuję, że to działa dla mnie – user2682809