intervall in open sql

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

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

intervall in open sql

Beitrag von gse ( / / 0 / 3 ) »
hallo und frohes neues liebe forumgemeinde,

in einem open sql-statement moechte ich eine intervallmenge ansprechen und in eine itab auslesen.

konkret moechte ich protokoll-eintraege aus der aenderungsbelegfortschreibung (cdhdr/cdpos) nach datum und uzeit auslesen.

Code: Alles auswählen.

  SELECT  *
    FROM  cdhdr
    INTO  CORRESPONDING FIELDS OF TABLE it_cdhdr
    WHERE objectclas  =   l_objectclas
      AND  objectid   =   l_objectid
      AND  username   =   l_userid
      AND  udate      >  l_datum_ab
      AND  udate      <=  l_datum_bis
      AND  utime      >  l_zeit_ab
      AND  utime      <=  l_zeit_bis
      .
 

dummerweise krieg ich aber statt einer ergebnismenge immer nur subrc = 4. ich vermute da verbirgt sich irgendwo ein denkfehler.

sieht jemand mehr als ich? :roll:
freue mich auf hinweise jeder art!

gruss gse

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


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

ebenfalls frohes neues Jahr :D

Soweit ich weiß, kannst Du die logischen Operatoren nicht in opensql verwenden.

Was funktionieren müßte wäre:

Code: Alles auswählen.

 SELECT  * 
    FROM  cdhdr 
    INTO  CORRESPONDING FIELDS OF TABLE it_cdhdr 
    WHERE objectclas  =   l_objectclas 
      AND  objectid   =   l_objectid 
      AND  username   =   l_userid 
      AND  udate  between l_datum_ab AND l_datum_bis 
      AND  utime  between  l_zeit_ab AND  l_zeit_bis 
      . 
 
Probier's mal aus. Müßte eigentlich funktionieren.

Grüße,
Steff

touch down!

Beitrag von gse (ForumUser / 97 / 0 / 2 ) »
hi steff,

DEIN hinweis war mal wieder goldwert! :P
vielen dank und noch einen schoene(n) ....../tag/feierabend/nacht?

gruss gse

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

Danke. Freut mich, dass es geklappt hat. In einem Punkt war ich allerdings etwas zu vorschnell:

Die logischen Operatoren '>=', '<', etc. sind auf jeden Fall zulässig. :oops:
Es müßte auch damit klappen, aber vermutlich nur dann, wenn Du eine Klammer setzt, also:

Code: Alles auswählen.

SELECT  * 
    FROM  cdhdr 
    INTO  CORRESPONDING FIELDS OF TABLE it_cdhdr 
    WHERE objectclas  =   l_objectclas 
      AND  objectid   =   l_objectid 
      AND  username   =   l_userid 
      AND  ( udate      >  l_datum_ab 
      AND  udate      <=  l_datum_bis ) 
      AND  ( utime      >  l_zeit_ab 
      AND  utime      <=  l_zeit_bis ) 
      . 
Ist aber nur eine Vermutung, ich habe es nicht ausprobiert :-)

Gruss,
Steff

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
>, <, >=, <= oder GT, LT, GE, LE kann man auch im Open SQL verwenden (mit oder ohne Klammern).
Das BETWEEN gefällt dem Optimizer besser, denke ich.
Außerdem kann

Code: Alles auswählen.

   field BETWEEN from AND to
für from = to passende Einträge finden, nicht jedoch

Code: Alles auswählen.

  field > from AND field <= to
Die mit BETWEEN vergleichbare Logik wäre

Code: Alles auswählen.

  field >= from AND field <= to
bzw.

Code: Alles auswählen.

  field GE from AND field LE to.
Vielleicht ist ja dieser Sonderfall das Problem, wenn SY-SUBRC 4 ist.

Aber noch eine Frage:

Willst Du (bzw. der Anwender) bei l_datum_ab = '20021220', l_zeit_ab = '060000', l_datum_bis = '20030102', l_zeit_bis = '080000' wirklich nur Einträge der Tage vom 20.12.02 bis zum 02.01.03, die in der Zeit von 06:00 bis 08:00 erzeugt wurden?
Oder doch lieber alle Einträge mit udate zwischen '20021219' und '20030101' sowie die Einträge vom 20.12.2002 mit utime >= 06:00 und die Einträge vom 02.01.2003 mit utime <= 08:00?

Und was, wenn l_zeit_von und l_zeit_bis initial sind, weil der Nutzer meint, dann wird die Uhrzeit ignoriert

Frank

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Die mit BETWEEN vergleichbare Logik wäre

Code: Alles auswählen.

  field >= from AND field <= to
bzw.

Code: Alles auswählen.

  field GE from AND field LE to.
Hi Frank,

weißt Du, ob hier geklammert werden muss? Ich vermute nämlich fast, dass es daran liegt (siehe meine letzte Antwort). Wenn Du nämlich nicht klammerst, dann wird jedes AND als ein 'AND' der where-Klausel interpretiert, aber nicht als 'AND' im Sinne einer logischen Verknüpfung. Wie gesagt, ich hab's noch nicht ausprobiert, aber es würde Sinn machen, oder?

Gruss,
Steff

Datum + Zeitpunkt als Intervallgrenzen

Beitrag von gse (ForumUser / 97 / 0 / 2 ) »
Hallo, guten Morgen,

und herzlichen Dank fuer Eurer Feedback.

vielleicht noch ein wort zur idee meines projektes:
als Basis habe ich ein DDIC-Objekt in dem sich Sicherungen einer bestimmten Ausprägung befinden. Um zum Sicherungsdatum aber auch noch angeben zu können, was sich von Sicherung zu Sicherung geaendert hat, möchte ich auf die Aenderungsbelegfortschreibung zugreifen und somit von Sicherung zu Sicherung die Aenderungen auslesen und anzeigen. Fuer das Auslesen aus der Belegfortschreibung loope ich ueber meine itab (enthaelt die Daten zu den einzelnen Sicherungen) und moechte dann die hier benannten Grenzen verwenden um die Selektion auf die Aenderungsbelege einzuschraenken.

->steff
habe mal das ganze mit Deinen code-vorschlaegen ausprobiert.
between

Code: Alles auswählen.

 AND  udate  between l_datum_ab AND l_datum_bis
     AND  utime  between  l_zeit_ab AND  l_zeit_bis 
ergebnis:
die intervalle werden noch nicht sauber berücksichtigt, ich möchte ja die obere intervallgrenze ein- und die untere (=vorige Sicherung) ausschliessen. Habe den Fall, dass es fuer die obere Grenze einen Satz gibt, der aber (scheinbar) durch diese Abfrage ausgeschlossen wird (subrc=4).

Protokolleintraege in cdhdr
datum zeit
10.12.02 10:16:44
10.12.02 10:21:29

Intervallgrenzen mit subrc bestimmt durch Eintraege in itab
l_datum_ab bis l_datum_bis subrc gefunden
00.00.02 -> 01.10.02 4 0
01.10.02 -> 04.10.02 4 0
04.10.02 -> 10.12.02 4 0
10.12.02 -> 10.12.02 0 2
10.12.02 -> 01.01.03 0 1

mit und ohne Klammer

Code: Alles auswählen.

... AND ( udate       >   l_datum_ab
AND    udate      <=  l_datum_bis ).... 
in beiden Fällen werden keine Eintraege gefunden. (subrc = 4)

->Frank,
die Daten

Code: Alles auswählen.

l_datum_ab  bzw.  l_datum_bis 

sollen mit dem jeweiligen zeitpunkt

Code: Alles auswählen.

l_zeit_ab / l_zeit_bis
einen zeitraum markieren, indem ich natuerlich alle Protokolleinträge abfangen möchte und nicht etwa nur die zwischen 06.oo und 18.00 Uhr.
Hast Du einen Vorschlag wie ich das Problem loesen koennte?

gruss gse

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Steff hat geschrieben:
Die mit BETWEEN vergleichbare Logik wäre

Code: Alles auswählen.

  field >= from AND field <= to
bzw.

Code: Alles auswählen.

  field GE from AND field LE to.
Hi Frank,

weißt Du, ob hier geklammert werden muss? Ich vermute nämlich fast, dass es daran liegt (siehe meine letzte Antwort). Wenn Du nämlich nicht klammerst, dann wird jedes AND als ein 'AND' der where-Klausel interpretiert, aber nicht als 'AND' im Sinne einer logischen Verknüpfung.
Man muß nicht klammern. Was meinst Du mit 'AND' im Sinne einer logischen Verknüpfung im Gegensatz zu 'AND' der where-Klausel

Für mich ist hier jedes AND eine Verknüfpung zwischen logischen Bedingungen der WHERE-Klausel, egal wie ich Klammern setze.
Und das BETWEEN läßt sich ohne weiteres in zwei mit AND verknüpfte Bedingungen umsetzen.

Die Klammerung wird eigentlich nur dann nötig, wenn ich Vorrangregeln ändern möchte, also z.B. wenn ich Bedingungen mit AND und OR verknüpfe und evtl noch NOT verwende.
Da muß man dann aufpassen, daß man nicht versehentlich so etwas macht:

http://groups.google.de/groups?hl=de&lr ... google.com

SY-SUBRC = 4 kam hier m.E. wegen der Bedingungen für die Uhrzeit zustande.
(Daher meine Frage, ob gse wirklich meinte, was er programmiert hat.)

Beitrag von DRABAP (ForumUser / 30 / 0 / 1 ) »
Der Ausdruck

Code: Alles auswählen.

dobj BETWEEN dobj1 AND dobj2
ist equivalent zu

Code: Alles auswählen.

dobj >= dobj1 AND dobj <= dobj2
Ein guter Optimizer behandelt beides gleich. Der Between-Ausdruck ist jedoch etwas kompakter und leichter zu verstehen.
Es gibt keine Unterscheidung in ein "AND der Where-Klausel" oder ein "AND des logischen Ausdrucks". Die Where-Klausel verlang einen logischen Ausdruck. Innhalb dieses Ausdrucks kann es beliebig viele ANDs geben. Ein Ausduck

Code: Alles auswählen.

c1 AND c2 AND c3 AND c4
kann aufgrund des Assoziativgesetzes beliebig geklammert werden, ohne dass sich der Wert verändert. Also auch:

Code: Alles auswählen.

( ( c1 AND c2 ) AND ( c3 AND c4 ) )
Dr. ABAP

timestamp

Beitrag von gse (ForumUser / 97 / 0 / 2 ) »
hi frank,

bzgl. des zeitpunkts in der where-klausel.

heisst dass vielleicht, dass ich mir erst zwei timestamp basteln muss (bestehend aus Datum l_datum_ab und Zeitpunkt l_zeit_ab bzw l_datum_bis und l_zeit_bis) und diese dann mit der between - verklausulierung einsetze?

wie gesagt, ich moechte gerne alle eintraege zwischen

l_datum_ab und l_zeit_ab

bis

l_datum_bis und l_zeit_bis

auslesen.

gruss gse

Beitrag von DRABAP (ForumUser / 30 / 0 / 1 ) »
noch ein kleiner NAchtrag: Der BETWEEN bildet immer das nach beiden Seiten hin geschlossene Interval [min...max], also obj >= min AND obj <= max. Wennn man ein offenes Intervall wie ]min..max[ haben möchte (das heisst die Grenzen min und max gehören nicht mehr zum Intervall), muß man im allgemeinen die Vergleichsoperatoren verwenden, also obj > min AND obj < max.
In einigen Spezialfällen kann man naturlich von den Intervalgrenzen den Nachfolger bzw. Vorgänger bestimmen. Bei einem Intergeger sähe dies wie folgt aus: ]min..max[ kann als obj BETWEEN min_ AND max_ geschrieben werden mit min_ = min + 1 und max_ = max - 1. Das geht jedoch nicht immer. Bei Gleitkommazahlen ist es nicht so einfach.
Dr. ABAP

Re: timestamp

Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
gse hat geschrieben:hi frank,

bzgl. des zeitpunkts in der where-klausel.

heisst dass vielleicht, dass ich mir erst zwei timestamp basteln muss (bestehend aus Datum l_datum_ab und Zeitpunkt l_zeit_ab bzw l_datum_bis und l_zeit_bis) und diese dann mit der between - verklausulierung einsetze?

wie gesagt, ich moechte gerne alle eintraege zwischen

l_datum_ab und l_zeit_ab

bis

l_datum_bis und l_zeit_bis

auslesen.

gruss gse
Hallo zusammen,

also ich weiß nicht, wie Ihr das seht, aber ich bin mir ziemlich sicher, dass das mit einem einzigen select statement (zumindest wie oben bereits aufgeführt) nicht machbar ist. Wenn es ein timestamp wäre, dann wäre eine entsprechende Selektion machbar, d.h. meiner Meinung nach müßte man eine interne Tabelle bauen und um einen Timestamp erweitern. Über diese interne Tabelle läßt sich dann mit dem Timestamp die entsprechende Auswahl treffen. Das wäre mein Vorschlag.

Gruss,
Steff

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
Klar geht das mit einem einzigen SELECT, nur siehrt dieses SELECT nicht besonders schön aus.

Besser und übersichtlicher wäre aber eine Falluntersscheidung mit verschiedenen SELECTs für die Fälle:
1. von_datum > bis_datum ODER ( von_datum = bis_datum und von_uhrzeit > bis_uhrzeit )
kein SELECT nötig, da Bedingung nicht erfüllbar ist.
(Ich weiß nicht, wie DB-optimizer üblicherweise vorgehen. Ob die Bedingung auf Erfüllbarkeit geprüft wird, bevor selecktiert wird oder nicht.
Wenn der Zugriffsmechanismus (execution plan) aber nur vom statement pattern und den Statistik-Informationen abhängt, ist nicht auszuschließen, daß tatsächlich Satz für Satz geprüft wird, ob das Datum > '20030102' und < '20021210' ist.)
2. von_datum = bis_datum und von_uhrzeit < bis_uhrzeit:
3. von_datum < bis_datum.

(Das Select-Statement für den 3. Fall ist immer noch das komplizierteste, aber nicht SO komplex als wenn ich auch die Falle 1 und 2 in einem SELECT abdecken will.)

Aber ich glaube auch nicht, daß man damit schon alle Probleme gelöst hat.
(In der Annahme, daß dieses Select im Programm mehrfach durchlaufen wird - nämlich für verschiedene Objekte und/oder Usernamen. Da gibt es mit Sicherheit noch Tuning-Potential.

Beitrag von Wolfgang G. Propfe (ForumUser / 23 / 0 / 0 ) »
Moin zusammen:
SELECT *
FROM cdhdr
INTO CORRESPONDING FIELDS OF TABLE it_cdhdr
WHERE objectclas = l_objectclas
AND objectid = l_objectid
AND username = l_userid
AND udate > l_datum_ab
AND udate <= l_datum_bis
AND utime > l_zeit_ab
AND utime <= l_zeit_bis
Just to confuse you even more, you could do one thing to address the issue Frank brought up. Only do:
SELECT *
FROM cdhdr
INTO CORRESPONDING FIELDS OF TABLE it_cdhdr
WHERE objectclas = l_objectclas
AND objectid = l_objectid
AND username = l_userid
AND udate > l_datum_ab
AND udate <= l_datum_bis.
Then loop at it_cdhdr where udate eq l_datum_ab +1 and check utime gt l_zeit_ab. Likewise loop at it_cdhdr where udate eq l_datum_bis and check utime le l_zeit_bis. Remove entries that fail the check. While you select a bit too much, you are sure to only check the first and last date for the time. Or you could issue up to three select statements (day 1, day 2 - n-1, day n) with time checks on the first and last day.

Have fun,
Wolfgang

Beitrag von andrea ( / / 0 / 3 ) »
Hallo,

ich hatte mal ein ähnliches Problem. Folgender Select müsste funktionieren:

Code: Alles auswählen.

SELECT * 
FROM cdhdr 
INTO CORRESPONDING FIELDS OF TABLE it_cdhdr 
WHERE objectclas = l_objectclas 
AND objectid = l_objectid 
AND username = l_userid 
AND (        udate =   l_datum_ab 
         AND utime >=  l_zeit_ab 
         OR  udate >   l_datum_ab 
         AND udate <   l_datum_bis
         OR  udate =   l_datum_bis
         AND utime <=  l_zeit_bis ).
Ich gehe natürlich davon aus, das der bis-Zeitpunkt wirklich größer ist als der von-Zeitpunkt.

Gruss Andrea

Vergleichbare Themen

1
Antw.
6200
Views
Parameter als Intervall
von Elcin » 04.03.2016 11:21 • Verfasst in ABAP® für Anfänger
0
Antw.
85344
Views
Intervall mit Beziehungswissen füllen
von wolli » 14.08.2025 07:36 • Verfasst in SAP - Allgemeines
1
Antw.
4016
Views
Nummern aus Intervall ausschliessen -> TA: SNUM
von bapimueller » 05.06.2019 11:01 • Verfasst in ABAP® Core
0
Antw.
2545
Views
open dataset
von joachim » 18.08.2008 11:05 • Verfasst in ABAP® Core
0
Antw.
1822
Views
OPEN SQL Buch
von swonny » 16.01.2007 10:02 • Verfasst in SAP - Allgemeines

Ü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

Aktuelle Forenbeiträge

ATC Finding in Smartforms
vor 2 Tagen von sap_enthusiast 2 / 257
LSMW-Problem
vor 3 Tagen von rob_abc 4 / 308

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.

Aktuelle Forenbeiträge

ATC Finding in Smartforms
vor 2 Tagen von sap_enthusiast 2 / 257
LSMW-Problem
vor 3 Tagen von rob_abc 4 / 308

Unbeantwortete Forenbeiträge

SFP/SEGW - Fehler beim Rendering
letzen Monat von Manfred K. 1 / 69550
Benutzerdefinierte Felder PSP
January 2026 von Rabea1103 1 / 122405