Geschachtelte Selects - wo liegt das Problem

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Geschachtelte Selects - wo liegt das Problem

Beitrag von Pascal ( / / 0 / 3 ) »
Hallo zusammen !

Ich verzweifle hier langsam.
Habe folgende geschachtelte Selects programmiert und bekomme kein Ergebnis angezeigt.

Code: Alles auswählen.

IF chgdate-low > sy-datum OR chgdate-high > sy-datum.
  MESSAGE e008 WITH 'Datum darf nicht in der Zukunft liegen !'.
ELSE.
  SELECT * FROM  vbak
           WHERE bstzd = addition.
    IF sy-subrc = 0.
      SELECT * FROM cdhdr
               WHERE username   = changer
               AND   objectid   = vbak-vbeln
               AND   objectclas = 'VERKBELEG'
               AND   udate     >= chgdate-low
               AND   udate     <= chgdate-high.
        IF sy-subrc = 0.
          SELECT * FROM cdpos
                   WHERE objectid   = vbak-vbeln
                   AND   objectclas = cdhdr-objectclas
                   AND   changenr   = cdhdr-changenr
                   AND   tabname    = t_name
                   AND   fname      = f_name.
            WRITE: /3 chgdate-low,
                   16 chgdate-high,
                   29 cdpos-tabname,
                   46 cdpos-fname,
                   59 cdhdr-username,
                   71 vbak-bstzd.
            counter = counter + 1.
          ENDSELECT.
        ENDIF.
      ENDSELECT.
    ENDIF.
  ENDSELECT.
ENDIF.           "von Datumsprüfung

IF counter = 0.
  WRITE 'Kein Datensatz gefunden !'.
ENDIF.
Ich bekomme immer "Kein Datensatz gefunden !" angezeigt.
Ist es wirklich so simpel, dass kein Datensatz mit o.g. Kriterien vorhanden ist oder habe ich einen Denkfehler bei der Schachtelung der Selects ?

Für jede Form von Hilfe wäre ich euch dankbar :wink:

Pascal

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


Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hallo Pascal,

zur Fehleranalyse würde ich erstmal sukzessive die Tabellen auf entsprechende Einträge prüfen, z.B. mittels SE16. Zunächst einmal Tabelle VBAK. Gibt es dort Einträge auf die die Bedingung bstzd = addition zutrifft? Wert von addition?

Am einfachsten ist es sicherlich, unmittelbar nach den jeweiligen selects einen Breakpoint zu setzen, dann siehst Du sofort, welcher select nicht klappt bzw. keine Daten zurückliefert.

Gruß,
Steff

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hallo Pascal,

1. bist du sicher , daß die "objectid" richtig gefüllt ist ?
-> gehört hier nicht noch der Mandant vor den Verkaufsbeleg.
2. du hast 2 if-Abfragen in deinem coding , die unnötig sind
(nach Selektion der vbak und cdhdr) -> Übersichtlichkeit.
3. es gibt natürlich einen Fuba (oder wie ich die SAP kenne, mehrere),
die dir die Selektion abnehmen.
-> CHANGEDOCUMENT_READ.

lg Andreas

Beitrag von zzcpak (Expert / 673 / 5 / 67 ) »
Außerdem kannst du dir die Abfrage von SY-SUBRC innerhalb einer Select-Schleife sparen, da SY-SUBRC immer erst NACH Ablauf der Schleife gesetzt wird.

Des weiteren wie schon von den Vorschreibern gesagt, mal überprüfen (SE16) ob tatsächlich Daten gefunden werden müßten. Da die Key-Felder der CDHDR und CDPOS nur Zeichenketten sind, auch mal prüfen, ob die fehlenden "führenden Nullen" vielleicht dran schuld sind.

Beitrag von Daniel (Specialist / 314 / 68 / 44 ) »
Je nachdem was vor diesem Coding passiert,
ist der subrc möglicherweise nicht null.
Weder IF noch SELECT * setzten den subrc.
Damit fliegst du ungewollt raus !

Gruss
Daniel

Beitrag von zzcpak (Expert / 673 / 5 / 67 ) »
Ähh stimmt nicht ganz. Wenn Werte gefunden und damit die Select-Schleife durchlaufen wird, so ist SY-SUBRC auf jeden Fall 0.

Code: Alles auswählen.

tables:  bsik.


select * from bsik where bukrs = '0001'
                   and   lifnr = '0000011111'.

endselect.

select * from bsik where bukrs = '0001'
                   and   lifnr = '0000000011'.

  write: / 'bla'.

endselect.
In diesem Beispiel wird im ersten Select nichts gefunden, folglich ist sy-subrc = 4. In der zweiten Schleife wird was gefunden, die Schleife also durchlaufen und bei der Write-Anweisung innerhalb der Schleife ist sy-subrc = 0.

Beitrag von hsv (ForumUser / 24 / 0 / 0 ) »
es liegt daran, daß du beim 2. select keine führenden nullen hast, bzw. kontrollieren solltest, ob die belegnummer im richtigen format übergeben wird.

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
zzcpak hat geschrieben:Ähh stimmt nicht ganz. Wenn Werte gefunden und damit die Select-Schleife durchlaufen wird, so ist SY-SUBRC auf jeden Fall 0.
zu 2.0 war das noch anders, da war SY-SUBRC nach einem SELECT mit ENDSELECT nicht unbedingt 0, sondern erst nach dem ENDSELECT.
Nachdem ich SAP mal eine elend lange Liste mit SAP-Standard-Programmen geschickt habe, in der dieser Fehler vorkam, habe sie das per Kernel-Patch "gefixt".
Inzwischen ist die SY-SUBRC-Abfrage also einfach nur überflüssig.

Beitrag von DRABAP (ForumUser / 30 / 0 / 1 ) »
Du könntest den

Code: Alles auswählen.

sy-dbcount
verwenden.
Dr. ABAP

Beitrag von Volker Neurath (ForumUser / 17 / 0 / 0 ) »
Und ein Einwand von mir Anfänger:

Ich kann mir nicht wirklich vorstellen, dass diese Schachtelung sonderlich performant ist - meiner Meinung nach sollten hier die Überlegungen dringend in Richtung JOIN gehen...

Volker
Imübrigen bin ich der Meinung, das TCPA verhindert werden muss --- www.againsttcpa.com

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Da bin ich aber neugierig, wie Du den JOIN von CDHDR und CDPOS hinbekommst.

Beitrag von Volker Neurath (ForumUser / 17 / 0 / 0 ) »
Mir war nicht bewusst, dass ich hier unter jeden vorschlag ein "technische Realisierbarkeit vorausgesetzt" schreiben muss :(
Imübrigen bin ich der Meinung, das TCPA verhindert werden muss --- www.againsttcpa.com

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Volker Neurath hat geschrieben:Mir war nicht bewusst, dass ich hier unter jeden vorschlag ein "technische Realisierbarkeit vorausgesetzt" schreiben muss :(
Musst Du nicht.
Aber wem sollen technisch nicht realisierbare Vorschläge helfen?

Beitrag von Volker Neurath (ForumUser / 17 / 0 / 0 ) »
Aehem -- du kannst dir gut vorstellen, dass ich auch von zu Hause hier poste?

Und dir ist bewusst, dass *niemand* die Struktur *aller* Tabellen kennen kann, und dass ich von zu Hause aus auch keine Chance habe, mir eine Tabelle in SE11 anzusehen, um so die Realisierbarkeit eines JOINS zu prüfen?

Insofern fasse ich dene *beiden* Antworten auf meine Postings als "Kommentare, die die Welt nicht braucht" zusammen.

Volker
Imübrigen bin ich der Meinung, das TCPA verhindert werden muss --- www.againsttcpa.com

Beitrag von Chrisu (Specialist / 225 / 0 / 1 ) »
DRABAP hat geschrieben:Du könntest den

Code: Alles auswählen.

sy-dbcount
verwenden.
sy-dbcnt meinst du oder?

Vergleichbare Themen

10
Antw.
2528
Views
Wo liegt der Sinn dahinter?
von Django90 » 27.09.2017 10:28 • Verfasst in ABAP® für Anfänger
3
Antw.
1385
Views
Ermitteln, ob Buchungsdatum in einer geschlossenen Buchungsperiode liegt
von SweetRuedi » 29.05.2020 12:22 • Verfasst in ABAP® Core
4
Antw.
2401
Views
form für die selects
von BabsiCSC » 23.06.2008 17:21 • Verfasst in ABAP® Core
9
Antw.
3265
Views
Geschachtelte Tabelle
von Kenny » 02.05.2013 11:37 • Verfasst in ABAP® für Anfänger
8
Antw.
2299
Views
GELÖST - ADOBE Forms - geschachtelte Tabellen
von Xilukarim » 20.05.2019 15:25 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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.