Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
[Gelöst] SAP RFC Commit nach BAPI aufruf
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

[Gelöst] SAP RFC Commit nach BAPI aufruf

beantworten | zitieren | melden

Hallo zusammen,

Mein Problem:
Ich will einen BAPI mittels C# ansprechen der SAP Equipments aus / einbaut.

Der BAPI hat im ABAP Code keinen Commit eingebaut, dieser muss also selbst aufgerufen werden. Soweit so gut, aber wie?


                .
                .
                .
                myfun = rfcRep.CreateFunction("BAPI_EQUI_DISMANTLE");

                myfun.SetValue("EQUIPMENT", AltesEquipment);
                myfun.SetValue("DISM_DATE", DateTime.Now);
                
                myfun.Invoke(rfcDest);
                IRfcStructure tmp = myfun.GetStructure("RETURN");
                if (tmp.GetString("MESSAGE") != "") throw new Exception(tmp.GetString("NUMBER") + "-" + tmp.GetString("MESSAGE") + "/EQ AUSBAUEN");
                ActionCommit();
                myfun = rfcRep.CreateFunction("BAPI_EQUI_INSTALL");

                IRfcStructure s = myfun.GetStructure("DATA_INSTALL");

                s.SetValue("FUNCLOC", "0001-10-86");
                s.SetValue("INST_DATE", DateTime.Now);

                myfun.SetValue("DATA_INSTALL", s);
                myfun.SetValue("EQUIPMENT", AltesEquipment);

                myfun.Invoke(rfcDest);
                 tmp = myfun.GetStructure("RETURN");
                if (tmp.GetString("MESSAGE") != "") throw new Exception(tmp.GetString("NUMBER") + "-" + tmp.GetString("MESSAGE") + "/EQ AUSBAUEN");
                ActionCommit();
                .
                .
                .


Die ActionCommit() Methode ruft den BAPI "BAPI_TRANSACTION_COMMIT" auf.


static public bool ActionCommit()
        {
            try
            {
                MyBackendConfig config__ = new MyBackendConfig();
                try
                { RfcDestinationManager.RegisterDestinationConfiguration(config__); } 
                catch { }
                RfcDestination rfcDest = RfcDestinationManager.GetDestination("U04");
                RfcRepository rfcRep = rfcDest.Repository;

                IRfcFunction myfun = rfcRep.CreateFunction("BAPI_TRANSACTION_COMMIT");
                myfun.Invoke(rfcDest);
                IRfcStructure struc = myfun.GetStructure("RETURN");

                if (!struc.GetString("NUMBER").Equals("000") || !(struc.GetString("NUMBER") == "000")) throw new Exception(struc.GetString("MESSAGE") + "/Action Commit"); 
                return true;
            }
            catch (Exception ex) { throw ex; }
        }

Fehlermeldungen gibt es keine, auch die Messages bleiben alle 000 bzw. leer. Allerdings werden keine Änderungen ans SAP System geschrieben. Wenn ich die Bausteine mit der SE37 als Sequenz öffne klappen die Bausteine.

Ich muss genau diese Bausteine verwenden da diese eine hausinterne Programmierung anstoßen die verschiedene Wartungspläne der Equipments ändert.

Kann es sein das ich SAP irgentwie mitgeben muss das der BAPI TRANSACTION_COMMIT sich auf BAPI_EQUI_INSTALL / DISMANTLE bezieht?
Wenn ja hat das schon mal jemand gemacht, oder kann mit hier einen Gedankenanstoß geben?

Gruß und Dank im Vorraus!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
GarlandGreene
myCSharp.de - Member



Dabei seit:
Beiträge: 499
Herkunft: Emmerich, NRW

beantworten | zitieren | melden

Soweit ich weiss, geht das nicht, jeder Aufruf erfolgt in seinem eigenen Kontext. Man kann sich aber damit behelfen, einen SAP-Baustein zu bauen, der dieselben Eingangsparameter wie der eigentliche Funktionsaufruf hat und der am Ende den Commit-Baustein aufruft.
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

beantworten | zitieren | melden

Danke erstmal für die schnelle Antwort.

Leider sind bei uns die Kapizitäten in der SAP Programmierung eher begrenzt. Villeicht hat ja noch jemand eine Idee wie ich den Commit senden kann, weil ich es vermeiden möchte hier auch noch interne Rssourcen zu benutzen, oder Externe damit zu beauftragen , da das Budget eher knapp ist.
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16109

beantworten | zitieren | melden

Wenn ihr noch nen bisschen Budget übrig habt und das lieber in eine Software statt ind ziemlich viel Zeit zu stecken würde sich ein Blick auf den SAP.NET CONNECTOR lohnen.
Vereinfacht die Interaktion mit SAP wirklich sehr.

Auch wenns erst mal Geld kostet -> man braucht einfach weniger Zeit und es läuft sauberer.
Kost ja auch Geld wenn man rumsitzt weil man nicht weiter kommt.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Vergiss SAP.NET Connector gleich wieder... der ist tot (wird nicht weiter entwickelt)... zudem ist das Teil (ohne Modifikation) brandgefährlich auf .Net-Versionen > 1.1 (da die ganze Serialisierung/Deserialisierung auf Reflection (speziell Reihenfolge von Feldern der Strukturen) aufgebaut ist... und Reflection ist ja ab 2.0 aufgrund der eingeführten Generics nicht mehr stabil (die Felder werden nicht bei jedem Call in derselben Reihenfolge geliefert).

SAP.Net Connector kann zudem nicht mit modifizierten Strukturen umgehen (d.h: Wenn irgendwo ein neues Feld dazwischengeklemmt wird bist du tot).

So wie Dein Code aussieht hast Du es mit SAPNCO3 gemacht... das passt schon.

Wenn mehrere Bausteine in Folge aufgerufen werden sollen, dann musst Du dafür sorgen dass die Aufrufe im selben Kontext stattfinden.

RfcSessionManager.BeginContext

Aufruf 1
Aufruf 2

RfcSessionManager.EndContext

Gruss
Programmierhans
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

beantworten | zitieren | melden

Danke :)

Genau DAS hab ich gesucht. Vielen Dank!

PS: ja genau SAPNCO3, was anderes währe ohne hin nicht in Frage gekommen da ich bereits bestehende Software weiterschreibe und hierbei nicht die Methode ändern wollte, trotzdem danke für den Vorschlag Abt :)
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat von EifelYeti
Genau DAS hab ich gesucht. Vielen Dank!

Kein Problem :-) und unser täglich SAP gib uns heute :-)

Gruss
Programmierhans

PS: SAP.Net.Connector ist ein dehnbarer Begriff ... die neue Version 3.0 wird meist SAPNCO3 genannt um Verwechslungen mit den älteren Versionen zu vermeiden (3.0 ist in keinster Weise kompatibel zu älteren Versionen).

Gute Links:

Uebersicht (Kein Account nötig):
- SAP .NET Connector 3.0Overview

.Net als Server (calls aus SAP)
- Build an RFC Server with NCo 3.0 – A Step-By-Step Guide
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Programmierhans am .
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16109

beantworten | zitieren | melden

Ich hatte SAP.NET Connector mit ERPConnect verwechselt.
Den oberen Beitrag habe ich daher "entfernt".
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers