Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi LookUp feld zur laufzeit erstellen (https://www.delphipraxis.net/175075-lookup-feld-zur-laufzeit-erstellen.html)

Hausmarke 29. Mai 2013 09:21

Datenbank: Firebird • Version: 2.1 • Zugriff über: TIBDatabase

LookUp feld zur laufzeit erstellen
 
Hallo Leute,

ich habe ein objekt in welchem ich dynamisch alle komponenten erzeuge die man für den zugriff auf eine Datenbank benötigt.
Soweit funktioniert das auch ganz gut, und ich kann die Daten in einem Grid ausgeben.
Nun möchte ich in dem DataSet, welches im grid abgebildet wird, mehrere LookUp felder einfügen, so wie man das äußerst easy zur Entwurfszeit machen kann.

Aktuell bin ich soweit:

Delphi-Quellcode:
  f := TStringField.Create(DSetDaten);
  with f do
  begin
    Name := DSetDaten.Name + FieldName;
    Size := 50;
    DisplayLabel := 'FieldNachschlagen';
    DisplayWidth := 21;
    FieldName := 'FieldNachschlagen';
    FieldKind := fkLookup;
    Lookup:=True;
    LookupDataSet := DSetInfos;
    KeyFields := 'INFOID';
    LookupKeyFields := 'ID';
    LookupResultField := 'Info';
    DataSet := DSetDaten;
    Index := 2;
  end;
nur leider bringt er mir den fehler das er "INFOID" nicht finden kann.

Woran könnte das liegen, denn dieses Feld existiert, und zur Entwurfszeit in der komponente konfiguriert funktioniert es auch.

gibt es evtl. einen einfacheren weg ein lookup feld in ein dataset zu bekommen?

Uwe Raabe 29. Mai 2013 09:43

AW: LookUp feld zur laufzeit erstellen
 
Auf den ersten Blick fallen zwei Dinge auf, die allerdings nicht zwingend dein Problem beheben:
  1. Du verwendest
    Delphi-Quellcode:
    FieldName
    bevor du es setzt
  2. Delphi-Quellcode:
    Lookup := true
    ist überflüssig

Hausmarke 29. Mai 2013 10:03

AW: LookUp feld zur laufzeit erstellen
 
danke für den hinweis, ergibt sinn :oops:

habe nun beides geändert

wie erwartet behebt es das Problem leider nicht.

baumina 29. Mai 2013 10:08

AW: LookUp feld zur laufzeit erstellen
 
Zitat:

Zitat von Hausmarke (Beitrag 1216813)
nur leider bringt er mir den fehler das er "INFOID" nicht finden kann.

Wann tritt der Fehler auf? Beim Programmstart, Beim öffnen des Formulars, beim Klicken auf das LookupFeld?

baumina 29. Mai 2013 10:16

AW: LookUp feld zur laufzeit erstellen
 
In welcher Datenbank-Tabelle gibt es das Feld 'INFOID' in DSetDaten(KeyFields) oder in DSetInfos( LookupKeyFields)?

baumina 29. Mai 2013 10:27

AW: LookUp feld zur laufzeit erstellen
 
Hier noch ne kleine Anleitung zu dem Thema:

http://www.swissdelphicenter.ch/de/showcode.php?id=2170

Hausmarke 29. Mai 2013 10:45

AW: LookUp feld zur laufzeit erstellen
 
INFOID befindet sich in der DSetDaten und beinhaltet die ID welche in DSetInfos als PK hinterlegt ist.

Rein von dieser Konfiguration her sollte das korrekt sein, da ich dies 1:1 wie zur Entwurfszeit in der Komponente gemacht habe.
Die Komponente zur Entwurfszeit dient dabei nur zu meiner Orientierung.

Danke für den Link. Hab mir das angeschaut und umgesetzt.

Leider will er das FieldDefs.Add nicht schlucken.

baumina 29. Mai 2013 10:48

AW: LookUp feld zur laufzeit erstellen
 
Zitat:

Zitat von Hausmarke (Beitrag 1216830)
Leider will er das FieldDefs.Add nicht schlucken.

Da fehlt meines Erachtens auch ein "YourDataSet." davor.

Hausmarke 29. Mai 2013 11:06

AW: LookUp feld zur laufzeit erstellen
 
Zitat:

Da fehlt meines Erachtens auch ein "YourDataSet." davor.
korrekt :thumb: das sagt die Delphi Hilfe auch :wink:

Hausmarke 30. Mai 2013 07:18

AW: LookUp feld zur laufzeit erstellen
 
ich hab das fehlende Bindeglied gefunden :dancer:

Man muss die Tabelle erst persistent machen, danach kann man sein LookUpfield auch zur Laufzeit erzeugen.

dies macht man für dieses Beispiel wie folgt:

Delphi-Quellcode:
 

procedure TFMain.CreatePersistentFields;
var i: Integer;
begin
  DSetDaten.FieldDefs.Update;
  DSetDaten.Close;
  for I := 0 to DSetDaten.FieldDefs.Count - 1 do
     if DSetDaten.FindField(DSetDaten.FieldDefs[i].Name) = Nil then
       DSetDaten.FieldDefs.Items[i].CreateField(DSetDaten);
end;

procedure TFMain.SetLookUp;
begin
CreatePersistentFields;
with TStringField.Create(DSetDaten) do
  begin
    Name := 'FieldNachschlagen';
    FieldName := 'FieldNachschlagen';
    DisplayLabel := 'Info';
    FieldKind := fkLookup;
    DataSet := DSetDaten;
    LookupDataSet := DSetInfos;
    KeyFields := 'INFOID';
    LookupKeyFields := 'ID';
    LookupResultField := 'Info';
  end;
  DSetDaten.Open;
end;
danke für eure Anregungen Lösungsansätze :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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