Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBLookupBox und Integer (https://www.delphipraxis.net/31798-dblookupbox-und-integer.html)

barnti 14. Okt 2004 07:13


DBLookupBox und Integer
 
Hallo,

ich habe das Problem, dass ich gern eine DBLookupCombobox benutzen möchte um dem Benutzer Eingaben zu erleichtern.
Diese LookupBox ist Bestandteil meines DBGrids. Immer wenn der Benutzer in ein Lookupfeld wechselt wird dort die LookupBox angezeigt.
Mein Problem ist: die LookupBox ist nur hilfreich, wenn diese auf Strings zugreift. Dann Lassen sich diese durch Tastatureingabe anspringen und auswählen.
Ist der auszuwählende Wert ein Integer, wie z.B. alle Primärschlüssel meiner DB, dann geht das nicht.

Kann mir jemand sagen, wie ich dieses Problem löse, so dass ich die LookupBox auch für Primärschlüssel nutzen kann?

Stevie 14. Okt 2004 08:27

Re: DBLookupBox und Integer
 
Ich denke, du meinst Fremdschlüssel. Du musst ein LookupField in deiner Datenmenge benutzen, dass die entsprechenden Texte für deine Keys anzeigt. Beispiel:
- 2 Tabellen: Artikel, Warengruppe
- in Artikel gibt es ein Feld, das Warengruppe_ID heißt und auf den Primärschlüssel aus Warengruppe verweist.
- also musst du im Artikel-Dataset ein zusätzliches Feld (vom typ Loopup) anlegen und als LookupDatenmenge das Warengruppendataset angeben. über das Feld Warengruppe_ID werden die beiden verknüft, als Anzeige dient das Feld Warengruppenname aus der Warengruppentabelle. In der Grid zeigst du jetzt nur das Lookupfeld an und nicht das ID-Feld.
Dann kannst du eine LookupComboBox nehmen und diese mit der Warengruppendatenmenge verknüpfen. Wenn du jetzt eine Warengruppe auswählst, dann wird die ID dieser Warengruppe in deinem Warengruppen_ID-Feld des Artikels eingetragen.

barnti 14. Okt 2004 09:05

Re: DBLookupBox und Integer
 
Hallo Stevie,

ist mir alles bekannt ;)

Bei der jetzigen Lösung erzeuge ich für jede Tabelle, aus der ich die ID brauche eine weitere Spalte, in der die ID als String eingetragen wird. So existiert neben der 'Waren_ID' ein Feld mit der Bezeichnung 'WarenNR'.

Verwende ich ein Lookup auf diese Tabelle, verwende ich als angezeigtes Feld 'WarenNR' in der Lookupliste. So geht es auch, ist aber nur ein 'Workarround'.

Deshalb: ich möchte ein Lookup OHNE ein weiteres Feld in meiner Quelltabelle anlegen zu müssen.

Stevie 14. Okt 2004 09:15

Re: DBLookupBox und Integer
 
Zitat:

Zitat von barnti
Deshalb: ich möchte ein Lookup OHNE ein weiteres Feld in meiner Quelltabelle anlegen zu müssen.

Ok, die Lösung heißt TDBLookupComboBox!! In der OH wird auch genau erklärt, wie man sie verwendet.
Nachtrag: Sorry, auf Absenden gekommen...
Also, du musst deinem Grid nur klarmachen, dass die TDBLookupComboBox auch für FK-Felder angezeigt werden soll und die dementsprechende ListSource benutzen.

barnti 14. Okt 2004 10:20

Re: DBLookupBox und Integer
 
Hi,
Zitat:

Zitat von Stevie
Zitat:

Zitat von barnti
Deshalb: ich möchte ein Lookup OHNE ein weiteres Feld in meiner Quelltabelle anlegen zu müssen.

Ok, die Lösung heißt TDBLookupComboBox!! In der OH wird auch genau erklärt, wie man sie verwendet.
Nachtrag: Sorry, auf Absenden gekommen...
Also, du musst deinem Grid nur klarmachen, dass die TDBLookupComboBox auch für FK-Felder angezeigt werden soll und die dementsprechende ListSource benutzen.

Äh? Sag mal liest Du meine Beiträge auch? :gruebel:
Oder habe ich mich nicht richtig ausgedrückt?

Ich HABE bereits eine TDBLookupComboBox...?!

Das Problem habe ich im ersten Beitrag beschrieben: Bei der Benutzung der besagten Komponente muss man auf Strings als angezeigtes Feld zurückgreifen.
Die Schlüsselattribute (autoInc) sind aber Integer.
Ich hoffe ich habe mich jetzt besser verständlich gemacht?

Stevie 14. Okt 2004 10:27

Re: DBLookupBox und Integer
 
Sorry, aber irgendwie steh ich wohl auf der Leitung. :oops:
Wieso bitte willst du AutoInc-Werte mittels eines LookupCombos ändern???
Erklär mir bitte nochmal deine Tabellenstruktur...

barnti 14. Okt 2004 11:42

Re: DBLookupBox und Integer
 
Hi,

Tabelle Partie
______________
Partie_ID, Bla, Blubber


Tabelle Unterpartie
___________________
Unterpartie_ID, Partie_ID, so, und, so

Jetzt möchte ich beim Anlegen einer neuen Unterpartie die Partie_ID mittels TDBLookupCombobox auswählen und in Unterpartie eintragen.

Ich hoffe das trägt zu Deinem Verständnis bei.

kiar 14. Okt 2004 11:50

Re: DBLookupBox und Integer
 
hallo,

die kompo auf das formular, die ds einstellen hier die TAbelle partie und da das feld auswählen hier Partie_id und schon hast du eine auswahlmöglichkeit.

raik

Stevie 14. Okt 2004 11:52

Re: DBLookupBox und Integer
 
Zitat:

Zitat von barnti
Hi,

Tabelle Partie
______________
Partie_ID, Bla, Blubber


Tabelle Unterpartie
___________________
Unterpartie_ID, Partie_ID, so, und, so

Jetzt möchte ich beim Anlegen einer neuen Unterpartie die Partie_ID mittels TDBLookupCombobox auswählen und in Unterpartie eintragen.

Ich hoffe das trägt zu Deinem Verständnis bei.

Auf jeden Fall! :wink:

Also, du hast dann zwei DataSets und DataSources.
Für das Feld Partie_ID muss die DBLookupComboBox folgende Eigenschaften haben:
- DataSource := DataSourceUnterpartie
- ListSource := DataSourcePartie
- DataField := Partie_ID (aus DataSourceUnterpartie.Dataset)
- KeyField := Partie_ID (aus DataSetPartie.Dataset)
- ListField := Bla (aus DataSetPartie.Dataset)

Jetzt kannst du aus deinen Partien auswählen und die DBLookupComboBox
trägt die ID der ausgewählten Partie in die Unterpartie ein.

barnti 14. Okt 2004 12:11

Re: DBLookupBox und Integer
 
Hi,

ich muss wohl chinesisch reden ;)

Ich KENNE die Funktion der TDBLookupCombobox. Ich NUTZE diese bereits!!

Was nicht funktioniert:

Auswahl eines Wertes aus der Box PER Tastatur. Das geht nur mit STRINGS. Ich habe aber bei dem Beispiel INTEGER.

Mehr weiß ich dazu jetzt echt nicht zu sagen...

Sharky 14. Okt 2004 12:17

Re: DBLookupBox und Integer
 
Zitat:

Zitat von barnti
... Das geht nur mit STRINGS. Ich habe aber bei dem Beispiel INTEGER..

Hai barnti,

caste doch in deiner SQL-Abfrage den Integer in einen String.

barnti 14. Okt 2004 12:21

Re: DBLookupBox und Integer
 
Hi sharky,

das ist die erste Idee zu meinem Problem.
Ich arbeite mit mysql und den mysqlDAC.
Wie kann ich die Abfrage casten und dann die Box nutzen?
Sollte ja mit der Query für die Lookupbox geschehen...

Sharky 14. Okt 2004 12:32

Re: DBLookupBox und Integer
 
Hai barnti,

versuche es mal so:
SQL-Code:
SELECT cast(id AS char) FROM tabelle

barnti 14. Okt 2004 13:15

Re: DBLookupBox und Integer
 
Hi Sharky,

ich werde mich mal gleich an die Arbeit machen...

barnti 14. Okt 2004 13:34

Re: DBLookupBox und Integer
 
Hi Sharky,
das ganze bedarf größerer Änderungen. Ich werde diese Woche nicht mehr dazu kommen. Ich melde mich nächste Woche bezüglich dieses Problems noch einmal.
Danke erst einmal!

Sharky 14. Okt 2004 13:34

Re: DBLookupBox und Integer
 
Zitat:

Zitat von barnti
...Danke erst einmal!

Bitte schön :stupid:

Stevie 14. Okt 2004 14:12

Re: DBLookupBox und Integer
 
Zitat:

Zitat von barnti
Hi,

ich muss wohl chinesisch reden ;)

Ich KENNE die Funktion der TDBLookupCombobox. Ich NUTZE diese bereits!!

Was nicht funktioniert:

Auswahl eines Wertes aus der Box PER Tastatur. Das geht nur mit STRINGS. Ich habe aber bei dem Beispiel INTEGER.

Mehr weiß ich dazu jetzt echt nicht zu sagen...

:wall: :wall: :wall: OH MANN!!!
Ich hab wohl komplett chinesisch verstanden...
Ok, nachdem ich das mal ausprobiert hab, das ListField als IntegerField zu deklarieren, ist mir auch klar, was dein Problem ist!
In der Tat eine komische Sache, aber irgendwie funzt das bei IntegerFeldern nicht mit der Tastatureingabe...

Ich hab mich mal geguckt, warum das so ist. Tja, in der Komponente wird gesagt, dass das mit der Tastatureingabe nur funktioniert, wenn das Feld vom Typ String o.Ä. ist, aber nicht bei Integer.

Nu gut, versuchen wir doch mal die Klasse etwas zu "modifizieren".

Einfach in die Unit, wo du die TDBLookupComboBox hast folgende Zeile als erstes unter type:
Delphi-Quellcode:
  TDBLookupComboBox = class(DBCtrls.TDBLookupComboBox)
    procedure ProcessSearchKey(Key: Char); override;
  end;
Die Funktion definieren wir wie folgt (mit kleinen Änderungen aus TDBLookupControl übernommen):
Delphi-Quellcode:
uses
  DB;

var
  SearchTickCount: Integer = 0;

procedure TDBLookupComboBox.ProcessSearchKey(Key: Char);
var
  TickCount: Integer;
  S: string;
  CharMsg: TMsg;
  FListField: TField;
  FKeyField: TField;
begin
  FListField := ListSource.DataSet.FindField(ListField);
  if (FListField <> nil) and (FListField.FieldKind in [fkData, fkInternalCalc]) and
    (FListField.DataType in [ftString, ftInteger, ftWideString]) then // <<--- hier hab ich ftInteger hinzugefügt
    case Key of
      #8, #27: SearchText := '';
      #32..#255:
        if CanModify then
        begin
          TickCount := GetTickCount;
          if TickCount - SearchTickCount > 2000 then SearchText := '';
          SearchTickCount := TickCount;
          if SysLocale.FarEast and (Key in LeadBytes) then
            if PeekMessage(CharMsg, Handle, WM_CHAR, WM_CHAR, PM_REMOVE) then
            begin
              if CharMsg.Message = WM_Quit then
              begin
                PostQuitMessage(CharMsg.wparam);
                Exit;
              end;
              SearchText := SearchText + Key;
              Key := Char(CharMsg.wParam);
            end;
          if Length(SearchText) < 32 then
          begin
            S := SearchText + Key;
            try
              if ListLink.DataSet.Locate(FListField.FieldName, S,
                [loCaseInsensitive, loPartialKey]) then
              begin
                FKeyField := ListSource.DataSet.FindField(KeyField);
                SelectKeyValue(FKeyField.Value);
                SearchText := S;
              end;
            except
              SearchText := S;
            end;
          end;
        end;
    end;
end;
Somit hast du - ok, auf etwas fiesem Weg - die Klasse überschrieben, ohne eine neue zu erstellen. Sie gilt allerdings nur innerhalb dieser Unit! Jetzt funktioniert die ganze Sache auch mit der Tastatureingabe.

barnti 14. Okt 2004 14:31

Re: DBLookupBox und Integer
 
Hallo Sharky,

ich habe mir mal eben ein Testprogramm erstellt. Ich habe deinen Tip beherzigt und - es FUNKTIONIERT!

Ich bin begeistert! Danke!Danke!...

barnti 14. Okt 2004 14:44

Re: DBLookupBox und Integer
 
Hi Stevie,
auch ein Weg. Ich bin am überlegen, ob das nicht sogar einfacher wäre.
Aber ich weiß nicht, ob das nicht andere 'Sauereien' macht...

Vielen Dank auch für Deine Geduld und Mühe!

Stevie 14. Okt 2004 14:49

Re: DBLookupBox und Integer
 
Zitat:

Zitat von barnti
Hi Stevie,
auch ein Weg. Ich bin am überlegen, ob das nicht sogar einfacher wäre.
Aber ich weiß nicht, ob das nicht andere 'Sauereien' macht...

Vielen Dank auch für Deine Geduld und Mühe!

Du läufst auf jeden Fall nicht Gefahr, dass dein in string gecastetes Feld doch irgendwo als integer benötigt wird.
Ok, die einzige Sauerei ist eigentlich, dass es schon etwas gegen die "Gesetze" der OOP verstößt, wenn ich die Kompo hier einfach "superclasse". :mrgreen: Ansonsten funktioniert das so, wie vorher.

Sharky 14. Okt 2004 14:55

Re: DBLookupBox und Integer
 
Zitat:

Zitat von Stevie
...Du läufst auf jeden Fall nicht Gefahr, dass dein in string gecastetes Feld doch irgendwo als integer benötigt wird...

Darum sollte man es ja auch als extra Feld ausgeben lassen ;-)
SQL-Code:
SELECT *, cast(id AS char) AS ID_str FROM test
Somit hat man alle Felder im Original und die ID einmal zusätzlich als String.

barnti 14. Okt 2004 15:00

Re: DBLookupBox und Integer
 
Hi,
das klingt vernünftig. Ich werde alle Felder benötigen. Zumindest möchte ich mich nicht jetzt festlegen. Deshalb werde ich deinen beschriebenen Weg gehen.
Danke noch einmal!

Stevie 14. Okt 2004 15:05

Re: DBLookupBox und Integer
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von Stevie
...Du läufst auf jeden Fall nicht Gefahr, dass dein in string gecastetes Feld doch irgendwo als integer benötigt wird...

Darum sollte man es ja auch als extra Feld ausgeben lassen ;-)
SQL-Code:
SELECT *, cast(id AS char) AS ID_str FROM test
Somit hat man alle Felder im Original und die ID einmal zusätzlich als String.

Oben wollte er noch möglichst wenige Felder haben... :mrgreen:
Zitat:

Zitat von barnti
Deshalb: ich möchte ein Lookup OHNE ein weiteres Feld in meiner Quelltabelle anlegen zu müssen.

Aber ist ja letztendlich eine Frage des Geschmacks...


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