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
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.
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
~~:::
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}~~
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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...
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
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...
Ich hatte SAP.NET Connector mit ERPConnect verwechselt.
Den oberen Beitrag habe ich daher "entfernt".
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code