[Gelöst] DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Rund um die LCL und andere Komponenten
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

[Gelöst] DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von Ich934 »

Hallo,

ich habe hier ein kleines Problem, bei dem sicher einer eine Lösung hat. ;-)

Ich ermittle Daten per SQL aus einer Datenbank und gebe diese in einem DBGrid aus. Die Daten aus dem Grid werden dann entsprechend weiter verarbeitet und u.A. als CSV-gespeichert etc. Das funktioniert an sich auch ohne Probleme.

Einige der Werte sind jedoch in Abhängigkeit von anderen Zellenwerten und benötigen entsprechende Logik, die nicht per SQL erledigt werden kann. So müssen in Abhängigkeit von Artikelnummern die Existenz von Dateien geprüft werden und dann URLs erzeugt werden.

Meine Lösung:
Ich habe diese Prüfung in das OnDatenDrawColumnCell ausgelagert. Grundsätzlich funktioniert das und die Werte werden entsprechend aufbereitet und dann angezeigt.
Problem: Diese Aktion erfolgt nicht beim Abholen der Daten sondern erst beim anzeigen und somit verspätet. Das kann dazu führen, dass u.U. diese Aktion gar nicht durchgeführt wird oder aber bei der Ausgabe für unnötige Verzögerungen sorgt, was ja beim ersten Aufruf schon abgefangen werden soll.

Frage:
Hat hier jemand eine Idee für mich, wie ich direkt nach dem Open auf den SQLQuery diese Aktionen durchführen kann und dann sofort ein fertig und vollständig gefülltest DBGrid habe?

Vielen Dank.
Zuletzt geändert von Ich934 am Do 8. Jul 2021, 18:49, insgesamt 1-mal geändert.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von af0815 »

Ich934 hat geschrieben:
Mi 7. Jul 2021, 10:37
Einige der Werte sind jedoch in Abhängigkeit von anderen Zellenwerten und benötigen entsprechende Logik, die nicht per SQL erledigt werden kann. So müssen in Abhängigkeit von Artikelnummern die Existenz von Dateien geprüft werden und dann URLs erzeugt werden.
Dann geht es nur im Grid. Du hast vorher keinen Zugriff auf andere Werte.

Alternativ geht es dann, wenn du in der Query die Datenfelder persistent machst und zusätzliche Felder hinzufügst, damit kannst du alles, was du in einer Row (DB-Zeile) zugreifen kannst verwenden und zusätzlich noch auf andersweitig definierte Variablen/Strukturen/Arrays. Nur da kann es gleich auch mal langsam werden, wenn die 'Lookup' Funktionen entsprechend Zeit brauchen. IM DB Grid kannst du die zusätzlichen Felder ganz einfach anzeigen lassen. Wenn du auch zurückschreiben willst, wird es komplizierter. Weil die zusätzlichen Felder mal grundlegend RO sind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von Ich934 »

Zurückschreiben ist kein Problem. Das ist nicht notwendig da diese Daten anderweitig verarbeitet werden müssen bzw. bei Dritten eingereicht werden. Das ist kein Problem. Auch wenn die Aufbereitung dauert ist das (in einem gewissen Rahmen) egal.

Wenn ich jetzt direkt in das Grid schreiben möchte, erhalte ich aber eine EDatabase Exception weil das DataSet ReadOnly ist. Das ist an sich klar, weil der komplexe SELECT keine Aktualisierung zulässt. Das ist mir aber hier ja auch egal. Wie kann ich das hier umgehen? (Eine Option ReadOnly ist nirgends aktiv von mir gesetzt.
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von fliegermichl »

Ich kann mich dunkel an Delphizeiten erinnern. Da gab es sowas wie calculated Fields.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von af0815 »

fliegermichl hat geschrieben:
Mi 7. Jul 2021, 14:45
Ich kann mich dunkel an Delphizeiten erinnern. Da gab es sowas wie calculated Fields.
Das sind genaugenommen die Felder die du hinzufügst ohne Bezug zur DB.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von Ich934 »

af0815 hat geschrieben:
Mi 7. Jul 2021, 21:19
Das sind genaugenommen die Felder die du hinzufügst ohne Bezug zur DB.
Naja das könnte ich ja verwenden - zumindest für einen Teil der Felder. Aber auch hier erhalte ich den Fehler mit dem ReadOnly beim DataSet.

Verwendet habe ich das Beispiel das ich hier gefunden habe...

Code: Alles auswählen

      MyField := TField.Create(Self);
      MyField.FieldName := 'Test';
      MyField.FieldKind := fkCalculated;
      MyField.ReadOnly := True;
      SQLQuery.Fields.Add(MyField);
Mein Hauptproblem ist also eher das ReadOnly. Kann ich dieses Problem lösen, so kann ich ja die Felder direkt überschreiben. Oder seh ich das falsch?

Korrektur: der Readonly wurde durch ein noch verbliebenes Überschreiben von Feldern verursacht. Jetzt das einmal test.
Tipp für PostgreSQL: www.pg-forum.de

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von Ich934 »

Mit der Lösung von hier habe ich die Felder einfügen können. Das funktioniert auch prima.

Beim setzen eines Wertes auf diese zusätzlichen Felder erhalte ich jedoch weiterhin eine EDatabaseError-Exception, dass der SQLQery not im edit oder insert state ist. Das sollte doch eigentlich bei diesen calculated Fields nicht der Fall sein oder?
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von af0815 »

Wenn du ein kurzes (kompilierbares) Beispiel machst, an dem man das Verhalten sieht, dann tut man sich leichter.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von Ich934 »

Hier mal ein Quick'n'Dirty Schweineprogramm...
Dateianhänge
GridTestprojekt.zip
(1012.56 KiB) 52-mal heruntergeladen
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von fliegermichl »

TDataSet definiert einen Event "OnCalcFields". Dieser bekommt das betreffende Dataset als Parameter mit.

Code: Alles auswählen

procedure TfrmMain.SQLQueryCalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('NewCalcField').Value := 'test';
end;
funktioniert.

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten

Beitrag von Ich934 »

Das wars! Da hätte ich auch selbst drauf kommen können. :roll:

Vielen Dank. Programm läuft jetzt wie es soll...
Tipp für PostgreSQL: www.pg-forum.de

Antworten