![]() |
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 |
Re: StartDate,EndDate, Überlappung verhindern
Wenn ich nicht ganz schief liege, sollte das über einen Trigger zu machen sein.
|
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 |
Re: StartDate,EndDate, Überlappung verhindern
Zitat:
1. Exception:
SQL-Code:
2. Trigger:
CREATE EXCEPTION E_INVALIDDATERANGE '';
SQL-Code:
[EDIT]Die beiden Datumsfelder sollten dabei indexiert sein![/EDIT]
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 Cu, Frank |
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 |
Re: StartDate,EndDate, Überlappung verhindern
Zitat:
da es die Multitrigger (BEFORE INSERT OR UPDATE) nicht gibt. Cu, Frank |
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:
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.
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 Und wie gesagt, der gleichen Trigger noch mal für BEFORE UPDATE. Cu, Frank |
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 |
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 |
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 23:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz