Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankeinträge in ComboBoxen zur Anzeige bringen. (https://www.delphipraxis.net/131353-datenbankeintraege-comboboxen-zur-anzeige-bringen.html)

Jens Hartmann 23. Mär 2009 19:34

Datenbank: Firebird • Version: V2.1 • Zugriff über: Zeos

Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Hallo mal wieder,

Habe folgendes Problem, ich möchte aus meine Datenbank aus einer Spalte die 5 letzten Einträge mit einem bestimmten Wert zur Anzeige bringen.

Soll heißen, ich habe eine Spalte, in der Ereignisse stehen, jetzt möchte ich die letzten 5 Ereignisse, mit dem Wert x in einer ComboBox oder ähnlich Anzeigen und in einer anderen die letzten 5 Ereignisse z.B. mit dem Wert y.

Meine frage, wie gehe ich das an. nehme ich normale ComboBoxen, oder DBCombo´s oder was ganz anderes, und wie kann ich diese Abfrage am einfachsten gestallten.

Gruß

Jens

mkinzler 23. Mär 2009 19:41

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Hier würden sich DBLookupComboboxen anbieten

Jens Hartmann 23. Mär 2009 19:43

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Das habe ich mir eben schon mal angesehen, ich vermute ich muss die über ne DataSource anbinden.

mkinzler 23. Mär 2009 19:50

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Ja. Und diese dann mit .ListSource anbinden

Jens Hartmann 23. Mär 2009 20:17

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Ich muss doch zum anbinden ne TZTable verwenden. Also mal grob den Aufbau.

TZTable mit TZConnection verbinden und in TableName die Tabelle eintragen.
Dann die TZTabel mit der DataSource verbinden. Wenn ich dann die LookupCombo mit der DataSource verbinden will, sagt Delphi immer, das LookupSource mit Table verbunden werden muss.

mkinzler 23. Mär 2009 20:20

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Zitat:

Dann die TZTabel mit der DataSource verbinden.
Nein, die Source mit der Table.
Zitat:

Wenn ich dann die LookupCombo mit der DataSource verbinden will, sagt Delphi immer, das LookupSource mit Table verbunden werden muss.
Ja die .LookupSource der LookupCompo muss mit der DataSource verbunden werden

Jens Hartmann 23. Mär 2009 20:27

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Da musste doch irgendne Reihenfolge eingehalten werden. Das habe ich auch schon mal gelesen, Ich finde es nur nicht. Wie muss ich da den noch vorgehen.

mkinzler 23. Mär 2009 20:34

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Ich weiss nicht, was du mit Reihenfolge meinst

Delphi-Quellcode:
DataSource.DataSet := Table;
LookupComboBox.LookupSource := DataSource;
LookupComboBox.LookupDisplay := <Anzuzeigendes Feld>;
LookupComboBox.LookupField := <Rückgabefeld>;

Jens Hartmann 23. Mär 2009 20:44

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Seltsam, genau das habe ich gemacht und bekomme den eben genannten Fehler

mkinzler 23. Mär 2009 20:47

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Ist Table.DataSource auch Nil?
Und was steht in LookupCombo.DataSource?

Jens Hartmann 23. Mär 2009 20:55

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
DataSource von LookupComboBox ist Leer. Ich nutzte ZTable von Zeos, und da habe ich doch gar kein Feld DataSource

haentschman 24. Mär 2009 18:16

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Hallo Jens,

Zitat:

ich möchte aus meine Datenbank aus einer Spalte die 5 letzten Einträge mit einem bestimmten Wert zur Anzeige bringen.
...dann kannst du die LookupComboBox in die Tonne schieben :wink: Dann hast du komplett alle Datensätze der Tabelle in der ComboBox Auswahl.

Vorschlag:
- eine normale Standard Combobox benutzen
- die gewünschten Datensätze per Query holen
- ComboBox.Clear
- Ergebnismenge der Query durchlaufen und jeden Datensatz der ComboBox hinzufügen.

hoffe geholfen zu haben :hi:

alzaimar 24. Mär 2009 19:07

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Zitat:

Zitat von haentschman
Zitat:

ich möchte aus meine Datenbank aus einer Spalte die 5 letzten Einträge mit einem bestimmten Wert zur Anzeige bringen.
...dann kannst du die LookupComboBox in die Tonne schieben :wink:

Ach, wurde die Filter-Eigenschaft abgeschafft? :zwinker:

Jens Hartmann 24. Mär 2009 19:18

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Liste der Anhänge anzeigen (Anzahl: 3)
Also, ich versuche es immer noch mit der Lookup ComboBox, und habe aber immer noch den selben Fehler. Ich habe mal die Einstellung im OI in den Anhang gelegt.

Gruß Jens

haentschman 24. Mär 2009 21:04

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Hallo alzaimar...

Zitat:

5 letzten Einträge mit einem bestimmten Wert
- ich lern gern dazu, aber obiges mit einem Filterstring des Datasets ?
- kannst du mal ein Beispiel zeigen ?

:hi:


@Jens:
- ähmmm...Stop du hast die DBLookupCombo aus der Registerkarte 3.1 erwischt. Die DBLookupComboBox ist in Datensteuerung
- die DBLookupComboBox ist geeignet, wenn man die Liste aus einer Tabelle holt und den Wert in eine andere schreiben will
- das wäre ListSource für die Liste und DataSource für das Ziel.
- wenn du nur die Daten in der Liste anzeigen möchtest und andersweitig weiterverarbeiten reicht die DBComboBox aus Datensteuerung. Dann hättest du als DataSource - DataSource1 und die Datasource wie gehabt.
- versuch dann mal die Tabelle erst zur Laufzeit Active:= True zu setzen.

Jens Hartmann 25. Mär 2009 04:32

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Sorry, dann muss ich das mal prüfen, ich bin auf die Lookup durch den obigen Beitrag gekommen.

mkinzler hat geschrieben

Zitat:

Hier würden sich DBLookupComboboxen anbieten

RWarnecke 25. Mär 2009 04:41

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Eine andere Varinate wäre noch, Du gehst direkt über eine Query.

So zu Beipsiel :
Delphi-Quellcode:
with TZQuery do begin
  SQL.Clear
  SQL.Text := 'Select * from tabelle where feld1=1';
  Open;
  Active := true;
  while not eof do
  begin
    Combobox1.Items.Add(FieldByName('Feld2').AsString);
  end;
  Active := false;
  Close;
end;
So fülle ich immer meine Listen oder Boxen. Ich benutze garnichtmehr die TDBxxx-Komponenten.

Jens Hartmann 25. Mär 2009 23:29

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Zitat:

RWarnecke hat geschrieben
Delphi-Quellcode:
with TZQuery do begin
  SQL.Clear
  SQL.Text := 'Select * from tabelle where feld1=1';
  Open;
  Active := true;
  while not eof do
  begin
    Combobox1.Items.Add(FieldByName('Feld2').AsString);
  end;
  Active := false;
  Close;
end;

So habe ich es ja bis jetzt gelößt, allerdings, möchte ich ja nur die letzten 5 aktuellesten Ereignisse.

Mein jetziger Code...
Delphi-Quellcode:
with QRYMB256PLUS do begin
  SQL.Clear
  SQL.Text := 'Select * from MB256PLUS where Ereignis=Einbruch';
  QRYMB256PLUS.Open;
  while QryMB256PLUS Not eof do
  begin
    CBAlarme.Items.Add(FieldByName('Ereignis').AsString);
  end;
  Active := false;
  Close;
end;

omata 25. Mär 2009 23:38

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Wie sieht denn deine Datenbankstruktur (Tabelle) aus? In einer Datenbank gibt es keine Reihenfolge, es sei denn du definierst eine. Sprich du hast eine Spalte, nach der du sortieren kannst. Mit First kannst du dann die Ergebnismenge einschränken...
SQL-Code:
SELECT FIRST 5 *
FROM tabelle
ORDER BY datum DESC

Jens Hartmann 26. Mär 2009 06:40

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Zitat:

Wie sieht denn deine Datenbankstruktur (Tabelle) aus? In einer Datenbank gibt es keine Reihenfolge, es sei denn du definierst eine. Sprich du hast eine Spalte, nach der du sortieren kannst. Mit First kannst du dann die Ergebnismenge einschränken...
Das ist mir soweit auch klar, ich sortiere nach dem Feld ID, welches ich über einen Generator anlegen lasse(Zähler).
Jetzt ist es aber so, das ich immer die letzten 5...

SQL-Code:
SELECT LAST 5 * FROM MB256PLUS WHERE EREIGNIS = Einbruch;
ich vermute das der Code so sein müsste. Leider, möchte ich ja aber auch realisieren, wenn jetzt ein neuer Datensatz dazu kommt, der dieses Kriterium erfüllt, der älteste entfernt wird, und der neue eingefügt wird.

Ich denke mir nur, wenn da alle 10 Sek. ein neuer Datensatz kommt, ob es da Sinnvoll ist die Query halt jedesmal auf´s neue abzufragen.

Daher dachte ich, das irgendwie einfacher mit einer DB-Komponente lössen zu können.

MFG

Jens

mkinzler 26. Mär 2009 06:44

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Es gibt kein Last, aber First mit umgekehrter Sortierung
SQL-Code:
SELECT FIRST 5 * FROM MB256PLUS WHERE EREIGNIS = Einbruch order by id desc;
Zitat:

Ich denke mir nur, wenn da alle 10 Sek. ein neuer Datensatz kommt, ob es da Sinnvoll ist die Query halt jedesmal auf´s neue abzufragen.
Ein Refresh sollte reichen. Entwdeder Zeitgesteuert oder als Event bei Insert ( durch Trigger)

Jens Hartmann 26. Mär 2009 06:56

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Also stehe des DESK für umgekehrte Sortierung. Dann muss ich es dann mal damit versuchen. Aber welche Komponente nehme ich den dann jetzt am besten zur Anzeige.

Ich denke mir das mittlerweile so...

Ich nutze die vorhanden TZConnection, da die Bearbeitung ja auch nur in dem Fall passieren muss, wenn eh Datenverkehr vorhanden ist.

Ich nehme aber eine neue TZQuery, die ich mit der vorhanden TZConnection verbinde.

In diese Query, packe ich den SQLCode, und binde an diese Query eine DataSource an.

Dann nehme ich eine DBComboBox und Verbinde diese mit dem richtigen Feld der DataSource.

Für die anderen InfoBoxen, nutze ich die selbe Query, und passe nur den jeweiligen SQL-Code an.

Ich denke daran werde ich mich später noch setzten. Danke aber schon mal für die vielen antworten.

Gruß Jens

Jens Hartmann 31. Mär 2009 15:29

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

so habe das jetzt mal soweit umgebaut, leider bin ich für SQL glaube ich zu doof. Aber Gott sei Dank, habe ich mir ja jetzt ein Buch dazu bestellt.

Es wäre aber trotzdem schön, wenn ihr mir schon mal weiter helfen könntet. Ich habe die Abfrage jetzt über die QUERY gemacht, und erstmal nur nach Ereignis = Einbruch gefragt. Doch leider bekomme ich da schon unten Angehangenen Fehler.

Delphi-Quellcode:
      with QryMB256PLUS do begin
      QryMB256PLUS.SQL.Clear;
      QryMB256PLUS.SQL.Text := 'SELECT FIRST 5 * FROM MB256PLUS WHERE Ereignis = Einbruch';
      QRYMB256PLUS.Open;
      while Not eof do
      begin
        CBAlarme.Items.Add(FieldByName('Ereignis').AsString);
        QryMB256PLUS.Next;
      end;
      QryMB256PLUS.Active := false;
      QryMB256PLUS.Close;
      end;
      CBAlarme.ItemIndex := 1;

haentschman 31. Mär 2009 15:47

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Hallo...

der Fehler sagt zwar daß das Feld EREIGNIS nicht vorhanden ist. Ich tippe aber eher auf Syntaxprobleme, da ich dir zutraue, zu überprüfen, daß das Feld wirklich in der Tabelle vorhanden ist.

probier es mal mit Parametern:
Delphi-Quellcode:
with QryMB256PLUS do begin
      QryMB256PLUS.SQL.Clear;
      QryMB256PLUS.SQL.Text := 'SELECT FIRST 5 * FROM MB256PLUS WHERE EREIGNIS = :Ereignis';
      QryMB256PLUS.ParamByName('Ereignis').asString:= 'Einbruch';
      QRYMB256PLUS.Open;
      while Not eof do
      begin
        CBAlarme.Items.Add(FieldByName('Ereignis').AsString);
        QryMB256PLUS.Next;
      end;
      QryMB256PLUS.Active := false;
      QryMB256PLUS.Close;
      end;
      CBAlarme.ItemIndex := 1;
:hi:

Jens Hartmann 31. Mär 2009 15:54

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Habe ich eben ach schon mal probiert, ich habe auch schon mal so einen ähnlichen Fehler geabt. Und zwar lag es da an den Feldnamen, wenn man auf die Query einen Doppelklick macht (Felder hinzufügen). Ich denke, das der Fehler was ganz einfaches ist, nur ich versteh das noch nicht.

Trotzdem danke.

Habe übrigens deinen geposteten Code auch noch ausprobiert. Aber wie schon gesagt, mit dem selben Fehler.

Gruß Jens.

haentschman 31. Mär 2009 16:02

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Zitat:

wenn man auf die Query einen Doppelklick macht (Felder hinzufügen).
:gruebel: brauchst du nicht. Die Felder werden durch das Open eingelesen. hast du vieleicht noch eine Sortierung in der Query eingetragen welche bei leerer Query auch ein fehlendes Feld anmeckert ?

PS: obigen Code verwende ich hunderte male schmerzfrei. Das Problem liegt nicht an der Query.

Auch zur richtigen Datenbank verbunden und nicht vieleicht Testdatenbank wo einige Felder fehlen ?

:gruebel:

Jens Hartmann 31. Mär 2009 18:54

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Zitat:

brauchst du nicht. Die Felder werden durch das Open eingelesen. hast du vieleicht noch eine Sortierung in der Query eingetragen welche bei leerer Query auch ein fehlendes Feld anmeckert ?
Ich weiß, ich hatte mal am Anfang dort Felder eingetragen, wodurch dann ein so ähnlicher Fehler entstanden ist.

Was meinst Du mit sonstiger Sortierung. Hier mal der komplette Code. Im oberen Bereich Frage ich die gesamte Tabelle ab, um ein VST zu füllen. Im unteren Bereich, ändere ich ja dann den SQL Code und frage nur nach dem Feld Ereignis. Vieleicht kann man ja anhand des Code´s was erkenne.

Delphi-Quellcode:
if ServiceGetStatus('', 'FirebirdGuardianDefaultInstance') = 4 then
  begin
  QryMB256PLUS.SQL.Clear;
  QryMB256PLUS.SQL.Text := 'Select * From MB256PLUS';
  if not QryMB256PLUS.Active then begin
    iError := 0;
    Repeat
      Try
        QryMB256PLUS.Open;
      Except
        on e : Exception Do begin
          sMessage := e.Message;
          Inc(iError);
          Application.ProcessMessages;
          Sleep(1000);
        end;
      end;
    until QryMB256PLUS.Active or (iError > 5); // <- bitte ausprobieren, ob 5 reicht oder eventuell höher sein muss.
    if iError > 5 then begin
      ShowMessage('Die Datenbank konnte mit ' + IntToStr(iError) + ' Versuchen nicht geöffnet werden.'
      + #13 + 'Die letzte Fehlermeldung lautete: ' + sMessage);
      Application.Terminate; // <- oder sonstige Fehlerbehandlung.
    end;
  end;
    VST.BeginUpdate;
    VST.Clear;
    QryMB256PLUS.Last;
    PBFortschritt.Max := QryMB256PLUS.RecordCount;

    for IAnzahl := 0 to 4000 do
      begin
        QryMB256PLUS.Prior;
      end;

    while not QryMB256PLUS.EOF do
      begin
        Daten := TOMB256PLUS.Create;
          with Daten do
            begin
              Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger;
              Daten.LfdNr := QryMB256PLUS.FieldByName('LfdNr').AsInteger;
              Daten.Datum := QryMB256PLUS.FieldByName('Datum').AsString;
              Daten.Uhrzeit := QryMB256PLUS.FieldByName('Uhrzeit').AsString;
              Daten.Ereignis := QryMB256PLUS.FieldByName('Ereignis').AsString;
              Daten.Teilnehmer := QryMB256PLUS.FieldByName('Teilnehmer').AsString;
              Daten.Bereich := QryMB256PLUS.FieldByName('Bereich').AsString;
            end;
          VST.AddChild(nil,Daten);

          if PBFortschritt.Visible = False then
          PBFortschritt.Visible := true;
          PBFortschritt.Position := QryMB256PLUS.RecNo;

          QryMB256PLUS.Next;
        end;
      VST.EndUpdate;
      VST.ScrollIntoView(VST.GetLast, true);

      with QryMB256PLUS do begin
      QryMB256PLUS.SQL.Clear;

      QryMB256PLUS.SQL.Text := 'SELECT FIRST 5 * FROM MB256PLUS WHERE EREIGNIS = :Ereignis';
      QryMB256PLUS.ParamByName('Ereignis').asString:= 'Einbruch';


      QRYMB256PLUS.Open;
      while Not eof do
      begin
        CBAlarme.Items.Add(FieldByName('Ereignis').AsString);
        QryMB256PLUS.Next;
      end;
      QryMB256PLUS.Active := false;
      QryMB256PLUS.Close;
      end;
      CBAlarme.ItemIndex := 1;
      PBFortschritt.Visible := false;
      MMStatus.Text := 'Datenbank geladen';
      MMStatus.Color := clLime;
      QryMB256PLUS.Close;
  end;
end;
Gruß Jens

Jens Hartmann 31. Mär 2009 22:06

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
So, ich habe jetzt mal in bißchen mit IBExpert getestet, und kann da in meiner Tabelle alle Filter sauber setzten. Dann habe ich aus IBExpert die Where Bedinung kopiert und in Delphi eingefügt. Jetzt auch mein kompilieren Fehlerfrei und die SQL Abfrage wird durchgeführt.

Leider ohne Ergebnismenge. Hier mal der aktuelle Code...
Delphi-Quellcode:
      with QryMB256PLUS do begin
      QryMB256PLUS.SQL.Clear;

      QryMB256PLUS.SQL.Text := 'SELECT FIRST 5 * FROM MB256PLUS WHERE ("Ereignis") STARTING WITH :Ereignis';
      QryMB256PLUS.ParamByName('Ereignis').asString:= 'Sabotage';
      while Not eof do
      begin
        CBAlarme.Items.Add(FieldByName('Ereignis').AsString);
        QryMB256PLUS.Next;
      end;
      QryMB256PLUS.Active := false;
      QryMB256PLUS.Close;
      end;
Gruß Jens

omata 31. Mär 2009 23:34

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Wann öffnest du denn die Datenmenge?

Delphi-Quellcode:
  QryMB256PLUS.SQL.Text :=
    'SELECT FIRST 5 *'#13 +
    'FROM MB256PLUS'#13 +
    'WHERE ereignis STARTING WITH :Ereignis';

  QryMB256PLUS.ParamByName('Ereignis').asString:= 'Sabotage';
  QryMB256PLUS.Open;
  while not QryMB256PLUS.Eof do
  begin
    CBAlarme.Items.Append(QryMB256PLUS.FieldByName('Ereignis').AsString);
    QryMB256PLUS.Next;
  end;
  QryMB256PLUS.Close;

Jens Hartmann 1. Apr 2009 05:28

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Nur beim starten des Programm´s, die Aktuallisierung der Infoboxen, mache ich im laufe des Programm´s dann über den direkten Datenausausch. Dieser wird aber erst gestartet, wenn ich eine Verbindung zu der entsprechenden Hardware herstelle.

Jens Hartmann 1. Apr 2009 12:01

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Ich hab das ganze jetzt noch weiter getestet. Ich habe zwar keine Fehler mehr, aber auch keine Datenmenge. Ich habe auch schon so Sachen mit UPPER und so getestet. Geht irgendwie alles nicht.

Frage ich allerdings den gesamten Datensatz ab, mit einer Abfrage auf ID, dann geht das.

SQL-Code:
SELECT FIRST 5 * FROM MB256PLUS WHERE ID > 1
oder...

SQL-Code:
SELECT * FROM MB256PLUS WHERE ID = 1156
oder

SQL-Code:
SELECT FIRST 5 * FROM MB256PLUS WHERE ID < 100000
Gruß Jens

Jens Hartmann 1. Apr 2009 21:23

Re: Datenbankeinträge in ComboBoxen zur Anzeige bringen.
 
Doofheit muss gepachtet werden, und kann eine masse Nerven kosten. Man bin ich doof. Ohne Open kann das ja auch nicht funktionieren. Habe echt jetzt die ganze Zeit danach gesucht. Jetzt habe ich das OPEN auch wieder drin, und es wird auch wieder abgefragt. Leider aber noch immer mit dem SQL Fehler. Der Fehler kam ja zuvor nicht, Da ich ja kein OPEN hatte. Oh Mann....

Delphi-Quellcode:
  QryMB256PLUS.SQL.Text := 'SELECT FIRST 5 * FROM MB256PLUS WHERE ereignis STARTING WITH :Ereignis';
  QryMB256PLUS.ParamByName('Ereignis').asString:= 'Sabotage';
Delphi-Quellcode:
  QryMB256PLUS.Open;
Delphi-Quellcode:
  while not QryMB256PLUS.Eof do
  begin
    CBAlarme.Items.Append(QryMB256PLUS.FieldByName('Ereignis').AsString);
    QryMB256PLUS.Next;
  end;
  QryMB256PLUS.Close;
Hat den da noch jemand ne Idee.

Gruß vom Leitungssteher


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