Bitte um Hilfe beim Select und den Where Klausel´n

Getting started ... Alles für einen gelungenen Start.
20 Beiträge • Seite 1 von 2 (current) Nächste
20 Beiträge Seite 1 von 2 (current) Nächste

Bitte um Hilfe beim Select und den Where Klausel´n

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo liebe Experten!

Hänge gerade bei einem Select mit der Where Klausel.

Habe zwei Probleme.

Zum einen möchte ich, wenn der Usere bei der so_dlkz einen Wert eingibt, in meinem ALV nur die Zeilen ausgeben wo der Wert vorkommt. Im Moment kommen alle Daten raus, obwohl der Wert nur einmal vorkommt.

Wenn kein Wert gefunden wird, soll eine Fehlermeldung kommen.

Mein zweites Problem sind die Where Klausel´n generell in meinen Select´s. Habe meine Probleme mit dem Monat (so_perio) und mit dem Jahr (pa_gj).

Wenn ich z.B.: das Jahr 2006 eingebe, kommen keine Daten raus, obwohl Daten drinnen stehen. Gebe ich in die Selektionen gar nichts ein, werden auch die Daten aus dem Jahr 2006 angezeigt. Weis im Moment absolut nicht mehr weiter. Hoffe Ihr könnt mir helfen!

Vielen Dank!!

Robin

Code: Alles auswählen.

TYPE-POOLS slis.

TABLES: lfa1, bseg, bkpf, bsik, bsak, zdlkz_t.

DATA: BEGIN OF itab_sumla OCCURS 10,
        lifnr LIKE lfa1-lifnr,
        land1 LIKE lfa1-land1,
        diekz LIKE bsak-diekz,
        belnr LIKE bsak-belnr,
        zuonr LIKE bsak-zuonr,
        blart LIKE bsak-blart,
        bukrs LIKE bsak-bukrs,
        monat LIKE bsak-monat,
        gjahr LIKE bsak-gjahr,
        shkzg LIKE bsak-shkzg,
        bschl LIKE bsak-bschl,
        dmbtr LIKE bsak-dmbtr,
        wrbtr LIKE bsak-wrbtr,
        zdlkz LIKE zdlkz_t-zdlkz,
        bezeichnung LIKE zdlkz_t-bezeichnung,
        soha TYPE p DECIMALS 2,
        soll TYPE p DECIMALS 2,
        haben TYPE p DECIMALS 2,
        zahler TYPE i,
      END OF itab_sumla.

* Zweite interne Tabelle für "READ" - Spalten Vergleich

DATA: BEGIN OF itab_zdlkz_t OCCURS 10,
        zdlkz LIKE zdlkz_t-zdlkz,
        bezeichnung LIKE zdlkz_t-bezeichnung,
      END OF itab_zdlkz_t.

DATA: wa_soha LIKE LINE OF itab_sumla,
      wa_zdlkz LIKE LINE OF itab_zdlkz_t.

* zum sy-subrc Auswerten der beiden JOINS

DATA: lv_subrc TYPE sy-subrc.

DATA: my_fieldcat TYPE slis_t_fieldcat_alv,
      wa_layout   TYPE slis_layout_alv,
      wa_fieldcat LIKE LINE OF my_fieldcat,
      repid TYPE sy-repid.

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.

* damit die Selektion Geschäftsjahr funktioniert

RANGES: range FOR bseg-gjahr.
IF NOT pa_gj IS INITIAL.
  range-sign = 'I'.
  range-option = 'EQ'.
  range-low = pa_gj.
  APPEND range.
ELSE.
  REFRESH range.
ENDIF.

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

* GUI-Titel anlegen

  SET TITLEBAR 'T_SOHA'.

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

  IF sy-subrc <> 0.
    MESSAGE i114(gu) WITH 'DlKz' so_dlkz.
*   Falsche Werteingabe (Pos.DlKz --> so_dlkz)
    EXIT.
  ENDIF.

 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 IN range
                                AND monat IN so_perio.

  IF sy-subrc <> 0.
    lv_subrc = sy-subrc.
  ENDIF.

 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 IN range
                                AND monat IN so_perio.

  IF sy-subrc <> 0 OR lv_subrc <> 0.
    MESSAGE i819(3f).
*   Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
*   Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
    EXIT.
  ENDIF.

* wa_soha-.... weil durch DATA Deklaration wa_soha

  LOOP AT itab_sumla INTO wa_soha.


    IF wa_soha-shkzg = 'H'.
      wa_soha-haben = wa_soha-dmbtr.
    ELSE.
      wa_soha-soll = wa_soha-dmbtr.
    ENDIF.

    wa_soha-soha = wa_soha-haben - wa_soha-soll.

* Spalten Vergleich

    IF wa_soha-zuonr = space.
      wa_soha-zdlkz = space.
    ELSE.
      READ TABLE itab_zdlkz_t INTO wa_zdlkz WITH KEY zdlkz =
      wa_soha-zuonr.
      IF sy-subrc = 0.
        wa_soha-zdlkz = wa_zdlkz-zdlkz.
        wa_soha-bezeichnung = wa_zdlkz-bezeichnung.
      ENDIF.
    ENDIF.

* Zähler für keine Einträge in DlKz

    IF wa_soha-zdlkz = space.
      wa_soha-zahler = 1.
    ELSE.
      wa_soha-zahler = 0.
    ENDIF.


    MODIFY itab_sumla FROM wa_soha TRANSPORTING soll haben soha zahler
    zdlkz bezeichnung.

  ENDLOOP.

  IF wa_zdlkz-zdlkz = space.
    MESSAGE i819(3f).
*   Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
*   Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
    EXIT.
  ENDIF.

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


Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
HI!

Zu deinem Prob 1 (so_dlkz):
Diese Werte speicherst du ja in deine ITAB zdlkz_t ab, auf die du später einen READ TABLE machst.
Bei diesem READ TABLE fragst du ja auch den sy-subrc ab. Wenn du das jetzt so erweiterst, das wenn der sy-subrc ungleich 0 ist du ein DELETE auf itab_sumla machst und dann den Befehl CONTINUE absetzt, dann ist dein Problem da erledgt.

Zu deinem 2ten Problem muss ich mir das ganze nochmals genauer anschauen.

EDIT:
Hab mir das ganze nochmals angeschaut.
Kann es sein, das wenn du das Jahr eingibst er nur im ersten Select was findet und im 2ten nicht oder umgegehrt?
Debugg damal drüber und schau noch ob (wenn das Jahr eingibst) beide Selects mit sy-subrc 0 zurückkommen.
Wenn nämlich einer von beiden nicht 0 beendest du ja selbst das Programm.
Zuletzt geändert von DeathGuardian am 13.02.2006 13:54, insgesamt 2-mal geändert.

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Death!

Danke für Deine Hilfe!

Was macht der Delete denn dann?

Was wird dann gelöscht?

Danke

Robin

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
robin1at hat geschrieben:Hallo Death!

Danke für Deine Hilfe!

Was macht der Delete denn dann?

Was wird dann gelöscht?

Danke

Robin
Der Delete löscht die aktuelle Zeile deiner Itab wo du mit dem LOOP gerade bist.
Das CONTINUE dannach sagt dann, das er direckt mit dem nächsten Durchlauf des LOOPs beginnen soll.

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Death!

Ja, das ist schon so, daß er in einem Join was findet und im zweiten nicht.

Heist das denn wirklich, daß wenn ich dieses Programm richtig verwenden will es nur über geschachtelte Select´s funktionieren kann? (Tabelle BSEG) Denn Tabelle BSEG ist ja eine Cluster Tabelle, auf die ich mit keinem Join zugreifen kann.

Danke

Robin

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo auch,

wobei wir mal wieder bei der Frage sind, was genau Du denn finden sollst:
  • sowohl ausgezifferte als auch offene Belege (logisch UND)
  • entweder ausgezifferte oder offene Belege (exclusives ODER)
  • ausgezifferte und/oder offene Belege (logisch ODER)
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Ereglam!

Ich möchte das finden, daß auch in der BSEG dann drinnen steht.

Ehrlich gesagt überfordert mich Deine Frage im Moment total. :roll:

Vielleicht sagt Dir das ja was und Du kannst mir weiterhelfen.

Danke

Robin

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Habe jetzt einen geschachtelten Selct gebaut, nur leider bekomme ich einen Kurzdump mit folgender Meldung.

Bei einem Select-Zugriff konnten die gelesenen Daten nicht in das zur Verfügung gestellte Zielfeld gestellt werden.

Die Konvertierung wird entweder für den Typ des Zielfelds nicht unterstützt, oder das Zielfeld ist zur Aufnahme des Werts zu klein, oder die Daten weisen nicht das für das Zielfeld geforderte Format auf.

Fehler bei: AND gjahr = pa_gj.

Funktioniert aber auch nicht, wenn ich es mit einem range mache, oder ich eine Select-Options hernehme anstatt eines Parameters.

Hoffe Ihr könnt mir helfen ....

Code: Alles auswählen.

REPORT  zsumla.

TYPE-POOLS slis.

TABLES: lfa1, bseg, bkpf, bsik, bsak, zdlkz_t.

DATA: BEGIN OF itab_sumla OCCURS 10,
        lifnr LIKE lfa1-lifnr,
        land1 LIKE lfa1-land1,
        diekz LIKE bseg-diekz,
        belnr LIKE bseg-belnr,
        zuonr LIKE bseg-zuonr,
        blart LIKE bkpf-blart,
        bukrs LIKE bseg-bukrs,
        monat LIKE bkpf-monat,
        gjahr LIKE bseg-gjahr,
        shkzg LIKE bseg-shkzg,
        bschl LIKE bseg-bschl,
        dmbtr LIKE bseg-dmbtr,
        wrbtr LIKE bseg-wrbtr,
        zdlkz LIKE zdlkz_t-zdlkz,
        bezeichnung LIKE zdlkz_t-bezeichnung,
        soha TYPE p DECIMALS 2,
        soll TYPE p DECIMALS 2,
        haben TYPE p DECIMALS 2,
        zahler TYPE i,
      END OF itab_sumla.

* Zweite interne Tabelle für "READ" - Spalten Vergleich

DATA: BEGIN OF itab_zdlkz_t OCCURS 10,
        zdlkz LIKE zdlkz_t-zdlkz,
        bezeichnung LIKE zdlkz_t-bezeichnung,
      END OF itab_zdlkz_t.

DATA: wa_soha LIKE LINE OF itab_sumla,
      wa_zdlkz LIKE LINE OF itab_zdlkz_t.

DATA: itab_lfa1 TYPE TABLE OF lfa1,
      itab_bseg TYPE TABLE OF bseg,
      itab_bkpf TYPE TABLE OF bkpf.

DATA: wa_lfa1 LIKE LINE OF itab_lfa1,
      wa_bseg LIKE LINE OF itab_bseg,
      wa_bkpf LIKE LINE OF itab_bkpf.

DATA: my_fieldcat TYPE slis_t_fieldcat_alv,
      wa_layout   TYPE slis_layout_alv,
      wa_fieldcat LIKE LINE OF my_fieldcat,
      repid TYPE sy-repid.

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.
*##################

* GUI-Titel anlegen

  SET TITLEBAR 'T_SOHA'.

  SELECT land1 lifnr
  INTO wa_lfa1 FROM lfa1
  WHERE land1 IN so_land.
    APPEND wa_lfa1 TO itab_sumla.
    SELECT diekz belnr zuonr bukrs gjahr shkzg bschl dmbtr wrbtr
    INTO wa_bseg FROM bseg
      WHERE bukrs IN ('1001')
      and gjahr = pa_gj.
      APPEND wa_bseg TO itab_sumla.
      SELECT blart monat gjahr
       INTO wa_bkpf FROM bkpf
          WHERE blart IN ('A1', 'A2', 'A3')
          AND monat IN so_perio.
        APPEND wa_bkpf TO itab_sumla.
        SELECT zdlkz bezeichnung
        INTO wa_zdlkz FROM zdlkz_t
        WHERE zdlkz IN so_dlkz.
          APPEND wa_zdlkz TO itab_zdlkz_t.
        ENDSELECT.
      ENDSELECT.
    ENDSELECT.
  ENDSELECT.

  IF sy-subrc <> 0.
    MESSAGE i819(3f).
*   Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
*   Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
    EXIT.
  ENDIF.

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo nochmal!

Vergeßt den geschachtelten Select wieder.

Death, aber das muß doch mit meinen Joins funktionieren.

Auch mit den beiden sy-subrc. Denn wenn ich keine Daten eingebe bei den Selections findet das Programm ja die Daten von 2006.

Ich denke es liegt nur an den Where Klauseln.

Bitte bitte bitte, wer kann mir weiterhelfen???

Danke

Robin

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Robin,

mal sehen, ob ich das zusammenbekomme:
Es werden alle Belege des Jahres P_GJ, der Monate SO_PERIO und der Belegarten A1, A2 und A3 im Buchungskreis 1001 gesucht, die mindestens eine Kreditorenposition mit Kreditor aus den eingeschänkten Ländern hat, wobei egal ist, ob der Beleg noch offen ist.
Weiterhin soll zum Dienstleitungskennzeichen ein Eintrag in der ZDLKZ vorhanden sein.

Als Selektionstechnik würde sich hier im Normalfall ein Inner Join anbieten, was aber wegen der technischen Eigenschaften der BSEG nicht geht.
Alternativ stehen zwar die Tabellen BSIK und BSAK zur Verfügung, was aber auch nicht wirklich besser ist, denn es gibt Belege, die nur in der BSIK (offene Belege) und Andere, die nur in der BSAK (ausgezifferte Belege) vorhanden sind.

Da wir somit eine Kombination mit logischen ODER haben, müsste die Abfrage nach dem Lesen in etwa Folgende sein:

Code: Alles auswählen.

  IF sy-subrc <> 0 UND lv_subrc <> 0. "logisches UND, dass beide Abfrage keinen Erfolg hatten
    MESSAGE i819(3f). 
*   Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message 
*   Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!! 
    EXIT. 
  ENDIF. 
Alternativ kann man in ABAP auch einfach fragen, ob denn die Zieltabelle ITAB_SUMLA einen Inhalt hat.
Dazu stehen folgende Möglichkeiten zur Verfügung (bezogen auf obige Prüfung, ob denn nichts gefunden wurde):

Code: Alles auswählen.

IF LINES( itab_sumla ) EQ 0.

IF itab_sumla[] IS NOT INITIAL. "bzw. IF NOT itab_sumla[] IS INITIAL.

DESCRIBE TABLE itab_sumla LINES var_ln_cnt.
IF var_ln_cnt EQ 0.
PS:
geh mal in den Debugger und schaue Dir die Daten in der Tabelle direkt nachdem die Selects gelaufen sind.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Ereglam!

Also statt

Code: Alles auswählen.

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

so

Code: Alles auswählen.

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

Werde ich probieren.

Danke

Robin

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
und zur Übung probierst Du auch die anderen Varianten (Tabelle hat keine Inhalt), die ich gepostet habe...


:oops:
habe ich da wirklich UND geschrieben?. Du hast natürlich recht, dass es AND sein muss. (war natürlich ein Test... :twisted: )

Kern der Aussage:
wenn Belege weder in der BSIK noch in der BSAK gefunden wurden, wird die Fehlermeldung gesendet.
Umgekehrt ist es vollkommen in Ordnung, wenn es Belege nur in einem der beiden Tabellen gibt.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Ereglam!

Vielen Dank für Deine Hilfe!

Jetzt habe ich noch eine generelle Frage. Vielleicht erklärt sich dann mein Problem auch ganz von selbst.

In der BSIK stehen offene Belege.
In der BSAK ausgezifferte Belege.
In der BSEG beides????

Danke

Robin

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
richtig.

Den genauen Grund für diese Aufteilung kann ich Dir nicht sagen, aber ich vermute, dass es u.a. mit dem Umstand der Cluster-Tabelle BSEG zu tun haben dürfte.
Es gilt auf jeden Fall, dass es zu jedem Satz in der BSIK bzw. BSAK einen entsprechenden Satz in der BSEG geben muss. Aus Sicht der BSEG mit Kreditorenkontierung gibt es pro Satz entweder einen Eintrag in der BSIK (exklusiv)oder BSAK.

Das Gleiche gilt übrigens auch für die Kunden/Debitorenseite für die Tabellen BSID und BSAD, sowie die BSIS und BSAS für Hauptbuchkontierungen.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Danke Ereglam!

Somit erledigt sich mein Problem schon fast.

Das heist ich kann mir den sy-subrc Abfrage Code sparen.

Denn eigentlich sollte ich die Daten aus der BSEG lesen. (lt. Auftrag) Nur da dieses viel zu lange dauert, greife ich über Joins auf die BSAK bzw. BSIK zu.

Also wenn man jetzt davon ausgeht wie ich auf die Daten zugreifen soll, sollte ich eigentlich alle Daten anzeigen, und mir den sy-subrc sparen, oder?

Habe ich doch richtig verstanden Deine Erklärung?

Danke

Robin

Vergleichbare Themen

4
Antw.
1519
Views
Select - Frage zu einer Where-Klausel
von Stahle71 » 17.02.2016 07:21 • Verfasst in ABAP® für Anfänger
4
Antw.
3676
Views
Problem mit IN Klausel in SELECT Anweisung
von Silberwind » 06.06.2008 10:32 • Verfasst in ABAP Objects®
2
Antw.
1044
Views
Hilfe bei SELECT
von supermario73 » 31.01.2008 14:02 • Verfasst in ABAP® für Anfänger
4
Antw.
1311
Views
Hilfe bei SELECT
von treyfifty » 18.02.2016 13:57 • Verfasst in ABAP® für Anfänger
5
Antw.
2480
Views
Hilfe bei Select-Anweisung
von Matthias Alles » 05.05.2004 10:29 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

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.