AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL-Suchergebnis nachträglich noch mal einschränken
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Suchergebnis nachträglich noch mal einschränken

Ein Thema von norwegen60 · begonnen am 1. Sep 2019 · letzter Beitrag vom 3. Sep 2019
Antwort Antwort
Seite 1 von 2  1 2      
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

SQL-Suchergebnis nachträglich noch mal einschränken

  Alt 1. Sep 2019, 12:08
Datenbank: MsSQL • Version: 2008 • Zugriff über: TUniDac
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 1. Sep 2019, 12:18
Man kann die Ergebnismenge natürlich auch noch lokal Filtern.
Delphi-Quellcode:
<DataSet>.Filter := ...
<DataSet>.Filtered := True;
Markus Kinzler
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 1. Sep 2019, 13:30
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 1. Sep 2019, 14:38
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;
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

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

  Alt 1. Sep 2019, 15:14
Es gibt berechnete Felder, die dann in dem Event TDataSet.OnCalcFields berechnet werden.

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

Ein Nachträgliches Bearbeiten der Datenmenge ist hier eher kontraproduktiv.
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 1. Sep 2019, 17:03
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
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 2. Sep 2019, 08:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName
Online

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 2. Sep 2019, 08:36
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.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#9

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

  Alt 2. Sep 2019, 10:10
Hmm..

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.. ).
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)

Geändert von HolgerX ( 2. Sep 2019 um 10:19 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.205 Beiträge
 
Delphi 11 Alexandria
 
#10

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

  Alt 2. Sep 2019, 11:05
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.
  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 08:28 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