Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi freien Belegungszeitraum ermitteln (https://www.delphipraxis.net/12792-freien-belegungszeitraum-ermitteln.html)

Rolf Rostig 4. Dez 2003 09:56


freien Belegungszeitraum ermitteln
 
Hallo,

ich habe mehrere Räume die belegt werden können.
Die Belegungszeiten werden in eine Firebird DB eingetragen.

Tabellenfelder: ID, anfang, ende, raum.

Mit einer SQL-Abfrage möchte ich herausfinden, welcher Raum für einen bestimmten Zeitraum frei ist.
Mit dieser Abfrage funktioniert es:

SQL-Code:
select distinct raum
from T_DATEN

where not (ende > '12.01.2004' and anfang < '18.01.2004')
and
Raum = 5
aber nur solange der Raum einmal in der Tabelle eingetragen ist.
Bei mehrfacher Eintragung wird der Raum als frei ausgegeben, obwohl er für den Abfragezeitraum belegt ist.

Ich hoffe, ich habe mich einigermassen verständlich ausgedrückt und mir kann jemand auf die Sprünge helfen.

Gruss
Rolf

r_kerber 4. Dez 2003 11:36

Re: freien Belegungszeitraum ermitteln
 
Hallo Rolf,

versuche es doch mal mit einem Subselect. Das könnte in etwa so aussehen (ungetestet!):
SQL-Code:
select distinct raum
from T_DATEN
where not exists
  (select raum from T_DATEN
   where (ende > '12.01.2004' and anfang < '18.01.2004');

Rolf Rostig 4. Dez 2003 13:12

Re: freien Belegungszeitraum ermitteln
 
Hallo Rainer,

vielen Dank für die Antwort, aber es funktioniert nicht.

Gruss
Rolf

r_kerber 4. Dez 2003 13:22

Re: freien Belegungszeitraum ermitteln
 
Hallo Rolf,

dann erläutere doch bitte mal, was nicht funktioniert.

kiar 4. Dez 2003 13:47

Re: freien Belegungszeitraum ermitteln
 
hallo rolf, ich habe mal etwas ähnlich realisiert. es lief auf einem webserver. es wurden freie zeiten eingetragen und die belegtzeiten werden in einem grid eingetragen. gleichzeitig wurden diese denkzellen mit ir sensoren vernetzt, um die belegung auf dem grid anzuzeigen. so war es möglich einen raum im vierten stock zu betreten obwohl sich das eigene büro im erdgeschoß befand. leider war ich nur für die hardware zuständig auf die software hatte phillips die hand drauf, dürfte aber nicht so schwierig sein. jedenfalls ist das eine sehr effektive variante die räume zu überwachen . sollte nur mal so zur anregung dienen.

raik

Rolf Rostig 4. Dez 2003 15:39

Re: freien Belegungszeitraum ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Rainer,

das Ergebins der Abfrage ist null obwohl alle Räume ausser 3 und 5 frei sind.
Siehe Bild von Tabelle im Anhang.

Gruss
Rolf

kiar 4. Dez 2003 17:19

Re: freien Belegungszeitraum ermitteln
 
vielleicht so
SQL-Code:
select distinct raum from T_daten where not between '12.01.2004 ' and '18.01.2004'

Rolf Rostig 4. Dez 2003 18:45

Re: freien Belegungszeitraum ermitteln
 
@kiar

nee, nicht wirklich.
Die Daten stehen im Feld anfang und ende.

Gruss
Rolf

r_kerber 4. Dez 2003 18:54

Re: freien Belegungszeitraum ermitteln
 
Hallo Rolf,

Zitat:

Zitat von Rolf Rostig
vielen Dank für die Antwort, aber es funktioniert nicht.

Stimmt. Das Ganze ist doch etwas komplizierter. Ich finde aber erst am Wochenende Zeit mir das genauer anzuschauen.

kiar 4. Dez 2003 18:55

Re: freien Belegungszeitraum ermitteln
 
hallo rolf

dann ersetze das das datum durch anfang und ende

Rolf Rostig 4. Dez 2003 19:22

Re: freien Belegungszeitraum ermitteln
 
Hallo Rainer,

Zitat:

Das Ganze ist doch etwas komplizierter.
Die Befürchtung hatte ich auch schon. Würde mich freuen, wenn dir am Wochenende etwas einfällt.

Gruss
Rolf

Robert_G 4. Dez 2003 22:38

Re: freien Belegungszeitraum ermitteln
 
Ich glaube so könnte es gehen:

SQL-Code:
SELECT COUNT(t.raum) CountRes
FROM  T_Daten t
WHERE t.Raum = :RaumNo AND
       t.Raum NOT IN (SELECT x.Raum
                      FROM  T_Daten x
                      WHERE x.Anfang BETWEEN :StartTM AND :EndTm OR
                             x.Ende  BETWEEN :StartTM AND :EndTm)
Wenn Start- oder Endzeit zwischen den gegeben Werten stehen, gilt der Raum als belegt.

Hoffe ich habe dein Problem richtig verstanden.

Rolf Rostig 5. Dez 2003 09:11

Re: freien Belegungszeitraum ermitteln
 
Hallo GeorgeWNewbie,

ja, es funktioniert.
Ich habe die Abfrage etwas angepasst.


SQL-Code:
SELECT distinct t.raum
FROM  T_Daten t
WHERE t.raum = :raumNo AND
       t.raum NOT IN (SELECT x.raum
                      FROM  T_Daten x
                      WHERE x.Anfang BETWEEN :StartTM AND :EndTm OR
                             x.Ende  BETWEEN :StartTM AND :EndTm)

Vielen Dank
Rolf

r_kerber 7. Dez 2003 17:27

Re: freien Belegungszeitraum ermitteln
 
Hallo Rolf,

mir ist nicht ganz klar, was die Abfrage t.raum = :raumNo bezwecken soll. Alle freien Räume solltest Du so erhalten
SQL-Code:
select distinct raum
from Belegung
where Raum not in
  (select Raum from Belegung
   where ende between '12.01.2004' and '18.01.2004'
   or anfang between '12.01.2004' and '18.01.2004');

Rolf Rostig 8. Dez 2003 15:27

Re: freien Belegungszeitraum ermitteln
 
Hallo,

mein Problem ist leider noch nicht gelöst.
Wenn ein Raum vom '12.01.2004' bis '18.01.2004' als belegt eingetragen ist und ich frage nach
'14.01.2004' bis '16.01.2004'
wird auch der belegte Raum als frei zurück gegeben.
Nur wenn ich die gebuchten Zeiten abfrage, wird der Raum als nicht frei zurück gegeben.

Aber so kommt es zur Kollision.

r_kerber 8. Dez 2003 15:37

Re: freien Belegungszeitraum ermitteln
 
Stimmt. :?

Funky-Sepp 8. Dez 2003 15:41

Re: freien Belegungszeitraum ermitteln
 
Probiers mal so

SQL-Code:
select distinct raum
from Belegung
where Raum not in
  (select Raum from Belegung
   where '14.01.2004' between anfang and ende
   or '16.01.2004' between anfang and ende);
[edit]hatte jetzt doch glatt das falsche Datum[/edit]
hoffe es klappt

r_kerber 8. Dez 2003 15:41

Re: freien Belegungszeitraum ermitteln
 
Und was hältst Du davon?
SQL-Code:
select distinct raum
from Belegung
where Raum not in
  (select Raum from Belegung
   where '14.01.2004' between anfang and ende
   or '16.01.2004' between anfang and ende);

Rolf Rostig 8. Dez 2003 16:00

Re: freien Belegungszeitraum ermitteln
 
Hey, ich komm ja gar nicht hinterher :lol:

ich will nicht nerven, aber wenn ich abfrage:

'10.01.2004' bis '22.01.2004' wird der Raum als frei zurück gegeben. :wall:

Treffnix 8. Dez 2003 16:10

Re: freien Belegungszeitraum ermitteln
 
Hi, wie wärs denn mit
SQL-Code:
Where Start <= '16.01.2004' AND Ende >= '14.01.2004'
?

r_kerber 8. Dez 2003 16:11

Re: freien Belegungszeitraum ermitteln
 
Was Du so alles wissen willst. :lol: Probiere es doch mal mit einer Kombination aus beidem:
SQL-Code:
select distinct raum
from Belegung
where Raum not in
  (select Raum from Belegung
   where '10.01.2004' between anfang and ende
   or '22.01.2004' between anfang and ende
   or ende between '10.01.2004' and '22.01.2004'
   or anfang between '10.01.2004' and '22.01.2004');

Treffnix 8. Dez 2003 16:26

Re: freien Belegungszeitraum ermitteln
 
Also, da find ich meine Idee aber irgendwie... naja, kürzer :gruebel:

Marcel Gascoyne 8. Dez 2003 16:44

Re: freien Belegungszeitraum ermitteln
 
So funktionierts bei mir:

SQL-Code:
select raum
from  Belegung
where raum not in (
         select raum
         from  Belegung
         where ((:von between anfang and ende)
                or (:bis between anfang and ende)
                or (:von <= anfang and :bis >= anfang)
                or (:von <= anfang and :bis >= ende)))
Gruß,
Marcel

r_kerber 8. Dez 2003 17:15

Re: freien Belegungszeitraum ermitteln
 
Zitat:

Zitat von Treffnix
Also, da find ich meine Idee aber irgendwie... naja, kürzer :gruebel:

Liefert nur nicht das erwünschte Ergebnis!

Robert_G 8. Dez 2003 18:02

Re: freien Belegungszeitraum ermitteln
 
Das Problem an meiner vorherigen Lösung war, dass Einträge, die vor :StartTm begannen/ nach :EndTm endeten, nicht erfasst wurden.
Versuch's mal so:
SQL-Code:
SELECT DISTINCT t.Raum
FROM  T_Daten t
WHERE t.Raum NOT IN
       (SELECT x.Raum
        FROM  T_Daten x
        WHERE (x.Anfang BETWEEN :StartTm AND :EndTm OR
                x.Ende  BETWEEN :StartTM AND :EndTm) OR
                x.Anfang <= :StartTm AND x.Ende >= :StartTm)
Kam hier aber bestimmt schon in irgendeinem Posting vor.

@Treffnix
Mach's dir nicht zu einfach - es wird nicht funktionieren.
Was ist wenn das Enddatum kleiner als :EndTm aber größer als :StartTm ist?

Treffnix 8. Dez 2003 18:58

Re: freien Belegungszeitraum ermitteln
 
Zitat:

Zitat von GeorgeWNewbie
@Treffnix
Mach's dir nicht zu einfach - es wird nicht funktionieren.
Was ist wenn das Enddatum kleiner als :EndTm aber größer als :StartTm ist?

Du meinst zum Beispiel Ende ist der 15.01.2004?

Dann ist Ende grösser als 14.01.2004 und passt somit ins Where-Statement, oder steh ich jetzt aufm Schlauch?

Mal ein paar Beispiele, die eigentlich alle Fälle abdecken sollten:
Annahme: StartTm = 12.01.2004, EndTm = 16.01.2004
SQL-Code:
Where Start <=:EndTm And Ende >=:StartTm
Code:
Start   Ende
10.01. - 19.01.
Where 12.01.2004 <= 19.01.2004 And 16.01.2004 >= 10.01.2004  True
13.01. - 15.01.
Where 12.01.2004 <= 15.01.2004 And 16.01.2004 >= 12.01.2004  True
10.01. - 15.01.
Where 12.01.2004 <= 15.01.2004 And 16.01.2004 >= 10.01.2004  True
15.01. - 21.01.
Where 12.01.2004 <= 21.01.2004 And 16.01.2004 >= 15.01.2004  True
09.01. - 10.01.
Where 12.01.2004 <= 10.01.2004 And 16.01.2004 >= 09.01.2004  False ( links )
18.01. - 20.01.
Where 12.01.2004 <= 20.01.2004 And 16.01.2004 >= 18.01.2004  False ( rechts )
*edit* da fehlten noch doppelpunkte *edit*
*edit2* 2 Werte vertauscht *edit2*

Robert_G 8. Dez 2003 19:30

Re: freien Belegungszeitraum ermitteln
 
Sorry TreffNix, hab' mich verguckt... :pale:

Anscheinend hast du vollkommen recht.

Mann (:wall: :wall: :wall: :wall:), manchmal müsste ich akutes Post-Verbot kriegen.
:duck:
(Manchmal denkt man, die Lösung sei kompliziert - also macht man sie auch kompliziert...)
Wenn TreffNix' Lösung bei dir nicht funktioniert dann liegt das ganz einfach an impliziter Umwandlung von String zu Datum.
Füge nicht " '14.01.2003' " in deine Abfrage ein, sondern verwende Variablen, die du als Datum definierst.

Denn implizite Umwandlung bedeutet einen ziemlichen CPU-Overhead auf dem Server.

Rolf Rostig 10. Dez 2003 09:56

Re: freien Belegungszeitraum ermitteln
 
Hallo GeorgeWNewbie,

ich habe jetzt erst die Tests fahren können und es sieht sehr sehr gut aus.

Vielen Dank, auch für die Beiträge von den Anderen.

:hello:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz