AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi StartDate,EndDate, Überlappung verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

StartDate,EndDate, Überlappung verhindern

Ein Thema von hoika · begonnen am 10. Okt 2007 · letzter Beitrag vom 31. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#1

StartDate,EndDate, Überlappung verhindern

  Alt 10. Okt 2007, 11:02
Datenbank: FB • Version: 1.5 • Zugriff über: egal
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: StartDate,EndDate, Überlappung verhindern

  Alt 10. Okt 2007, 11:17
Wenn ich nicht ganz schief liege, sollte das über einen Trigger zu machen sein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: StartDate,EndDate, Überlappung verhindern

  Alt 10. Okt 2007, 11:23
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: StartDate,EndDate, Überlappung verhindern

  Alt 10. Okt 2007, 11:27
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:

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
Frank Reim
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: StartDate,EndDate, Überlappung verhindern

  Alt 10. Okt 2007, 11:35
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: StartDate,EndDate, Überlappung verhindern

  Alt 10. Okt 2007, 11:41
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: StartDate,EndDate, Überlappung verhindern

  Alt 11. Okt 2007, 12:28
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 'Tfrom 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
Frank Reim
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: StartDate,EndDate, Überlappung verhindern

  Alt 11. Okt 2007, 13:37
Hallo,

danke!

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


Heiko
Heiko
  Mit Zitat antworten Zitat
Trigger2003

Registriert seit: 14. Jun 2006
36 Beiträge
 
Delphi 12 Athens
 
#9

Re: StartDate,EndDate, Überlappung verhindern

  Alt 12. Okt 2007, 18:28
Hallo,

wenn ich heute nicht mal wieder einen Knick in der Logik habe , 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
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#10

Re: StartDate,EndDate, Überlappung verhindern

  Alt 31. Okt 2007, 10:44
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))
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 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