*Ohne System, daher evtl. nicht ganz syntaxfehlerfrei - aber so geht es etwa:DeathAndPain hat geschrieben: Es ist kein absolut zwingender Zusammenhang, aber in den allermeisten Fällen ist der kürzere Code auch der besser lesbare.
Ich habe mir schon vor langer Zeit den folgenden Include gebaut:cuncon hat geschrieben:Zu dem Problem, warum war mein Programm hängen geblieben. Ich habe herausgefunden, dass FUBA SAPGUI_PROGRESS_INDICATOR zu oft aufgerufen wurde. Es gibt bei dem Code 2 LOOPS und nach jedem LOOP habe ich SAPGUI_PROGRESS_INDICATOR eingebaut und es hat Probleme gemacht. Dann habe ich bei der 2.LOOP nur je 1000.Schleife ein mal FUBA SAPGUI_PROGRESS_INDICATOR aufgerufen. Dann ging es.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Include ZINDIKAT
*&---------------------------------------------------------------------*
* Benutzungshinweise: Die Variablen I, AI und GES müssen als TYPE I definiert sein. Vor einem aufwendigeren LOOP über
* eine interne Tabelle xyz schreibt man dann folgende Zeilen (natürlich ohne Kommentarzeichen):
* DESCRIBE TABLE xyz LINES GES.
* CLEAR AI.
* Dann kann man im LOOP als ersten Befehl einfach
* PROGRESS_INDICATOR 'Berechnung findet statt'
* schreiben und bekommt dadurch eine Statusanzeige mit sauber hochzählender Prozentzahl.
* Die Einschränkung auf 5-Prozent-Schritte dient zur Performanceverbesserung, damit LOOPS über 1000 oder mehr
* Tabellenzeilen nicht tausendmal mit dem Client GUI kommunizieren. Ansonsten leidet nämlich die Performance merklich.
DEFINE PROGRESS_INDICATOR.
I = 100 * SY-TABIX / GES - 5.
IF I = 0. I = 1. ENDIF. " gleich beim ersten Durchlauf Uhr anzeigen
IF I > AI.
ADD 5 TO I. " nur alle 5 Prozent GUI-Sanduhr aktualisieren
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING PERCENTAGE = I
TEXT = &1.
MOVE I TO AI.
ENDIF.
END-OF-DEFINITION.
Warum nichtDeathAndPain hat geschrieben:Code: Alles auswählen.
DESCRIBE TABLE xyz LINES GES.
Code: Alles auswählen.
ges = lines( xyz ).
Das Coding passt nicht zum Kommentar "gleich beim 1. Durchlauf Uhr anzeigen":DeathAndPain hat geschrieben:Code: Alles auswählen.
* DESCRIBE TABLE xyz LINES GES. * CLEAR AI. ... DEFINE PROGRESS_INDICATOR. I = 100 * SY-TABIX / GES - 5. IF I = 0. I = 1. ENDIF. " gleich beim ersten Durchlauf Uhr anzeigen IF I > AI. ADD 5 TO I. " nur alle 5 Prozent GUI-Sanduhr aktualisieren CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING PERCENTAGE = I TEXT = &1. MOVE I TO AI. ENDIF. END-OF-DEFINITION.
Weißt Du, wie alt dieser Include ist? Der hat so schon unter 3.1i funktioniert. Damals gab es Deine Syntax noch nicht. Heute würde ich ihn etwas anders schreiben, ja.ralf hat geschrieben:Warum nicht
Code: Alles auswählen
ges = lines( xyz ).
Sieht aus wie jede andere Zuweisung.....
Hast recht, ist ein Bug, der aber all die Jahre nicht wirklich aufgefallen ist. Vielleicht eine gute Gelegenheit, das Coding mal zu moderniseren.black_adept hat geschrieben:Das Coding passt nicht zum Kommentar "gleich beim 1. Durchlauf Uhr anzeigen"
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Include ZINDIKAT
*&---------------------------------------------------------------------*
* Benutzungshinweise: Die Variablen I, AI und GES müssen als TYPE I definiert sein. Vor einem aufwendigeren LOOP über
* eine interne Tabelle xyz schreibt man dann folgende Zeilen (natürlich ohne Kommentarzeichen):
* GES = LINES( xyz ).
* CLEAR AI.
* Dann kann man im LOOP als ersten Befehl einfach
* PROGRESS_INDICATOR 'Berechnung findet statt'
* schreiben und bekommt dadurch eine Statusanzeige mit sauber hochzählender Prozentzahl.
* Die Einschränkung auf 5-Prozent-Schritte dient zur Performanceverbesserung, damit LOOPs über 1000 oder mehr
* Tabellenzeilen nicht tausendmal mit dem Client GUI kommunizieren. Ansonsten leidet nämlich die Performance merklich.
DEFINE PROGRESS_INDICATOR.
I = TRUNC( 99 * SY-TABIX / GES ) + 1.
IF I > AI.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING PERCENTAGE = I
TEXT = &1.
AI = I + 4. " 5%-Schritte machen
ENDIF.
END-OF-DEFINITION.
Code: Alles auswählen.
I = TRUNC( 99 * SY-TABIX / GES ) + 1.
Code: Alles auswählen.
AI = I + 4. " 5%-Schritte machen
Gut gebrüllt, Löwe. Aber statt hier so was zu postulieren würde mich für diesen ganz speziellen Fall doch mal interessieren, wie so eine Serviceklasse aussehen soll, die sowohl handhabbar als auch laufzeittechnisch mit D&Ps Include mithalten kann, wenn dieser denn mal sauber ausprogrammiert gepostet würde ( also auch mit der Datendefinition für GES, AI und I bzw. sinnvoll benannten Pendants im Include ). Denn so einfach wie du das hier darstellst ist das m.E. gar nicht.ralf.wenzel hat geschrieben:Ich fände eine Methode auch besser als ein Makro..... Kann man auch zentral warten und ich bin kein besonderer Freund von Makros. Ab in eine Serviceklasse damit als statische Methode und gut is.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
a-dead-trousers
(Ganz) früher hab ich die verwendet um wiederkehrende Code-Abschnitte, die mit Feld-Symbolen in Methoden arbeiten zu "parametrisieren". Inzwischen gibt es ja Gottseidank den Zusatz REFERENCE INTO zu diversen Befehlen und somit auch eine OO-konforme Alternative zu den Feld-Symbolen die über Methodengrenzen hinweg funktioniert. Ich hätte damals zwar auch GET REFERENCE verwenden können, aber erst seit REFERENCE INTO hab ich die Sinnhaftigkeit dahinter verstanden. (Brett vorm Kopf usw.)ralf.wenzel hat geschrieben:Eigentlich konnte mir noch niemand erklären, welchen Vorteil ein Makro hat.
Du drückst dich vor einer Antwort. Poste doch bitte mal ein Coding welches das macht was D&P gepostet hat als statische Methode. Und danach den Aufruf ebendieser. Wahrscheinlich merkst du schon beim Versuch so eine Methode zu erstellen was der Vorteil des Makros in diesem ganz speziellen Fall ist.ralf.wenzel hat geschrieben:Also, zunächst mal habe ich keine Veranlassung, anzunehmen, dass eine statische Methode grundsätzlich inperformanter ist als ein Makro. Was ich weiß, ist: Ein Makro kann man nicht debuggen und subjektiv schwerer lesbar ist es auch noch (und das geht nicht nur mir so). Eigentlich konnte mir noch niemand erklären, welchen Vorteil ein Makro hat.
Aber ich bin ja lernfähig....
Ralf
Dann ist die Antwort einfach für diesen Fall: Weil der Aufruf schlanker ist als beim Aufruf einer alternativen statischen Methode[ und wahrscheinlich sogar unwesentlich performanter ].ralf.wenzel hat geschrieben:Ich drücke mich nicht vor der Antwort, ich habe die Frage gestellt (die, welchen Vorteil ein Makro hat).