Discussion:
Select-options mit AND-Verknüpfung?
(zu alt für eine Antwort)
Stefan Bauer
2004-10-21 13:23:17 UTC
Permalink
Hallo zusammen,

irgendwie stolpere ich immer wieder über dasselbe Problem. Wie kann ich
bei select-options dafür sorgen, dass bei einer Selektion alle Werte mit
AND statt mit OR verknüpft werden?
Ich habe schon versucht, alle Select-Option-Werte mit einem Select über
die entsprechende Tabelle in eine interne Tabelle zu schreiben. Aber wie
geht es dann weiter? Wenn ich dann einen Select mache stehe ich wieder
vor demselbem Problem, wenn ich for all entries in itab nehme.

Gibt es da einen Funktionsbaustein oder einen eleganten kleine Abap-Befehl?

Viele Grüße,

Stefan
Alexander Bauer
2004-10-21 13:48:43 UTC
Permalink
Hi Stefan,

ist das nicht automatisch so, oder verstehe ich Deine Frage falsch?

Beispiel:

SELECT-OPTIONS : s_mblnr FOR mseg-mblnr,
s_lifnr FOR lfa1-lifnr,

Eingabe s_mblnr-low = 1000 s_mblnr-high = 2000
s_lifnr-low = 2 s

Ausgabe: Belege zwischen1000 und 2000 AND wo der Lieferant = 2 ist.

viele Grüße
Alex
Post by Stefan Bauer
Hallo zusammen,
irgendwie stolpere ich immer wieder über dasselbe Problem. Wie kann ich
bei select-options dafür sorgen, dass bei einer Selektion alle Werte mit
AND statt mit OR verknüpft werden?
Ich habe schon versucht, alle Select-Option-Werte mit einem Select über
die entsprechende Tabelle in eine interne Tabelle zu schreiben. Aber wie
geht es dann weiter? Wenn ich dann einen Select mache stehe ich wieder
vor demselbem Problem, wenn ich for all entries in itab nehme.
Gibt es da einen Funktionsbaustein oder einen eleganten kleine
Abap-Befehl?
Post by Stefan Bauer
Viele Grüße,
Stefan
Stefan Bauer
2004-10-21 14:06:18 UTC
Permalink
Hallo Alexander,

danke für den Hinweis. Ich sollte mich wohl etwas klarer ausdrücken.

Ich habe eine Select-Option und gebe dort in der Mehrfachselektion
mehrere Werte ein.

Beispiel:
Sign/Option jeweils I/EQ
VBELN
POSNR

Jetzt möchte ich z.B. aus der DD03L alle Tabellen selektieren, die
sowohl VBELN als auch POSNR enthalten, also Verknüpfung UND.

Da aber nun jedesmal andere Selektionswerte eingetragen werden können,
kann ich die nicht einfach in einer Where-Bedingung mit AND verknüpfen,
zumal auch die Anzahl differieren kann.

Am liebsten wäre mir, wenn ich auch Eingaben wie VBEL* und POS* mit AND
verknüpfen könnte. Ist wahrscheinlich jedoch nur in seltenen Fällen
sinnvoll.

Danke für die schnelle Reaktion,

Stefan
Christoph Thomas
2004-10-21 17:18:51 UTC
Permalink
Hallo Stefan, ich bin nicht sicher ob ich das jetzt richtig verstehe...

Ich denke das kannst Du schon mit for all entries in itab lösen:

Die Itab muss zwei Spalten enthalten (type VBELN und type POSNR) und dann entsprechend Deinen vorgaben gefüllt werden (Die Werte der Select Options gemäß den Vorgaben übertragen). Z.B.:
VBELN POSNR
1 1
1 2
2 1

select * into table wrktab from xyz
for all entries in itab[]
where vbeln = itab-vbeln
and posnr = itab-posnr.

liefert alle angegebenen Werte, aber keinen mit VBELN 2 und POSNR 1. Vorsichtig musst Du sein wenn die ITAB leer ist (liefert dann wie Select-Options alle Werte).

Viele Grüsse, Christoph
Post by Stefan Bauer
Hallo Alexander,
danke für den Hinweis. Ich sollte mich wohl etwas klarer ausdrücken.
Ich habe eine Select-Option und gebe dort in der Mehrfachselektion
mehrere Werte ein.
Sign/Option jeweils I/EQ
VBELN
POSNR
Jetzt möchte ich z.B. aus der DD03L alle Tabellen selektieren, die
sowohl VBELN als auch POSNR enthalten, also Verknüpfung UND.
Da aber nun jedesmal andere Selektionswerte eingetragen werden können,
kann ich die nicht einfach in einer Where-Bedingung mit AND verknüpfen,
zumal auch die Anzahl differieren kann.
Am liebsten wäre mir, wenn ich auch Eingaben wie VBEL* und POS* mit AND
verknüpfen könnte. Ist wahrscheinlich jedoch nur in seltenen Fällen
sinnvoll.
Danke für die schnelle Reaktion,
Stefan
Andreas Christoph
2004-10-21 18:48:42 UTC
Permalink
Post by Stefan Bauer
Hallo Alexander,
danke für den Hinweis. Ich sollte mich wohl etwas klarer ausdrücken.
Ich habe eine Select-Option und gebe dort in der Mehrfachselektion
mehrere Werte ein.
Sign/Option jeweils I/EQ
VBELN
POSNR
Jetzt möchte ich z.B. aus der DD03L alle Tabellen selektieren, die
sowohl VBELN als auch POSNR enthalten, also Verknüpfung UND.
Da aber nun jedesmal andere Selektionswerte eingetragen werden können,
kann ich die nicht einfach in einer Where-Bedingung mit AND verknüpfen,
zumal auch die Anzahl differieren kann.
Am liebsten wäre mir, wenn ich auch Eingaben wie VBEL* und POS* mit AND
verknüpfen könnte. Ist wahrscheinlich jedoch nur in seltenen Fällen
sinnvoll.
Danke für die schnelle Reaktion,
Stefan
Hallo Stefan, dann hast Du kein Problem mit UND/ODER als Verknüpfung,
sondern willst eigentlich etwas ganz anderes:
Du willst aus dem DDIC (Tabelle DD03L) die Tabellen ermitteln, die
sowohl ein Feld mit Namen VBELN las auch eines mit Namen POSNR haben,
korrekt ?
Da DD03L pro Tabellenfeld eine Zeile enthält, ist Deine
Selektionsbedingung gar nicht auf eine Zeile bezogen, sondern Du hast
ein zeilenübergreifendes Selektionskriterium:
Du hast zwei (im Prinzip auch auf mehr erweiterbar) Range-Tabellen
und suchst die Sätze in der DD03L, deren FIELDNAME jeweils einem Range
genügt und die im TABNAME übereinstimmen.

Experimentier mal mit folgendem ABAP:

REPORT ZJOINTEST .

tables: dd03l.

data: l_tabname like dd03l-tabname occurs 1 with header line.

select-options s_name1 for dd03l-fieldname.
select-options s_name2 for dd03l-fieldname.



select a~tabname from dd03l as a
inner join dd03l as b
ON a~tabname = b~tabname
appending table l_tabname
where a~fieldname in s_name1 AND
b~fieldname in s_name2.


Gruß,
Andreas
Stefan Bauer
2004-10-22 07:59:10 UTC
Permalink
Hallo zusammen,

vielleicht liegt es daran, dass ich mich gerade mit einer Grippe
rumschlage, dass ich mich nicht klar ausdrücken kann.

Also noch ein Versuch:

ich habe EINE select-option, in der ich über die Mehrfachselektion
mehrere Zeilen gefüllt habe.

ddictab zum Beispiel mit folgender Struktur:
nachname,
vorname.

s_option for ddictab-feld.

Werte:
I/EQ/hugo
I/EQ/herbert
I/EQ/seppel

Dann kommt mein Select:

select * from ddictab
where vorname in s_option.

Nun werden aber eben alle Datensätze selektiert, die hugo, herbert oder
seppel in vorname haben. Ich möchte aber alle nachnamen haben, die es
mit hugo und herbert und seppel als vornamen gibt, also z.B:
Müller, hugo
Müller, herbert
Müller, seppel

Dies ist aber nur ein Beispiel. Konkrete Anwendung wäre zum Beispiel
alle Datensätze aus der VBAP auszulesen, die alle bestimmte Materialien
enthalten.

Da die Anwender ja quasi beliebig viele Datensätze in die s_option
eintragen können, weiß ich eben nicht, wie ich damit eine interne
Tabelle anlegen soll. Möglicherweise geht das dynamisch, aber eigentlich
hatte ich gehofft es gäbe einen einfacheren Weg als diesen.

Viele Grüße,

Stefan
Post by Stefan Bauer
Hallo Alexander,
danke für den Hinweis. Ich sollte mich wohl etwas klarer ausdrücken.
Ich habe eine Select-Option und gebe dort in der Mehrfachselektion
mehrere Werte ein.
Sign/Option jeweils I/EQ
VBELN
POSNR
Jetzt möchte ich z.B. aus der DD03L alle Tabellen selektieren, die
sowohl VBELN als auch POSNR enthalten, also Verknüpfung UND.
Da aber nun jedesmal andere Selektionswerte eingetragen werden können,
kann ich die nicht einfach in einer Where-Bedingung mit AND verknüpfen,
zumal auch die Anzahl differieren kann.
Am liebsten wäre mir, wenn ich auch Eingaben wie VBEL* und POS* mit AND
verknüpfen könnte. Ist wahrscheinlich jedoch nur in seltenen Fällen
sinnvoll.
Danke für die schnelle Reaktion,
Stefan
Dirk Sehner
2004-10-22 09:04:11 UTC
Permalink
nimm 2 select-options.

vorname => s_option1
nachname => s_option2

select * from ddictab
where vorna in s_option1 and
nachn in s_optin2.

Gruß Dirk
Post by Stefan Bauer
Hallo zusammen,
vielleicht liegt es daran, dass ich mich gerade mit einer Grippe
rumschlage, dass ich mich nicht klar ausdrücken kann.
ich habe EINE select-option, in der ich über die Mehrfachselektion
mehrere Zeilen gefüllt habe.
nachname,
vorname.
s_option for ddictab-feld.
I/EQ/hugo
I/EQ/herbert
I/EQ/seppel
select * from ddictab
where vorname in s_option.
Nun werden aber eben alle Datensätze selektiert, die hugo, herbert oder
seppel in vorname haben. Ich möchte aber alle nachnamen haben, die es
Müller, hugo
Müller, herbert
Müller, seppel
Dies ist aber nur ein Beispiel. Konkrete Anwendung wäre zum Beispiel
alle Datensätze aus der VBAP auszulesen, die alle bestimmte Materialien
enthalten.
Da die Anwender ja quasi beliebig viele Datensätze in die s_option
eintragen können, weiß ich eben nicht, wie ich damit eine interne
Tabelle anlegen soll. Möglicherweise geht das dynamisch, aber eigentlich
hatte ich gehofft es gäbe einen einfacheren Weg als diesen.
Viele Grüße,
Stefan
Post by Stefan Bauer
Hallo Alexander,
danke für den Hinweis. Ich sollte mich wohl etwas klarer ausdrücken.
Ich habe eine Select-Option und gebe dort in der Mehrfachselektion
mehrere Werte ein.
Sign/Option jeweils I/EQ
VBELN
POSNR
Jetzt möchte ich z.B. aus der DD03L alle Tabellen selektieren, die
sowohl VBELN als auch POSNR enthalten, also Verknüpfung UND.
Da aber nun jedesmal andere Selektionswerte eingetragen werden können,
kann ich die nicht einfach in einer Where-Bedingung mit AND verknüpfen,
zumal auch die Anzahl differieren kann.
Am liebsten wäre mir, wenn ich auch Eingaben wie VBEL* und POS* mit AND
verknüpfen könnte. Ist wahrscheinlich jedoch nur in seltenen Fällen
sinnvoll.
Danke für die schnelle Reaktion,
Stefan
Stefan Bauer
2004-10-22 09:11:01 UTC
Permalink
Hallo Dirk,

genau da ist der Haken. Manchmal sollen 2, mal 3, mal vielleicht sogar
10 Kriterien eingegeben werden. Und dann müsste ich dynamisch die
gewünschte Anzahl von select-options erzeugen. Daher möchte ich eben die
Mehrfachselektion verwenden.

Viele Grüße,

Stefan
Post by Dirk Sehner
nimm 2 select-options.
vorname => s_option1
nachname => s_option2
select * from ddictab
where vorna in s_option1 and
nachn in s_optin2.
Gruß Dirk
mecons
2004-10-22 11:15:29 UTC
Permalink
Hallo Stefan,

so wie Dirk das beschrieben hat funktioniert das !!!
Alle ausgewählten Daten sind in s_option1 bereits enthalten, durch das "in"
in der where-Klausel
erhälst du alle gewünschten Daten.

Probiers einfach in einem miniabap aus.

Gruß Achim
Post by Stefan Bauer
Hallo Dirk,
genau da ist der Haken. Manchmal sollen 2, mal 3, mal vielleicht sogar
10 Kriterien eingegeben werden. Und dann müsste ich dynamisch die
gewünschte Anzahl von select-options erzeugen. Daher möchte ich eben die
Mehrfachselektion verwenden.
Viele Grüße,
Stefan
Post by Dirk Sehner
nimm 2 select-options.
vorname => s_option1
nachname => s_option2
select * from ddictab
where vorna in s_option1 and
nachn in s_optin2.
Gruß Dirk
Stefan
2004-10-22 17:02:50 UTC
Permalink
REPORT ZTEST4 .

tables: dd03l.

data: l type i.

select-options: fields for dd03l-fieldname.

describe table fields lines l.

select tabname from dd03l
into corresponding fields of dd03l
where fieldname in fields
group by tabname
having count( * ) = l.
write:/ dd03l-tabname.
endselect.


Gruß Stefan

Loading...