7

vb6プログラムをC#.net 3.5に移行する必要があります。ユーザーはSAPログオンを開始して認証します。その後、ツールを使用してデータをフェッチおよび挿入できます。問題:リフレクションを使用して新しいGuiApplicationを作成できますが、現在開いているGuiSessionsをフェッチしない:/これは、開いているすべてのGuiSessionsで現在開いているGuiApplicationを取得するコードのvb6部分です。

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

私は反射でそれを試しました:

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

インスタンスは取得しましたが、既存のセッションはありません

4

5 に答える 5

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


        }

この方法を使用します。SAPインストールのsapguiフォルダーにあるSapROTWr.DLLを参照する必要があります。

于 2014-02-24T20:37:18.567 に答える
2

これは私のために働きます(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;
        }
    }
}
于 2015-03-13T17:01:43.463 に答える
1

SAPGUIがCOMオブジェクトであると仮定すると、SAPGUIへの参照を取得し、リフレクションを使用せずに新しいオブジェクトとして作成できるはずです。つまり、元のVB6コードが「遅延バインディング」を使用している場合でも、遅延バインディングではなく早期バインディングを使用します

第二に、遅延バインディングを想定すると、Type.GetTypeFromProgID("SapGui.S‌criptingCtrl.1")フラグメントType.GetTypeFromProgID("SapGui")は元のVB6と一致するべきではありませんか?SAPGUIのオブジェクトモデルをチェックして、正しいオブジェクトを参照していることを確認する必要がある場合があります。

于 2012-12-10T15:42:25.453 に答える
0

SAPはSAP.NETコネクタをリリースし、.NETアプリケーション内からSAPシステムと対話するための標準的な方法を提供しました。http://service.sap.com/connectorsを見てください。このページにアクセスするには、SAPパートナーである必要があります。

于 2012-12-14T06:35:05.177 に答える
0

実行中のセッションで動作することがわかった唯一の解決策は、そのコードをdllにロードし、c#経由でアクセスすることです。

于 2012-12-14T06:20:56.127 に答える