Laden...

[Gelöst] SAP RFC Commit nach BAPI aufruf

Erstellt von EifelYeti vor 11 Jahren Letzter Beitrag vor 11 Jahren 7.213 Views
EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren
[Gelöst] SAP RFC Commit nach BAPI aufruf

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!

++Rekursion ++
(lat. , die) siehe Rekursion

G
497 Beiträge seit 2006
vor 11 Jahren

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.

EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren

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

16.828 Beiträge seit 2008
vor 11 Jahren

~~:::

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.){gray}~~

4.221 Beiträge seit 2005
vor 11 Jahren

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...

EifelYeti Themenstarter:in
64 Beiträge seit 2012
vor 11 Jahren

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

4.221 Beiträge seit 2005
vor 11 Jahren

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

.Net als Server (calls aus SAP)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

16.828 Beiträge seit 2008
vor 11 Jahren

Ich hatte SAP.NET Connector mit ERPConnect verwechselt.
Den oberen Beitrag habe ich daher "entfernt".