![]() |
Datenbank: MsSQL • Version: 2008 • Zugriff über: TUniDac
SQL-Suchergebnis nachträglich noch mal einschränken
Hallo zusammen,
ich zeige das Ergebnis ein SQL-Abfrage direkt in einem DbGrid an. Die SQL-Liste entält z.B. eine Liste von bestimmten Dokumenten. Jetzt möchte ich zusätzlich per (erweitertem) FileExists abfragen, ob die Datei auch physisch existiert. Selbst wenn es in SQL einen Befehl gäbe der die Suche nach Dateien zuließe, ginge das nicht, da schon die Festlegung des Verzeichnis in Delphi programmiert ist. Hat jemand eine Idee, wie per zweitem Schritt durch die Ergebnismenge gegangen werden kann und dort ein Flag gesetzt wird, das noch mal einzelne Sätze ausblendet, so dass die Darstellung weiter per DbGrid erfolgen kann. Oder bleibt mir nichts anderes übrig, als auf Grid zu wechseln und das Einfügen selber zu übernehemen? Grüße Gerd |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Man kann die Ergebnismenge natürlich auch noch lokal Filtern.
Delphi-Quellcode:
<DataSet>.Filter := ...
<DataSet>.Filtered := True; |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Erst dachte ich "Klar, ganz einfach" aber es hakt an der Umsetzung
Wenn ich bei folgendem SQL
Code:
in einem zweiten Schritt das Feld FileExist entsprechend meiner Suche
select d.Nr, v.version, FileExist = 1
from Table1 d left outer join Table2 v on v.id = d.Table2ID
Delphi-Quellcode:
anpasse bekomme ich die Fehlermeldung "Feld 'FileExist' kann nicht verändert werden"
while not dbquSQL.Eof do
begin if not FileExist then begin dbquSQL.Open; dbquSQL.FieldByName('FileExist').Value = 0: dbquSQL.post; end; dbquSQL.next; end; Wie kann ich ein Feld in einer Suchmenge ändern um dann den Filter zu setzen? Grüße Gerd |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Moin...
Delphi-Quellcode:
while not dbquSQL.Eof do
begin if not TFile.Exists(dbquSQL.FieldByName('Feld mit dem Dateinamen').AsString) then begin dbquSQL.Edit; dbquSQL.FieldByName('FileExist').AsInteger = 0: dbquSQL.Post; end; dbquSQL.Next; end; |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Es gibt berechnete Felder, die dann in dem Event
![]()
Delphi-Quellcode:
berechnet werden.
TDataSet.OnCalcFields
Darüberhinaus kann man zum Filtern den Event ![]()
Delphi-Quellcode:
verwenden.
TDataSet.OnFilterRecord
Einfach die Eigenschaft ![]()
Delphi-Quellcode:
auf
TDataSet.Filtered
Delphi-Quellcode:
setzen und gut ist.
true
Ein Nachträgliches Bearbeiten der Datenmenge ist hier eher kontraproduktiv. |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Zitat:
Ging aber erst nachdem Options.SetFieldsReadOnly entsprechend gesetzt war
Delphi-Quellcode:
Grüße
// Damit VersionExists nachträglich geändert werden kann. Muss vor der ersten Ausführung des SQL stehen
dbquSQL.Options.SetFieldsReadOnly := false; // SQL-Statement ausführen dbquSQL.Open; // Prüfen, ob schon eine versionierte Datei vorliegt while not dbquSQL.Eof do begin sNr := dbquSQL.FieldByName('DokNr').AsString; if (GetVersionedFiles(sNr)) then begin dbquSQL.Edit; dbquSQL.FieldByName('VersionExists').Value := 0; dbquSQL.Post; end; dbquSQL.next; end; Gerd |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Unter MS-SQL kannst du auf die Existenz von Dateien prüfen:
dbo.xp_fileexist @path, @result ![]() Das nachträglich, also lokal, zu machen, kommt mir unstimmig vor. Besser der Server macht das. |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Es gibt ein OnFilterRecord Event bei Datensätze, wenn du Filtered auf True setzt, kannst Du dort prüfen, ob die Datei existiert und wenn nicht, Accept auf False setzen, dann wird dieses Ergebis nicht angezeigt.
|
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Hmm..
Zitat:
Somit wird dies wohl nur funktionieren, wenn die Dateien eventuell auch direkt auf dem gleichen Server liegen, wie der SQL-Server selber, denn dieser läuft meistens als LocalSystem, ohne Zugriff auf (Domain-) Netzwerklaufwerke. Hier würde wohl, wie von Schokohase erwähnt, besser mit einem CalcField und der Prüfung im OnCalcFields zurückgegriffen werden, da dieses dann aus Sicht und mit dessen Zugriffsrechten der Applikation erfolgt. Die Lösung mit Edit/Post ist zu vermeiden, da hier direkt eventuell Einträge auf der Datenbank geändert würden, da hierzu ein DB-Feld benötigt wird. Einfach im OnCalcField:
Delphi-Quellcode:
Dann auf dem Query z.B. den Filter "FileExists <> 'True'" setzen.
procedure TForm1.dbquSQLCalcFields(DataSet: TDataSet);
begin DataSet.FieldByName('FileExists').AsString := BoolToStr(FileExists(FFilePath + DataSet.FieldByName('FileName').AsString), True); end; Edit:Anstelle eines StringFeldes solltest Du dann aber eher ein Boolean oder nummeric Feld für 'FileExists' nehmen (Oben ist es nur als Beispiel angegeben..;) ). |
AW: SQL-Suchergebnis nachträglich noch mal einschränken
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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