Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Lookup-Field Size bei Strings automatisch anpassen (https://www.delphipraxis.net/136066-lookup-field-size-bei-strings-automatisch-anpassen.html)

spechto 23. Jun 2009 00:52

Datenbank: Firebird • Version: 2.1 • Zugriff über: FIBPlus 6.9.5

Lookup-Field Size bei Strings automatisch anpassen
 
... wie versprochen das nächste Problemchen:

wenn ich nun meine Lookup-Felder erstellt habe, wie
kann ich erreichen, dass Size bei Strings die gleiche
Größe hat wie in der Lookup-Quelle? Gibt es einen
Automatismus bzw. muss ich Ihn selber implementieren
oder reicht es, den Wert manuell zu setzen (hinsichtlich
späterer Datenbankanpassungen und der Softwarepflege ...)?

Danke für Eure Tipps.

Grüße
Martin

mkinzler 23. Jun 2009 05:35

Re: Lookup-Field Size bei Strings automatisch anpassen
 
Wie meinst du das welche Strings?

spechto 23. Jun 2009 07:31

Re: Lookup-Field Size bei Strings automatisch anpassen
 
Ich habe in einem Datensatz ein Fremdschlüssel (ID, Integer), der auf
eine andere Tabelle verweist. Aus dieser Tabelle hole ich mir ja per
Lookup sagen wir mal den Namen des Mitarbeiters. Beim Erstellen des
Feldes zur Designtime muss ich ja eine Länge (Size) angeben, damit
irgendetwas ausgegeben wird, wenn ich dieses LookupFeld in einem DBGrid
anzeigen lassen möchte. Der Wert TFIBStringField.Size wird also manuell
auf einen Wert gesetzt, der nicht unbedingt der Feldgröße des Originals
entsprechen muss. Gibt es hier eine Art Automatik, dass immer die
Größe des Feldes aus der Original-Tabelle kommt?

Grüße
Martin

spechto 24. Jun 2009 00:19

Re: Lookup-Field Size bei Strings automatisch anpassen
 
Hallo nochmal,

noch einigen Tests habe ich folgendes herausbekommen: Ändert man in der Datenbank die Größe von Stringfeldern, so wird deren Änderung automatisch von den FIBPlus-TField-Abkömmlingen beim Aufrufen des Datasets in die Fields übernommen.
Warum klappt das nicht bei den LookUp-Feldern?

Grüße
Martin

sx2008 24. Jun 2009 02:00

Re: Lookup-Field Size bei Strings automatisch anpassen
 
Es gibt "automatische" Felder und persistente Felder.
Automatische Felder werden aufgrund der unterliegenden Datenmenge erzeugt (Feldname, -typ, länge, Nachkommastellen, ...) .
Persistente Felder werden vom Programmierer zur Entwicklungszeit angelegt.
Leider verfolgt die VCL eine Alles-oder-Nichts-Strategie.
Entweder werden alle Felder automatisch erzeugt oder es gibt nur persistente Felder.
Sobald du ein Lookupfield willst werden persistente Felder gebraucht.
Sind persistente Felder erst einmal angelegt, dann werden sie nicht mehr an Änderungen der unterliegenden Datenmenge angepasst.
Das kann gemeine Probleme nach sich ziehen, wenn z.B. ein Datenbankfeld verlängert wird, aber die Anwendung dies ignoriert.

=> es gibt keinen Automatismus bezüglich der Lookupfelder.
Du kannst ja versuchen, im Event AfterOpen ein Lookupfield aus dem Code heraus hinzuzufügen.
Nicht ganz einfach, denn die VCL zickt da etwas.

spechto 24. Jun 2009 07:39

Re: Lookup-Field Size bei Strings automatisch anpassen
 
Hallo und vielen Dank für die Antwort,

so wie es scheint, werden bei FIBPlus die persistenten Felder
bei Änderungen in der Größe (Strings als Domain) automatisch
angepasst. Allerdings nicht bei LookUp-Feldern.

Arbeitet man nur mit persistenten Feldern, habe ich das Problem
so umgangen (im OnCreate-Ereignis des Datasets):
Delphi-Quellcode:
  pFIBDataSet1TEAM_LEADER_.Size := pFIBDataSet2FULL_NAME.Size; // LookUp-Feld.Size anpassen
Bei automatischen Felder muss zuerst das Dataset geöffnet werden
(auch im OnCreate-Ereignis des Datasets), da sonst der Feldname nicht
bekannt ist:
Delphi-Quellcode:
  pFIBDataSet2.Open;
  pFIBDataSet1TEAM_LEADER_.Size:=pFIBDataSet2.FieldByName('FULL_NAME').Size;
  pFIBDataSet12.Close;
Allerdings scheint es bei Firebird problematisch zu sein, nachträglich
Felder (in der Breite) zu verändern, wenn es Verknüpfungen innerhalb
der DB gibt. - Kann auch sein das es am EMS SQL Manager liegt ...


Grüße
Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz