Lazarus DBGrid Eintrag
Guten Tag,
Ich bin neu in diesem Forum und auch was das Programmieren angeht da ich eine Umschulung angefangen habe und mit Lazarus(2.2.4) Arbeite. Derzeit Programmiere ich einen Gaszähler mit MariaDB-10 und einem DBGrid, leider bekomme ich es aber nicht hin das mein Neu Eingetragener Wert ("Neu" im DBGrid) dann als Alter Stand in der nächen Reihe Eingetragen wird ("Stand" im DBGrid). Mein Code ist leider noch nicht so Gut/schön da ich noch reltiv am Anfang stehe. :lol: Über Hilfe würde ich micht sehr freuen. (Bild vom DBGrid Häng ich einfach mal an Genau wie den Code der bisher Zum Füllen des DBGrids Zuständig ist) https://s20.directupload.net/images/221107/xv6rlpso.png Mein Bisheriger Code:
Code:
MFG
//------------------------------------------------------------------------------
// SQL Table füllen (DBGrid) //------------------------------------------------------------------------------ begin with DB_Query_Eintragen do begin Application.ProcessMessages; Close; SQL.Clear; SQL.Text:='select * from daten'; ExecSQL; Active:=True; Edit; Last; zStand:=FieldByName('Stand').AsInteger; Append; //FieldByName('Stand').AsInteger:=FieldByName('Neu').AsInteger; FieldByName('Datum').AsDateTime:=Date; FieldByName('Zeit').AsString:=TimeToStr(Time); FieldByName('Name').AsString:=CbB_Name.Text; DB_Query_Eintragen.FieldByName('Stand').AsVariant:=0; x:=StrToInt(LbE_Zaehler.Text); FieldByName('Neu').AsVariant:=(x); y:=x-zStand; FieldByName('Neu').AsVariant:=StrToInt(LbE_Zaehler.Text); FieldByName('Verbrauch').AsVariant:=IntToStr(y); Post; Table_Daten.Refresh; Close; end; end; end; |
AW: Lazarus DBGrid Eintrag
Delphi-Quellcode:
Habe mal deinen Quelltext etwas überarbeitet und kommentiert, keine Ahnung, ob dadurch dein Problem gelöst werden kann.
begin
// Bisherige Abfrage schließen. DB_Query_Eintragen.Close; // Neues Statement zuweisen. // Ohne Order By ist die Reihenfolge eher zufällig. // Eventuell select * from daten order by Datum, Zeit? DB_Query_Eintragen.SQL.Text := 'select * from daten'; // Abfrage öffnen DB_Query_Eintragen.Open; // Zum letzten Satz gehen, ohne Order By nicht zwingend der höchste, Stand, // das neueste Datum, sondern nur das, was die Datenbank zufällig als Letztes liefert. DB_Query_Eintragen.Last; // Berechnungen durchführen // Der Wert von Neu aus dem letzten Datensatz wird im neuen Datensatz der Wert für Stand. zStand := DB_Query_Eintragen.FieldByName('Neu').AsInteger; xZaehlerstand := StrToInt(LbE_Zaehler.Text); yVerbrauch := xZaehlerstand - zStand; // neuen Datensatz einfügen und Werte zuweisen DB_Query_Eintragen.Append; DB_Query_Eintragen.FieldByName('Datum').AsDateTime := Date; // Warum Datum als TDateTime und Zeit als String? DB_Query_Eintragen.FieldByName('Zeit').AsString := TimeToStr(Time); // oder DB_Query_Eintragen.FieldByName('Zeit').AsDateTime := Time; DB_Query_Eintragen.FieldByName('Name').AsString := CbB_Name.Text; DB_Query_Eintragen.FieldByName('Stand').AsInteger := zStand; DB_Query_Eintragen.FieldByName('Neu').AsInteger := xZaehlerstand; DB_Query_Eintragen.FieldByName('Verbrauch').AsInteger := yVerbrauch; // und Daten speichern. DB_Query_Eintragen.Post; // Abfrage schließen. DB_Query_Eintragen.Close; // Welcher Zusammenhang besteht zwischen // der Abfrage DB_Query_Eintragen, Table_Daten und dem DBGrid? Table_Daten.Refresh; end;
Delphi-Quellcode:
nutze ich nur, wenn ich den Datentyp nicht kenne.
.AsVariant
Wenn x ein Integer ist, ist eine Zuweisung der Art
Delphi-Quellcode:
, nicht zwingend sinnvoll, da ist
.AsVariant := x
Delphi-Quellcode:
bessert, dito. natürlich auch für Strings, ...
.AsInteger := x
Mit welcher Datenbankkomponente ist das DBGrid verbunden? Mit DB_Query_Eintragen oder mit Table_Daten. Welche Daten enthält überhaupt Table_Daten? Sollte das DBGrid mit DB_Query_Eintragen verbunden sein, muss
Delphi-Quellcode:
entfallen, da dadurch die Datenmenge geschlossen wird und damit keine Anzeige im DBGrid möglich ist.
DB_Query_Eintragen.Close;
|
AW: Lazarus DBGrid Eintrag
Vielen Dank Für deine Hilfe und die Tipps mit der Zuweisung,
Ich werde es Gleich Testen und ein Feedback geben. Das DBGrid ist derzeit mit der DataSource (Unter Eigenschaften) Verbunden ( Ich häng mal ein Screenshot und den Gesamten Komponenten auf dem Desinger an :-D) https://s20.directupload.net/images/221108/9vbeyuh4.png Hier mal der Komplett Code.
Code:
MFG Davidvar x : Integer; y : Integer; zStand : Integer; begin //------------------------------------------------------------------------------ //Zählerstand darf nicht Leer sein! //------------------------------------------------------------------------------ begin if (LbE_Zaehler.Text='') then begin ShowMessage('Bitte Zählerstand Eintragen.'); end; end; //------------------------------------------------------------------------------ // ComboBox mit namen Darf nicht Frei Sein! //------------------------------------------------------------------------------ begin if (CbB_Name.Text='') then begin ShowMessage('Bitte Namen Auswählen.'); end; end; //------------------------------------------------------------------------------ // SQL Table füllen (DBGrid) //------------------------------------------------------------------------------ begin with DB_Query_Eintragen do begin Application.ProcessMessages; Close; SQL.Clear; SQL.Text:='select * from daten'; ExecSQL; Active:=True; Edit; Last; zStand:=FieldByName('Stand').AsInteger; Append; //FieldByName('Stand').AsInteger:=FieldByName('Neu').AsInteger; FieldByName('Datum').AsDateTime:=Date; FieldByName('Zeit').AsString:=TimeToStr(Time); FieldByName('Name').AsString:=CbB_Name.Text; DB_Query_Eintragen.FieldByName('Stand').AsVariant:=0; x:=StrToInt(LbE_Zaehler.Text); FieldByName('Neu').AsVariant:=(x); y:=x-zStand; FieldByName('Neu').AsVariant:=StrToInt(LbE_Zaehler.Text); FieldByName('Verbrauch').AsVariant:=IntToStr(y); Post; Table_Daten.Refresh; Close; end; end; end; |
AW: Lazarus DBGrid Eintrag
Ich hab es jetzt Getestet und es Funktioniert Einwandfrei.
Also Nochmal Vielen Dank für deine Hilfe Delphi.Narium. :-D :thumb: |
AW: Lazarus DBGrid Eintrag
Moin...8-)
Zitat:
|
AW: Lazarus DBGrid Eintrag
Moin :)
Zitat:
|
AW: Lazarus DBGrid Eintrag
Zitat:
Wenn du das wirklich lernen willst, nehme ich mir die Zeit dir die Fehler, unabhängig von der Funktion, in deinem Code zu erklären. Sag Bescheid...:wink: Bitte lade mal das komplette Projekt als ZIP hoch. :wink: PS: Wenn du das durchgearbeitet hast, siehst du selbst einige Fehler. :zwinker: https://www.delphi-treff.de/object-pascal/styleguide/ PS: Bilder bitte nicht als Link sondern als Anhang direkt hier anhängen. |
AW: Lazarus DBGrid Eintrag
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das Angebot würde ich sehr gerne Annehmen, Ich möchte es Richtig Lernen und später auch Richtig und Sauber Umsetzen können. Vielen Dank schonmal :) Zitat:
Zitat:
Projekt hab ich mit Angehangen |
AW: Lazarus DBGrid Eintrag
Hallöle...8-)
Ich werde dein Projekt mal mit Anmerkungen versehen. Da ich auch arbeiten muß, klappt das nicht gleich. :wink: Wenn du das durchgearbeitet hast, stellt du das Ergebnis mal hier online. (ZIP) PS: Auf den ersten Blick ist dein Code nicht so schlimm. :thumb: Du hast aber mindestens 3 Logicfehler drin. Stichwort: Btn_EintragenClick(Sender: TObject). Schau dir das mal genauer an. :wink: |
AW: Lazarus DBGrid Eintrag
Okay mach ich :D
Bin schon dabei, könnte gegeben falls bei mir aber auch noch ein Moment Dauern :lol: Oh Danke ich schau mir das gleich mal an und guck ob ich die Logikfehler direkt finde. |
AW: Lazarus DBGrid Eintrag
Liste der Anhänge anzeigen (Anzahl: 1)
So Ich hab mal versucht das ganze mit der Hilfe des Guides etwas zu verschönern und Übersichtlicher zu machen. :-D
Ich weiß nicht ob du Die Fehler die ich Gefunden habe mit Logikfehler meinst aber ich hab gesehen das es einen Fehler gibt wenn ich den Zählerstand leer lasse wenn das Programm Läuft. :roll: Dann hab ich noch den Fehler gefunden das er den Eintrag trotzdem macht auch wenn kein Name aus der Combobox ausgewählt ist. Behoben hab ich das leider Bisher noch nicht da setz ich mich Morgen mal dran. :) In den Anhang pck ich mal den Verschönerten Code. |
AW: Lazarus DBGrid Eintrag
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöle...8-)
Anbei die Bemerkungen... |
AW: Lazarus DBGrid Eintrag
Vielen Vielen Dank haentschman!:-D
Ich hab meinen Code noch etwas angepasst und mit dem Guide und deinen Tipps/Hilfe Lesbarer gemacht. Das hat mir extrem geholfen auch nochmal etwas mehr Verständnis dafür zu bekommen. Danke das du dir die Zeit genommen hast :) Eine Frage hätte ich noch, Ich hab ja die Procedure von dem Edit Feld mit der Passwort Eingabe. Ich steh grade etwas auf dem Schlauch und frage mich ob ich das noch etwas Sauberer schreiben könnte da ich mehrere Buttons erst nach Eingabe das Passwortes sichtbar machen möchte.
Code:
MFG
procedure TForm1.EditPasswortChange(Sender: TObject);
begin EditPasswort.PasswordChar:= #0; EditPasswort.PasswordChar:= '*'; if (EditPasswort.Text ='test123') then BtnMinimieren.Visible:=True else BtnMinimieren.Visible:=False; if (EditPasswort.Text ='test123') then BtnSchliessen.Visible:=True else BtnSchliessen.Visible:=False; if (EditPasswort.Text ='test123') then BtnNewDb.Visible:=True else BtnNewDb.Visible:=False; end; David |
AW: Lazarus DBGrid Eintrag
.. du kannst das mit begin end zusammenfassen.
Delphi-Quellcode:
if (EditPasswort.Text ='test123') then
begin BtnMinimieren.Visible:=True; BtnSchliessen.Visible:=True; BtnNewDb.Visible:=True; end else begin BtnMinimieren.Visible:=False; BtnSchliessen.Visible:=False; BtnNewDb.Visible:=False; end; |
AW: Lazarus DBGrid Eintrag
Vielen Danke Klaus :)
|
AW: Lazarus DBGrid Eintrag
Alternative:
Delphi-Quellcode:
oder
procedure TForm1.EditPasswortChange(Sender: TObject);
begin EditPasswort.PasswordChar := #0; EditPasswort.PasswordChar := '*'; BtnMinimieren.Visible := (EditPasswort.Text = 'test123'); BtnSchliessen.Visible := (EditPasswort.Text = 'test123'); BtnNewDb.Visible := (EditPasswort.Text = 'test123'); end;
Delphi-Quellcode:
oder
procedure TForm1.EditPasswortChange(Sender: TObject);
begin EditPasswort.PasswordChar := #0; EditPasswort.PasswordChar := '*'; // Es reicht, diesen Vergleich einmal zu machen. BtnMinimieren.Visible := (EditPasswort.Text = 'test123'); BtnSchliessen.Visible := BtnMinimieren.Visible; BtnNewDb.Visible := BtnMinimieren.Visible; end;
Delphi-Quellcode:
function PruefePasswort(AEingabe, APasswort : String) : Boolean;
begin // Hier könnte man später auch eine beliebige Prüflogik implementieren. Result := AEingabe = APasswort; end; procedure TForm1.EditPasswortChange(Sender: TObject); begin EditPasswort.PasswordChar := #0; EditPasswort.PasswordChar := '*'; BtnMinimieren.Visible := PruefePasswort(EditPasswort.Text,'test123'); BtnSchliessen.Visible := BtnMinimieren.Visible; BtnNewDb.Visible := BtnMinimieren.Visible; end; |
AW: Lazarus DBGrid Eintrag
Keine Ahnung, ob das unter Lazarus funktioniert, aber so oder ähnlich würde ich es wohl machen:
Delphi-Quellcode:
P.S.: das PasswordChar kann man direkt im Objektinspektor setzen und muss das nicht immer wieder tun.
type
TForm1 = class(TForm) edtPassword: TEdit; btnBla: TButton; btnBlubb: TButton; btnWuppdi: TButton; procedure FormCreate(Sender: TObject); procedure edtPasswordChange(Sender: TObject); ... private { Private-Deklarationen } FButtons: array of TButton; function PasswordValid(const APassword: string): Boolean; ... end; ... procedure TForm1.edtPasswordChange(Sender: TObject); var i: integer; begin for i := Low(FButtons) to High(FButtons) do FButtons[i].Visible := PasswordValid(edtPassword.Text); end; procedure TForm1.FormCreate(Sender: TObject); begin FButtons := [btnBla, btnBlubb, btnWuppdi]; end; function TForm1.PasswordValid(const APassword: string): Boolean; begin Result := APassword = 'test123'; end; |
AW: Lazarus DBGrid Eintrag
Um die Passwortprüfung nur einmal machen zu müssen:
Delphi-Quellcode:
Je nachdem wie die Prüfung des Passwortes erfolgt (z. B. Abgleich mit Daten in einer Datenbank), kann es schon sinnvoll sein, die Prüfung des Passwortes nur einmalig vorzunehmen.
procedure TForm1.edtPasswordChange(Sender: TObject);
var i : integer; bOk : Boolean; begin bOk := PasswordValid(edtPassword.Text); for i := Low(FButtons) to High(FButtons) do FButtons[i].Visible := bOk; end; |
AW: Lazarus DBGrid Eintrag
Vielen Dank euch allen,
ich werde es alles mal Durchtesten und schauen was am besten für das Projekt Passt. :-D |
AW: Lazarus DBGrid Eintrag
Guten Tag,
Ich Hoffe das ist Okay das ich hier drin einfach meine Nächste Frage stelle. :D und zwar würde ich gern das DBGrid einmal als CSV Exportieren und später Importieren. Mit Hilfe des Internets hab ich den Export als CSV schon "Fertig".
Code:
Mein Problem ist das ich den Import einfach nicht Hinbekomme. :s
//==============================================================================
procedure TForm1.btnCsvExportClick(Sender: TObject); //============================================================================== var sInhalt:string; fDatei:textfile; begin assignfile(fDatei,'C:\Lazarus_Projekte\DB_Gaszähler\DBDaten.csv'); rewrite(fDatei); TableDaten.First; while not TableDaten.EOF do begin sInhalt:='"' + TableDaten.FieldByName('idDaten').AsString +'",'; sInhalt:=sInhalt + '"' + TableDaten.FieldByName('Datum').AsString +'"'; sInhalt:=sInhalt + '"' + TableDaten.FieldByName('Zeit').AsString +'",'; sInhalt:=sInhalt + '"' + TableDaten.FieldByName('Name').AsString +'"'; sInhalt:=sInhalt + '"' + TableDaten.FieldByName('Stand').AsString +'"'; sInhalt:=sInhalt + '"' + TableDaten.FieldByName('Neu').AsString +'"'; sInhalt:=sInhalt + '"' + TableDaten.FieldByName('Verbrauch').AsString +'"'; WriteLn(fDatei, sInhalt); TableDaten.next; end; closefile(fDatei); end; Es sollte am besten per Button in mein DBGrid. Würde mich sehr über weitere Hilfe Freuen. MfG David |
AW: Lazarus DBGrid Eintrag
Falls du nur CSV Daten in deinem Grid nur anzeigen möchtest, dann kannst du in Lazarus das TCSVDataset dazu verwenden.
Falls du aber die Daten auch in deine DB importieren möchtest, dann müsstest du erst die Daten in die Datenbank importieren und dann über die DB die Daten in deinem Grid anzeigen. Mir ist leider noch nicht ganz klar was du mit den Daten machen möchtest, deswegen kann ich dir wahrscheinlich nur teilweise helfen. |
AW: Lazarus DBGrid Eintrag
Das ganze soll Als Backup gedacht sein falls mal mit der Datenbank etwas schiefläuft, so dass ich die CSV als Backup-Datei habe und sie in dem Fall nur "Neu" Laden/Importieren muss.
Also sollten die Daten aus der CSV in die Datenbank importiert werden wenn ich den Button zum laden/Importieren Drücke.(Nur leider sind da meine Probleme das ich nicht weiß wie ich das genau Anstelle :s) Das ganze Projekt ist ein Gaszähler welcher später auf einem RaspberryPi (als Tablet) Laufen soll. MfG David |
AW: Lazarus DBGrid Eintrag
Im 2. post dieses Threads gab es ja schon mal eine Erklärung wie du Daten in die Datenbank eintragen kannst. Ich würde aus den CSV Daten einen SQL Insert Befehl generieren.
SQL-Befehl: INSERT INTO Tabelle (Spalte1, Spalte2, ...) VALUES (value1, value2, ..)
|
AW: Lazarus DBGrid Eintrag
Zitat:
Grüße Klaus |
AW: Lazarus DBGrid Eintrag
Hallöle...8-)
Zitat:
https://mariadb.com/kb/en/backup-and-restore-overview/ https://mariadb.com/kb/en/mariabackup-overview/ |
AW: Lazarus DBGrid Eintrag
Danke für eure Tipps ich werde mir das nochmal Überlegen und mir zu den Backup und Restore Durchlesen und dann etwas weiter rumprobieren in der Hoffnung das ich das dann Hinbekomme.^^
(Leider bin ich im Umgang mit SQL immer noch nicht so Bewandert. :( ) |
AW: Lazarus DBGrid Eintrag
PS: Welches Admin Tool benutzt du? HeidiSQL?
|
AW: Lazarus DBGrid Eintrag
Genau ich benutze HeidiSQL.
|
AW: Lazarus DBGrid Eintrag
Das kann doch HeidiSQL...
https://www.google.de/search?q=heidi...client=gws-wiz |
AW: Lazarus DBGrid Eintrag
Guten Morgen,
Ich hab mal ne Frage kann mir jemand bei dem backup SQL statement Helfen?(ich würde das gern um die SQL statements besser zu lernen erstmal über die Statements machen wollen) Leider Funktioniert der SQL Befehel in Heidi SQL nicht.
Code:
wenn ich versuche in HeidiSQL diesen Befehel Auszuführen bringt er immer
USE gasdaten; GO BACKUP DATABASE gasdaten TO DISK = 'c:\tmp\gasdaten.bak'
Zitat:
Ich benutze derzeit MariaDB 10.6.10. MfG David |
AW: Lazarus DBGrid Eintrag
.. für MariaDb gibt es doch ein eigenes Backup/Restore Tool
Dies kannst Du doch per shellExecute o.ä. aufrufen. Grüße Klaus |
AW: Lazarus DBGrid Eintrag
Ich hab das jetzt einfach per ShellExecute gemacht.
Danke Klaus01 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 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