Select Options


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

Moderatoren: Jan, Steff

Select Options

Beitragvon robin1at » 31.01.2006, 09:48

Hallo liebe Experten!

Habe ein Problem mit meinen Select Option´s.

Und zwar, wenn ich in meinem Programm die Selektionskriterien eingebe, haben diese sogut wie keinen Einfluß auf meine Ausgabe.

Ich möchte, wenn nichts eingegeben ist, daß alle Daten angezeigt werden, und wenn die Selektionskriterien erfüllt sind, die Selektierten Daten ausgeben werden.

Leider weis ich da im Moment nicht, wo mein Fehler liegt. Hoffe Ihr könnt mir wieder einmal helfen.

Danke

Robin

Code: Alles auswählen

SELECT-OPTIONS: so_land FOR lfa1-land1,
                so_perio FOR bkpf-monat.

PARAMETERS pa_gj LIKE bseg-gjahr.

SELECT-OPTIONS: so_dlkz FOR zdlkz_t-zdlkz.

START-OF-SELECTION.
*##################

  SELECT zdlkz bezeichnung
  FROM zdlkz_t INTO CORRESPONDING FIELDS OF TABLE itab_zdlkz_t
  WHERE zdlkz IN so_dlkz.

SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
         b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr
                 INTO CORRESPONDING FIELDS OF TABLE itab_sumla
                      FROM ( lfa1 AS a
                                  INNER JOIN bsak AS b
                                  ON a~lifnr = b~lifnr )
                                       WHERE bukrs IN ('1001')
                                       AND blart IN ('A1', 'A2', 'A3')
                                       AND land1 IN so_land
                                       OR land1 = space
                                       AND gjahr = pa_gj
                                       OR gjahr = space
                                       AND monat IN so_perio.
                                       OR monat = space.

 SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
         b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr
                 APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
                      FROM ( lfa1 AS a
                                  INNER JOIN bsik AS b
                                  ON a~lifnr = b~lifnr )
                                       WHERE bukrs IN ('1001')
                                       AND blart IN ('A1', 'A2', 'A3')
                                       AND land1 IN so_land
                                       OR land1 = space
                                       AND gjahr = pa_gj
                                       OR gjahr = space
                                       AND monat IN so_perio.
                                       OR monat = space.

  IF sy-subrc <> 0.
    MESSAGE i819&#40;3f&#41;.
*   Keine Daten im gewählten Zeitraum vorhanden
  ENDIF.
 
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal

Sponsor

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

Re: Select Options

Beitragvon Gast » 31.01.2006, 10:17

robin1at hat geschrieben:Ich möchte, wenn nichts eingegeben ist, daß alle Daten angezeigt werden, und wenn die Selektionskriterien erfüllt sind, die Selektierten Daten ausgeben werden.


Wieso fragst du immer auf gleich SPACE ab?
Schmeiß das überall raus, dass brauchst du nicht.

WHERE bukrs IN ('1001')
AND blart IN ('A1', 'A2', 'A3')
AND land1 IN so_land
AND gjahr = pa_gj
AND monat IN so_perio.

Gruß Hendrik
Gast
 

Beitragvon robin1at » 31.01.2006, 10:30

Hallo Hendrik!

Danke für Deine Hilfe!

Habe das space rausgeschmissen. Das Problem liegt bei pa_gj.

Wenn ich hier z.B.: 2005 eingebe, werden auch älter Daten angezeigt. (2003, 2004, 2005)

...
and gjahr = pa_gj.

Wie könnte ich das anders machen? Der IN Operator funktioniert hier nicht, weil es keine bis Option gibt.

Danke

Robin
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal

Beitragvon GastX » 31.01.2006, 10:32

Kurz angenommen, die Abfragen auf Space wären nötig (siehe vorigen Poster), dann müsstest Du aber noch Klammern setzen.
Der Code
Code: Alles auswählen
WHERE bukrs IN &#40;'1001'&#41;
AND blart IN &#40;'A1', 'A2', 'A3'&#41;
AND land1 IN so_land
OR land1 = space
AND gjahr = pa_gj
OR gjahr = space
AND monat IN so_perio.
OR monat = space.
 

hat zwei Punkte, einen nach so_perio und einen nach monat?
Angenommen, der nach so_perio wäre nicht da, dann wäre dein Code, da AND stärker als OR bindet, gleichbedeutend mit
Code: Alles auswählen
WHERE
&#40; bukrs IN &#40;'1001'&#41; AND blart IN &#40;'A1', 'A2', 'A3'&#41; AND land1 IN so_land &#41;
OR
&#40; land1 = space AND gjahr = pa_gj &#41;
OR
&#40; gjahr = space AND monat IN so_perio&#41;
OR
monat = space.
 
Du hast aber wahrscheinlich
Code: Alles auswählen
WHERE bukrs IN &#40;'1001'&#41;
AND blart IN &#40;'A1', 'A2', 'A3'&#41;
AND &#40; land1 IN so_land OR land1 = space &#41; "<<<
AND &#40; gjahr = pa_gj OR gjahr = space &#41;    "<<<
AND &#40; monat IN so_perio OR monat = space &#41; .
 

gemeint, oder?
Gruß, Frank
GastX
Specialist
 
Beiträge: 266
Registriert: 26.07.2004, 08:45
Wohnort: Detmold
Dank erhalten: 10 mal
Ich bin: Berater/in

Beitragvon GastX » 31.01.2006, 10:34

Ups, da hat sich was überschnitten.
Poste doch nochmal dein aktuelles Coding.
GastX
Specialist
 
Beiträge: 266
Registriert: 26.07.2004, 08:45
Wohnort: Detmold
Dank erhalten: 10 mal
Ich bin: Berater/in

Beitragvon robin1at » 31.01.2006, 10:42

Hallo Frank!

Auch Dir danke für Deine Hilfe!

Das Problem liegt bei dem Parameter pa_gj.

Danke

Robin

Code: Alles auswählen
SELECT-OPTIONS: so_land FOR lfa1-land1,
                so_perio FOR bkpf-monat.

PARAMETERS pa_gj LIKE bseg-gjahr.

SELECT-OPTIONS: so_dlkz FOR zdlkz_t-zdlkz.

START-OF-SELECTION.
*##################

  SELECT zdlkz bezeichnung
  FROM zdlkz_t INTO CORRESPONDING FIELDS OF TABLE itab_zdlkz_t
  WHERE zdlkz IN so_dlkz.

 SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
          b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr
                  INTO CORRESPONDING FIELDS OF TABLE itab_sumla
                       FROM &#40; lfa1 AS a
                                   INNER JOIN bsak AS b
                                   ON a~lifnr = b~lifnr &#41;
                                        WHERE bukrs IN &#40;'1001'&#41;
                                        AND blart IN &#40;'A1', 'A2', 'A3'&#41;
                                        AND land1 IN so_land
                                        AND gjahr = pa_gj
                                        AND monat IN so_perio.

 SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
          b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr
                  APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
                       FROM &#40; lfa1 AS a
                                   INNER JOIN bsik AS b
                                   ON a~lifnr = b~lifnr &#41;
                                        WHERE bukrs IN &#40;'1001'&#41;
                                        AND blart IN &#40;'A1', 'A2', 'A3'&#41;
                                        AND land1 IN so_land
                                        AND gjahr = pa_gj
                                        AND monat IN so_perio.

  IF sy-subrc <> 0.
    MESSAGE i819&#40;3f&#41;.
*   Keine Daten im gewählten Zeitraum vorhanden
  ENDIF.
 
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal

Beitragvon robin1at » 31.01.2006, 12:56

Hallo liebe Experten!

Ich weis absolut nicht mehr weiter.
:roll:
Hat noch jemand einen Rat oder Tip für mich?

Danke

Robin
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal

Beitragvon DeathGuardian » 31.01.2006, 13:37

Wenn ich das ganze jetzt richtig verstanden habe liegt dein Problem an deinem "pa_gj" bzw wenn du in diesen Paramter nichts eingibst.

In dem Fall gibts jetzt folgende Möglichkeiten:
1) Mach aus diesem Parameter ein Select-Option
2) oder
Code: Alles auswählen
RANGES: range type bseg-gjahr.
IF NOT pa_gj IS INITIAL.
range-sign = 'I'.
range-option = 'EQ'.
range-low = pa_gj .
append range.
ELSE.
REFRESH range.
ENDIF.
*im select dann auf den range mit "IN" abfragen
 
DeathGuardian
Expert
 
Beiträge: 762
Registriert: 28.09.2005, 08:31
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Beitragvon Gast » 31.01.2006, 13:42

Ich würde es auch mit Ranges machen, wie DeathGuardian es vorgeschlagen hat.

Eine andere Möglichkeit wäre noch vor dem Select eine Abfrage zu machen, ob dein Parameter leer ist und du dann das select ohne Bedingung auf diesen Parameter ausführst.
Sieht allerdings nicht so schön aus, wie mit Ranges!!
Gast
 

Beitragvon robin1at » 31.01.2006, 14:25

Hallo Death und Gast!

Vielen Dank für die Hilfe!

Ja, mit dem Range hat es super funktioniert! :)

Jetzt habe ich aber noch ein anderes Problem. Weis gar nicht ob ich jetzt richtig verstanden werde.

Ich probiere es mal ...

Die Selektion läßt sich jetzt über das Jahr auch einschränken.

2005 funktioniert tadellos!

Wenn ich jetzt 2004 selektiere, bekomme ich den sy-subrc von 4.

[/code] IF sy-subrc <> 0.
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden
ENDIF.

Nur weis ich absolut nicht warum?

Die Daten zeigt mir der ALV dann trotzdem an, und die stimmen auch!

Warum bekomme ich hier plötzlich sy-subrc = 4???

Hoffe Ihr könnt mir nochmal weiterhelfen.

Danke

Robin
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal

Beitragvon GastX » 31.01.2006, 14:51

Vielleicht denke ich gerade zu simpel, aber Du hast in Deinen obigen Beispielen zwei Selects und dahinter eine Abfrage auf den sy-subrc.
So wie Du das schilderst würde ich vermuten, dass der erste Select einen sy-subrc = 0 zurückliefert und Daten in die itab-sumla stellt, der zweite Select nix findet und daher den sy-subrc mit 4 liefert.

Dann würde das weitere Coding zwar ein Ergebnis anzeigen können (nämlich das des ersten Select), du bekämst aber dennoch eine Fehlermeldung.

Gruß, Frank
GastX
Specialist
 
Beiträge: 266
Registriert: 26.07.2004, 08:45
Wohnort: Detmold
Dank erhalten: 10 mal
Ich bin: Berater/in

Beitragvon robin1at » 31.01.2006, 14:54

Hallo Frank!

Genauso ist es!

Aber warum stimmen dann die Daten die rauskommen?

Wo hat das Programm einen Fehler?

Danke

Robin
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal

Beitragvon Gast » 31.01.2006, 15:33

robin1at hat geschrieben:Aber warum stimmen dann die Daten die rauskommen?


Du hast nur in der Tabelle BSAK Daten die zu deiner Where-Bedingng passen. In Tabelle BSIK passen keine Daten zu deiner Where-Bedingung

robin1at hat geschrieben:Wo hat das Programm einen Fehler?


Du fragst nur den sy-subrc nach dem Select auf BSIK ab, nicht aber den von BSAK. Besser an dieser Stelle wäre es zu schauen ob die Tabelle itab_sumla Daten enthällt:

* Schauen ob Daten gelesen wurden
IF itab_sumla[] is initial.
MESSAGE i819(3f).
ENDIF.

wobei die []-Klammern expliziet den Tabelleninhalt abfragt und nicht die Kopfzeile betrachtet.

Gruß Hendrik
Gast
 

Beitragvon ereglam » 31.01.2006, 15:33

Hallo Robin,

der Fehler besteht darin, dass Du Dir nicht den SY-SUBRC des ersten Selekt auf die BSAK merkst und nur dann eine Fehlermeldung bringst, wenn der zweite SELECT in die Hose geht.
Code: Alles auswählen
  SELECT ... JOIN bsak...

  lv_subrc = sy-subrc.

  SELECT ... JOIN bsik...

* nur wenn beide kein Ergebnis liefern...
  IF sy-subrc <> 0 AND lv_subrc NE 0.
    MESSAGE i819&#40;3f&#41;.
*   Keine Daten im gewählten Zeitraum vorhanden
  ENDIF.
 

alternativ würde ich einfach prüfen, ob denn die Tabelle itab_sumla überhaupt gefüllt ist:
Code: Alles auswählen
IF lines&#40; itab_sumla &#41; EQ 0. "eine Variante

IF itab_sumla&#91;&#93; IS INITIAL. " eine Weitere

DESCRIBE TABLE itab_sumla LINES sy-tfill."noch eine mit Systemfeld
IF sy-tfill EQ 0.

* etc.


Nachtrag: und wieder war ein Anderer schneller...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .
Mitglied im XING
ereglam
Top Expert
 
Beiträge: 1826
Registriert: 30.09.2004, 12:42
Wohnort: Schwalbach am Taunus
Dank erhalten: 5 mal
Ich bin: Entwickler/in

Beitragvon robin1at » 31.01.2006, 15:49

Hallo Hendrik und Ereglam!

DANKE!!!! :D

Ja, jetzt kapier ich es auch. :oops:

Vielen vielen Dank für Eure Hilfe!!!

Schöne Grüße

Robin
robin1at
Specialist
 
Beiträge: 190
Registriert: 04.01.2006, 09:46
Wohnort: Wien
Dank erhalten: 0 mal


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

  Aktuelle Beiträge   
gelöst SALV - Layout wird nicht gezogen
vor 6 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
Select nach Parameter & Select-Options
11.07.2012, 15:38 von Unit605 4 Antw.
SELECT - Options & SELECT Abfrage
15.05.2007, 07:13 von Mavrix 2 Antw.
select-options ... for
11.08.2005, 12:09 von ewx 2 Antw.
Select Options
24.01.2006, 15:53 von robin1at 2 Antw.
Select-Options
19.12.2014, 08:02 von a-dead-trousers 24 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder