Select Options

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

Select Options

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 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(3f).
*   Keine Daten im gewählten Zeitraum vorhanden
  ENDIF.


Re: Select Options

Beitrag von Gast ( / / 0 / 3 ) » 31. Jan 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

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 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

Beitrag von GastX (Specialist / 266 / 4 / 10 ) » 31. Jan 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 ('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. 
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 
( 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. 
Du hast aber wahrscheinlich

Code: Alles auswählen.

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 ) . 
gemeint, oder?
Gruß, Frank

Beitrag von GastX (Specialist / 266 / 4 / 10 ) » 31. Jan 2006 10:34

Ups, da hat sich was überschnitten.
Poste doch nochmal dein aktuelles Coding.

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 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 ( 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
                                        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 ( 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
                                        AND gjahr = pa_gj
                                        AND monat IN so_perio.

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

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 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

Beitrag von DeathGuardian (Expert / 759 / 0 / 2 ) » 31. Jan 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

Beitrag von Gast ( / / 0 / 3 ) » 31. Jan 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!!

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 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

Beitrag von GastX (Specialist / 266 / 4 / 10 ) » 31. Jan 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

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 2006 14:54

Hallo Frank!

Genauso ist es!

Aber warum stimmen dann die Daten die rauskommen?

Wo hat das Programm einen Fehler?

Danke

Robin

Beitrag von Gast ( / / 0 / 3 ) » 31. Jan 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

Beitrag von ereglam (Top Expert / 1826 / 0 / 5 ) » 31. Jan 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(3f). 
*   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( itab_sumla ) EQ 0. "eine Variante

IF itab_sumla[] 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

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) » 31. Jan 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

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