Naja, es ist schon klar, dass mit "eine Zeile" kein "String" gemeint war.DeathAndPain hat geschrieben:Das mit der einen Zeile ist sowieso interpretationsbedürftig, denn rein syntaktisch darf man - nur unter Berücksichtigung der Grenzen, die der ABAP Editor vorgibt - auch das ganze, große Programm in eine Zeile schreiben.
Das ist so ein Klassiker, den ich gern hervorheben möchte. Solcherlei gibt es viele, die dann zu Hilfsvariablen und "Drumherum-Programmieren" nötigen, was dann vom eigentlichen Zweck der Logik ablenkt, selbst wenn man es kapselt. Und gerade beim Lesen von Programmen möchte ich jegliche Ablenkung vermeiden.ewx hat geschrieben:Ich ärgere mich jedes Mal über die dynamischen Dokumente, bei denen Texte stets im Format sdydo_text_element (C255) übergeben werden müssen anstelle von CLIKE.
Gebe ich Dir recht, aber diese Tür schwingt in beide Richtungen. Zu stark geschachtelte Anweisungen, sei es über geschachtelte funktionale Methoden, sei es über mit dem FOR-Befehl bewerkstelligte Schweinereien, können weit mehr ablenken, weil sie den Programmierer zwingen, sich geistig vom Inhalt zu lösen, um erst mal die komplizierte Syntax zu dekodieren.Und gerade beim Lesen von Programmen möchte ich jegliche Ablenkung vermeiden.
Nicht vergleichbar mit einer Indexsuche (wobei eine Standardtabelle mit so wenigen Einträgen, wie ein Dynpro typischerweise Elemente hat, sequentiell schneller durchsucht wird als eine sortierte Tabelle über Index, siehe mein Testprogramm von neulich). Aber die Suche innerhalb des ABAP-Compilers durchzuführen, also eine Sprachenebene niedriger, halte ich für allemal performanter, als es in ABAP mit diskreten Befehlen zu machen. Überdies wird der Code dadurch kürzer und besser lesbar, da sich der IF/CHECK in der Schleife erübrigt. Obendrein ist die Darstellung mit WHERE beim Code-Lesen besser verständlich.Ein LOOP AT...WHERE... würde wohl kaum schneller werden bei einer schlüssellosen Standardtabelle.
Da hatten wir doch kürzlich hier erst die Diskussion, in der sich alle einig waren, dass zumindest bei Schleifen gegen CHECK nichts einzuwenden sei.Von CHECK rät die SAP aus guten Gründen ab.
Code: Alles auswählen.
LOOP AT SCREEN.
IF SCREEN-NAME = 'HIER_NIX_EINGEBEN'.
SCREEN-INPUT = '0'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.Code: Alles auswählen.
LOOP AT SCREEN.
CHECK SCREEN-NAME = 'HIER_NIX_EINGEBEN'.
SCREEN-INPUT = '0'.
MODIFY SCREEN.
ENDLOOP.Code: Alles auswählen.
LOOP AT SCREEN WHERE SCREEN-NAME = 'HIER_NIX_EINGEBEN'.
SCREEN-INPUT = '0'.
MODIFY SCREEN.
ENDLOOP.Code: Alles auswählen.
READ TABLE SCREEN WITH KEY NAME = 'HIER_NIX_EINGEBEN'.
SCREEN-INPUT = '0'.
MODIFY SCREEN.Wenn es denn ginge plädiere ich fürDeathAndPain hat geschrieben: Und wenn ich drüber nachdenke, wäre die allerschönste, die eigentlich angemessene Syntax:
Code: Alles auswählen.
READ TABLE SCREEN WITH KEY NAME = 'HIER_NIX_EINGEBEN'. SCREEN-INPUT = '0'. MODIFY SCREEN.
SCREEN[ name = 'HIER_NIX_EINGEBEN' ]-input = '0'.
Nein, du bist nicht allein. CHECK macht in vielen Situationen Sinn.DeathAndPain hat geschrieben: Davon abgesehen muss CHECK die Lesbarkeit nicht verschlechtern (ich persönlich bin im Gegenteil der Meinung, dass er das niemals tut, auch wenn ich weiß, dass ich mit der Ansicht ziemlich alleine dastehe.)
Da gibt es ein Problem: Namen können doppelt vorkommen!DeathAndPain hat geschrieben: Und wenn ich drüber nachdenke, wäre die allerschönste, die eigentlich angemessene Syntax:Code: Alles auswählen.
READ TABLE SCREEN WITH KEY NAME = 'HIER_NIX_EINGEBEN'. SCREEN-INPUT = '0'. MODIFY SCREEN.
Der Screen ist natürlich in der Realität gar keine Tabelle.DeathAndPain hat geschrieben: Dass man auf SCREEN nicht richtig wie auf andere interne Tabellen zugreifen kann, halte ich für eine Eigenart, die auf technischen Unzulänglichkeiten längst vergangener Releases beruht. Heute sollte es kein Problem mehr sein, das volle Befehlsarsenal auch für SCREEN bereitzustellen.
Der Befehl ist sogar noch viel tückischer! Entgegen derblack_adept hat geschrieben: Wenn es denn ginge plädiere ich fürSCREEN[ name = 'HIER_NIX_EINGEBEN' ]-input = '0'.
Seit wann das denn?!Daniel hat geschrieben: Da gibt es ein Problem: Namen können doppelt vorkommen!
Code: Alles auswählen.
LOOP at itab.
if a = b.
...
endif.
endloop.Code: Alles auswählen.
loop at itab.
if a ne b.
continue.
endif.
....
endloop.Naja, es ist ein READ - jeder READ erwischt nur einen Satz. Wo nimmst du die Erwartungshaltung her, dass diese Anweisung mehrere Vorkommen erwischt?Daniel hat geschrieben:Entgegen der Erwartung die sich aus der Syntax ergibt erwischt er auch
nur das erste Vorkommen von 'HIER_NIX_EINGEBEN'.
Das ist das typische Argument gegen CHECK. Ich halte es nicht für valide, denn an der Aufrufstelle des CHECK muss man ja nicht die ganze Aufrufhierarchie kennen, sondern nur den innersten Verarbeitungsblock. Wenn man so weit die Übersicht verloren hat, dass man nicht mehr weiß, ob man sich in einer Schleife befindet oder nicht, dann hat man ein Problem, das mit CHECK nichts zu tun hat. Weiß man das aber noch, dann weiß man genug, und dann ist es völlig egal, ob da außenrum noch weitere LOOPs, DOs oder FORMs sind.Das Problem beim CHECK ist, dass es den aktuellen Verarbeitungsblock verlässt, es also kontextabhängig unterschiedliche Dinge tut. Und gerade in Monolithen mit LOOP in LOOP in DO in FORM verliert man hin und wieder den Überblick - und ja, ich kenne konkrete Beispiele dafür.
Wenn Du aber einen LOOP in einem LOOP hast und schmeißt den inneren LOOP raus, dann passiert genau das gleiche, was Du dem CHECK gerade vorwirfst: der CONTINUE "tut einfach was anderes", wie Du es ausgedrückt hast, da er dann nämlich plötzlich die äußere Schleife fortsetzt. Das kann Dir also bei CONTINUE genauso passieren wie bei CHECK. Der einzige Befehl aus diesem Themengebiet, bei dem das nicht so ist, ist RETURN (den man wohl extra zu diesem Zweck als Ablöse für EXIT eingeführt hat).Ein IF....CONTINUE...ENDIF in einem LOOP macht das gleiche wie ein CHECK in einem LOOP, aber wenn ich den LOOP rauswerfe, ist der CONTINUE syntaktisch falsch (und tut nicht einfach was anderes, wie das ein CHECK macht).
Hast dafür dann aber semantisch auch was anderes. Wenn nämlich hinter demralf.wenzel hat geschrieben:Darum finde ich das IF-Konstrukt besser, weil es eindeutiger ist. CHECK verwende ich grundsätzlich nicht mehr - weil ich es schwerer lesbar finde. Allerdings verwende ich es negativ, also nicht:
sondern:Code: Alles auswählen.
LOOP at itab. if a = b. ... endif. endloop.
So verhindere ich ewige IF in IF in IF-Konstrukte, die ich auch nicht sehr übersichtlich finde.Code: Alles auswählen.
loop at itab. if a ne b. continue. endif. .... endloop.
Code: Alles auswählen.
if a = b.
...
endif.Man muss halt die neue Syntax erst verinnerlichen. Wenn man sie noch nicht kennt und nur intuitiv zu verstehen sucht, dann suggeriert sie in der Tat etwas anderes. Daraus würde ich ihr aber auch keinen Vorwurf konstruieren wollen.Naja, es ist ein READ - jeder READ erwischt nur einen Satz. Wo nimmst du die Erwartungshaltung her, dass diese Anweisung mehrere Vorkommen erwischt?