Range-Tabelle befüllen

Getting started ... Alles für einen gelungenen Start.
10 Beiträge / Seite 1 von 1
10 Beiträge Seite 1 von 1

Range-Tabelle befüllen

Beitrag von Bright4.5 (Specialist / 108 / 9 / 0 ) » 6. Feb 2019 15:08

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 :).


Re: Range-Tabelle befüllen

Beitrag von IHe (ForumUser / 34 / 6 / 8 ) » 6. Feb 2019 15:34

Klingt eher so als ob du einen SELECT .. FOR ALL ENTRIES IN @itab WHERE field1 = @itab-field1 AND [..] verwenden möchtest...

Re: Range-Tabelle befüllen

Beitrag von Bright4.5 (Specialist / 108 / 9 / 0 ) » 6. Feb 2019 15:42

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 / 100 / 18 / 16 ) » 6. Feb 2019 16:24

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 / 3918 / 160 / 349 ) » 6. Feb 2019 16:30

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 / 1014 / 115 / 223 ) » 6. Feb 2019 16:34

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 / 100 / 18 / 16 ) » 6. Feb 2019 16:41

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 / 3918 / 160 / 349 ) » 6. Feb 2019 16:51

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 / 1014 / 115 / 223 ) » 6. Feb 2019 17:12

Das wird Ralf gefallen. Und ab in die TRMAC damit! :-D

Re: Range-Tabelle befüllen

Beitrag von Bright4.5 (Specialist / 108 / 9 / 0 ) » 7. Feb 2019 09:59

vielen Dank schon mal. Mit der Befüllung hat es soweit geklappt, leider klappt es nun bloß an einer anderen Stelle nicht.

Seite 1 von 1

Aktuelle Forenbeiträge

In einer Methode auf Rangetabelle zugreifen
vor 6 Stunden von DeathAndPain 5 / 75
Elstam: IDnr mehrfach für die Personalnummer
vor 8 Stunden von missforgotten 6 / 280
Steuerprüfer GDPDU - Daten rutschen um eine Zeile
vor 8 Stunden von missforgotten 1 / 19
OBN im NWBC ohne Popup
Gestern von msfox 2 / 55
Business Partner Konzept
Gestern von waltersen 4 / 293

Unbeantwortete Forenbeiträge

Steuerprüfer GDPDU - Daten rutschen um eine Zeile
vor 8 Stunden von missforgotten 1 / 19
MD14 Felder einblenden Umsetzung Planauftrag
Gestern von Thomas R. 1 / 30
Verursachervormerkung OCM manuell anlegen
vor einer Woche von Aba 1 / 131
Auflösen MILL_OC - Auftragszusammenfassung
vor 2 Wochen von tofralu 1 / 115