Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Suchergebnis nachträglich noch mal einschränken (https://www.delphipraxis.net/201832-sql-suchergebnis-nachtraeglich-noch-mal-einschraenken.html)

norwegen60 1. Sep 2019 11:08

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

mkinzler 1. Sep 2019 11:18

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;

norwegen60 1. Sep 2019 12:30

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:
select d.Nr, v.version, FileExist = 1
from Table1 d
left outer join Table2 v on v.id = d.Table2ID
in einem zweiten Schritt das Feld FileExist entsprechend meiner Suche
Delphi-Quellcode:
while not dbquSQL.Eof do
begin
  if not FileExist then
  begin
    dbquSQL.Open;
    dbquSQL.FieldByName('FileExist').Value = 0:
    dbquSQL.post;
  end;
  dbquSQL.next;
end;
anpasse bekomme ich die Fehlermeldung "Feld 'FileExist' kann nicht verändert werden"
Wie kann ich ein Feld in einer Suchmenge ändern um dann den Filter zu setzen?

Grüße
Gerd

haentschman 1. Sep 2019 13:38

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;

Schokohase 1. Sep 2019 14:14

AW: SQL-Suchergebnis nachträglich noch mal einschränken
 
Es gibt berechnete Felder, die dann in dem Event
Delphi-Quellcode:
TDataSet.OnCalcFields
berechnet werden.

Darüberhinaus kann man zum Filtern den Event
Delphi-Quellcode:
TDataSet.OnFilterRecord
verwenden.
Einfach die Eigenschaft
Delphi-Quellcode:
TDataSet.Filtered
auf
Delphi-Quellcode:
true
setzen und gut ist.

Ein Nachträgliches Bearbeiten der Datenmenge ist hier eher kontraproduktiv.

norwegen60 1. Sep 2019 16:03

AW: SQL-Suchergebnis nachträglich noch mal einschränken
 
Zitat:

Zitat von haentschman (Beitrag 1444240)
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;

Natürlich Edit und nicht Open. War ein Schreibfehler
Ging aber erst nachdem Options.SetFieldsReadOnly entsprechend gesetzt war

Delphi-Quellcode:
  // 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;
Grüße
Gerd

TigerLilly 2. Sep 2019 07:15

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

https://www.tech-recipes.com/rx/3052...n-a-directory/

Das nachträglich, also lokal, zu machen, kommt mir unstimmig vor. Besser der Server macht das.

MyRealName 2. Sep 2019 07:36

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.

HolgerX 2. Sep 2019 09:10

AW: SQL-Suchergebnis nachträglich noch mal einschränken
 
Hmm..

Zitat:

Zitat von TigerLilly (Beitrag 1444320)
Unter MS-SQL kannst du auf die Existenz von Dateien prüfen:
dbo.xp_fileexist @path, @result

https://www.tech-recipes.com/rx/3052...n-a-directory/

Das nachträglich, also lokal, zu machen, kommt mir unstimmig vor. Besser der Server macht das.

Dies ist aber nur möglich, wenn der "SQL-Server" Zugriff auf das Verzeichnis hat und er muss dann den Pfad zur Datei nicht aus Anwendungssicht, sondern aus SQL-Server-Sicht im Query angeben.

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:
procedure TForm1.dbquSQLCalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('FileExists').AsString :=
    BoolToStr(FileExists(FFilePath + DataSet.FieldByName('FileName').AsString), True);
end;
Dann auf dem Query z.B. den Filter "FileExists <> 'True'" setzen.

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..;) ).

TigerLilly 2. Sep 2019 10:05

AW: SQL-Suchergebnis nachträglich noch mal einschränken
 
Zitat:

Zitat von HolgerX (Beitrag 1444332)
Dies ist aber nur möglich, wenn der "SQL-Server" Zugriff auf das Verzeichnis hat und er muss dann den Pfad zur Datei nicht aus Anwendungssicht, sondern aus SQL-Server-Sicht im Query angeben.

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.

Naja. Sowas nennt man Client/Server. Ich kenn die Anforderung des TE nicht, aber Serverdaten mit lokalen Verzeichnissen abzugleichen ist ungewöhnlich. Dehalb mein Hinweis. Aber sonst hast du recht, ja.

p80286 3. Sep 2019 09:07

AW: SQL-Suchergebnis nachträglich noch mal einschränken
 
Zitat:

Zitat von TigerLilly (Beitrag 1444341)

Naja. Sowas nennt man Client/Server. Ich kenn die Anforderung des TE nicht, aber Serverdaten mit lokalen Verzeichnissen abzugleichen ist ungewöhnlich.

Nicht unbedingt, ich hatte mal eine ähnliche Aufgabenstellung. Aber da ich grundsätzlich nichts von datensensitiven Controls halte, konnte ich mit einer Dateinamenliste und einer Listview bzw. einem Stringgrid frei operieren.

Gruß
K-H


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