Page 1 of 2

intervall in open sql

PostPosted: Thu Jan 02, 2003 5:47 pm
by Cecilia1751
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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   SELECT  *
  2.     FROM  cdhdr
  3.     INTO  CORRESPONDING FIELDS OF TABLE it_cdhdr
  4.     WHERE objectclas  =   l_objectclas
  5.       AND  objectid   =   l_objectid
  6.       AND  username   =   l_userid
  7.       AND  udate      >  l_datum_ab
  8.       AND  udate      <=  l_datum_bis
  9.       AND  utime      >  l_zeit_ab
  10.       AND  utime      <=  l_zeit_bis
  11.       .
  12.  
GeSHi ©



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

PostPosted: Thu Jan 02, 2003 5:57 pm
by Walter4536
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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  SELECT  *
  2.     FROM  cdhdr
  3.     INTO  CORRESPONDING FIELDS OF TABLE it_cdhdr
  4.     WHERE objectclas  =   l_objectclas
  5.       AND  objectid   =   l_objectid
  6.       AND  username   =   l_userid
  7.       AND  udate  between l_datum_ab AND l_datum_bis
  8.       AND  utime  between  l_zeit_ab AND  l_zeit_bis
  9.       .
  10.  
  11.  
GeSHi ©


Probier's mal aus. Müßte eigentlich funktionieren.

Grüße,
Steff

touch down!

PostPosted: Thu Jan 02, 2003 6:05 pm
by Cecilia1751
hi steff,

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

gruss gse

PostPosted: Thu Jan 02, 2003 6:13 pm
by Walter4536
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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. SELECT  *
  2.     FROM  cdhdr
  3.     INTO  CORRESPONDING FIELDS OF TABLE it_cdhdr
  4.     WHERE objectclas  =   l_objectclas
  5.       AND  objectid   =   l_objectid
  6.       AND  username   =   l_userid
  7.       AND  &#40; udate      >  l_datum_ab
  8.       AND  udate      <=  l_datum_bis &#41;
  9.       AND  &#40; utime      >  l_zeit_ab
  10.       AND  utime      <=  l_zeit_bis &#41;
  11.       .
  12.  
GeSHi ©


Ist aber nur eine Vermutung, ich habe es nicht ausprobiert :-)

Gruss,
Steff

PostPosted: Thu Jan 02, 2003 7:44 pm
by Willy1492
>, <, >=, <= 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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.    field BETWEEN from AND to
GeSHi ©

für from = to passende Einträge finden, nicht jedoch
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field > from AND field <= to
GeSHi ©

Die mit BETWEEN vergleichbare Logik wäre
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field >= from AND field <= to
GeSHi ©

bzw.
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field GE from AND field LE to.
GeSHi ©


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

PostPosted: Fri Jan 03, 2003 10:21 am
by Walter4536
Die mit BETWEEN vergleichbare Logik wäre
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field >= from AND field <= to
GeSHi ©

bzw.
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field GE from AND field LE to.
GeSHi ©



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

PostPosted: Fri Jan 03, 2003 12:16 pm
by Cecilia1751
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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  AND  udate  between l_datum_ab AND l_datum_bis
  2.      AND  utime  between  l_zeit_ab AND  l_zeit_bis
GeSHi ©

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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. ... AND &#40; udate       >   l_datum_ab
  2. AND    udate      <=  l_datum_bis &#41;....
GeSHi ©

in beiden Fällen werden keine Eintraege gefunden. (subrc = 4)

->Frank,
die Daten
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. l_datum_ab  bzw.  l_datum_bis
GeSHi ©

sollen mit dem jeweiligen zeitpunkt
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. l_zeit_ab / l_zeit_bis
GeSHi ©

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

PostPosted: Fri Jan 03, 2003 12:38 pm
by Willy1492
Steff hat geschrieben:
Die mit BETWEEN vergleichbare Logik wäre
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field >= from AND field <= to
GeSHi ©

bzw.
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   field GE from AND field LE to.
GeSHi ©



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.)

PostPosted: Fri Jan 03, 2003 12:49 pm
by Quinn1225
Der Ausdruck
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. dobj BETWEEN dobj1 AND dobj2
  2.  
GeSHi ©

ist equivalent zu
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. dobj >= dobj1 AND dobj <= dobj2
  2.  
GeSHi ©

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: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. c1 AND c2 AND c3 AND c4
  2.  
GeSHi ©

kann aufgrund des Assoziativgesetzes beliebig geklammert werden, ohne dass sich der Wert verändert. Also auch:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. &#40; &#40; c1 AND c2 &#41; AND &#40; c3 AND c4 &#41; &#41;
  2.  
GeSHi ©

timestamp

PostPosted: Fri Jan 03, 2003 12:57 pm
by Cecilia1751
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