[Gelöst] DBGrid: Werte auf Zelleninhalt auf Basis von Zellenwerten
-
- 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
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.
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
- 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
Dann geht es nur im Grid. Du hast vorher keinen Zugriff auf andere Werte.Ich934 hat geschrieben: ↑Mi 7. Jul 2021, 10:37Einige 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.
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).
-
- 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
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.
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
- 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
Ich kann mich dunkel an Delphizeiten erinnern. Da gab es sowas wie calculated Fields.
- 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
Das sind genaugenommen die Felder die du hinzufügst ohne Bezug zur DB.fliegermichl hat geschrieben: ↑Mi 7. Jul 2021, 14:45Ich kann mich dunkel an Delphizeiten erinnern. Da gab es sowas wie calculated Fields.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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
Naja das könnte ich ja verwenden - zumindest für einen Teil der Felder.
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);
Korrektur: der Readonly wurde durch ein noch verbliebenes Überschreiben von Feldern verursacht. Jetzt das einmal test.
Tipp für PostgreSQL: www.pg-forum.de
-
- 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
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?
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
- 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
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).
-
- 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
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
- 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
TDataSet definiert einen Event "OnCalcFields". Dieser bekommt das betreffende Dataset als Parameter mit.
funktioniert.
Code: Alles auswählen
procedure TfrmMain.SQLQueryCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('NewCalcField').Value := 'test';
end;
-
- 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
Das wars! Da hätte ich auch selbst drauf kommen können.
Vielen Dank. Programm läuft jetzt wie es soll...
Vielen Dank. Programm läuft jetzt wie es soll...
Tipp für PostgreSQL: www.pg-forum.de