![]() |
Datenbank: MySql • Zugriff über: SQL Query
Tabelle und DBGrid aus DB füllen
Hey Leute,
hoffe ihr könnt mir helfen. Ich benutze für ein FH Projekt Delphi 5 Pro und muss ein "kleines" Programm erweitern. Ich muss auf eine Datenbank verschiedene Sqlquerys ablassen um verschiedene statistische Daten zu erhalten. Z.B. Summe der Mitglieder. Dann soll das Ganze noch grafisch aufgearbeitet werden. Die Verbindung zur Datenbank besteht eigentlich permanent. Aber ich hab keine Ahnung welche Komponente ich für die Tabelle benutzen soll und wie die dann gefüllt wird, weil die Spalten unterschiedlich benannt werden müssen, je nachdem was abgefragt wird und somit auch unterschiedliche Anzahl an Spalten/Zeilen hat. Kann mir da jemand sagen wie das geht? Und dann soll aus dieser Tabelle dann ein Diagramm erzeugt werden. Für Hilfe wäre ich echt dankbar. |
Re: Tabelle und DBGrid aus DB füllen
Schau Dir doch mal Luckies Tutorial dazu an:
![]() Das sollte für den Einstieg und das Stellen detaillierterer Fragen reichen. Edit: Dann gibt es in Delphi noch standardmäßig einige datenbankgebundene Komponenten, die Du verwenden kannst, schau mal in die Gruppe Datensteuerung (oder so ähnlich). Sherlock |
Re: Tabelle und DBGrid aus DB füllen
Stichwort datengebundene Komponenten: Wenn du des Englischen mächtig bist, ist
![]() |
Re: Tabelle und DBGrid aus DB füllen
|
Re: Tabelle und DBGrid aus DB füllen
Kann es sein das Delphi es einfach nur nicht so mit MySQL hat? Dort wird immer nur MSQL aufgerufen. Muss man das für MySQL von Hand programmieren?
|
Re: Tabelle und DBGrid aus DB füllen
Es kommt darauf an, welche Zugriffskomponenten man verwendet.
|
Re: Tabelle und DBGrid aus DB füllen
Die Tutorials beziehen sich aber leider auf solche Komponenten wo kein Mysql drin steht.
:wall: |
Re: Tabelle und DBGrid aus DB füllen
Hallo,
> Die Verbindung zur Datenbank besteht eigentlich permanent. < Was hast du denn für eine "Verbindung". Wenn es eine Erweiterung ist, musst du doch wissen, wmit das bisher gemacht wurde, also wie kommen die Daten in die DB. Für so eine Anzeige brauchst du TDBGrid.DataSource -> TDataSource.DataSet -> TXXXQuery TXXXQuery kann was weiss ich was sein (TAdoQuery, TZQuery), kommt immer darauf an, wmit das Programm begonnen wurde. Heiko |
Re: Tabelle und DBGrid aus DB füllen
Delphi-Quellcode:
Das ist der code mit der die Verbindung hergestellt wird
function SQLVerbinden():boolean;
begin result := False; // FMysql Verbindungsparameter setzen loghinzufuegen('SQLVerbinden: SQL-Verbindung herstellen'); FMysql := TMysqlClient.create; fmysql.Host := strEinstellungenSQLServername; fmysql.Port := intEinstellungenSQLServerPort; fmysql.User := strEinstellungenSQLBenutzername; fmysql.Password := strEinstellungenSQLPasswort; fmysql.UseSSL := False; // noch ändern??? - DEBUG fmysql.Compress := True; bolEinstellungenAdministratorModus := false; // Administrator-Modus zurücksetzen, damit beim Start keine Anmeldung erfolgen kann fmysql.Db := ''; // Keine Datenbank bei Verbindungsaufbau auswaehlen // Versuchen DB-Server zu connecten if fmysql.connect then begin // Verbindung steht if fmysql.select_db(strEinstellungenSQLDatenbank) then begin loghinzufuegen('SQLVerbinden: Verbindung okay, DB "' + strEinstellungenSQLDatenbank + '" existiert'); end else begin loghinzufuegen('SQLVerbinden: Verbindung okay, DB "' + strEinstellungenSQLDatenbank + '" existiert jedoch nicht'); messagedlg('Die Verbindung zum Datenbankserver wurde hergestellt, die Datenbank "' + strEinstellungenSQLDatenbank + '" jedoch nicht gefunden. Bitte passen Sie die Programm-Einstellungen an.', mtError, [mbOK], 0); Exit; end; SQLEinstellungenLesen(); end else begin // Verbindung ist fehlgeschlagen - Fehlermeldung ausgeben loghinzufuegen('SQLVerbinden: SQL-Fehler: ' + fmysql.LastError); messagedlg('Die Verbindung zum Datenbankserver ist fehlgeschlagen.' + #10#13 + 'Grund: ' + fmysql.LastError + #10#13#10#13 + 'Bitte prüfen Sie die Datenbank-Zugangsdaten sowie Ihre Internet-/Netzwerkverbindung und ggf. die Einstellungen Ihrer Firewall.', mterror, [mbOK], 0); Exit; end; result := True; end; Edit: Kann auch gern das Programm zur Verfügung stellen per Mail wenns hilft |
Re: Tabelle und DBGrid aus DB füllen
Damit man Dir richtig helfen kann, wäre es interessant zu wissen, was TMysqlClient für eine Komponente ist.
Woher kommt die? P.S. Wenn Du alles umbauen kannst, würde ich Dir ZEOS-Komponenten für den Zugriff auf MySQL empfehlen. |
Re: Tabelle und DBGrid aus DB füllen
Alles Umbauen wäre schon ne riesen Arbeit wo mir leider die Zeit ausgehen würde.
Aber ich kann einfach ne 2te Verbindung zur Datenbank öffnen oder nicht? Ist zwar Programmiertechnisch nicht sauber, aber WAYNE. Hauptsache läuft. Ist für eine Tafel hier im Ort, die sind froh das die das so umsonst bekommen |
Re: Tabelle und DBGrid aus DB füllen
Hallo,
und womit werden Daten eingetragen ? Heiko |
Re: Tabelle und DBGrid aus DB füllen
Im hauptfenster werden Daten in Edit Felder eingegeben und dann eingetragen
Hoffe das hilft dir weiter :
Delphi-Quellcode:
procedure TfrmMain.KundeanlegenClick(Sender: TObject);
begin // Verbindung prüfen if FMySQL.Connected = false then begin LogHinzufuegen('Kunde anlegen: Keine SQL-Verbindung'); messagedlg(strMySqlKeineVerbindung,mterror,[mbok],0 ); end; frmKundeAnlegen.strKundennummer := ''; frmKundeAnlegen.Tag := 0; frmKundeAnlegen.ShowModal; if frmKundeAnlegen.Tag = 1 then BescheideAendernClick(Sender); end;
Delphi-Quellcode:
procedure TfrmMain.BescheideAendernClick(Sender: TObject);
var strKundennummer:string; begin // Verbindung prüfen if FMySQL.Connected = false then begin LogHinzufuegen('btnBescheideAendernClick: Keine SQL-Verbindung'); messagedlg(strMySqlKeineVerbindung,mterror,[mbok],0 ); end; strKundennummer := FeldAusGridLesen(frmmain.grdKunden, 'Kd.-Nr.'); if strKundennummer <> '' then begin frmBescheide.strKundennummer := strKundennummer; frmBescheidEinf.strKundennummer := strKundennummer; frmBescheide.ShowModal; frmmain.Refresh; frmmain.grdKundenClick(frmMain); // Aktualisieren end; end;
Delphi-Quellcode:
procedure TfrmMain.grdKundenClick(Sender: TObject); var intZaehler,intZaehlerZwei,intAnzahlGueltig, intAnzahlHauptkundeE,intAnzahlHauptkundeK,intAnzahlE,intAnzahlK,intAnzahlHauptkundeUngueltig,intAnzahlUngueltig:integer; strSpalte,strInhalt,strKundennummer,strAbfrage,strGueltigAb,strGueltigBis,strBescheidArt:string; objFeldDefinitionen:TMysql_FieldDef; ex:boolean; datDatum:TDateTime; fltUmsatz,fltZahlung,fltKundenSaldo:real; begin // Verbindung prüfen if FMySQL.Connected = false then begin LogHinzufuegen('grdKundenClick: Keine SQL-Verbindung'); messagedlg(strMySqlKeineVerbindung,mterror,[mbok],0 ); end; // Fenster rücksetzen FelderLeeren(); // Kundennummer im Grid suchen strKundennummer := FeldAusGridLesen(frmmain.grdKunden, 'Kd.-Nr.'); if strKundennummer = '' then begin LogHinzufuegen('grdKundenClick: Kundennummer konnte nicht aus Grid gelesen werden'); // messagedlg('Ein interner Fehler ist beim Abrufen der Kundendaten aufgetreten.' + #10#13 + 'Prüfen Sie die Datenbankverbindung und versuchen Sie es erneut.',mterror,[mbok],0 ); Exit; end; // Fortschritt zeigen frmmain.lblKunden.Caption := 'Lese Kundendaten...'; frmmain.lblKunden.Refresh; // Felder rücksetzen intAnzahlE := 0; intAnzahlK := 0; intAnzahlUngueltig := 0; intAnzahlHauptkundeE := 0; intAnzahlHauptkundeK := 0; // Kundenstammdaten lesen fltKundenSaldo := 0; strAbfrage := 'select Kundennummer,Nachname,Vorname,Strasse as Straße,Hausnummer,Postleitzahl,Ort as Wohnort,Geburtsdatum,Kunde_seit as "Kunde seit",Bezeichnung as Verteilstelle,Bemerkungen,Fruehere_Kundennummer as "Orts Kundennumer",Kundenkonto_Saldo from ' + strEinstellungenSQLTabellenKundenstamm + ' INNER JOIN ' + strEinstellungenSQLTabellenPLZ + ' ON ('+ strEinstellungenSQLTabellenKundenstamm +'.Postleitzahl_id = '+ strEinstellungenSQLTabellenPLZ +'.Postleitzahl_id) INNER JOIN ' + strEinstellungenSQLTabellenVerteilstellen +' ON (' + strEinstellungenSQLTabellenKundenstamm + '.Verteilstellen_Nr =' + strEinstellungenSQLTabellenVerteilstellen + '.Verteilstellen_Nr) where ('; strAbfrage := strAbfrage + 'Kundennummer="' + strKundennummer + '")'; LogHinzufuegen('grdKundenClick: SQL-Abfrage: ' + strabfrage); FResult := fmysql.query(strabfrage, True, ex); if (ex = True) and (fresult.rowscount > 0) then begin LogHinzufuegen('grdKundenClick: Resultat: OK, Kunden ' + inttostr(FResult.RowsCount) + ' Mal gefunden'); for intZaehler := 0 to fresult.FieldsCount - 1 do begin objFeldDefinitionen := fresult.FieldDef(intZaehler)^; strspalte := objFeldDefinitionen.name; strInhalt := fresult.FieldValue(intzaehler); loghinzufuegen('grdKundenClick: Verarbeite Kunden-Stammdaten ' + strspalte + ' / ' + strinhalt); try if strspalte = 'Vorname' then edtVorname.text := strinhalt; if strspalte = 'Nachname' then edtName.text := strinhalt; if strspalte = 'Postleitzahl' then edtPLZ.text := strinhalt; if strspalte = 'Wohnort' then edtWohnort.text := strinhalt; if strspalte = 'Straße' then edtStrasse.text := strinhalt; if strspalte = 'Hausnummer' then edtHausnr.text := strinhalt; if strspalte = 'Geburtsdatum' then begin edtGeburtsdatum.text := Transformdate(strinhalt,MysqlDateToDate); try strInhalt := Transformdate(strinhalt,MysqlDateToDate); // ############### DEBUG #################### // Datum vor 18 Jahren errechnen if FormatDateTime('dd.mm.', frmMain.dteDatum.date) = '29.02.' then begin // Schaltjahr datDatum := strtodate('28.02.' + inttostr(strtoint(FormatDateTime('yyyy', frmMain.dteDatum.date)) - 18)); end else begin datDatum := strtodate(FormatDateTime('dd.mm.yyyy', strtodate(FormatDateTime('dd.mm.', frmMain.dteDatum.date) + inttostr(strtoint(FormatDateTime('yyyy', frmMain.dteDatum.date)) - 18)))); end; // Datum vergleichen if isDatePlus(strInhalt) = True then begin // Datum prüfen if strtodate(strInhalt) > datDatum then begin // Kind/Jugendlicher unter 18 intAnzahlHauptkundeK := intAnzahlHauptkundeK + 1; LogHinzufuegen('grdKundenClick: Hauptkunde Kind/Jugendlicher'); end else begin // Erwachsener intAnzahlHauptkundeE := intAnzahlHauptkundeE + 1; LogHinzufuegen('grdKundenClick: Hauptkunde Erwachsener'); end; end else begin LogHinzufuegen('grdKundenClick: Hauptkunde - Datum ungültig'); intAnzahlHauptkundeUngueltig := intAnzahlHauptkundeUngueltig + 1; end; except LogHinzufuegen('grdKundenClick: Fehler beim Verarbeiten von Kunden-Daten'); end; end; if strspalte = 'Kundennummer' then edtKdnNr.text := strinhalt; if strspalte = 'Kunde seit' then edtKundeSeit.text := Transformdate(strinhalt,MysqlDateToDate); if strspalte = 'Verteilstelle' then edtVerteilstelle.text := strinhalt; if strspalte = 'Orts Kundennumer' then edtOertlKdnr.text := strinhalt; if strspalte = 'Bemerkungen' then begin mmoBemerkung.Lines.Clear; mmoBemerkung.Lines.text := BermerkungenDeKodieren(strInhalt); end; if strSpalte = 'Kundenkonto_Saldo' then fltKundenSaldo := StrToFloat(StringReplace(strinhalt, '.', ',', [])); except LogHinzufuegen('grdKundenClick: Fehler beim Verarbeiten von Kunden-Stammdaten'); end; end; end else begin LogHinzufuegen('grdKundenClick: Resultat: Fehler oder 0 Resultate - ' + fmysql.LastError); messagedlg('Ein Fehler ist beim Abrufen der Kundendaten aufgetreten.' + #10#13 + 'Prüfen Sie die Datenbankverbindung und versuchen Sie es erneut.',mterror,[mbok],0 ); end; mmoBemerkung.Perform(EM_LineScroll, 0 , 0); // Scrollbar nach oben rollen // Bescheid-Daten lesen frmmain.mmoBescheid.Clear; strAbfrage := 'select Bescheid_Art, Gueltig_Ab, Gueltig_Bis from ' + strEinstellungenSQLTabellenBescheide + ' where ('; strAbfrage := strAbfrage + 'Kundennummer="' + strKundennummer + '")'; LogHinzufuegen('grdKundenClick: SQL-Abfrage: ' + strabfrage); FResult := fmysql.query(strabfrage, True, ex); if (ex = True) and (fresult.rowscount > 0) then begin LogHinzufuegen('grdKundenClick: Resultat: OK, ' + inttostr(FResult.RowsCount) + ' Bescheide gefunden'); intAnzahlGueltig := 0; for intZaehler := 0 to fresult.RowsCount - 1 do begin fresult.RecNo := intZaehler; strGueltigAb := ''; strGueltigBis := ''; strBescheidArt := ''; for intZaehlerZwei := 0 to fresult.FieldsCount -1 do begin objFeldDefinitionen := fresult.FieldDef(intZaehlerZwei)^; strSpalte := objFeldDefinitionen.name; strInhalt := fresult.FieldValue(intZaehlerZwei); LogHinzufuegen('grdKundenClick: Verarbeiten Daten für Bescheid ' + IntToStr(intZaehler) + ' ' + strspalte + ' / ' + strinhalt); try if strspalte = 'Gueltig_Ab' then begin strInhalt := Transformdate(strinhalt,MysqlDateToDate); if isDatePlus(strInhalt) = true then begin strGueltigAb := strInhalt; end else begin LogHinzufuegen('grdKundenClick: Datum ungültig'); strGueltigAb := ''; end; end; if strspalte = 'Gueltig_Bis' then begin strInhalt := Transformdate(strinhalt,MysqlDateToDate); if isDatePlus(strInhalt) = true then begin strGueltigBis := strInhalt; end else begin LogHinzufuegen('grdKundenClick: Datum ungültig'); strGueltigBis := ''; end; end; if strspalte = 'Bescheid_Art' then strBescheidArt := strinhalt; except LogHinzufuegen('grdKundenClick: Fehler beim Verarbeiten von Bescheid-Daten'); end; end; strInhalt := inttostr(intZaehler + 1) + ': ' + strBescheidArt; if (isDatePlus(strGueltigAb) = True) then begin if strGueltigBis = '' then strGueltigBis := DateToStr(frmMain.dteDatum.date); if (StrToDate(strGueltigAb) <= frmMain.dteDatum.date) and (StrToDate(strGueltigBis) >= StrToDate(DateToStr(frmMain.dteDatum.date)) {frmMain.dteDatum.date}) then begin strInhalt := strInhalt + ' (gültig)'; intAnzahlGueltig := intAnzahlGueltig + 1; end else if (StrToDate(strGueltigAb) >= frmMain.dteDatum.date) and ((StrToDate(strGueltigBis) >= StrToDate(strGueltigAb)) or (StrToDate(strGueltigBis) = StrToDate(DateToStr(frmMain.dteDatum.date)))) then begin strInhalt := strInhalt + ' (noch nicht gültig)'; end else begin strInhalt := strInhalt + ' (abgelaufen)'; end; end else begin strInhalt := strInhalt + ' (Daten ungültig)'; LogHinzufuegen('grdKundenClick: Bescheid-Daten ungültig'); end; frmmain.mmoBescheid.Lines.Add(strInhalt); end; if intAnzahlGueltig = 0 then frmmain.mmoBescheid.Lines.Add('Fazit: Keine gültigen Bescheide gefunden.') else if intAnzahlGueltig = 1 then frmmain.mmoBescheid.Lines.Add('Fazit: ' + inttostr(intAnzahlGueltig) + ' gültiger Bescheid') else if intAnzahlGueltig > 1 then frmmain.mmoBescheid.Lines.Add('Fazit: ' + inttostr(intAnzahlGueltig) + ' gültige Bescheid'); end else begin LogHinzufuegen('grdKundenClick: Resultat: Fehler oder 0 Resultate - ' + fmysql.LastError); frmmain.mmoBescheid.Lines.Add('(keine Bescheide erfasst)'); // messagedlg('Ein Fehler ist beim Abrufen der Bescheide aufgetreten.' + #10#13 + 'Prüfen Sie die Datenbankverbindung und versuchen Sie es erneut.',mterror,[mbok],0 ); end; mmoBescheid.Perform(EM_LineScroll, 0 , mmoBescheid.Lines.Count-1); // Scrollbar nach oben rollen // Weitere-Personen-Daten lesen frmmain.edtAnzErw.text := '0'; frmmain.edtAnzKinder.text := '0'; strAbfrage := 'select Geburtsdatum from ' + strEinstellungenSQLTabellenFamilienmitglieder + ' where ('; strAbfrage := strAbfrage + 'Kundennummer="' + strKundennummer + '")'; LogHinzufuegen('grdKundenClick: SQL-Abfrage: ' + strabfrage); FResult := fmysql.query(strabfrage, True, ex); if (ex = True) and (fresult.rowscount > 0) then begin LogHinzufuegen('grdKundenClick: Resultat: OK, ' + inttostr(FResult.RowsCount) + ' weitere Personen gefunden'); for intZaehler := 0 to fresult.RowsCount - 1 do begin fresult.RecNo := intZaehler; for intZaehlerZwei := 0 to fresult.FieldsCount -1 do begin objFeldDefinitionen := fresult.FieldDef(intZaehlerZwei)^; strSpalte := objFeldDefinitionen.name; strInhalt := fresult.FieldValue(intZaehlerZwei); LogHinzufuegen('grdKundenClick: Verarbeite Daten für weitere Person ' + IntToStr(intZaehler) + ' ' + strspalte + ' / ' + strinhalt); if strspalte = 'Geburtsdatum' then begin try strInhalt := Transformdate(strinhalt,MysqlDateToDate); // Datum vor 18 Jahren errechnen if FormatDateTime('dd.mm.', frmMain.dteDatum.date) = '29.02.' then begin // Schaltjahr datDatum := strtodate('28.02.' + inttostr(strtoint(FormatDateTime('yyyy', frmMain.dteDatum.date)) - 18)); end else begin datDatum := strtodate(FormatDateTime('dd.mm.yyyy', strtodate(FormatDateTime('dd.mm.', frmMain.dteDatum.date) + inttostr(strtoint(FormatDateTime('yyyy', frmMain.dteDatum.date)) - 18)))); end; // Datum vergleichen if isDatePlus(strInhalt) = True then begin // Datum prüfen if strtodate(strInhalt) > datDatum then begin // Kind/Jugendlicher unter 18 intAnzahlK := intAnzahlK + 1; LogHinzufuegen('grdKundenClick: Kind/Jugendlicher'); end else begin // Erwachsener intAnzahlE := intAnzahlE + 1; LogHinzufuegen('grdKundenClick: Erwachsener'); end; end else begin LogHinzufuegen('grdKundenClick: Datum ungültig'); intAnzahlUngueltig := intAnzahlUngueltig + 1; end; except LogHinzufuegen('grdKundenClick: Fehler beim Verarbeiten von Weitere-Kunden-Daten'); end; end; end; end; end else begin LogHinzufuegen('grdKundenClick: Resultat: Fehler oder 0 Resultate - ' + fmysql.LastError); // messagedlg('Ein Fehler ist beim Abrufen der weiteren Personen aufgetreten.' + #10#13 + 'Prüfen Sie die Datenbankverbindung und versuchen Sie es erneut.',mterror,[mbok],0 ); end; // Personen-Daten eintragen (inkl. ungültigen Hauptkunden- und Nebenkunden-Geburtstage) frmmain.edtAnzErw.text := inttostr(intAnzahlE + intAnzahlHauptkundeE); if (intAnzahlUngueltig > 0) or (intAnzahlHauptkundeUngueltig > 0) then frmmain.edtAnzErw.text := frmmain.edtAnzErw.text + ' (+' + inttostr(intAnzahlUngueltig + intAnzahlHauptkundeUngueltig) + '?)'; frmmain.edtAnzKinder.text := inttostr(intAnzahlK + intAnzahlHauptkundeK); // Umsatz-Daten eintragen frmmain.edtZuZahlen.text := Format('%f',[reaEinstellungenGebuehrErwachsener * (intAnzahlE + intAnzahlHauptkundeE + intAnzahlUngueltig + intAnzahlHauptkundeUngueltig) + reaEinstellungenGebuehrKind * (intAnzahlK + intAnzahlHauptkundeK)]); frmmain.edtHeuteKassiert.text := frmmain.edtZuZahlen.text; frmmain.edtNochOffen.text := Format('%f',[fltKundenSaldo]); // Fortschritt zeigen frmmain.lblKunden.Caption := 'Gefundene Kunden: ' + IntToStr(frmmain.grdKunden.RowCount - 1); // Fokus auf das Umsatz-Feld setzen try frmmain.edtHeuteKassiert.SetFocus; except end; end; |
Re: Tabelle und DBGrid aus DB füllen
Hallo,
ich fass mal zusammen, 1 ( ) der sieht wirklich so aus 2 ( ) die Formatierung ist verrutscht Im Fall vom 1 -> Grauenhaft Handschuhe anziehen und auf Sonderdeponie entsorgen Im Fall vom 2 -> Puh, Glück gehabt ;) Nu aber im Ernst´. Zurück zu 1. ;) eine Zeile ist mir aufgefallen
Delphi-Quellcode:
Hier wird also eine Query ausgeführt, deren Text in strabfrage steht,
FResult := fmysql.query(strabfrage, True, ex);
d.h. dieses fmysql.query muss in der Lage sein, Queries auszuführen (ExecSQL), dann mussirgendwie ja auch ein DataSet geöffnet werden können (.Open), was dann Ausgangfsbasis für ein DBGrid sein kann. Da würde ich mal beginnen. Mit dieser Query könnte man sich an eine DataSource.Dataset anbinden, aber ich habe echt keinen Nerv mehr heute (und morgen), mir diesen Code anzutun. Hänge mal das ganze Projekt als Zip oder Rar an, wenn es geht. Heiko |
Re: Tabelle und DBGrid aus DB füllen
Das sieht mir stark nach MySQL Direct aus.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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