Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StartDate,EndDate, Überlappung verhindern (https://www.delphipraxis.net/101235-startdate-enddate-ueberlappung-verhindern.html)

hoika 10. Okt 2007 10:02

Datenbank: FB • Version: 1.5 • Zugriff über: egal

StartDate,EndDate, Überlappung verhindern
 
Hallo #,

gegeben ist folgende Tabelle

Id Integer
StartDate Date
EndDate Date

Wie kann ich verhindern, dass überlappende Einträge erzeugt werden.

Überlappen wäre z.B.

DB-Eintrag |---|
neuer Eintrag |----|

Am liebsten wäre mir ja ein unique Index,
aber so richtig hab ich da keinen Plan.

Check Constraint ? Habe ich noch nie benutzt ...
SP, die es prüft, was ist bei "quasi gleichzeitgen" Zugriff.

Danke im voraus


Heiko

DeddyH 10. Okt 2007 10:17

Re: StartDate,EndDate, Überlappung verhindern
 
Wenn ich nicht ganz schief liege, sollte das über einen Trigger zu machen sein.

hoika 10. Okt 2007 10:23

Re: StartDate,EndDate, Überlappung verhindern
 
Hallo,

hm, und wie würde der aussehen ?
Sorry, aber ich ärgere mih damit schon seit langem rum,
immer wieder kommen Fehler, also dass wieder eine Überlappung auftritt. ;(



Heiko

dataspider 10. Okt 2007 10:27

Re: StartDate,EndDate, Überlappung verhindern
 
Zitat:

Zitat von hoika
Hallo,

hm, und wie würde der aussehen ?
Sorry, aber ich ärgere mih damit schon seit langem rum,
immer wieder kommen Fehler, also dass wieder eine Überlappung auftritt. ;(



Heiko

Nehmen wir an, die Tabelle heisst Buchung:

1. Exception:

SQL-Code:
CREATE EXCEPTION E_INVALIDDATERANGE '';
2. Trigger:

SQL-Code:
CREATE TRIGGER BUCHUNG_BIU0 FOR BUCHUNG
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
as
declare variable ueberlappung char(1);
begin
  /*
    Datumsbereich prüfen
  */
  select
    case
      when
        exists(select * from buchung
               where (new.startdate between startdate and enddate) or
                     (new.enddate between startdate and enddate)) then
        'T'
      else
        'F'
    end
    from rdb$database into :ueberlappung;
  if (:ueberlappung = 'T') then
    exception e_invaliddaterange 'Überlappender Datumsbereich';

end
[EDIT]Die beiden Datumsfelder sollten dabei indexiert sein![/EDIT]

Cu, Frank

hoika 10. Okt 2007 10:35

Re: StartDate,EndDate, Überlappung verhindern
 
Hallo,

bo eh ;)

das klappt ja wirklich.

Noch ne Frage zum Between.
War das auch schon in IB6 drin ?

Ich hab hier dummerweise noch ein paar Kunden damit .. ;(

Und fnde gerade die Beta-Dok hier nicht.


Heiko

dataspider 10. Okt 2007 10:41

Re: StartDate,EndDate, Überlappung verhindern
 
Zitat:

Zitat von hoika
Hallo,

bo eh ;)

das klappt ja wirklich.

Noch ne Frage zum Between.
War das auch schon in IB6 drin ?

Ich hab hier dummerweise noch ein paar Kunden damit .. ;(

Und fnde gerade die Beta-Dok hier nicht.


Heiko

between ist IMHO kein Problem. Ich denke aber, dass man bei IB6 2 Trigger anlegen muss,
da es die Multitrigger (BEFORE INSERT OR UPDATE) nicht gibt.

Cu, Frank

dataspider 11. Okt 2007 11:28

Re: StartDate,EndDate, Überlappung verhindern
 
Hallo Heiko,

ich habe doch noch was vergessen. IB6 kennt ja ach noch kein CASE - Construct!

Wenn es auch in IB6 funktionieren muss, könnte der Trigger so aussehen:

SQL-Code:
CREATE TRIGGER BUCHUNG_BIU0 FOR BUCHUNG
ACTIVE BEFORE INSERT POSITION 1
as
declare variable range_exists char(1);
begin
  /*
    Datumsbereich prüfen bei Insert
  */
  range_exists = 'F';
  select 'T' from rdb$database where
             exists(select * from buchung where
                   (new.startdate between startdate and enddate) or
                   (new.enddate between startdate and enddate))
             into :range_exists;
  if (:range_exists = 'T') then
    exception e_invaliddaterange 'Überlappender Datumsbereich';
end
Man kann hier auch ein Select count(*) nehmen, da ja eigentlich höchstens ein Datensatz mit der Bedingung existieren kann und damit der Geschwindigkeitsvorteil von exists wegfällt.

Und wie gesagt, der gleichen Trigger noch mal für BEFORE UPDATE.

Cu, Frank

hoika 11. Okt 2007 12:37

Re: StartDate,EndDate, Überlappung verhindern
 
Hallo,

danke!

das mit dem case hatte ich schon geändert,
das insert or update hatte ich vergessen (das ib6 das nicht kennt).


Heiko

Trigger2003 12. Okt 2007 17:28

Re: StartDate,EndDate, Überlappung verhindern
 
Hallo,

wenn ich heute nicht mal wieder einen Knick in der Logik habe :wink: , habt ihr beiden was vergessen: vollständige Überdeckung.

also (new.startdate < startdate) UND (new.enddate > enddate)

Ist IMHO auch eine Art von Überlappung....

just my 2 cents

Salomon 31. Okt 2007 09:44

Re: StartDate,EndDate, Überlappung verhindern
 
Moin,
ich habe genau zu diesem Thema noch eine Frage. Ich erfasse in meinem Programm Zeiten, wobei sich die Zeiträume nicht überschneiden dürfen. In der DB habe ein Von und ein Bis Feld vom typ DateTime.
Bislang habe ich mit SQL Betwenn geprüft, ob die neue Startzeit oder die neue Endzeit in einem existieren Zeitraum fallen.

Nun sollen die Zeiten aber wie folgt erfasst werden:

08:00 - 09:00
09:00 - 10:00
10:00 - ...

Dies ist mit der Methode nicht möglich...

Wie kann ich mit SQL den Zeitraum so prüfen, das er diesen Anforderungen entspricht?

Ich habe es so probiert, allerdings ohne Erfolg:
SQL-Code:
SELECT COUNT(*) as DataExists FROM TB_AM_Hours
  WHERE (('29.10.2007 14:00:00' >= FromHour) and ('29.10.2007 14:00:00' <= ToHour))
     or (('29.10.2007 15:00:00' >= FromHour) and ('29.10.2007 15:00:00' <= ToHour))


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.
Seite 1 von 2  1 2      

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