Range-Tabelle befüllen

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

Getting started ... Alles für einen gelungenen Start.
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Range-Tabelle befüllen

Beitrag von Bright4.5 (Specialist / 274 / 21 / 1 ) »
Hallo ganz kurze Anfängerfrage :D

Ich möchte gerne eine Range-Tabelle befüllen, mit den Werten von einer internen Tabelle befüllen. So nach der Art :

Code: Alles auswählen.

DATA: rangetab TYPE RANGE OF dbtab-field1,
wa_rangetab LIKE LINE OF rangetab.
LOOP AT itab INTO wa.
wa_rangetab-sign = 'I'.
wa_rangetab-option = 'EQ'.
wa_rangetab-low = wa-field1.
APPEND wa_rangetab TO rangetab.
ENDLOOP.
SELECT *
INTO TABLE lt_dbtab
FROM dbtab
WHERE field1 IN rangetab.
bloß hat meine interne Tabelle mehrere Felder nämlich 15. Nun möchte ich natürlich nicht 15 mal sign = 'I' ...EQ... low = .... usw. schreiben. Kennt jemand eine schöne performante Lösung?

Vielen Dank an alle :).

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


Re: Range-Tabelle befüllen

Beitrag von IHe (Specialist / 150 / 36 / 49 ) »
Klingt eher so als ob du einen SELECT .. FOR ALL ENTRIES IN @itab WHERE field1 = @itab-field1 AND [..] verwenden möchtest...
Ingo Hoffmann

ECC|S/4HANA|BTP
dbh SAP Solutions

Re: Range-Tabelle befüllen

Beitrag von Bright4.5 (Specialist / 274 / 21 / 1 ) »
Ich möchte etwas ausprobieren und zwar anstatt über den FOR ALL ENtRIES-Befehl über eine Range-Tabelle zu gehen und möchte mir diese nun befüllen. Ich möchte diese später nutzen um sie bei einem Select in der Where-Bedingung zu nutzen.

Re: Range-Tabelle befüllen

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
Hallo Bright4.5,

Du hast doch die Lösung schon, Du machst einen Loop über eine interne Tabelle und füllst im Loop 15 mal die Rangetabelle wenn Deine interne Tabelle 15 Einträge hat? Dann steht es im Code doch nur einmal?

Hier mal eine noch kürzere Schreibweise:

Code: Alles auswählen.

Loop at t_itab assigning fieldsymbol(<w_itab>).
  rt_range = value #( base rt_range
                     ( sign = 'I' option = 'EQ' low = <w_itab>-value ) ).
endloop.
Geht nicht gibts nicht

Re: Range-Tabelle befüllen

Beitrag von ewx (Top Expert / 4848 / 312 / 642 ) »
Dann sind aber ggfs. Werte doppelt in der RANGES-Tabelle. man müsste also noch mit LINE_EXISTS abfragen, ob der Wert vorhanden ist.
Alternativ und altbacken: Ein Makro

Code: Alles auswählen.

DATA itab TYPE STANDARD TABLE OF vbak.
DATA wa LIKE LINE OF itab.

DATA ra_vbtyp TYPE RANGE OF vbtyp.
DATA ra_vkorg TYPE RANGE OF vkorg.


DEFINE _add_range_.

  DATA wa_&1 LIKE LINE OF &1.
  FIELD-SYMBOLS <&2> TYPE any.

  ASSIGN COMPONENT '&2' OF STRUCTURE wa TO <&2>.
  IF sy-subrc = 0.
  READ TABLE &1 WITH KEY low = <&2> TRANSPORTING NO FIELDS.
  IF sy-subrc > 0.
  wa_&1-sign   = 'I'.
  wa_&1-option = 'EQ'.
  wa_&1-low    = <&2>.
  APPEND wa_&1 TO &1.
  ENDIF.
  ENDIF.

END-OF-DEFINITION.

SELECT * FROM vbak INTO TABLE itab UP TO 10 ROWS.

LOOP AT itab INTO wa.
  _add_range_ ra_vbtyp vbtyp.
  _add_range_ ra_vkorg vkorg.
ENDLOOP.

Re: Range-Tabelle befüllen

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Dieses Makro soll funktionieren, obgleich es einen DATA-Befehl enthält? Beim 2. Einsatz des Makros ist der DATA doppelt drin; das sollte einen Syntax Error werfen.

@Bright: Ich verstehe nicht, weshalb Du
wa_rangetab-sign = 'I'.
wa_rangetab-option = 'EQ'.
in Deiner LOOP-Schleife zu stehen hast. Schreib die Befehle doch einfach für einmalige Ausführung vor die LOOP-Schleife. Diese Werte ändern sich doch nicht, so dass Du im LOOP einfach immer nur den LOW änderst und dann Deinen APPEND machst.

Ab Release 7.40 machst Du einfach:

Code: Alles auswählen.

LOOP AT itab INTO wa.
  APPEND #( sign= 'I' option = 'EQ' low = wa-field1 ) to rangetab.
ENDLOOP.
Tatsächlich bin ich sogar überzeugt, dass Du ab 7.40 den ganzen LOOP weglassen und durch eine einzige Zuweisung an die Tabelle rangetab ersetzen kannst, indem Du den FOR-Befehl verwendest. Ich bin aber zu faul jetzt auszuarbeiten, wie das syntaktisch genau aussehen müsste, und ob es am Ende besser lesbar ist, wollen wir auch mal dahingestellt sein lassen. Performanter wäre es aber wahrscheinlich (auch wenn das hier keine Rolle spielen wird).
Romaniac hat geschrieben:Du machst einen Loop über eine interne Tabelle und füllst im Loop 15 mal die Rangetabelle wenn Deine interne Tabelle 15 Einträge hat?
15 Spalten. Offenbar hat er in seiner itab eine Zeile für jede Spalte, deren Wert er einschränken möchte.

Deine Syntax gefällt mir nicht so gut, weil Du bei jedem Spaltendurchlauf die gesamte interne Tabelle neu schreibst. Das kann nicht performant sein! Einen Append finde ich da besser. Oder halt, wie gesagt, die interne Tabelle per FOR aufbauen.

Re: Range-Tabelle befüllen

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
Stimmt, das habe ich überlesen mit den 15 Spalten.

Wenn die Felder aber unterschiedliche Typen haben muss pro Feld ein Range vom selben Typ angelegt werden.
Geht nicht gibts nicht

Re: Range-Tabelle befüllen

Beitrag von ewx (Top Expert / 4848 / 312 / 642 ) »
DeathAndPain hat geschrieben:Dieses Makro soll funktionieren, obgleich es einen DATA-Befehl enthält? Beim 2. Einsatz des Makros ist der DATA doppelt drin; das sollte einen Syntax Error werfen.
Es geht sogar noch "besser": Du kannst sogar die Rangetab im Makro definieren:

DEFINE _add_range_.

DATA ra_&1 TYPE RANGE OF &1.
DATA wa_&1 LIKE LINE OF ra_&1.
FIELD-SYMBOLS <&1> TYPE any.

ASSIGN COMPONENT '&1' OF STRUCTURE wa TO <&1>.
IF sy-subrc = 0.
READ TABLE ra_&1 WITH KEY low = <&1> TRANSPORTING NO FIELDS.
IF sy-subrc > 0.
wa_&1-sign = 'I'.
wa_&1-option = 'EQ'.
wa_&1-low = <&1>.
APPEND wa_&1 TO ra_&1.
ENDIF.
ENDIF.

END-OF-DEFINITION.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
RomaniacBright4.5


Re: Range-Tabelle befüllen

Beitrag von DeathAndPain (Top Expert / 1944 / 257 / 413 ) »
Das wird Ralf gefallen. Und ab in die TRMAC damit! :-D

Re: Range-Tabelle befüllen

Beitrag von Bright4.5 (Specialist / 274 / 21 / 1 ) »
vielen Dank schon mal. Mit der Befüllung hat es soweit geklappt, leider klappt es nun bloß an einer anderen Stelle nicht.

Re: Range-Tabelle befüllen

Beitrag von M4cM4rco (ForumUser / 19 / 7 / 0 ) »
DeathAndPain hat geschrieben:
06.02.2019 16:34

Ab Release 7.40 machst Du einfach:

Code: Alles auswählen.

LOOP AT itab INTO wa.
  APPEND #( sign= 'I' option = 'EQ' low = wa-field1 ) to rangetab.
ENDLOOP.
Kleine Verbesserung:

Code: Alles auswählen.

LOOP AT itab INTO wa.
  APPEND VALUE #( sign = 'I' option = 'EQ' low = wa-field1 ) to rangetab.
ENDLOOP.

Re: Range-Tabelle befüllen

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
oder:

Code: Alles auswählen.

LOOP AT itab INTO wa.
  rangetab = VALUE #( BASE rangetab ( sign = 'I' option = 'EQ' low = wa-field1 ) ).
ENDLOOP.
Geht nicht gibts nicht

Re: Range-Tabelle befüllen

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
Oder besser gleich:

Code: Alles auswählen.

rangetab = value #( for <wa> in itab ( sign = 'I' option = 'EQ' low = <wa>-field1 ) ).

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Icke0801

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: Range-Tabelle befüllen

Beitrag von Romaniac (Specialist / 221 / 65 / 27 ) »
😊 Danke, eine Zeile und alles drin!
Geht nicht gibts nicht

Re: Range-Tabelle befüllen

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
Und wenn du auch gleichzeitig noch Duplikate ausfiltern möchtest und auf einem hinreichend modernen System arbeitest:

Code: Alles auswählen.

SELECT DISTINCT 'I'         AS sign,
                'EQ'        AS option,
                itab~field1 AS low
  FROM @itab AS itab
  INTO CORRESPONDING FIELDS OF TABLE @rangetab.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Romaniac

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

3
Antw.
1492
Views
Range-Tabelle gegen Range-Tabelle abgleichen
von Romaniac » 09.02.2024 16:26 • Verfasst in ABAP® Core
6
Antw.
4110
Views
Range Tabelle vom Typ RRRANGESID in eine DB-Tabelle füllen
von kaim77 » 15.09.2014 12:32 • Verfasst in ABAP® Core
5
Antw.
3992
Views
Feldsymbol auf RANGE-Tabelle
von Erdbaehr » 07.06.2007 07:56 • Verfasst in ABAP Objects®
2
Antw.
11363
Views
Füllen von Range Tabelle
von ulli952 » 22.06.2007 13:08 • Verfasst in ABAP® Core
3
Antw.
2605
Views
DB Tabelle befüllen
von bohne » 06.12.2006 23:47 • 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

Dialog-Container mit Toolbar/Status
vor einer Stunde von black_adept gelöst 23 / 3507
User Exit EXIT_RQCPRM10_001
vor 2 Stunden von a-dead-trousers 2 / 162
Trennen Strasse und Hausnummer
vor 8 Stunden von payten 13 / 10464
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1220

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

Dialog-Container mit Toolbar/Status
vor einer Stunde von black_adept gelöst 23 / 3507
User Exit EXIT_RQCPRM10_001
vor 2 Stunden von a-dead-trousers 2 / 162
Trennen Strasse und Hausnummer
vor 8 Stunden von payten 13 / 10464
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1220

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2772
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9351