AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Label, Editfeld und DBlookupListbox
Thema durchsuchen
Ansicht
Themen-Optionen

Label, Editfeld und DBlookupListbox

Ein Thema von Hansa · begonnen am 23. Jan 2003 · letzter Beitrag vom 28. Jan 2003
Antwort Antwort
Seite 1 von 3  1 23      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Label, Editfeld und DBlookupListbox

  Alt 23. Jan 2003, 12:54
Hi,

folgendes Problem (es geht um 2 Tables : Artikel und Warengruppen) : Ich habe hier ein Label, ein Editfeld, sowie eine Listbox. Folgendes soll gemacht werden : Nach Eingabe der Art.Nr. soll das Label mit der Warengruppe des Artikels beschriftet werden und die Nr. soll als Vorgabewert im Editfeld stehen. Sobald dieses betreten wird, soll die Box aufgehen.

Code:
  ArtDS.Active := false;
  ArtDs.SelectSQL.Text := 'SELECT * FROM ART8 WHERE NR = ' +   ArtNrEdit.Text;
  ArtDS.Active := true;
  WGDS.active := false;
  WGDS.SelectSQL.Text := 'SELECT * FROM WG8 WHERE ID = :ID_WG';
  WGDS.active := true;
  Label3.Caption := WGDS.FieldByName ('BEZ').value;
  Edit1.Text := WGDS.FieldByName ('NR').value;
Das da geht nicht : "Invalid Variant conversion". Das liegt an dem ID = :ID. Wie macht man das denn jetzt richtig? Aus Der Warengruppen-Table soll die Bez. der WG gesucht werden, deren ID gleich der ID_WG des Artikels ist.

Um überhaupt etwas zu sehen, habe ich das :ID_WG durch einen statischen Wert ersetzt. Dann läuft alles richtig. Dann noch etwas mit der Box. Wie gesagt, soll diese nur sichtbar sein, falls sich der Cursor in dem EditFeld befindet. Setze ich sie aber in dem Edit1Exit enabled und visible auf false, dann kann ich mit der Maus ja keinen Eintrag mehr auswählen, da ich zu diesem Zweck ja das Feld verlassen muß. Ich brauche also ein Unterscheidungsmerkmal, ob ich mich in dem Feld der WG-Nr. befinde, in der Listbox oder woanders (nur in diesem Fall dürfte dann visible und enabled auf false gesetzt werden). Wer weiß was dazu ?

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#2
  Alt 23. Jan 2003, 13:33
Hi Hansa,
ich kann leider nicht ganz nachvollziehen, was genau passieren soll. Möglicherweise kommt es in Deinem Datenbestand vor, dass das ID Feld des aktuellen Datensatzes nicht besetzt, also NULL ist. Möglicherweise stimmt das Format auch nicht überein (string, longint). Außerdem, versuchs mal mit
Delphi-Quellcode:
Label3.Caption := WGDS.FieldByName('BEZ').AString;
  Edit1.Text := WGDS.FieldByName('NR').AsInteger;
Zu Deiner zweiten Sache: das scheint mir usibilitytechnisch ein Knieschuss zu sein. Klar bist Du nicht im Editierfeld, wenn Du die Liste anklickst. Wahrscheinlich hab ich auch noch nicht begriffen, was dahinter steckt, kannst Du das kurz genauer erläutern? Irgendein Trick wird uns dann schon einfallen (LastFocusedObject oder so).

gruß, harrybo
Harry Boldt
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3
  Alt 23. Jan 2003, 14:16
Hi harrybo,

zu 1 : Was hab ich denn da für einen Mist stehen ? Das ist mir ehrlich gesagt gar nicht aufgefallen, irgendwie hatte ich aber ein ungutes Gefühl Das mit den Parametern bei SQL verstehe ich anscheinend nie. Weiß nie wo und wie die herkommen. Probier ich noch aus.

zu 2 : Die Box soll verschwinden, sobald klar ist, daß das Editfeld im Moment nicht gebraucht wird. sobald es betreten wird, soll die Box aufklappen, wobei natürlich die Möglichkeit der Auswahl gegeben sein muß. Ich müßte nur rausfinden ob der Focus in einem Feld <> WGedit UND <> Listbox ist. Nur wie? Oder geht es anders? Daaaaaa fällt mir gerade etwas ein ,es gibt doch bei jedem Feld ein Tag !!!! Keine Sau benutzt das, ich auch nicht. Aber für so einen Sonderfall ist das doch geradezu prädestiniert, oder nicht? Obwohl ich glaube, daß es auch anders / einfacher geht.

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 23. Jan 2003, 14:42
Zitat von Hansa:
zu 2 : Die Box soll verschwinden, sobald klar ist, daß das Editfeld im Moment nicht gebraucht wird. sobald es betreten wird, soll die Box aufklappen, wobei natürlich die Möglichkeit der Auswahl gegeben sein muß. Ich müßte nur rausfinden ob der Focus in einem Feld <> WGedit UND <> Listbox ist. Nur wie? .....
Hai Hansa,

das ist relativ einfach zu lösen.

Ich habe es eben mal mit mehreren Edits und einer ComboBox auf dem Formluar getestet.

Im OnEnter vom Edit1 schreibst Du:

Delphi-Quellcode:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
   ComboBox1.Visible := True;
end;
Das ist ja auch klar.

Jetzt kommt der grosse Zauber.

Im OnExit des Edits schreibst Du:

Delphi-Quellcode:
procedure TForm1.Edit1Exit(Sender: TObject);
begin
 If Not (ActiveControl = ComboBox1) then
  begin
   ComboBox1.Visible := False;
  end;
end;
ActiveControl wird nämlich gesetzt BEVOR das OnExit ausgelöst wird
Und so weisst Du zu welchem Control der Anweder gewechselt hat.

So, jetzt noch in das OnExit der ComboBox:

Delphi-Quellcode:
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
 If Not (ActiveControl = Edit1) then
  begin
   ComboBox1.Visible := False;
  end;
end;
Und fertig ist der Lack...
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5
  Alt 23. Jan 2003, 18:33
Hi,

Danke euch beiden, das geht jetzt alles einwandfrei

@Harrybo :
Code:
 
  Label3.Caption := WGDS.FieldByName('BEZ').AsString;
  Edit1.Text := IntToStr (WGDS.FieldByName('NR').AsInteger);
//  Label3.Caption := WGDS.FieldByName ('BEZ').value;
//  Edit1.Text := WGDS.FieldByName ('NR').value;
Hab Dein Beispiel abgekupfert. IntToStr hat halt noch gefehlt und "AsString" schreibt man nicht "Astring" *ichnichtschimpf* 2 Min., dann ging das. Auf die Idee mit dem value kam ich folgendermaßen : Fehler in der Code-Vervollständ. FieldByName tauchte da nicht auf Auswendig wußte ich die genaue Syntax nicht.

@Sharky : Das war genauso richtig. In 30 Min. war auch das fertig. Das war nur aufwendiger, weil ich die SQL-Statements etwas umbauen mußte. Vom Prinzip her war es kein Problem. Das geht ja runter wie Öl. Eine Frage, eine Antwort, nochmals gefragt : zweite Antwort. Und dann gehts.

Aber ich weiß immer noch nicht, woher der weiß, daß das :ID ein Parameter ist, bzw. wo der Wert herkommt. Und was ich auch nicht genau weiß, wie kriege ich die ID der ausgewählten Warengruppe in den Artikel? Ich lese immer nur, das ginge automatisch, bei mir aber nicht einfach so.

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#6
  Alt 23. Jan 2003, 18:52
Hi Hansa,
alles klar. Sorry mit AsString, war ein Tippfehler von mir. Ja, stimmt, FieldByName taucht in der Code-Vervollständigung nicht auf. Einfach schreiben, Klammer auf, Feldname, Klammer zu, Punkt, und es geht weiter mit der Code-Vervollständigung. Ok, IntToStr fehlte tatsächlich auch noch, war ja Gott sei Dank für Dich ein Klacks...

gruß, harrybo
Harry Boldt
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7
  Alt 23. Jan 2003, 19:07
Hi,

Zitat von harrybo:
Ja, stimmt, FieldByName taucht in der Code-Vervollständigung nicht auf.
Ich glaub ich werd noch bekloppt. Weil ich das nicht auf Anhieb gefunden habe, hab ich sogar die Vervollst. auf alphabetisch umgestellt, nix zu sehen. Jetzt habe ich noch einmal nachgeschaut und es wird aufgeführt Was ist das denn ?

Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8
  Alt 24. Jan 2003, 12:00
Hi,

so ganz fertig ist das ganze noch nicht, zumindest funktioniert es jetzt richtig. Aber gestern hatte ich nicht gemerkt daß hier :
Code:
ArtDs.SelectSQL.Text := 'SELECT * FROM ART8 WHERE NR = ' + ArtNrEdit.Text;
  ArtDS.Active := true;
  WGDS.active := false;
  WGDS.SelectSQL.Text := 'SELECT * FROM WG8 WHERE ID = :ID';
das :ID noch durch eine feste Zahl ersetzt war. 8) Natürlich lief es dann, weil das die passenden Zahlen waren.

Jetzt habe ich das zweite Select hierdurch ersetzt :
Code:
WGDS.SelectSQL.Text := 'SELECT * FROM WG8 WHERE ID = ' + IntToStr (ArtDS.FieldByName ('ID_WG').AsInteger);
Muß das tatsächlich so umständlich gemacht werden? Deshalb nochmals die Frage: Wie kriege ich die ID_WG aus dem ersten Select als Parameter an die zweite Übergeben ?

Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#9
  Alt 24. Jan 2003, 12:21
Kann man nicht die ID direkt als String auslesen? Also mit .AsString, dann müsste man sich das umwandeln doch sparen können. Aber eventuell dann noch das "=" durch LIKE ersetzen, falls dann eine Fehlermeldugn kommt "Type Mismatch ..." .
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#10
  Alt 24. Jan 2003, 12:26
Hi Hansa,
Du hast recht, es geht professioneller und auch schneller in der Ausführung wenn Du mit Parametern arbeitest. Vorteil: der SQL Text muss nicht geändert werden. Einen Parameter kannst Du im Design Modus über den Objekt Inspector anlegen (Params, hast Du wahrscheinlich schon) oder per Code für Deinen Fall mit
WGDS.Params.CreateParam(ftInteger, 'ID'); Deinen SQL Text kannst Du nun stehen lassen als
WGDS.SelectSQL.Text := 'SELECT * FROM WG8 WHERE ID = :ID'; Jetzt aktualisierst Du mit
Delphi-Quellcode:
with WGDS do try
  DisableControls;
  if Active then Close;
  ParamByName('ID').Value := ArtDS.FieldByName ('ID_WG').AsInteger;
  // Alternativ, wenn die Abfrage genau einen Parameter hat:
  // Params[0].Value := ArtDS.FieldByName ('ID_WG').AsInteger;
  Open;
finally
  EnableControls;
end;
Bingo! Umformen per IntToStr ist auch nicht nötig, da es sich ja um einen echten Integer Parameter handelt.
gruß, harrybo
Harry Boldt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 13:59 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