WHERE-Bedingung mit Ranges erstellen

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

WHERE-Bedingung mit Ranges erstellen

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo!

Bisher habe ich WHERE-Bedingungen meist dynamisch zusammengestellt indem ich mit Hilfe von Concatenate mir eine Query erstellt habe.
Nun habe ich gelesen, dass Ranges eine bessere Möglichkeit wären. Bin mir nicht ganz sicher, ob es so stimmt (kann gerade nicht testen), vor allem geht es mir aber darum, dass ich nicht weiß, ob es doch nicht besser geht.
DATA: lt_status TYPE RANGE OF tab-status,
ls_status LIKE LINE OF lt_status.

DATA: lt_start TYPE RANGE OF tab-start,
ls_start LIKE LINE OF lt_start.

DATA: lt_end TYPE RANGE OF tab-end,
ls_end LIKE LINE OF lt_end.

ls_status-low = iv_status.
ls_status-sign = 'I'.
ls_status-option = 'EQ'.
APPEND ls_status TO lt_status.

IF iv_date_low IS NOT INITIAL AND iv_date_high IS NOT INITIAL.
ls_start-low = iv_date_low.
ls_start-sign = 'I'.
ls_start-option = 'GE'.
APPEND ls_start TO lt_start.
ls_end-low = iv_date_low.
ls_end-sign = 'I'.
ls_end-option = 'GE'.
APPEND ls_end TO lt_end.
ENDIF.

SELECT * FROM tab INTO TABLE gt_db_data_selected WHERE status IN lt_status
AND start IN lt_start
AND end IN lt_end.
Ich frage mich vor allem, ob es denn eine Möglichkeit gibt, weniger Variablen zu keklarieren und diese WHERE-Bedingung zu verkürzen?

Viele Grüße

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


Re: WHERE-Bedingung mit Ranges erstellen

Beitrag von a-dead-trousers (Top Expert / 4451 / 227 / 1197 ) »
hi!

Die Ranges sind dann praktisch, wenn man die abzufragenden Felder statisch weiß, aber nicht alle gleichzeitig abzufragen sind.
So erspart man es sich die Query immer wieder zu schreiben.

Und wenn man ein ganz ein Fauler ist so wie ich, kann man sich für die Erstellung/Befüllung von Ranges auch zwei Makros schreiben

Code: Alles auswählen.

define create_range.
  types: tyr_&1 type range of &1.
  data: lrt_&1 type tyr_&1.
  field-symbols: <lrs_&1> type line of tyr_&1.
end-of-definition.

Code: Alles auswählen.

define append_range.
  append initial line to ltr_&1 assigning <lrs_&1>.
  <lrs_&1>-sign = 'I'.
  <lrs_&1>-option = 'EQ'.
  <lrs_&1>-low = &2.
end-of-definition.
Dein Beispiel würde dann ungefähr so ausschauen:

Code: Alles auswählen.

create_range status.
create_range start.
create_range end.

append_range status iv_status.
IF iv_date_low IS NOT INITIAL AND iv_date_high IS NOT INITIAL.
append_range start iv_date_low.
append_range end iv_date_high.
ENDIF.
Wobei du aber für diese Makros den DDIC-Type der Tabellefelder verwenden/kennen must.

lg ADT

EDIT: die & sollten natürlich nur & sein.
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: WHERE-Bedingung mit Ranges erstellen

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Mir ist ehrlich gesagt nicht bewusst, was diese Codezeilen besagen.
Eigentlich hätte ich sogar gedacht, dass diese Codezeielen einen Syntax-Fehler verursachen...
a-dead-trousers hat geschrieben:

Code: Alles auswählen.

append_range status iv_status.

append_range start iv_date_low.
append_range end iv_date_high.

Re: WHERE-Bedingung mit Ranges erstellen

Beitrag von a-dead-trousers (Top Expert / 4451 / 227 / 1197 ) »
Mit DEFINE werden sog. Makros erstellt.

Darin werden der Reihe nach die Vorkommen von &1, &2 usw. durch die Parameter ersetzt die man beim Aufruf des Makros angegeben hat.

In meinem Beispiel wird also aus

Code: Alles auswählen.

define create_range.
  types: tyr_&1 type range of &1.
  data: lrt_&1 type tyr_&1.
  field-symbols: <lrs_&1> type line of tyr_&1.
end-of-definition.
define append_range.
  append initial line to ltr_&1 assigning <lrs_&1>.
  <lrs_&1>-sign = 'I'.
  <lrs_&1>-option = 'EQ'.
  <lrs_&1>-low = &2.
end-of-definition.

create_range status.
append_range status iv_status.
der Quellcode generiert

Code: Alles auswählen.

types: tyr_status type range of status.
data: lrt_status type tyr_status.
field-symbols: <lrs_status> type line of tyr_status.

append initial line to ltr_status assigning <lrs_status>.
<lrs_status>-sign = 'I'.
<lrs_status>-option = 'EQ'.
<lrs_status>-low = iv_status.
Damit lassen sich immer wiederkehrende Codeabschnitte zusammenfassen um Schreibarbeit zu ersparen.
Einen tollen Benefit hat man meines Erachtens außerdem im Vergleich zum "kopieren" von Codeabschnitten. Da man beim Austauschen von einzelnen Variablen schon mal ein paar "vergessen" kann auszutauschen. Dannach in diesen "ähnlichen" Codeabschnitten die abweichende Stelle zu finden kann recht mühsam werden.

Natürlich machen die Makros nur Sinn, bei Codings die man nicht über andere Wege (FORM, FUNCTION, usw) modularisieren kann.

lg ADT

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

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: WHERE-Bedingung mit Ranges erstellen

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Ah verstehe...vielen Dank! :)

Seite 1 von 1

Vergleichbare Themen

6
Antw.
3796
Views
RANGES in Klasse erstellen
von anam.jabrane » 07.02.2014 11:07 • Verfasst in ABAP Objects®
1
Antw.
786
Views
Ranges
von dyv » 18.08.2014 16:32 • Verfasst in ABAP® für Anfänger
1
Antw.
1115
Views
Ranges dynamisch aufbauen
von Gast » 19.01.2006 11:48 • Verfasst in ABAP® Core
1
Antw.
8694
Views
Ranges in Excel speichern
von hmaxi96 » 08.01.2016 08:46 • Verfasst in ABAP® für Anfänger
0
Antw.
4592
Views
RFC_READ_TABLE mit RANGES selection
von Tron » 12.11.2019 07:28 • Verfasst in Tips + Tricks & FAQs

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Frage zur redefinierten Methode
vor 3 Stunden von Tetr4 1 / 43
RFC vs. ODATA
vor 9 Stunden von ewx 3 / 130
Druck von Etiketten via FP_PDF_TEST_01
vor 12 Stunden von Mr_Mkt 3 / 138

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

Frage zur redefinierten Methode
vor 3 Stunden von Tetr4 1 / 43
RFC vs. ODATA
vor 9 Stunden von ewx 3 / 130
Druck von Etiketten via FP_PDF_TEST_01
vor 12 Stunden von Mr_Mkt 3 / 138