intervall in open sql

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

intervall in open sql

Postby Cecilia1751 » Thu Jan 02, 2003 5:47 pm

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
Cecilia1751
...
...
 
Posts: 110
Joined: Wed Dec 18, 2002 11:04 am

Postby Walter4536 » Thu Jan 02, 2003 5:57 pm

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
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

touch down!

Postby Cecilia1751 » Thu Jan 02, 2003 6:05 pm

hi steff,

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

gruss gse
Cecilia1751
...
...
 
Posts: 110
Joined: Wed Dec 18, 2002 11:04 am

Postby Walter4536 » Thu Jan 02, 2003 6:13 pm

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
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Postby Willy1492 » Thu Jan 02, 2003 7:44 pm

>, <, >=, <= 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
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Postby Walter4536 » Fri Jan 03, 2003 10:21 am

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
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Datum + Zeitpunkt als Intervallgrenzen

Postby Cecilia1751 » Fri Jan 03, 2003 12:16 pm

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
Cecilia1751
...
...
 
Posts: 110
Joined: Wed Dec 18, 2002 11:04 am

Postby Willy1492 » Fri Jan 03, 2003 12:38 pm

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.)
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Postby Quinn1225 » Fri Jan 03, 2003 12:49 pm

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 ©
Quinn1225
..
..
 
Posts: 30
Joined: Thu Jan 02, 2003 4:16 pm

timestamp

Postby Cecilia1751 » Fri Jan 03, 2003 12:57 pm

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
Cecilia1751
...
...
 
Posts: 110
Joined: Wed Dec 18, 2002 11:04 am

Next

Return to ABAP® Core

Who is online

Users browsing this forum: No registered users and 2 guests

cron