Loop Exit Sy-Subrc

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Loop Exit Sy-Subrc

Beitrag von SaskuAc (Specialist / 321 / 37 / 44 ) »
Hallo Zusammen,

ich wollte gerade eben einen Code von mir testen in dem ich in der PA30 eine Person bearbeite.
Nun ist das Problem, dass ich immer automatisch wenn ich die Transaktion öffne in eine endlosschleife gerate...
Ich weiß auch wo ich das tue.. Und zwar in einer von uns selbst geschriebenen Klasse.. ( warum die dort aufgerufen wird ist mir noch ein Rätsel .. aber das frage ich morgen einen Kollegen )

Dieser Codeschnipsel ist dafür Verantwortlich:

Code: Alles auswählen.

* Besetzte Leiterplanstelle gefunden?
  LOOP AT ch_responsibles TRANSPORTING NO FIELDS
                          WHERE employee IS NOT INITIAL.
    EXIT.
  ENDLOOP.
  IF sy-subrc = 0.
*   Mindestens 1 besetzte Planstelle vorhanden
    DELETE ch_responsibles WHERE employee IS INITIAL.
  ELSE.
*   KEINE besetzte Planstelle vorhanden, suche aufwärts -> Rekursivaufruf
nun ich erwarte aktuell eigentlich dass er nach dem Loop sy-subrc auf 0 setzt und ich dann ganz normal weiter machen kann, aber nein, das Programm springt in den ELSE-Zweig und ruft sich rekursiv auf.

Nun ist meine Frage: Verändert das EXIT, weil das ja ordentlich durchläuft, den sy-subrc? Weil im Debugger habe ich beim IF einen subrc von 4 .. OBWOHL employee leer ist.

Oder bin ich einfach nur dämlich und übersehe etwas?
der Loop müsste ja eigentlich sagen "ist employee leer? Ja --> sy-subrc = 0; Nein --> sy-subrc = 4" ..
aber employee ist nunmal leider leer ..

sorry für diesen verwirrten Beitrag ... ich bin einfach nur fertig, weil es mich einen ganzen Tag gekostet hat ...

Danke für die Hilfe...

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Loop Exit Sy-Subrc

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Der Subrc sagt gar nichts darüber aus, ob employee leer ist, sondern ob mindestens eine Zeile gefunden werden konnte, bei der employee leer ist. Wenn er keine findet, dann führt er den Inhalt des LOOP überhaupt nicht aus, sondern gibt Dir direkt SY-SUBRC = 4 zurück.

Ich vermute, dass Dein Problem darin besteht, dass Du irgendwann ganz oben im Orgbaum angekommen bist. Dort findest Du keine besetzte Planstelle, rufst Dich erneut rekursiv auf, obwohl es nach oben nicht mehr weiter geht, findest wieder nichts usw.

Nach meiner Erfahrung taugt Rekursion sowieso nur etwas, wenn man den Orgbaum abwärts suchen möchte, weil die Rekursion einem dann hilft, in alle Teilzweige hineinzukommen. Sucht man hingegen aufwärts, dann ist das eine lineare Sache, da jede Orgeinheit ja nur (maximal) eine übergeordnete Orgeinheit haben kann. Da ist man mit einer WHILE-Schleife besser bedient (WHILE SY-SUBRC = 0 und am Ende dann SY-SUBRC <> 0 werfen, wenn keine höhere Orgeinheit mehr gefunden wird).

Davon abgesehen möchte ich noch anmerken, dass mir nicht gefällt, dass Du hier überhaupt einen LOOP genommen hast. Für den sehe ich keinerlei Veranlassung, da Du nicht auf Ungleichheit prüfst. Ein READ TABLE ... TRANSPORTING NO FIELDS würde Deinen Zweck mindestens genauso gut erfüllen, wäre performanter und obendrein besser lesbar. Hast Du mindestens Release 7.40, dann könnest Du mit einem LINE_EXISTS( ) das ganze superelegant schreiben:

IF LINE_EXISTS( ch_responsibles[ employee <> '00000000' ] ). " Unter der Maßgabe, dass employee eine Personalnummer ist, denn dann ist '00000000' der Initialwert
* Mindestens 1 besetzte Planstelle vorhanden
DELETE ch_responsibles WHERE employee IS INITIAL.
ELSE.
* KEINE besetzte Planstelle vorhanden, suche aufwärts -> Rekursivaufruf

Das EXIT verändert den SY-SUBRC nicht. Wenn die LOOP-Schleife durchlaufen worden ist, wird SY-SUBRC auf 0 stehen.

Bei weiteren Fragen poste doch bitte etwas mehr Code, sonst ist das immer so ein Rätselraten, was da passiert. Du beklagst Dich über eine Endlosschleife und lässt in Deinem Codeausschnitt die Endlosschleife selbst weg. Das ist nicht hilfreich.

Re: Loop Exit Sy-Subrc

Beitrag von Tron (Top Expert / 1327 / 35 / 332 ) »
Moin.
Ich sehe so keinen Grund überhaupt einen Loop zu verwenden.

Code: Alles auswählen.

DELETE ch_responsibles WHERE employee IS INITIAL.
if sy-subrc <> 0.
*   KEINE besetzte Planstelle vorhanden, suche aufwärts -> Rekursivaufruf
gruß Jens
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Loop Exit Sy-Subrc

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Noch schicker, hast recht. Wobei ich, wenn ich er wäre, dennoch verstehen wollen würde, wo mein Denkfehler gelegen hat. Ein LOOP AT mit EXIT drin zum Finden einer einzelnen Zeile ist ja nicht unüblich - und notwendig, sobald man Bedingungen drin hat, bei denen eine Prüfung auf Gleichheit nicht ausreicht.

Re: Loop Exit Sy-Subrc

Beitrag von a-dead-trousers (Top Expert / 4399 / 223 / 1182 ) »
Ich glaube der Fehler ist nicht ursächlich in dem Codeschnippsel von SaskuAc zu suchen.
Vielmehr glaube ich, dass die Abbruchbedingung aufgrund der Rekursion "falsch" gewählt ist. Oft wenn ich eine Rekursion (z.B. für das Durchsuchen von Hierarchien) programmiere, übersehe ich gerne, dass es auch passieren kann, dass man einen Zweig mehrmals durchläuft. Das passiert vor allem dann, wenn man aus der "treibenden" Tabelle für die Rekursion die Einträge rauslöscht, so wie das hier scheinbar der Fall ist. Irgendwann hat man dann nichts mehr gegen das man die Abbruchbedingung prüfen kann und das Ding läuft bis zum St. Nimmerleinstag. Dann braucht man eine zweite Hilfstabelle um sich die bereits durchlaufenen Zweige der Rekursion zu merken.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Loop Exit Sy-Subrc

Beitrag von SaskuAc (Specialist / 321 / 37 / 44 ) »
Okay ich hatte hier einfach einen Denkfehler bezgl. des TRANSPORTING NO FIELDS ... habe das selber noch nie verwendet, daher kannte ich das nicht.

Und das Coding selber stammt nicht von mir, das ist von einem Kollegen, ansonsten weiß ich natürlich, dass ich hier keinen Loop verwendet hätte sondern wie ihr schon gesagt habt, direkt den Delete und dann dort auf sy-subrc prüfen. Allerdings kann ich das Coding aktuell nicht anfassen, da es in anderen größeren Changes drinnen ist - in die ich nicht rein darf..

Zur Abbruchbedingung - es kann sein, dass hier im Entwicklungssystem ( denn nur da tritt der Fehler auf ) Datenfehler im Orgmanagement ( das inzwischen seit 4 Jahren nicht mehr vom Produktiv kopiert worden ist ... ) vorhanden sind und es deswegen zu einer Endlosschleife kommt.. im Quality und Produktivsystem tritt das nicht auf.

Was mich noch mehr wundert und wahrscheinlich die Frage nach dem Coding irrelevant macht ist, warum es bei meinem Kollegen funktioniert, der die PA20 ( oder 30 ) ganz normal aufruft, bei mir aber nicht .. er hat da absolut keine Probleme ...

Sind für die PA20 / PA30 irgendwelche Userparameter vorhanden oder etwas derartiges, dass die Art und Weise wie man auf die Transaktion zugreift ( denn Berechtigungen - also Rollen und Profile sind identisch ) bestimmt? Das ist das einzige was ich mir vorstellen kann ...

Re: Loop Exit Sy-Subrc

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Okay ich hatte hier einfach einen Denkfehler bezgl. des TRANSPORTING NO FIELDS ... habe das selber noch nie verwendet, daher kannte ich das nicht.
In bezug auf den SY-SUBRC ist der TRANSPORTING NO FIELDS aber eigentlich bedeutungslos.
Sind für die PA20 / PA30 irgendwelche Userparameter vorhanden oder etwas derartiges, dass die Art und Weise wie man auf die Transaktion zugreift ( denn Berechtigungen - also Rollen und Profile sind identisch ) bestimmt? Das ist das einzige was ich mir vorstellen kann ...
An der Stelle wären wieder ergänzende Hintergrundinformationen interessant, insbesondere die, auf welche Weise Du Deinen Code denn in die PA20/PA30 eingebunden hast. Ich kenne dafür zwei Wege: Über die ZXPADU01/ZXPADU02 (klassischer User Exit) oder über den BADI HRPAD00INFTY (und darin dann wieder über verschiedene Methoden).
Sind für die PA20 / PA30 irgendwelche Userparameter vorhanden oder etwas derartiges, dass die Art und Weise wie man auf die Transaktion zugreift ( denn Berechtigungen - also Rollen und Profile sind identisch ) bestimmt?
Nicht, dass ich wüsste (wobei Du neben den regulären natürlich auch an - möglicherweise sogar kontextsensitive - strukturelle Berechtigungen denken musst, falls ihr die im Einsatz habt). Aber auch hier stellt sich wieder die Frage, was Du mit "zugreift" meinst. In der PA20/30 gibt man ja zunächst mal nicht mehr ein als die Personalnummer; der Rest ist dann infotypspezifisch. Unter welchen Umständen wird Dein Code überhaupt ausgeführt? Da fehlen deutlich zu viele Randinformationen. Wenn Du hier eine nützliche Antwort haben möchtest, wirst Du Dein Problem so detailliert beschreiben müssen, dass man es nachvollziehen kann.

Re: Loop Exit Sy-Subrc

Beitrag von SaskuAc (Specialist / 321 / 37 / 44 ) »
Danke, das Problem hat sich allerdings gerade eben in Luft aufgelöst..

Das Programm hat aufgrund eines Customizingfehlers von einem Kollegen bezgl. strukturellen Berechtigungen ( die fürs MSS gedacht sind ) den Code aufgerufen .. den zusammenhang verstehe ich auch noch nicht wirklich, aber naja .. behoben ist behoben.

Da war dann allerdings noch das Problem mit der Endlosschleife .. diese wurde durchlaufen, weil sich mein Kollege für eben das MSS Reporting auf die Stelle des Personalchefs und seine aktuelle Stelle gleichzeitig gesetzt hat. Daraus ist dann dieser Loop entstanden.


Danke euch dennoch für die Hilfe!
Gruß!

Re: Loop Exit Sy-Subrc

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Das Programm hat aufgrund eines Customizingfehlers von einem Kollegen bezgl. strukturellen Berechtigungen ( die fürs MSS gedacht sind ) den Code aufgerufen
Strukturelle Berechtigungen sind häufig in HCM-bezogene Probleme verwickelt. Trotzdem liebe ich sie, denn man kann eine Menge damit machen, und die strukturellen Berechtigungen als solche sind ja nicht schuld am jeweiligen Problem, sondern ein Fehler im Umgang damit.
Da war dann allerdings noch das Problem mit der Endlosschleife .. diese wurde durchlaufen, weil sich mein Kollege für eben das MSS Reporting auf die Stelle des Personalchefs und seine aktuelle Stelle gleichzeitig gesetzt hat. Daraus ist dann dieser Loop entstanden.
Das ist aber trotzdem Mist, denn dass eine Person mehrere Planstellen besetzt, ist ja absolut legitim (weswegen SAP auch den jeweiligen Besetzungsprozentsatz führt). Selbst wenn ihr davon in eurem Haus keinen Gebrauch macht, würde ich den Code so schreiben, dass er damit umgehen kann (wer weiß, was in Zukunft noch kommt). Im Zweifel bei jeder neu gefundenen Planstelle prüfen, ob sie schon in der Liste der bereits durchlaufenen Planstellen mit drin ist und wenn ja, den LOOP dort beenden.

Wobei ihr das relativ einfach hättet finden können, indem ihr den Endlos-LOOP debuggt. Wenn ihr nicht wisst, wo er ist, einfach Programm starten, dann in der SM50 den Prozess markieren und Menü Administration -> Programm -> Debugging. Schwupp springste in den Debugger und kannst Dir dann in Ruhe anschauen, an welcher Stelle er sich im Kreise dreht.

Re: Loop Exit Sy-Subrc

Beitrag von SaskuAc (Specialist / 321 / 37 / 44 ) »
DeathAndPain hat geschrieben:
Da war dann allerdings noch das Problem mit der Endlosschleife .. diese wurde durchlaufen, weil sich mein Kollege für eben das MSS Reporting auf die Stelle des Personalchefs und seine aktuelle Stelle gleichzeitig gesetzt hat. Daraus ist dann dieser Loop entstanden.
Das ist aber trotzdem Mist, denn dass eine Person mehrere Planstellen besetzt, ist ja absolut legitim (weswegen SAP auch den jeweiligen Besetzungsprozentsatz führt). Selbst wenn ihr davon in eurem Haus keinen Gebrauch macht, würde ich den Code so schreiben, dass er damit umgehen kann (wer weiß, was in Zukunft noch kommt).
Es lag nicht daran, dass er mehrere Planstellen hatte, das ist bei uns tatsächlich üblich ..
Er hat sich hier dann allerdings zum Chef von seinem Chef gemacht. Dadurch wurde dann wieder sein chef gesucht, dann wurde er wieder gefunden .. dann wurde wieder der chef gesucht .. dann wieder er .. usw.
DeathAndPain hat geschrieben:
Das Programm hat aufgrund eines Customizingfehlers von einem Kollegen bezgl. strukturellen Berechtigungen ( die fürs MSS gedacht sind ) den Code aufgerufen
Strukturelle Berechtigungen sind häufig in HCM-bezogene Probleme verwickelt. Trotzdem liebe ich sie, denn man kann eine Menge damit machen, und die strukturellen Berechtigungen als solche sind ja nicht schuld am jeweiligen Problem, sondern ein Fehler im Umgang damit.
Da hast du natürlich recht .. wobei ich noch nicht wirklich 100%ig hinter diese gestiegen bin ..
Sie waren hier auch nicht das Problem .. sondern eben, wie du sagtest, der Umgang damit .. ^^

Re: Loop Exit Sy-Subrc

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Es lag nicht daran, dass er mehrere Planstellen hatte, das ist bei uns tatsächlich üblich ..
Er hat sich hier dann allerdings zum Chef von seinem Chef gemacht. Dadurch wurde dann wieder sein chef gesucht, dann wurde er wieder gefunden .. dann wurde wieder der chef gesucht .. dann wieder er .. usw.
Ok, mit sowas kann man sogar den SAP-Standard in eine Endlosschleife schicken. Wenn Du in Deinem Orgbaum einen Ring baust (Orgeinheit 1 > Orgeinheit 2 > Orgeinheit 3 > Orgeinheit 1), dann läuft er z.B. in der PPOSE bei der strukturellen Berechtigungsprüfung (!) in eine Endlosschleife, weil Du einen Auswertungsweg von der Form O-O-S-P haben wirst und er den Auswertungsbaum niemals komplett aufgespannt bekommt. Das hatten wir schon mal; da habe ich mir auch mit dem Debugger über die SM50 geholfen, um das zu finden.

Das Gemeine ist, dass man solch Ring mit der PPOME selbst hinbekommt - einfach die obere Orgeinheit unter die unsere ziehen. So ist es damals bei uns gelaufen, da hat ein Misclick einer Sachbearbeiterin ausgereicht. Dafür musste sie noch nicht mal eine Tastaturtaste drücken!

Um eine Ringdefinition bei der Chefzuordnung hinzukriegen (soweit sie sich nicht aus solch einem Orgunit-Ring ergibt), muss man aber schon händisch mit der PO13, PO10 oder PP01 ran.
Sie waren hier auch nicht das Problem .. sondern eben, wie du sagtest, der Umgang damit .. ^^
Einen Fall gibt es freilich, bei dem die strukturellen Berechtigungen ziemlich dicht dran sind, selbst die Ursache zu sein, und zwar wenn Du dafür die Pufferung eingeschaltet hast. Was hab ich mir schon einen Wolf gesucht, warum die strukturelle Berechtigung eines Users nicht funktioniert, obwohl ich sie korrekt eingestellt habe, bis ich auf den Trichter gekommen bin, dass ja erst nachts der Job (Report RHBAUS00) läuft, der den Puffer aktualisiert... :oops:

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2877
Views
sy-subrc oder syst-subrc?
von genua » 31.10.2007 11:55 • Verfasst in ABAP® für Anfänger
13
Antw.
18148
Views
exit und loop???
von Nadine_2706 » 01.09.2011 13:50 • Verfasst in ABAP® für Anfänger
1
Antw.
1484
Views
2
Antw.
3267
Views
Übersicht zu sy-subrc
von KleinerEisbaer » 22.07.2008 16:48 • Verfasst in ABAP® für Anfänger
8
Antw.
6174
Views
MB_CREATE_GOODS_MOVEMENT mit SUBRC 5
von Adrian » 20.04.2015 14:34 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Regex in where
vor 58 Minuten von tar 8 / 175
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1488

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Regex in where
vor 58 Minuten von tar 8 / 175
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1488

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822