2014-11-24 182 views
2

藉助在stackoverflow上找到的代碼示例,我成功地設法連接到SAP的EXISTING實例。如何停止腳本?

但是,我不知道如何脫離SAP並停止腳本。

我的代碼完成後,在SAP窗口中,我仍然可以看到小理髮師旋轉起來,表明我仍然連接到它。

注意:我不想爲用戶終止會話。

我的意圖是簡單地勾住他們當前的連接,從他們的會話中獲取一些信息,然後釋放我的參與與他們的連接。

我想以'正確'的方式做到這一點..而不是猜測並將用戶弄得一團糟。

下面是我使用進行連接(SapInfoSapInfoItem是我自己的結構)的腳本:運行與Excel VBA腳本時,我有同樣的問題

public static Dictionary<string, SapInfoItem> get_sapInfo() 
{ 
    Dictionary<string, SapInfoItem> sapInfo = new Dictionary<string, SapInfoItem>(); 
    GuiApplication sapGuiApp; 

    SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper(); 
    object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI"); 
    object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod, 
    null, SapGuilRot, null); 

    sapGuiApp = engine as GuiApplication; 
    GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection; 

    foreach (GuiSession child_session in connection.Children) 
    { 
     GuiSession session = child_session as GuiSession; //connection.Children.ElementAt(0) as GuiSession; 
     SapInfoItem sii = new SapInfoItem(); 
     sii.system_name = session.Info.SystemName; 
     sii.client = session.Info.Client; 
     sii.client = session.Info.Program; 
     sii.screen_number = session.Info.ScreenNumber; 
     sii.handle = session.ActiveWindow.Handle; 
     sii.transaction = session.Info.Transaction; 

     sapInfo.Add(sii.handle.ToString("X"), sii); 
    } 

    connection.CloseConnection(); 

    return sapInfo; 
} 
+0

它已經很長一段時間,因爲我已經處理了C#SAP自動化。我不記得,如果你殺掉了這個進程,你會棄用'GuiApplication'。我會從那裏開始,也許嘗試處理'engine'來查看它是否停止Gui自動化並將控制權釋放回給用戶。 – tyh 2014-11-24 20:25:55

回答

0

在腳本結束後,「小理髮師」杆仍在運行,但我注意到停止宏是從SAP斷開腳本。

事實上,這是因爲我使用了一個公共變量來保存「會話」對象,所以它在腳本結束後仍然在內存中。我通過銷燬腳本末尾的會話對象引用來解決問題。

因此,請檢查您是否在代碼末尾銷燬了所有對公共對象的引用,它可以解決您的問題。

在VBA,代碼要做到這一點是

Set session = Nothing 

在C#中,它應該是

obj = Null;