Kopfzeile oder Workarea - interne Tabellen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

Kopfzeile oder Workarea - interne Tabellen

Beitrag von huckb (ForumUser / 1 / 0 / 0 ) »
Hallo ABAPler,
ich soll das folgende coding so umschreiben, dass ich eine workarea verwende.

read table tt_matn with key l_id = tt_matn-l_id.

In meiner ABAP schulung habe ich gelern, dass headerlines nicht mehr verwendet werden sollen.
wg. Lesbarkeit vom Coding und weil sie in OO nicht unterstützt werden...

Hatte bisher nicht die Notwendigkeit mich mit Headerlines zu beschäftigen. Daher habe ich sie gewissenhaft ignoriert :twisted:
Nun stehe ich vor dem Problem und habe keine Ahnung wie weiter. :?

Vielen Dank für eure Hilfe vorab,
Tim

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


Re: Kopfzeile oder Workarea - interne Tabellen

Beitrag von JHM (Top Expert / 1188 / 1 / 195 ) »
huckb hat geschrieben:Nun stehe ich vor dem Problem und habe keine Ahnung wie weiter.
Der erste Anlaufpunkt für solche Probleme ist immer die F1-Hilfe im Editor.
Dort wird dir die Syntax von READ TABLE erklärt:
F1 hat geschrieben: READ TABLE itab { table_key
| free_key
| index } result.
Vollgst du dann dem Zusatz result wirst du auf INTO wa [transport_options] stoßen, dort ist dann alles beschrieben.


Oder ging es dir um die ITAB mit/ohne Kopfzeile und einem passenden WA?
Gruß Hendrik

Re: Kopfzeile oder Workarea - interne Tabellen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
hi!

Ich würde ja anstatt einer Workarea eher ein Feldsymbol empfehlen. Vorallem wenn bislang nur Kopfzeilen verwendet wurden, kann man doch gleich auf die beste Lösung umsteigen.
1) Ist performanter
2) Man kann den Tabelleneintrag OHNE Modify ändern
3) Siehe 1)

Code: Alles auswählen.

READ TABLE lt_table ASSIGNING <ls_line> INDEX 1.
* bzw.
LOOP AT lt_table ASSIGNING <ls_line>.
Zur Definition von Tablle/Feldsymbol/Workare gibts mehrere Ansätze:

Code: Alles auswählen.

DATA: lt_flight TYPE flighttab. "<-- Tabellentyp
FIELD-SYMBOLS: <ls_line> TYPE LINE OF flighttab."<-- Zeile eines Tabellentyps

Code: Alles auswählen.

DATA: lt_flight TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY. "<-- Tabellentyp einer Struktur
FIELD-SYMBOLS: <ls_line> TYPE sflight. "<-- Struktur

Code: Alles auswählen.

DATA: lt_flight TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY. "<-- Tabellentyp einer Struktur
FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_flight. "<-- Zeile einer tabellarischen Variable
Wobei zwar die LIKE Variante am flexibelsten ist, aber leider auch auf der "zu vermeiden" Liste steht, weil es zur Laufzeit interpretiert werden muss und daher imperformant ist.
Vorteil: Man muss hier nur den Datentyp der Tabelle ändern und gleichzeitig ändert sich auch das Feldsymbol mit.

lg ADT
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: Kopfzeile oder Workarea - interne Tabellen

Beitrag von Thanatos82 (Expert / 699 / 32 / 123 ) »
Hi,

ich kann ADT da nur komplett zustimmen. Mit Feldsymbolen arbeitest du echt am effektivsten und einfachsten und brauchst dir nicht extra eine Workarea einrichten.
Gruß,
der Matze

Re: Kopfzeile oder Workarea - interne Tabellen

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
a-dead-trousers hat geschrieben:...

Code: Alles auswählen.

DATA: lt_flight TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY. "<-- Tabellentyp einer Struktur
FIELD-SYMBOLS: <ls_line> LIKE LINE OF lt_flight. "<-- Zeile einer tabellarischen Variable
Wobei zwar die LIKE Variante am flexibelsten ist, aber leider auch auf der "zu vermeiden" Liste steht, weil es zur Laufzeit interpretiert werden muss und daher imperformant ist.
...
Guten Abend adt,

ich hätte da mal 2 Fragen zu obiger Aussage:

1.) Kannst du (in etwa) beziffern wie stark sich dieses Konstrukt gegenüber der "type"-Version im Laufzeitverhalten verschlechtert. Vor allem interessiert mich, ob die Verlangsamung tatsächlich signifikant/messbar ist und den Lesbarkeitsgewinn aufwiegt.
2.) In dem obigen Beispiel sollte ein "guter" Compiler zumindest theoretisch in der Lage sein auch schon vor Beginn der Laufzeit die Typauflösung vorzunehmen. Kannst du die Quelle nennen, wo du diese "wird zur Laufzeit interpretiert"-Information her hast. Denn irgendwie hatte ich so was auch noch im Hinterkopf bin mir aber schon länger nicht mehr sicher ob das in aktuellen Kernels überhaupt noch gilt.


Guten Abend Tim,

auch wenn ich selber ein großer Verfechter von Feldsymbolen beim Arbeiten mit Tabellen bin möchte ich dennoch darauf hinweisen, dass es Situationen gibt, wo du definitiv auf ebendiese verzichten und stattdessen auf Workareas setzen solltest.
Ein paar Beispiele:
- Du arbeitest mit sortierten oder gehashten Tabellen und möchtest an Schlüsselfeldern rumfummeln
- Du arbeitest mit SUM innerhalb von Loops
- Du löscht innerhalb eines Loops Zeilen aus der Tabelle und invalidierst dir damit das Feldsymbol
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Kopfzeile oder Workarea - interne Tabellen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
black_adept hat geschrieben:1.) Kannst du (in etwa) beziffern wie stark sich dieses Konstrukt gegenüber der "type"-Version im Laufzeitverhalten verschlechtert. Vor allem interessiert mich, ob die Verlangsamung tatsächlich signifikant/messbar ist und den Lesbarkeitsgewinn aufwiegt.
2.) In dem obigen Beispiel sollte ein "guter" Compiler zumindest theoretisch in der Lage sein auch schon vor Beginn der Laufzeit die Typauflösung vorzunehmen. Kannst du die Quelle nennen, wo du diese "wird zur Laufzeit interpretiert"-Information her hast. Denn irgendwie hatte ich so was auch noch im Hinterkopf bin mir aber schon länger nicht mehr sicher ob das in aktuellen Kernels überhaupt noch gilt.
1.) Okay, ich geb zu der zusätzliche Interpretationsaufwand wird bei wenigen Aufrufen (z.B. eines Unterprogramms) nicht ins Gewicht fallen. Aber wenn man einen LOOP mit vielen Einträgen hat und innerhalb davon ein Unterprogramm aufruft das einen mit LIKE definierten Datentyp beinhaltet, dürfte sich das schon messbar auswirken. Aber um schon gar nicht in diese Problematik hinein zu stolpern, habe ich mir das LIKE so weit wie möglich abgewöhnt.
2.) Ich glaube mich zu erinnern, dass der Vortragende bei der BC 490 Schulung (ABAP Performance - Tuning) das erwähnt hat. Ich hab in den Unterlagen nachgesehen, aber jetzt auf die Schnelle nichts dazu gefunden.

lg ADT
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: Kopfzeile oder Workarea - interne Tabellen

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Guten Morgen adt,

schau dir mal folgendes Codebeispiel an ( mit Syntaxfehler beim Aktivieren )

Code: Alles auswählen.

REPORT.
data: gt_mara type STANDARD TABLE OF mara with NON-UNIQUE DEFAULT KEY,
      gt_marc type STANDARD TABLE OF marc with NON-UNIQUE DEFAULT KEY.

FIELD-SYMBOLS: <mara1> type mara,
               <mara2> like line of gt_mara.
FIELD-SYMBOLS: <marc1> type marc,
               <marc2> like line of gt_marc.

append INITIAL LINE TO gt_mara ASSIGNING <mara1>.
append INITIAL LINE TO gt_mara ASSIGNING <mara2>.

append INITIAL LINE TO gt_mara ASSIGNING <marc1>.
append INITIAL LINE TO gt_mara ASSIGNING <marc2>.
Der Syntaxchecker liefert beim Aktivieren Fehlermeldungen für die letzten beiden APPENDS weil die Feldsymbole falsch typisiert sind. Somit hat der Parser also insbesondere schon den Typ von <marc2> erkannt trotz LIKE-Definition. "Normalerweise" sollte damit eine Laufzeitinterpretation unnötig sein - aber genau das ist es ja auch warum ich hier so gezielt nachfrage.
Von wann sind denn deine BC490-Schulungsunterlagen?
Vielleicht hat ja auch jemand anderes hier diesen Kurs letztlich besucht und könnte etwas hierzu sagen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Kopfzeile oder Workarea - interne Tabellen

Beitrag von black_adept (Top Expert / 3943 / 105 / 886 ) »
Und noch mal ein praktischer Test:
Folgender Report versucht den Laufzeitunterschied zu messen. Die Laufzeit des Programmes sollte jetzt durch den Aufruf der Unterroutine und das Zuweisen des Feldsymbols bestimmt werden - 2 Sachen die üblicherweise sowieso immer gemacht werden müssen. Falls die Typisierung via TYPE und LIKE tatsächlich etwas bewirkt sollte dieses Programm das eigentlich bemerken.

Code: Alles auswählen.

REPORT.



DATA: gs_t000    TYPE t000,
      gv_counter TYPE i,
      gv_start   TYPE i,
      gv_ende    TYPE i,
      gv_time    TYPE i.



gv_counter = 1.
DO 8 TIMES.

  GET RUN TIME FIELD gv_start.
  DO gv_counter TIMES.
    PERFORM test1 CHANGING gs_t000.
  ENDDO.
  GET RUN TIME FIELD gv_ende.
  gv_time = gv_ende - gv_start.
  WRITE:/ gv_counter,'Def. via TYPE', gv_time.


  GET RUN TIME FIELD gv_start.
  DO gv_counter TIMES.
    PERFORM test2 CHANGING gs_t000.
  ENDDO.
  GET RUN TIME FIELD gv_ende.
  gv_time = gv_ende - gv_start.
  WRITE: at 40 'Def. via LIKE', gv_time.


  MULTIPLY gv_counter BY 10.
ENDDO.


*&---------------------------------------------------------------------*
*&      Form  TEST1
*&---------------------------------------------------------------------*
FORM test1  CHANGING p_data TYPE t000.

  FIELD-SYMBOLS: <fs> TYPE t000.
  ASSIGN p_data TO <fs>.

ENDFORM.                                                    " TEST1


*&---------------------------------------------------------------------*
*&      Form  TEST1
*&---------------------------------------------------------------------*
FORM test2  CHANGING p_data TYPE t000.

  FIELD-SYMBOLS: <fs> LIKE p_data.
  ASSIGN p_data TO <fs>.

ENDFORM.                                                    " TEST1
Ausgabe / Laufzeitvergleich zeigt keinen signifikanten Unterschied - auch nicht wenn man die Reihenfolge der Aufrufe von test1 und test2 vertauscht.

Code: Alles auswählen.

         1  Def. via TYPE          6   Def. via LIKE          6
        10  Def. via TYPE          9   Def. via LIKE          9
       100  Def. via TYPE         64   Def. via LIKE         66
     1.000  Def. via TYPE        699   Def. via LIKE        676
    10.000  Def. via TYPE      6.754   Def. via LIKE      6.651
   100.000  Def. via TYPE     68.661   Def. via LIKE     65.965
 1.000.000  Def. via TYPE    676.409   Def. via LIKE    649.990
10.000.000  Def. via TYPE  6.637.538   Def. via LIKE  6.592.154
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Kopfzeile oder Workarea - interne Tabellen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
okay!
Stimmt. Hast recht. Habs selber grad ausprobiert.
Scheinbar nimmt der Kompiler hier wirklich die Informationen zur Designtime und optimiert die Aufrufe entsprechend.
Aber woher hab ich das dann...
Hab mir nochmal die Hilfe zu LIKE durchgelesen und die "obsolete" Form gefunden.
Kann sein, dass ich das aus der Definition von LIKE mit Bezug auf DDIC Felder unter Verwendung von TABLES hergeleitet hab. :oops:

tja... Aber ich werd jetzt nicht alle meine Programme wieder umschreiben :P
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

Seite 1 von 1

Vergleichbare Themen

5
Antw.
3677
Views
SmartForms (interne Tabellen und Workarea)
von ansi » 28.10.2005 11:50 • Verfasst in ABAP® für Anfänger
2
Antw.
4142
Views
Dynamisch Workarea und interne Tabellen benutzen?
von kbit100 » 07.05.2008 14:51 • Verfasst in ABAP® für Anfänger
5
Antw.
7391
Views
interne Tabelle kontra workarea
von wewezz » 26.05.2005 12:24 • Verfasst in ABAP® für Anfänger
6
Antw.
4004
Views
Workarea und Interne Tabelle dynamisch anlegen
von Slim_Chance » 18.10.2005 17:01 • Verfasst in ABAP® Core
12
Antw.
9358
Views
Interne Tabelle onne Kopfzeile
von Seeburg » 30.05.2005 13:11 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Tagen von Lucyalison 1 / 72
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141