![]() |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Die Routine würd' ich noch ein bisserl allgemeiner machen:
Delphi-Quellcode:
Oder noch allgemeiner:
var
i : Integer; Item : TListItem; begin lvBarcodes.Items.Clear; QueryBarcodes.SQL.Text := 'SELECT ID, Produktname, Hersteller, Inhalt, Lieferant, Preis, Barcode, Kommentar FROM barcodes'; QueryBarcodes.Open; // schreiben der Daten aus der Datenbank "barcodes" in die Listview while not QueryBarcodes.Eof do begin Item := lvBarcodes.Items.Add; // Name // Der Wert der ersten Ergebnisspalte kommt nach Caption, // die übrigen Spalten werden in der Reihenfolge, // in der sie im SQL stehen, übernommen. // Damit werden wir bei der Datenübernahme unabhängig vom // Inhalt der Datenmenge. Item.Caption := QueryBarcodes.Fields[0].AsString; for i := 1 to QueryBarcodes.Fields.Count - 1 do begin Item.SubItems.Add(QueryBarcodes.Fields[i].AsString); end; QueryBarcodes.Next; end; // außerhalb der Schleife. Imho ist Close nicht notwendig. Mit Zuweisung von "SQL.Text" und dem Open wird Close automatisch augeführt. // Aber eine Datenmenge dann, wenn man sie nicht mehr benötigt, zu schließen, ist auch nicht unbedingt verkehrt. QueryBarcodes.Close; end;
Delphi-Quellcode:
Aufruf:
procedure DataSetToListView(ds : TDataSet; lv : TListView);
var i : Integer; iCount : Integer; isActive : Boolean; Item : TListItem; begin lv.Items.Clear; // Ist die Datenmenge offen? // Wenn nein, öffnen wir sie, // ansonsten gehen wird zum ersten Datensatz. isActive := ds.Active; if not isActive then ds.Open else ds.First; // Man könnte sich auch noch den aktuellen Satz merken. iCount := ds.Fields.Count - 1; while not ds.EoF do begin Item := lv.Items.Add; Item.Caption := ds.Fields[0].AsString; for i := 1 to iCount do Item.SubItems.Add(ds.Fields[i].AsString); ds.Next; end; // Haben wir die Datenmenge selbst geöffnet, schließen wir sie auch wieder. if not isActive then ds.Close else ds.First; // oder zum ggfls. gemerkten Satz zurückgehen. end;
Delphi-Quellcode:
QueryBarcodes.SQL.Text := 'SELECT ID, Produktname, Hersteller, Inhalt, Lieferant, Preis, Barcode, Kommentar FROM barcodes';
DataSetToListView(QueryBarcodes,lvBarcodes); // Weitere Datenmengen, wenn Bedarf besteht: QueryIrgendwas.SQL.Text := 'select Name, Strasse, Ort form irgendeinertabelle'; DataSetToListView(QueryIrgendwas,lvIrgendwas); ... |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Moin...:P
@nahpets: Zitat:
In deinem Beispiel:
Delphi-Quellcode:
...hast du etwas nicht berücksichtigt:
procedure DataSetToListView(ds : TDataSet; lv : TListView);
var i : Integer; iCount : Integer; isActive : Boolean; Item : TListItem; begin lv.Items.Clear; // Ist die Datenmenge offen? // Wenn nein, öffnen wir sie, // ansonsten gehen wird zum ersten Datensatz. isActive := ds.Active; if not isActive then ds.Open else ds.First; // Man könnte sich auch noch den aktuellen Satz merken. iCount := ds.Fields.Count - 1; while not ds.EoF do begin Item := lv.Items.Add; Item.Caption := ds.Fields[0].AsString; for i := 1 to iCount do Item.SubItems.Add(ds.Fields[i].AsString); ds.Next; end; // Haben wir die Datenmenge selbst geöffnet, schließen wir sie auch wieder. if not isActive then ds.Close else ds.First; // oder zum ggfls. gemerkten Satz zurückgehen. end; 1. Spaltennamen. Da die Klartextnamen der Spalten im DataSet nicht vorhanden sind, mußt du die anders "lagern" 2. Die Reihenfolge der Spalten ist von der Reihenfolge der Spalten in der DB abhängig. Für mich ein NoGo. Letztendlich kann man diese Probleme auch lösen. Das erzeugt imho mehr Aufwand als der klassische Weg und verstößt damit gegen das KISS Prinzip. :zwinker: |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Zitat:
Die Reihenfolge wir durch das Select-Statement bestimmt. Und hier kannst Du auch gleich die Feldnamen "sprechender" gestalten. z.b.
SQL-Code:
Was bei mehrsprachigen Anwendungen allerdings ein NoGo ist.
"select ID, Firstname as Vorname, Familyname as Familienname ..."
Gruß K-H |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
@haentschman
Naja, war halt nur ein Beispiel für: Wenn es sehr unabhängig sein soll. Spaltennamen stehen im DataSet schon drin:
Delphi-Quellcode:
Wenn ich die brauche, komm ich da auch problemlos dran.
DataSet.Fields[FeldNr].FieldName
Und die Spaltennamen sind nicht von der Reihenfolge in der DB abhängig, sondern von der Reihenfolge im SQL. Hier kann ich sie also durchaus ganz klar, so wie in Deinem Beispiel, bestimmen. Eine "Zufallsreihenfolge" erhalte ich nur bei einem
Delphi-Quellcode:
.
select * from Tabelle
Für mich ist es ein NoGo, wenn in der Anzeige die Spaltenreihenfolge fest vorgegeben ist. Die soll der Anwender, wenn möglich, selbst bestimmen können. Seine persönliche Konfiguration wird beim Programmende gespeichert und beim Neustart wieder hergestellt. Zugegeben: Bisher bin ich noch nicht auf die Idee gekommen, Daten aus 'ner Datenbank in 'nem Listview darzustellen, da nehme ich lieber ein Grid, aber das ist sicherlich eine persönliche Ansicht. Je nach Aufgabe mag es sehr unterschiedliche, sinnvolle und praktikable Lösungsmöglichkeiten für die Darstellung der Daten geben. @p80286 Da bei mir für gewöhnlich SQL-Statements nicht fest verdrahtet in der Anwendung stehen, sondern in 'ner Datenbanktabelle (um darüber auch eine Datenbankunabhängigkeit einfacher realisieren zu können), habe ich mit Deinem Vorschlag sogar die recht einfache Möglichkeit, sprachunabhängig zu sein, indem ich die Spaltennamen eben so, wie Du es vorschlägst, an die Anzeigesprache anzupassen. Was dann allerdings nicht geht, ist: Im Programm die Spalten über FieldByName anzusprechen, das geht dann gewaltig schief ;-) Aber da Anzeige und sonstige Datenzugriffe getrennt sind, ist das kein unlösbares Problem. |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Hallöle...:P
Zitat:
Trotzdem muß ich nicht beim "Design" des SQL darübernachdenken in welcher Reihenfolge die Daten angezeigt werden. Das hat das Statement nicht zu interessieren. :roll: Und wie machst du das wenn nicht ALLE Felder angezeigt werden sollen...aber trotzdem mit geladen werden sollen? Hilfsfelder etc.? :gruebel: Zitat:
Zitat:
|
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Für die Anzeige lade ich nur die Daten, die für die Anzeige benötigt werden.
Ich käme nie auf die Idee Daten zu laden und davon dann nur eine Teilmenge anzuzeigen. Die anzuzeigenden Daten haben bei mir nichts mit den sonstigen Daten, die im Programmablauf benötigt werden, zu tuen. Ein Select * gibt es für mich bei Anzeigedaten nicht, da ich ja dann immer von der Tabellenstruktur in der Datenbank abhängig bin. Bei 'ner Umstrukturierung kann ich mit 'nem FieldByName und Select * immer scheitern. Wenn auf der Datenbank was geändert wird, kann ich im SQL immer mit Spaltenname as SoSollErBeiMirHeißen reagieren, mit dem * hab ich diese Möglichkeit nicht. Gehe mal davon aus, dass wir sehr unterschiedliche Ansatzweisen haben, beide haben ihre Berechtigung, die "ultimativ beste Lösung" gibt es meiner Meinung nach nicht. Sollten wir die hier finden wollen, weichen wir arg vom Thema ab. Daher: Lassen wir es gut sein. Es gibt mehrere Vorschläge, die die Ursprungsfrage beantworten. Welcher davon im konkreten Fall die sinnvollere und / oder bessere ist, möge der Fragesteller für sich entscheiden. |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Zitat:
|
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Weitere Alternative: Die Daten via Live-Binding vom DataSet automatisch in die Komponente schieben lassen.
Oder statt dem ListView direkt eine datensensitive Komponente (DBGrid) verwenden. Zitat:
SSL "kostenlos" gedownloaded oder so |
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
Wow:shock:
Bin gerade etwas erschlagen von den ganzen Antworten. Danke an alle und besonders an haentschman für seine ausführliche Erklärung:) Ich werde mich mit den Punkten nach und nach befassen. Ich finde es super dass du - einem Anfänger wie mir - so viel Zeit widmest und das niederschreibst. Ich versuche mir das Programmieren tatsächlich mit "learning by doing" beizubringen. Deshalb ist das bei mir ja auch ein wenig Kraut und Rüben. Teilweise ist der Code, den ich gepostet habe, auch ein wenig Trial and Error. Momentan habe ich einfach eine Vorstellung von dem, was mein Programm alles einmal können soll. Es ist nur für mich selbst und soll nie veröffentlicht werden. Es gibt ein Grundgerüst und das möchte ich nun nach und nach mit Funktionen füllen. Momentan ist die Datenbank dran aber es soll noch viel mehr folgen. Natrülich sagt mir vieles von dem, was ihr hier geschrieben habt, noch nicht viel. Wahrscheinlich fehlen mir noch viele Grundlagen aber ich glaube ich lerne mehr (und habe mehr Spaß daran) direkt loszulegen und aus meinen Fehlern zu lernen anstatt trocken nur Bücher zu wälzen. Es ist einfach ein super Gefühl wenn man einen Stunde an etwas gesessen hat und es schlussendlich so funktioniert, wie man das wollte:-D Ich werde als nächstes auf jeden Fall den einen oder anderen Tipp direkt umsetzen. z.B. meine Komponenten einheitlich und logisch zu benennen und Struktur in meinen Code zu bringen. Außerdem einige Funktionen "auszulagern" - also zu lernen wie das geht. Zitat:
|
AW: Problem Auslesen von MySQL und Ausgabe in ListViews
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 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