Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQl Abfrage, ob einzutragender Datensatz bereits besteht. (https://www.delphipraxis.net/12972-sql-abfrage-ob-einzutragender-datensatz-bereits-besteht.html)

LuckyStrike4life 8. Dez 2003 11:35


SQl Abfrage, ob einzutragender Datensatz bereits besteht.
 
Und schon das nächste Problem,

die Überschrift beschreibt es noch nicht so sonderlich perfekt.
Es geht wieder um das Programm der Dienstreisen.
Wenn nun ein bereits in die DB aufgenommener Datensatz, einen Dienst PKW für sich beansprucht, dann muss eine Meldung bei dem Anwender auftreten, der für den gleichen Tag den gleichen PKW haben möchte.

D.h. Person 1 will am 01.01.04 den VW Bus haben, er trägt sich ein.
Person 2 will am 01.01.04 ebenfalls den VW Bus haben, trägt sich aber später ein.

So muss Person 2 eine Meldung bekommen, wenn er seinen Datensatz eintragen lassen will, das der VW Bus für den Tag schon vergeben ist.

Das wird sich sicher nur über SQL realisieren lassen,
man müsste auf die Datenbank zugreifen, das Feld für Datum und für Dienst PKW selectieren lassen. Diese dann abgleichen mit dem Datum und dem Dienstwagen von dem Datensatz der eingetragen werden soll.

Leider bin ich in SQL n Anfänger, Hilfe würde mir helfen... .
Bitte eure Ideen.

Robert_G 8. Dez 2003 11:38

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Ist hier schon besprochen und gelöst worden.

LuckyStrike4life 8. Dez 2003 12:46

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Zitat:

Zitat von GeorgeWNewbie
Ist hier schon besprochen und gelöst worden.

Ja,
allerdings geht mir durch den genannten Thread nicht alles auf.

Ist es eigentlich wichtig SQL über einen Query einzuleiten? Sprich in der Form:
Delphi-Quellcode:
Querysort.Close;
Querysort.SQL.Clear;
Querysort.SQL.Add
Vermutlich ist man zwingend auf ein Query angewiesen, hmm.

Für was steht in diesem Code:
Delphi-Quellcode:
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');
'distinct'?
Für 'Belegung' müsste ich wieder den Pfad der DB angeben.´
'RAUM' wird sicher für die relevante Spalte stehen, die würde ich also auf die Dienst_PKW Spalte setzen.

Nun muss ich aber nach den Tagen schauen, ob ein bestimmtes Fahrzeug da schon gebucht wurde. Wenn ich auch noch nach Uhrzeit gehen würde - dann wärs perfekt. Allerdings sollte ich für den Anfang nicht zuviel planen.

Delphi-Quellcode:
select dienst_pkw from "t:eDienstreisebuch\mainDBalt.dbf"
where dienst_pkw not in
  (select dienst_pkw from "t:eDienstreisebuch\mainDBalt.dbf"
   where DATUM between 'TT.MM.JJJJ' [...]
So würde ich es jetzt ändern, das wird aber nicht funktionieren :(.
Könnte mir wer hier schon mal die Fehler nennen?

LuckyStrike4life 8. Dez 2003 13:44

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Hm..
würde mich eigentlich ein ziemlich einfacher Code schon weiterbringen?
Ich hätte da z.B. an diesen gedacht:
Delphi-Quellcode:
SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" WHERE DATUM 'gleiches Datum wie neuer Datensatz'
Und wenn dann ein Datensatz gefunden wird, muss die Fehlermeldung ausgegeben werden.

Robert_G 8. Dez 2003 14:09

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Erstens: "DISITNCT" sorgt dafür, dass keine doppelten Einträge ausgegeben werden.
Im folgenden Code kriegst du alle Dienstwagen, die im angegeben Zeitraum nicht belegt sind.
SQL-Code:
SELECT DISTINCT t.Dienst_PKW
FROM  T_Daten t
WHERE t.Raum NOT IN
       (SELECT x.Dienst_PKW
        FROM  T_Daten x
        WHERE x.Anfang BETWEEN :StartTm AND :EndTm OR
               x.Ende  BETWEEN :StartTm AND :EndTm)
Für StartTm & EndTm musst du Parameter in deiner Query anlegen.
Wie das umsetzen kannst steht dort: Hier im Forum suchendatumpicker AND in AND sql AND abfrage AND einbauen

Einfacher geht's nur wenn du nur ein Datum pro Wagen hast.
SQL-Code:
SELECT DISTINCT t.Dienst_PKW
FROM  T_Daten t
WHERE t.DATUM NOT BETWEEN :StartTm AND :EndTm
(Dürfte Probleme geben, wenn ein Wagen 2 Tage weg ist, aber nur das Startdatum angegeben ist)

Robert_G 8. Dez 2003 14:09

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Doppelposting :wall:

LuckyStrike4life 8. Dez 2003 14:18

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Zitat:

Zitat von GeorgeWNewbie
Erstens: "DISITNCT" sorgt dafür, dass keine doppelten Einträge ausgegeben werden.
Im folgenden Code kriegst du alle Dienstwagen, die im angegeben Zeitraum nicht belegt sind.
SQL-Code:
SELECT DISTINCT t.Dienst_PKW
FROM  T_Daten t
WHERE t.Raum NOT IN
       (SELECT x.Dienst_PKW
        FROM  T_Daten x
        WHERE x.Anfang BETWEEN :StartTm AND :EndTm OR
               x.Ende  BETWEEN :StartTm AND :EndTm)
Für StartTm & EndTm musst du Parameter in deiner Query anlegen.
Wie das umsetzen kannst steht dort: Hier im Forum suchendatumpicker AND in AND sql AND abfrage AND einbauen

Einfacher geht's nur wenn du nur ein Datum pro Wagen hast.
SQL-Code:
SELECT DISTINCT t.Dienst_PKW
FROM  T_Daten t
WHERE t.DATUM NOT BETWEEN :StartTm AND :EndTm
(Dürfte Probleme geben, wenn ein Wagen 2 Tage weg ist, aber nur das Startdatum angegeben ist)

Danke!
Das werd ich auch gleich noch mal checken, hab eben ne recht einfache Version umgesetzt:
Delphi-Quellcode:
Query2.Close;
Query2.SQL.Clear;
Query2.SQL.ADD ('SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" WHERE dienst_pkw="Ford DM-162"');
Query2.Active:=True;
So wird dann in nem Grid der Datensatz ausgegeben. Allerdings greift er noch nicht aufs Datum zu. Mal schaun wie weit ich mit deinem Code komme.

r_kerber 8. Dez 2003 15:22

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Hallo LuckyStrike4life

ich muß gestehen, ich bekomme immer eine Gänsehaut, wenn ich folgendes sehe:
Zitat:

Zitat von LuckyStrike4life
SELECT * FROM "t:eDienstreisebuch\mainDBalt.dbf" WHERE dienst_pkw="Ford DM-162"

Du solltest Dir wirklich überlegen, ob Du nicht doch besser Alias-Namen für die Datenbank verwendest und Dir somit die Angabe des kompletten Pfad-Namens im SELECT-Statement ersparst. Dann hast Du es z.B. wesentlich einfacher, wenn Du mal die DB wechseln mußt. Außerdem ist der WHERE-Klausel falsch. Zeichenketten werden duch ' umschlossen!
Um Dir besser helfen zu können, wäre es hilfreich die Struktur der Tabellen zu kennen.
Zu Deinen weiteren Fragen: Belegung ist der Name der Tabelle. Diese habe ich schnell mal mit Interbase erstellt. Raum, Anfang und Ende sind die drei Spalten dieser Tabelle.
Zitat:

Zitat von LuckyStrike4life
Ist es eigentlich wichtig SQL über einen Query einzuleiten?...
Delphi-Quellcode:
Querysort.Close;
Querysort.SQL.Clear;
Querysort.SQL.Add

Jep, Genaus werden aus einem Delphi-Programm heraus Queryies an die DB geschickt. Es fehlet aber noch entweder Querysort.Open oder Querysort.ExecSQL!

LuckyStrike4life 8. Dez 2003 16:23

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Zitat:

Zitat von r_kerber
Du solltest Dir wirklich überlegen, ob Du nicht doch besser Alias-Namen für die Datenbank verwendest und Dir somit die Angabe des kompletten Pfad-Namens im SELECT-Statement ersparst.

Ja, da hast du recht,
ich würde es ja auch machen - wenn ich denn einen Weg wüsste, mit dem es funktionieren würde.
Leider reichen die internen Bezeichnungen der DBs nicht aus.
Kann ich irgendwo den Pfad der DBs einstellen, und auch leicht editieren?


Zitat:

Zitat von r_kerber
Um Dir besser helfen zu können, wäre es hilfreich die Struktur der Tabellen zu kennen.

Okay, es ist eine DBase Datenbank. Die relevanten Spalten sind 'Datum' und 'dienst_plw', wenn man noch auf die Uhrzeit (von wann bis wann werden die Wagen gebraucht) eingehen möchte, dann sind auch noch die Spalten "Beginn" und "Ende" wichtig. Ihren Inhalt beschreibt der Name. Ich hoffe das ist es, was du wissen wolltest.

Zitat:

Zitat von r_kerber
[...]Es fehlet aber noch entweder Querysort.Open oder Querysort.ExecSQL!

Also in der Forum:
Delphi-Quellcode:
     Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL.add [...];
     Query1.ExecSQL;

r_kerber 8. Dez 2003 17:19

Re: SQl Abfrage, ob einzutragender Datensatz bereits besteht
 
Zitat:

Zitat von LuckyStrike4life
Kann ich irgendwo den Pfad der DBs einstellen, und auch leicht editieren?

Ja in der BDE-Administration
Zitat:

Zitat von LuckyStrike4life
Okay, es ist eine DBase Datenbank. Die relevanten Spalten sind 'Datum' und 'dienst_plw', wenn man noch auf die Uhrzeit (von wann bis wann werden die Wagen gebraucht) eingehen möchte, dann sind auch noch die Spalten "Beginn" und "Ende" wichtig. Ihren Inhalt beschreibt der Name. Ich hoffe das ist es, was du wissen wolltest.

Da war der Verwis auf den andern Thread doch gar nicht so verkehrt!
Zitat:

Zitat von LuckyStrike4life
Zitat:

Zitat von r_kerber
[...]Es fehlet aber noch entweder Querysort.Open oder Querysort.ExecSQL!

Also in der Forum:
Delphi-Quellcode:
     Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL.add [...];
     Query1.ExecSQL;

Nö. Da Du eine Ergebnis (auch Antwortmenge genannt) gelifert bekommen willst in Form von Datensätzen, mußt Du hier Query1.Open verwenden. Das steht aber auch in der OH!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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