Code: Alles auswählen.
<current_line>-value = VALUE #( mytab[ id = <current_line>-id DEFAULT 0 ]-value ).
Code: Alles auswählen.
READ TABLE mytab ASSIGNING FIELD-SYMBOL(<lookup_line>) WITH KEY id = <current_line>-id BINARY SEARCH.
IF sy-subrc = 0.
<current_line>-value = <loopup_line>-value.
ENDIF.
Code: Alles auswählen.
SELECT viele_felder
FROM dbtab
INTO TABLE @DATA(lt_data).
TYPES: lts_data LIKE LINE OF lt_data,
ltt_data TYPE HASHED TABLE OF lts_data WITH UNIQUE KEY keyfield(s).
DATA(lt_data2) = CORRESPONDING ltt_data( lt_data ).
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
a-dead-trousers • whaslbeck
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
whaslbeck
Ich habe nicht verstanden, was das eine mit dem anderen zu tun hat, denn Dein Beispiel enthält doch überhaupt keinen SELECT ... INTO TABLE @DATA.whaslbeck hat geschrieben: ↑22.05.2023 09:54die neueren Sprachfeatures wie "SELECT ... INTO TABLE @DATA(..." und Zugriff über Tabellenausdrücke sind im Alltag ja echt hilfreich.
Was mich an der Kombination aber richtig stört, ist die fehlende Möglichkeit weder bei "...INTO TABLE @DATA(..." einen Index zu definieren noch beim Tabellenausdruck ein "BINARY READ" mitzugeben.
Somit sieht einzwar wesentlich eleganter ausCode: Alles auswählen.
<current_line>-value = VALUE #( mytab[ id = <current_line>-id DEFAULT 0 ]-value ).
Das finde ich aber richtig eklig, denn dann hast Du ja einen TYPES-Befehl inmitten der Routine anstatt am Anfang. Sowas wäre bei mir bestenfalls als temporäre Krücke denkbar, aber niemals in einem finalen Code.black_adept hat geschrieben: ↑22.05.2023 13:41wenn das noch sehr im Flux ist oder die Anzahl der Felder zu groß (und ich zu faul ), dann folgendes Konstrukt.Code: Alles auswählen.
SELECT viele_felder FROM dbtab INTO TABLE @DATA(lt_data). TYPES: lts_data LIKE LINE OF lt_data, ltt_data TYPE HASHED TABLE OF lts_data WITH UNIQUE KEY keyfield(s). DATA(lt_data2) = CORRESPONDING ltt_data( lt_data ).
Dem kann (und IMHO sollte) man leicht begegnen, indem man gleich nach dem Umkopieren einen FREE auf die temporäre Hilfstabelle (hier: lt_data) ausführt.a-dead-trousers hat geschrieben: ↑22.05.2023 14:29Trotzdem sollte für Anfänger noch dazu gesagt werden, dass bei großen Datenmengen Vorsicht geboten ist, weil es höchstwahrscheinlich zu einer Verdopplung der Daten kommt.
Den hab ich nicht explizit dazugeschrieben, aber natürlich war das so gemeint, dass die interne Tabelle "mytab" durch ein SELECT ... INTO TABLE @DATA(mytab) erstellt wird.DeathAndPain hat geschrieben: ↑15.06.2023 19:59Ich habe nicht verstanden, was das eine mit dem anderen zu tun hat, denn Dein Beispiel enthält doch überhaupt keinen SELECT ... INTO TABLE @DATA.
Aber ein SELECT * INTO CORRESPONDING... holt doch erst die Daten ALLER DB-Felder aus der DB in den Appserver und matched diese dort dann in die passenden Felder der Zieltabelle. Gefällt mir auch nicht so, man will ja eigentlich den Datentransfer DB=>Appserver minimieren.DeathAndPain hat geschrieben: ↑15.06.2023 19:59Im übrigen verstehe ich auch den Nutzen nicht, denn wenn Du viele_felder ohnehin im Code aufzählst, dann kannst Du es auch gleich in einem TYPE-Block am Anfang der Routine tun und dann mit einem ordentlichen SELECT * INTO CORRESPONDING FIELDS OF TABLE arbeiten und hast einen sauberen und performanten Code.
Ist tatsächlich so. Habs grad mal überprüft:DeathAndPain hat geschrieben: ↑21.06.2023 16:08Ich könnte mir durchaus vorstellen, dass ABAP da gewisse Optimierungen eingebaut hat.
Code: Alles auswählen.
TYPES: BEGIN OF t_m,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
END OF t_m.
DATA t TYPE STANDARD TABLE OF t_m.
SELECT * FROM mara INTO CORRESPONDING FIELDS OF TABLE t.
Folgende Benutzer bedankten sich beim Autor whaslbeck für den Beitrag (Insgesamt 2):
DeathAndPain • a-dead-trousers
Recht hast du - aber seit SAP die Inlinedeklarationen zulässt hast du das gleiche Problem mit (impliziten) DATA-Anweiseungen, die jetzt über den Code verstreut werden. Aus diesem Grund habe ich inzwischen auch kein Problem mehr damit TYPES-Anweisungen weiter hinten zu platzieren wenn es notwendig ist. ( Und ja - üblicherweise packe ich die recht weit zum Anfang des Codings )DeathAndPain hat geschrieben: ↑15.06.2023 19:59Das finde ich aber richtig eklig, denn dann hast Du ja einen TYPES-Befehl inmitten der Routine anstatt am Anfang. Sowas wäre bei mir bestenfalls als temporäre Krücke denkbar, aber niemals in einem finalen Code.black_adept hat geschrieben: ↑22.05.2023 13:41Code: Alles auswählen.
SELECT viele_felder FROM dbtab INTO TABLE @DATA(lt_data). TYPES: lts_data LIKE LINE OF lt_data, ltt_data TYPE HASHED TABLE OF lts_data WITH UNIQUE KEY keyfield(s). DATA(lt_data2) = CORRESPONDING ltt_data( lt_data ).
Was ist mit spaltenoptimierten DBs wie HANA, wo es jetzt doch wieder wichtig ( naja - m.E. weit weniger als SAP es immer hinstellt ) wird möglichst nur die Felder anzusprechen die man haben will?DeathAndPain hat geschrieben: ↑21.06.2023 16:08Also als ich im Jahre 2001 mit ABAP angefangen habe, da hat es noch richtig wahrnehmbar einen Unterschied gemacht, wie viele Spalten man aus einer Tabelle gelesen hat und wie viele Daten dementsprechend zu bewegen waren.
In den letzten Jahren ist das aber unter die Wahrnehmungsschwelle gerutscht. Ein sauberer, gut les- und wartbarer Code ist wesentlich wertvoller.
Alternative für ALL ENTRIES in recht neuen Releases ist auch die Möglichkeit eine interne Tabelle als Datenquelle im SELECT zuzulassen und dann mittels JOIN weiterzuarbeiten.a-dead-trousers hat geschrieben: ↑21.06.2023 17:13Und wenn man es schafft den FOR ALL ENTRIES IN wegzulassen und stattdessen z.B. RANGE Tabellen oder ähnliches zu verwenden, wird das ganze noch schneller.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
sap_enthusiast • a-dead-trousers
Aus diesem Grunde habe ich anfangs auch gezögert, diese einzusetzen, aber die Vorteile überwiegen die Nachteile, weil der Code durch (vernünftige) Inline-Deklarationen kürzer und zugleich besser lesbar wird. Erst recht, wenn man sich an der SAP-Empfehlung orientiert, Inline-Deklarationen nur lokal einzusetzen (was ich meist tue, nur nicht beim Holen von Daten aus funktionalen Methoden - der Komfort, zusammen mit den Ergebniswerten auch die Typdeklaration implizit mitgeliefert zu bekommen, ist einfach zu kolossal. Und für lesbar halte ich es auch, wenn man auf dem Zielfeld in Eclipse Strg+Klick macht und damit zum Methodenaufruf springt, durch den klar ist, dass dies ein Feld ist, das über den Rückgabewert dieser Methode deklariert wird).black_adept hat geschrieben: ↑22.06.2023 12:20Recht hast du - aber seit SAP die Inlinedeklarationen zulässt hast du das gleiche Problem mit (impliziten) DATA-Anweiseungen, die jetzt über den Code verstreut werden.
Darüber mache ich mir Gedanken, wenn ich mal eine in den Fingern habe. 😁 Wobei, wenn selbst der herkömmliche SELECT diese Syntax optimiert und bei INTO CORRESPONDING FIELDS OF TABLE nur die benötigten Spalten an die Datenbank übermittelt, dann sollte die HANA-Implementierung das eigentlich auch können.