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 User-Exit's werden über RFC nicht aufgerufen.
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

[gelöst] SAP User-Exit's werden über RFC nicht aufgerufen.

beantworten | zitieren | melden

Hallo zusammen,

ich kämpfe mal wieder an einem leidigen SAP Thema.

Wenn ich einen SAP Baustein in meinem Programm aufrufe dann werden die User-Exits die wir angelegt haben nicht angesprochen, gebe ich die selben Daten in der SE37 ein, wird alles wie gewohnt ausgeführt.

Ich verwende die sapnco.dll / sap.connector

Mein Code als minimalprojekt:


MyBackendConfig config__ = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(config__);
RfcDestination rfcDest = RfcDestinationManager.GetDestination("U04");
RfcRepository rfcRep = rfcDest.Repository;

IRfcFunction myfun;
DateTime SAPZEIT;

myfun = rfcRep.CreateFunction("SCTM_GET_TIME_RFC"); // SAP Systemzeit holen
myfun.Invoke(rfcDest);

string time = myfun.GetString("EV_TIME");
string date = myfun.GetString("EV_DATE");
string[] tmpar = date.Split('-');

SAPZEIT = new DateTime(int.Parse(tmpar[0]), int.Parse(tmpar[1]), int.Parse(tmpar[2]));

tmpar = time.Split(':');

SAPZEIT = SAPZEIT.Add(new TimeSpan(int.Parse(tmpar[0]), int.Parse(tmpar[1]), int.Parse(tmpar[2])));

myfun = rfcRep.CreateFunction("ALM_MEREP_040_CREATE");
myfun.SetValue("USER", "BenutzerName");

IRfcStructure messung = myfun.GetStructure("MEASUREMENT");
//messung.SetValue("DOCUMENT", "123456789");
messung.SetValue("MEASUREMENT_POINT", fill("5734", 12, '0'));
messung.SetValue("READING_DATE", SAPZEIT);
messung.SetValue("READING_TIME", SAPZEIT);
messung.SetValue("SHORT_TEXT", "12345 1100 100 001");
messung.SetValue("READER", "MeinAbleser");
messung.SetValue("RECORDED_VALUE", fill("20", 22, '0'));
messung.SetValue("RECORDED_UNIT", '%');

myfun.SetValue("MEASUREMENT", messung);

myfun.Invoke(rfcDest);

Es gibt keine Fehlermeldung und der Messbeleg selbst wird auch angelegt. Nur werden eben scheinbar nicht die UserExits durchlaufen, da der Wartungsplan bei einer Messung unter 99,99998% nicht angestoßen wird. (20% ist da deutlich drunter)

(Der Return Parameter ist immer null, also auf dieser Ebene schoneinmal keine Fehler)

Hatte hier sonst schon jemand das Problem?

Danke vorab und viele Grüße
EifelYeti
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion
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

Sooo

Ich hab in der Zeit mal mit unserem externen Programmierer gesprochen, dieser hat in SAP eine Debugconsole zur Verfügung mit der er Systemvariabeln und Flags lesen kann. Er meinte auch das es eine solche Konsole auch für .net geben sollte.

Ich habe aber leider keine solche Konsole bei der SAP Hilfe oder bei google gefunden.

Hat hier schoneinmal jemand eine solche Konsole gesehen? Ich habe jetzt zwar ein Capture mit Wireshark gemacht, in dem die Daten unverschlüsselt gesendet werden, aber komme damit nicht so recht weiter da ich die Systemvariabeln nicht aus dem TCP Stream lesen kann (es scheitert kognitiv und nicht optisch, bzw an ermangelung von Erfahrung oder Information bezüglich des Aufbaus).

Bin für jede Idee dankbar :)
Rekursion
(lat. , die) siehe Rekursion
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

Hat hier keiner mehr eine Idee oder braucht ihr noch mehr Informationen?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
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

Ganz ehrlich: ich würde mein Glück in einem anderen Forum, zum Beispiel bei Stackoverflow versuchen.
Hier ist die Verwendung von SAP schon sehr selten und die Wahrscheinlichkeit, dass sich hier SAP Cracks tummeln, ist gering ;-)
- 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

Mach mal ein

RfcSessionManager.BeginContext(rfcDest) vor den Aufrufen und ein entsprechendes EndContext nach dem letzen Aufruf.
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

Hi ,

danke für den Tipp hatte ich im Testprojekt total verschwitzt, hat aber leider nicht den gewünschten Erfolg gebracht..

Es wird immernoch nicht der Userexit angesprochen.

@Abt
Auch Danke, ich habs mal in Stackoverflow versucht :)
Rekursion
(lat. , die) siehe Rekursion

Moderationshinweis von Abt (07.01.2013 - 17:52:18):

Mein Name hat 3 Buchstaben. Is ja nich sooo schwer :) Jedes mal schreibst Du p statt b - das is nicht nett ;-)

EDIT von herbivore: Da der Thread auf Stackoverflow (SAP Backgroundwork not started) auf Hinweis eines Moderators erstellt wurde, zählt er ausnahmsweise nicht als Crosspost (zumal die konkrete Frage auch etwas anders ist).

private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Setz in SAP in SE37 in ALM_MEREP_040_CREATE einen harten Breakpoint ... und schau Dir die Werte an...

Vorallem diese 2 Werte sehen für mich strange aus...

messung.SetValue("READING_DATE", SAPZEIT);
messung.SetValue("READING_TIME", SAPZEIT);


--> Konzentrier Dich zuerst auf die WERTE ... erst wenn Du 100% sicher bist, dass die Werte identisch sind (zwischen RFC-Call und Handeingabe) kannst Du weiter nach der Ursache suchen...

Ich habe zu oft erlebt, dass es am Schluss nur an den Daten liegt.

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

Hallo zusammen,

ich habe nun die Daten genauso eingegeben wie in der SE37 (Copy & Paste).

Dafür hab ich auch solange die "SAPZEIT" durch ein festes Datum ersetzt.

Wenn ich mir dann aber in der IP10 die Wartungspläne angucke (die werden von der Programmierung angelegt) steht unter der Sonderwartung leider immernoch kein Wert. (Auser die Werte die mit der SE37 angelegt wurden.

Muss ich villeicht noch irgentwo einen Parameter setzten der es erlaubt auf einen Programmabschluss der Hintergrundprogrammierung zu warten?

Bei den Werten bin ich mir jetzt wirklich sicher das ich die 1:1 übernommen habe.
Ich bin zwar selbst noch nicht an den Werten im SAP gescheitert, vertraue da aber voll deiner Erfahrung :)

//Offtopic: Sorry Abt, ich gebe mir jetzt Mühe dir nicht mehr verbal auf die Füße zu treten ;)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EifelYeti am .
Rekursion
(lat. , die) siehe Rekursion
private Nachricht | Beiträge des Benutzers
EifelYeti
myCSharp.de - Member

Avatar #avatar-3408.jpeg


Dabei seit:
Beiträge: 66
Herkunft: Eifel

Themenstarter:

[gelöst] SAP User-Exit's werden über RFC nicht aufgerufen.

beantworten | zitieren | melden

Hallo zusammen.

Wir haben das Problem gefunden:

Ein sy-... Flag , welches in der SAP Gui immer gesetzt ist, wird beim aufruf von Auserhalb nicht gesetzt. Darauf hat aber leider die externe Programmierung geprüft, wodurch die Bedingung immer als falsch beendet wurde.

Also wurde der Userexit zwar aufgerufen, jedoch sofort wieder beendet.

Nun zur Lösung:
Wir haben um das herrauszufinden einen Externenbreakpoint in der SE37 hinzugefügt.
Dann das Testprogramm ablaufen gelassen, hier wird dann sofort im SAP der Ababdebugger geöffnet (klappt witziger Weise auch bei unterschiedlichen Maschienen (Programm => Lokal // SAP => TerminalServer). Hier haben wir dann die Sys'variabelen überwacht und die einzelnen Steps durchgegangen.

Danke für eure Tipps und die Hilfestellungen!

Edit:
Hier noch ein paar Links für mitsuchende, und falls mein Beitrag zu unverständlich gewesen ist:

Breakpoint setzen Tutorial

Allgemeines über Breakpoints
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von EifelYeti am .
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

Schön dass die Tipps geholfen haben...

Der Vollständigkeit halber noch was zum Breakpoint:

1) SE37 in die entsprechende Funktion
2) Breakpoint auf der ersten Zeile setzen (Wichtig: es gibt zwei Arten von Breakpoints... es muss derjenige verwendet werden welcher 2-Stunden gültig ist (in deinem Link sieht man das Icon).
3) Es muss derselbe User verwendet werden welcher beim Aufruf des FuBa verwendet wird.
4) Breakpoints gelten nur für neue Verbindungen (im Zweifelsfall die Anwendung neu starten)

Gruss
Programmierhans

PS: Wir debuggen aus der Schweiz sogar Anwendungen in Australien :-). Bei alten SAP-Versionen kann man das AbapDebug-Flag (der Verbindung) setzen und kann so sogar OHNE externen Breakpoint direkt in SAPGui reindebuggen.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers