2014-11-24 4 views
2

stackoverflow에있는 코드 예제를 사용하여 SAP의 기존 인스턴스에 성공적으로 연결할 수있었습니다.스크립팅을 중지하는 방법은 무엇입니까?

그러나 SAP에서 연결을 끊고 스크립팅을 중지하는 방법에 관해서는 분실 상태입니다.

내 코드가 끝나면 SAP 창에서 여전히 작은 이발소 극을 구부려 볼 수 있습니다. 이는 여전히 연결되어 있음을 나타냅니다.

참고 : 사용자 세션을 종료하고 싶지 않습니다.

내 의도는 단순히 현재 연결에 연결하고, 세션에서 정보 양식을 가져온 다음 연결을 통해 내 참여를 해제하는 것입니다.

그리고 저는 이것을 '올바른'방식으로하고 싶습니다. 추측하고 사용자를 혼란에 빠지기보다는 말합니다.

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 자동화 처리 이후 오랜 시간이되었습니다해야합니다, C#에서

Set session = Nothing 

입니다. 나는 프로세스를 죽이면'GuiApplication'을 폐기할지 기억이 나지 않습니다. 나는 거기에서 시작할 것이고 아마도 Gui 자동화를 멈추고 사용자에게 다시 제어권을 넘겨 주는지 확인하기 위해'Engine'의 Disposing을 시도 할 것이다. – tyh

답변

0

엑셀 VBA와 스크립트를 실행할 때 저도 같은 문제를 가지고 :

는 여기에 내가 연결 (SapInfoSapInfoItem 내 자신의 구조입니다)를 만들기 위해 사용하고있는 스크립트입니다.

"작은 이발소 기둥"은 스크립트가 끝난 후에도 계속 실행 중이지만 매크로를 중지하면 SAP에서 스크립트가 연결 해제되는 것으로 나타났습니다.

"세션"개체를 보관하기 위해 공용 변수를 사용했기 때문에 사실 그것은 스크립트가 끝난 후에도 메모리에 남아있었습니다. 나는 스크립트의 끝에서 세션 객체에 대한 참조를 파괴함으로써이 문제를 해결했다.

코드 끝에서 공용 객체에 대한 모든 참조를 제거하면 문제가 해결 될 수 있습니다.

은 VBA에서는 그렇게 할 수있는 코드는

obj = Null; 
관련 문제