Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query (https://www.delphipraxis.net/173291-tfield-size-zur-laufzeit-anpassen-ohne-doppeltes-oeffnen-der-query.html)

RSE 16. Feb 2013 10:46

AW: TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query
 
@Furtbichler: Das ist mal ein radikaler Ansatz, den werde ich definitiv am Montag testen und mich dann hier wieder melden. Es wird aber wohl gegen Feierabend werden, da der Vormittag bereits verplant ist und daraus meist neue dringende Aufgaben entstehen... Aber der Ansatz ist es auf alle Fälle Wert die Sache noch einmal anzufassen!

Danke und schönes Wochenende!

RSE 19. Feb 2013 10:50

AW: TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query
 
Gestern hatte ich keine Zeit mehr diese Sache anzugehen. Soeben habe ich das Vorgehen etwas genauer unter die Lupe genommen und bin auf folgende Schwierigkeiten gestoßen:
  • Es gibt mehrere Referenzen auf die Instanz von T(String)Field: Einmal Query.Fields['MEINFELD'] und einmal die persistenten Objekte im Datenmodul (QueryMEINFELD). Beide müssten auf das neue Objekt umgebogen werden. Ich glaube auch, dass dann jedes mit diesem Feld verbundene datensensitive Steuerelement (wovon wir viele in vielen verschiedenen anderen Units haben) neu verbunden werden muss. Soweit ich mich erinnere, werden diese Verknüpfungen beim Instanzieren vorgenommen.
  • Es gibt einige Eigenschaften von TField, die bei der Aktion nicht verloren gehen dürfen. Dazu zählen z.B. die Ereignisse und DisplayLabel.
Den zweiten Punkt sehe ich als weniger kritisch an, vorausgesetzt die Assign-Methode ist ordentlich implementiert (das unterstelle ich bei diesen Klassen einfach mal). Allerdings ist der erste Punkt für mich ein Killerkriterium, das wird mir einfach zu heiß. Wahrscheinlich lauern auch noch mehr versteckte Fallen. Da das Programm bereits zum Tode verurteilt ist, werde ich diesen Weg nicht umsetzen, da er potenziell zu viel Arbeit macht und zu viele Fallen bereithält. Wir werden bis zum Tod des Programms die Umsetzung mit der Meldung behalten.

Trotzdem danke für die Idee.

dataspider 19. Feb 2013 11:00

AW: TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query
 
Hi,

IBObjects erstellt die Felder ja schon beim Prepare, nicht erst nach dem Öffnen.
So könnte man nach dem Prepare den Check durchführen.

U.U. den Select in eine Temporäre Query, Preparen und mit der richtigen Query vergleichen.

Frank

RSE 19. Feb 2013 15:30

AW: TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query
 
Wie ich im ersten Beitrag schrieb, sind die FieldDefs, die die wahren Stringlängen aus der DB enthalten, erst nach dem Öffnen der Query verfügbar. Ich will die Query auch nicht zweimal öffnen - auch keine temporäre Query. Da ich das Ganze nicht für jede Query extra programmiere, sondern zentral für alle Queries, kenne ich auch das ausgeführte SQL nicht. Sollte dieses mal kein reines SELECT enthalten, wäre eine mehrfache Ausführung u.U. schlichtweg falsch.

dataspider 20. Feb 2013 05:44

AW: TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query
 
Zitat:

Zitat von RSE (Beitrag 1204335)
Wie ich im ersten Beitrag schrieb, sind die FieldDefs, die die wahren Stringlängen aus der DB enthalten, erst nach dem Öffnen der Query verfügbar.

Und wie ich schrieb, ist es bei IBObjects anders.
Setz doch einfach mal das Ereignis AfterPrepare.
Und dann eine Schleife durch die Felder:

Delphi-Quellcode:
for ...
  if qry.Fields[2].Size <> qry.FieldDefs[2].Size then
    qry.Fields[2].Size := qry.FieldDefs[2].Size;
Frank
[EDIT]
Kann natürlich Probleme geben, wenn das Active der Query auch schon zur Entwurfszeit gesetzt ist.
Aber das kann ich ja nicht wissen.
[/EDIT]

RSE 20. Feb 2013 17:40

AW: TField.Size zur Laufzeit anpassen ohne doppeltes Öffnen der Query
 
Dann ist das offenbar in einer neueren Version geändert worden. Wir haben eine etwas ältere, welche genau kann ich auf die Schnelle nicht sagen. Jedenfalls habe ich alle Ereignisse selbst ausprobiert mit unserer Version der IBObjects, bevor ich diesen Thread begonnen habe. Bei unserer Version sind sie im AfterPrepare noch nicht verfügbar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.
Seite 2 von 2     12   

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