gelöst Range-Tabelle befüllen


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Range-Tabelle befüllen

Beitragvon Bright4.5 » 06.02.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 :).
Bright4.5
Specialist
 
Beiträge: 103
Registriert: 17.08.2018, 18:23
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Range-Tabelle befüllen

Beitragvon IHe » 06.02.2019, 15:34

Klingt eher so als ob du einen SELECT .. FOR ALL ENTRIES IN @itab WHERE field1 = @itab-field1 AND [..] verwenden möchtest...
IHe
ForumUser
 
Beiträge: 32
Registriert: 13.01.2016, 13:29
Dank erhalten: 8 mal
Ich bin: Entwickler/in

Re: Range-Tabelle befüllen

Beitragvon Bright4.5 » 06.02.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.
Bright4.5
Specialist
 
Beiträge: 103
Registriert: 17.08.2018, 18:23
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Range-Tabelle befüllen

Beitragvon Romaniac » 06.02.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
Romaniac
Specialist
 
Beiträge: 100
Registriert: 20.03.2017, 10:31
Wohnort: Augsburg
Dank erhalten: 16 mal
Ich bin: Freiberufler/in

Re: Range-Tabelle befüllen

Beitragvon ewx » 06.02.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_&amp;1 LIKE LINE OF &amp;1.
  FIELD-SYMBOLS <&amp;2> TYPE any.

  ASSIGN COMPONENT '&amp;2' OF STRUCTURE wa TO <&amp;2>.
  IF sy-subrc = 0.
  READ TABLE &amp;1 WITH KEY low = <&amp;2> TRANSPORTING NO FIELDS.
  IF sy-subrc > 0.
  wa_&amp;1-sign   = 'I'.
  wa_&amp;1-option = 'EQ'.
  wa_&amp;1-low    = <&amp;2>.
  APPEND wa_&amp;1 TO &amp;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.
ewx
Top Expert
 
Beiträge: 3868
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 334 mal

Re: Range-Tabelle befüllen

Beitragvon DeathAndPain » 06.02.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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Range-Tabelle befüllen

Beitragvon Romaniac » 06.02.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
Romaniac
Specialist
 
Beiträge: 100
Registriert: 20.03.2017, 10:31
Wohnort: Augsburg
Dank erhalten: 16 mal
Ich bin: Freiberufler/in

Re: Range-Tabelle befüllen

Beitragvon ewx » 06.02.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.

Für diese Nachricht hat ewx 2 Dankeschön bekommen :
Bright4.5, Romaniac
ewx
Top Expert
 
Beiträge: 3868
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 334 mal

Re: Range-Tabelle befüllen

Beitragvon DeathAndPain » 06.02.2019, 17:12

Das wird Ralf gefallen. Und ab in die TRMAC damit! :-D
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Range-Tabelle befüllen

Beitragvon Bright4.5 » 07.02.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.
Bright4.5
Specialist
 
Beiträge: 103
Registriert: 17.08.2018, 18:23
Dank erhalten: 0 mal
Ich bin: Entwickler/in


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
gelöst SALV - Layout wird nicht gezogen
vor 7 Stunden von ralf.wenzel 0 Antw.
ADRMAS-Segmente vorbefüllen
vor 10 Stunden von lausek 0 Antw.
MS Word nicht als SAPscript-Editor verwenden
vor 11 Stunden von DeathAndPain 2 Antw.
EWM: HU mit RBG anhand von Produkt-LB bewegen
Gestern von TimTo 0 Antw.
BADI Impl. cin_plug_in_to_migo deaktivieren
Gestern von zzcpak 1 Antw.

  Ähnliche Beiträge beta
DB Tabelle befüllen
07.12.2006, 23:10 von bohne 3 Antw.
Befüllen einer Tabelle
22.05.2006, 11:06 von M. Lahr 9 Antw.
Interne Tabelle befüllen
26.10.2015, 15:04 von DHE 2 Antw.
gelöst Interne Tabelle befüllen
16.02.2017, 15:10 von abuma 10 Antw.
gelöst interne Tabelle mit Value befüllen.
03.12.2018, 13:05 von L0w-RiDer 3 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]