AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wie definiere ich ein Lookup-Feld für eine TQuery?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie definiere ich ein Lookup-Feld für eine TQuery?

Ein Thema von MPirnstill · begonnen am 9. Jan 2006 · letzter Beitrag vom 11. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von MPirnstill
MPirnstill

Registriert seit: 19. Jul 2004
Ort: Burgdorf
197 Beiträge
 
Delphi XE8 Enterprise
 
#1

Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 11:22
Datenbank: MS-SQL-Server • Version: 2000 • Zugriff über: Delphi 2.0 - BDE
Hi Leute!

Ich versuche mein Problem mal neue zu beschreiben, da es bei meinem letzten Thread leider nicht zum Erfolg geführt hat.

Problem:
Ich versuche ein Lookup-Feld für eine TQuery (wird auch zur Laufzeit erzeugt) während der Laufzeit zu erzeugen.

Query ist zu diesem Zeitpunkt bereits erzeugt, dann

Delphi-Quellcode:
with FQry do
begin
  if State <> dsInactive then
    close;
  RequestLive := True;
  ParamByName('Verfahren').asInteger := FVerfahren;
  ParamByName('Pruef_ID').asString := FPruef_ID;
  Open;
  .
  .
Jetzt weise ich noch ein DisplayFormat zu. So weit, so gut. Und dann möchte ich ein Lookup-Feld zu erzeugen

Delphi-Quellcode:
  TBooleanField(FieldByName('Vorsitz')).DisplayValues := 'V.; ';
  FieldDefs.Add('myLookupFeld', ftString, 50, False);
  .
  .
Bis hier scheint es auch zu funktionieren. Ich konnte mir beim debuggen, den Eintrag in FieldDefs anzeigen lassen.

  TStringField(FieldByName('myLookupFeld')).OnGetText := myLookupFeldGetText; Wenn ich jetzt versuche, mit vorstehender Anweisung die Daten bereit zu stellen (bei onGetText Zugriff auf andere Query), kennt Delphi 'myLookupFeld' nicht.

Was mache ich hier falsch? Oder besser wie kann ich es richtig machen?
Ich möchte keinen JOIN in meiner SQL-Anweisung verwenden, da ich die Query update-fähig haben möchte.

Gruß
Micha
Ich habe fertig!

DP - hier werden Sie geholfen!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 12:33
Mit FieldDefs liegst du falsch. Du musst das Property Fields[] um ein Feld erweitern.
Delphi-Quellcode:
type
   TDataSetCracker = class(TDataSet); // Zugriff auf protected Member ermöglichen
function AddLookupField(ADataSet: TDataSet; AFieldClass: TFieldClass; const AFieldName: string; const AFieldSize: Integer = 0): TField;
   procedure CreateAllFields(DS: TDataSet);
   begin
      with TDataSetCracker(DS) do
      begin
         DestroyFields;
         FieldDefs.Update;
         CreateFields;
      end;
   end;
begin
   Result := nil;

   // Falls keine Felder im DataSet sind werden alle vorhandenen Felder angelegt.
   // Falls Felder vorhanden sind, so darf "CreateAllFields" nicht aufgerufen
   // werden, da die vorhandenen Felder nicht mehr gelöscht werden dürfen.
   if ADataSet.FieldCount = 0 then
      CreateAllFields(ADataSet);

   // Falls das LU Field schon existiert wird nix mehr gemacht.
   if ADataSet.FindField(AFieldName) <> nil then
      Exit;

   // LU Field anlegen, wenn weitere Eigenschaften des Feldes gesetzt
   // werden sollen, kann dies über den Rückgabewert gemacht werden.
   Result := AFieldClass.Create(ADataSet);
   Result.Name := ADataSet.Name + Copy(AFieldClass.ClassName,2,666) + AFieldName;
   Result.FieldName := AFieldName;
   Result.Size := AFieldSize;
   Result.FieldKind := fkLookup;
   Result.DataSet := ADataSet;
end;
Nach dem Öffnen der Query:
Delphi-Quellcode:
with AddLookupField(Fqry, TStringField, 'Landname', 35) do
begin
   LookupDataset := FqryLookup;
   LookupKeyfields := 'LandId';
   LookupResultField := 'Landname_deutsch';
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von MPirnstill
MPirnstill

Registriert seit: 19. Jul 2004
Ort: Burgdorf
197 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 12:48
Zitat von shmia:
Delphi-Quellcode:
function AddLookupField(ADataSet: TDataSet; AFieldClass: TFieldClass; const AFieldName: string; const AFieldSize: Integer = 0): TField;
   procedure CreateAllFields(DS: TDataSet);
   begin
      with TDataSetCracker(DS) do
      begin
         DestroyFields;
         FieldDefs.Update;
         CreateFields;
      end;
   end;
begin
.
.
end;
Hey! Vielen Dank für deine Antwort!

Ich wollte es gleich ausprobieren, aber beim übertragen fiel mir "TDataSetCracker" auf. Was ist das für ein Type?
Bei Delphi 2.0 (auch bei D7) finde ich darüber nichts in der Hilfe und aus deinem Code-Snipet kann ich leider auch nicht erkennen was für ein Typ dies ist.

Gruß
Micha
Ich habe fertig!

DP - hier werden Sie geholfen!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 12:54
Zitat von MPirnstill:
Ich wollte es gleich ausprobieren, aber beim übertragen fiel mir "TDataSetCracker" auf. Was ist das für ein Type?
Tja, hatte ich vergessen; ist nun aber oben nachgetragen.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von MPirnstill
MPirnstill

Registriert seit: 19. Jul 2004
Ort: Burgdorf
197 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 13:31
@shmia

Ich habe das jetzt eingebaut, aber bei der Anweisung:
  Result.DataSet := ADataSet; bekomme ich immer die Fehlermeldung:
Zitat:
Operation bei geöffneter Datenmenge nicht ausführbar
Hat ja auch recht, "with AddLookupField .. do"
wird ja erst nach dem öffnen von "FQry" ausgeführt.

Mache ich da noch etwas falsch?

Ach ja, "CreateAllFields" habe ich erstmal auskomentiert, da die die Befehle "DestroyFields" und "CreateFields" unbekannt sind. Irgendwie scheint das mit dem Zugriff auf die Protected-Methoden von TDataSet noch nicht zu funktionieren. Vielleicht kennt TDataset diese Methoden unter Delphi 2.0 noch nicht oder sie heißen anders.
Aber hier dran kann der o.a. Fehler doch nicht liegen, oder?

Gruß
Micha
Ich habe fertig!

DP - hier werden Sie geholfen!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 13:53
Zitat von MPirnstill:
Ach ja, "CreateAllFields" habe ich erstmal auskomentiert, da die die Befehle "DestroyFields" und "CreateFields" unbekannt sind. Irgendwie scheint das mit dem Zugriff auf die Protected-Methoden von TDataSet noch nicht zu funktionieren. Vielleicht kennt TDataset diese Methoden unter Delphi 2.0 noch nicht oder sie heißen anders.
Aber hier dran kann der o.a. Fehler doch nicht liegen, oder?
Doch, das scheint mir das Problem zu sein.
Wenn du den Sourcecode hast, kannst du ja nachprüfen, ob es in Unit db.pas die virtuellen
Methoden TDataSet.CreateFields und TDataSet.DestroyFields gibt. (sie müssten protected sein)
Mein Sourcecode ist mit Delphi 5 getestet.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von MPirnstill
MPirnstill

Registriert seit: 19. Jul 2004
Ort: Burgdorf
197 Beiträge
 
Delphi XE8 Enterprise
 
#7

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 14:15
Die stehen bei Delphi 2.0 leider unter "Private".
Micha
Ich habe fertig!

DP - hier werden Sie geholfen!
  Mit Zitat antworten Zitat
Benutzerbild von MPirnstill
MPirnstill

Registriert seit: 19. Jul 2004
Ort: Burgdorf
197 Beiträge
 
Delphi XE8 Enterprise
 
#8

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 14:21
Aber ich kann mir nicht vorstellen, daß das Problem sein soll. Wenn ich es im Debug-Modus durch gehe, ist
aDataSet.FieldCount > 0 und deshalb wird diese interne Prozedur garnicht aufgerufen.
Micha
Ich habe fertig!

DP - hier werden Sie geholfen!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 14:23
Hallo Micha,

wenn du sonst keine Probleme mit dem Code hast, dann würde ich die Funktion CreateAllFields() einfach komplett weglassen. Damit hast du dann wieder das Verhalten, welches auch der Feld-Editor zeigt: du musst selbst entscheiden, ob du alle oder nur ausgewählte Felder persistent machen möchtest. Borland ist übrigens der Meinung, dass persistente Felder grundsätzlich im Feld-Editor erzeugt werden sollten. Keine Ahnung warum das für dich inakzeptabel ist.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von MPirnstill
MPirnstill

Registriert seit: 19. Jul 2004
Ort: Burgdorf
197 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Wie definiere ich ein Lookup-Feld für eine TQuery?

  Alt 9. Jan 2006, 14:32
Zitat von marabu:
Hallo Micha,

wenn du sonst keine Probleme mit dem Code hast, dann würde ich die Funktion CreateAllFields() einfach komplett weglassen. Damit hast du dann wieder das Verhalten, welches auch der Feld-Editor zeigt: du musst selbst entscheiden, ob du alle oder nur ausgewählte Felder persistent machen möchtest. Borland ist übrigens der Meinung, dass persistente Felder grundsätzlich im Feld-Editor erzeugt werden sollten. Keine Ahnung warum das für dich inakzeptabel ist.

Grüße vom marabu
Das ist für mich nicht inakzeptabel, aber meine Query wird in einer von mir geschriebenen Klasse dynamisch erzeugt. Ich versuche lediglich, anstatt einer Adress-ID einen Namen anzuzeigen, dabei aber die Update-Fähigkeit der Query zu erhalten, was ja bedeutet, daß nur eine Tabelle in der SQL-Anweisung angesprochen werden darf.

Wenn du einen einfacheren Weg weiß, teile mir diesen doch bitte mit. Ich bin für neue Vorschläge offen.

Das weglassen von "CreateAllFields" ist ja auch nicht das Problem, aber das was ich unter #5 beschrieben hab. und das kann ich nicht so einfach weglassen.

Gruß
Micha
Ich habe fertig!

DP - hier werden Sie geholfen!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 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