Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbank-Programmierung mit UPDATE (SQL) (https://www.delphipraxis.net/203464-datenbank-programmierung-mit-update-sql.html)

Reedx 19. Feb 2020 13:07

Datenbank: Access • Version: office 16 • Zugriff über: OLEB Provider Microsoft Jet

Datenbank-Programmierung mit UPDATE (SQL)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo :)
bin neu hier, deswegen entschuldige ich mich im Vorfeld, falls ich hier etwas schreibe, was schon tausend mal nachgefragt wurde. Zudem entschuldige ich mich, falls ich hier etwas falsch einstelle ..:lol:

Ich muss derzeit für die Schule ein Projekt erarbeiten mit Delphi 7 Enterprise und habe mich für ein Quiz entschieden. Nun möchte ich, dass der Admin bereits bestehende Fragen (aus meiner Datenbank) ändern kann. Die Fragen lasse ich in einer DBGrid darstellen, bestehend aus folgenden Spalten: ID Fach Schwierigkeit Frage L1 L2 L3 Lösung
Ich hab es folgend programmiert. Fehlermeldung kommt keine mehr! Allerdings wird die Änderung nicht ausgeführt und nicht in meiner Datenbank geändert. Die Art und Weise wie ich programmiere, hab ich so in der Schule gelernt. Zudem muss ich noch sagen, dass mir programmieren einfach nicht liegt und ich es auch nicht sonderlich mag. Bin aber trotzdem sehr stolz auf das bisher erreichte. :-D

Im Anhang hab ich noch ein Bild vom Formular eingefügt, zum besseren Vorstellen. Die erste Zeile hab ich provisorisch so eingegeben, um zu testen.

Delphi-Quellcode:
procedure TFormbearb.ButtonbearbClick(Sender: TObject);
var antw:integer; query:ANSIstring;
begin

if (EditID.Text='') and (EditFach.Text='') and (EditSchw.Text='') and (Editfr.Text='') and (Editl1.Text='') and (Editl2.Text='') and (Editl3.Text='') and (Editlr.Text='') then
     begin
     application.MessageBox('Bitte alle Felder ausfüllen','Fehler');
     end else
      begin
        antw:= MessageDlg('Frage wirklich bearbeiten? ',mtConfirmation,[mbyes,mbNo],0);
                                          //Message mit Fragezeichen, Möglk. Ja/Nein
        Datamodule1.ADOQuery4.SQL.Clear;
      if antw = mrYes then //mrYes - Benutzer auf yes
       begin //Frage bearbeiten
        query:= 'UPDATE Fragen SET Fach=' +quotedstr(Editfr.Text)+ ', Schwierigkeit='+quotedstr(Editschw.Text)+', Frage='+quotedstr(Editfr.Text)+', L1='+quotedstr(Editl1.Text)+', L2='+quotedstr(Editl2.Text)+', L3='+quotedstr(Editl3.Text)+', Lösung='+quotedstr(Editlr.Text)+' '+
                'WHERE ID= :ID';
        Datamodule1.ADOQuery4.SQL.Add(query);
        Datamodule1.ADOQuery4.ExecSQL;
        application.MessageBox('Frage wurde überarbeitet!','Meldung');
   end else
   begin
     application.MessageBox('Frage wird nicht überarbeitet!','Meldung');
   end;
   end;



end;

Klaus01 19. Feb 2020 13:27

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Die Bedingung welches Feld ein update erfahren soll, wo wird :ID mit einem Wert belegt?
Delphi-Quellcode:
Datamodlule1.ADOQuery4.Parameters.ParamByName('ID').Value := 123;
Grüße
Klaus

Reedx 19. Feb 2020 13:40

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Hab es so gemacht:
Datamodule1.ADOQuery4.Parameters.ParamByName('ID') .Value:= Editid.Text;
nun kommt als Fehlermeldung: EDatabaseError, 'AdoQuer4: Parameter 'ID' nicht gefunden'. Und nun?
Kann ja die ID im Quelltext nicht vorher festschreiben, wenn die Datenbank ja "feste" ID vorgibt..

mkinzler 19. Feb 2020 13:49

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Statt

Zitat:

Delphi-Quellcode:
query:= 'UPDATE Fragen SET Fach=' +quotedstr(Editfr.Text)+ ', Schwierigkeit='+quotedstr(Editschw.Text)+', Frage='+quotedstr(Editfr.Text)+', L1='+quotedstr(Editl1.Text)+', L2='+quotedstr(Editl2.Text)+', L3='+quotedstr(Editl3.Text)+', Lösung='+quotedstr(Editlr.Text)+' '+
                'WHERE ID= :ID';
        Datamodule1.ADOQuery4.SQL.Add(query);

Delphi-Quellcode:
Datamodule1.ADOQuery4.SQL.Text := 'UPDATE Fragen SET Fach=' +quotedstr(Editfr.Text)+ ', Schwierigkeit='+quotedstr(Editschw.Text)+', Frage='+quotedstr(Editfr.Text)+', L1='+quotedstr(Editl1.Text)+', L2='+quotedstr(Editl2.Text)+', L3='+quotedstr(Editl3.Text)+', Lösung='+quotedstr(Editlr.Text)+' '+
                'WHERE ID= :ID';
Datamodule1.ADOQuery4.Parameters.ParamByName('ID') .Value:= Editid.Text;
Nach dem Setzten der Abfrage werden die Parameter neu erzeugt.

Klaus01 19. Feb 2020 13:54

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Delphi-Quellcode:
Datamodule1.ADOQuery4.SQL.Text := 'UPDATE Fragen SET Fach=' +quotedstr(Editfr.Text)+ ', Schwierigkeit='+quotedstr(Editschw.Text)+', Frage='+quotedstr(Editfr.Text)+', L1='+quotedstr(Editl1.Text)+', L2='+quotedstr(Editl2.Text)+', L3='+quotedstr(Editl3.Text)+', Lösung='+quotedstr(Editlr.Text)+' '+
                'WHERE ID= :ID';
Datamodule1.ADOQuery4.Parameters.ParamByName('ID') .Value:= Editid.Text;

.. sollte der Parameter ID nicht ein Integer, Cardinal oder ähnliches sein?

Delphi-Quellcode:
Datamodule1.ADOQuery4.Parameters.ParamByName('ID') .Value:= strtoInt(Editid.Text);

Reedx 19. Feb 2020 13:58

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
es kommt zwar keine Fehlermeldung mehr, aber es wird trotzdem nicht gespeichert.. :(

haentschman 19. Feb 2020 13:58

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Moin...:P
Zitat:

Kann ja die ID im Quelltext nicht vorher festschreiben
...sollst du auch nicht. Du brauchst aber die DatensatzID des zu bearbeiten Datensatzes. Die mußt du irgendwo gespeichert haben. Wo holst du die Einträge in das Grid?

Delphi-Quellcode:
Datamodule1.ADOQuery4.SQL.Text := 'UPDATE Fragen SET Fach = :FA, Schwierigkeit = :SW, Frage = :FR, L1 = :L1, L2 = :L2, L3 = :L3, Lösung = :LO WHERE ID = :ID'; // besser keine Umlaute in den Feldern verwenden
Datamodule1.ADOQuery4.Parameters.ParamByName('FA').AsString := Editfr.Text; // ist das richtig? ...doppelt?
Datamodule1.ADOQuery4.Parameters.ParamByName('SW').AsString := Editschw.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('FR').AsString := Editfr.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('L1').AsString := EditL1.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('L1').AsString := EditL2.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('L3').AsString := EditL3.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('LO').AsString := EditLr.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('ID').AsInteger := StrToInt(Editid.Text); // besser aus der geladenen Datenmenge holen
Datamodule1.ADOQuery4.ExecSQL;

Reedx 19. Feb 2020 14:05

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Zitat von haentschman (Beitrag 1457914)
Moin...:P
Die mußt du irgendwo gespeichert haben. Wo holst du die Einträge in das Grid?

hier mit dieser procedure. so in der schule gelernt. ist für mich auch verständlich, aber evtl umständlich. aber das ist mir egal, solange ich verstehe, was ich geschrieben habe :lol:

Delphi-Quellcode:
procedure TFormbearb.ButtonausClick(Sender: TObject);
var query:ANSIstring;
begin
 datamodule1.ADOQuery3.SQL.Clear;

 if lb.ItemIndex >=0 then
 begin
 query:= 'SELECT Fr.ID, Fr.Fach, Fr.Schwierigkeit, Fr.Frage, Fr.L1, Fr.L2, Fr.L3, Fr.Lösung FROM Faecher Fa, Fragen Fr '+
         'WHERE Fa.Fach = Fr.Fach and '+
         'Fr.Fach = ' +#39+lb.Items.Strings[lb.ItemIndex]+#39 +
         'ORDER BY Fr.ID ';
          Datamodule1.ADOQuery3.SQL.Add(query);
       Datamodule1.ADOQuery3.Open;
        TStringGrid(DB2).ColWidths[1]:=30;
        TStringGrid(DB2).ColWidths[2]:=60;
        TStringGrid(DB2).ColWidths[3]:=30;
        TStringGrid(DB2).ColWidths[4]:=220;
        TStringGrid(DB2).ColWidths[5]:=150;
        TStringGrid(DB2).ColWidths[6]:=150;
        TStringGrid(DB2).ColWidths[7]:=150;
        TStringGrid(DB2).ColWidths[8]:=20;
    end else
    begin
    application.MessageBox('Auswahlfehler!','Fehler');
    end;
end;

Reedx 19. Feb 2020 14:13

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Zitat von haentschman (Beitrag 1457914)

Delphi-Quellcode:
Datamodule1.ADOQuery4.SQL.Text := 'UPDATE Fragen SET Fach = :FA, Schwierigkeit = :SW, Frage = :FR, L1 = :L1, L2 = :L2, L3 = :L3, Lösung = :LO WHERE ID = :ID'; // besser keine Umlaute in den Feldern verwenden
Datamodule1.ADOQuery4.Parameters.ParamByName('FA').AsString := Editfr.Text; // ist das richtig? ...doppelt?
Datamodule1.ADOQuery4.Parameters.ParamByName('SW').AsString := Editschw.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('FR').AsString := Editfr.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('L1').AsString := EditL1.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('L1').AsString := EditL2.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('L3').AsString := EditL3.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('LO').AsString := EditLr.Text;
Datamodule1.ADOQuery4.Parameters.ParamByName('ID').AsInteger := StrToInt(Editid.Text); // besser aus der geladenen Datenmenge holen
Datamodule1.ADOQuery4.ExecSQL;



wenn ich das so mache, dann kommt "undefinierter bezeichner Asstring und Asinteger"...

haentschman 19. Feb 2020 14:24

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
:gruebel: Ado kennt auch Parameter mit "Asxxxx". Ich weiß schon warum ich ADO nicht mag. :?
Im Zweifelsfalle "Value". Da muß die Query aber die Parameter "casten". Asxxxc hast du gleich den Wert. Das ist besser.

Zitat:

so in der schule gelernt.
...von einem Lehrer?

Nachtrag:
Recherche:
Zitat:

unter D7 geht kein weg an .Value vorbei
:?

Reedx 19. Feb 2020 17:43

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Zitat von haentschman (Beitrag 1457922)
...von einem Lehrer?
unter D7 geht kein weg an .Value vorbei

Ja mit unseren Lehrern haben wir das so programmiert. Wir programmieren aber auch oft ziemlich schwammig, weswegen ich sehr viel recherchieren muss, damit das Projekt funktioniert.. Abgabe ist am 17.3. und ich hab jetzt schon Angst, dass ich das nicht schaffe.:cry: Aber mal sehen.

Das Problem mit dem speichern hat funktioniert und nun wird ALLES gespeichert, so wie ich mir das vorgestellt habe. DANKE!:thumb::thumb::thumb:

haentschman 20. Feb 2020 04:53

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Moin...:P
Zitat:

ich hab jetzt schon Angst, dass ich das nicht schaffe
...hier werden sie geholfen. :stupid:
Zitat:

Das Problem mit dem speichern hat funktioniert und nun wird ALLES gespeichert, so wie ich mir das vorgestellt habe
Für die Anderen...poste bitte die Lösung. :wink:

p80286 20. Feb 2020 08:58

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Das
Delphi-Quellcode:
Datamodule1.ADOQuery3.SQL.Add(query);
solltest Du besser durch
Delphi-Quellcode:
 Datamodule1.ADOQuery3.SQL.Text:=query;
ersetzen.

Falls bei Deiner Lösung der SQL.ext nicht leer ist, könntest Du böse Überraschungen erleben.
Und vorher ein
Delphi-Quellcode:
Datamodule1.ADOQuery3.Close;
ist auch nicht falsch.

Gruß
K-H

Delphi.Narium 20. Feb 2020 16:12

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Zitat von p80286 (Beitrag 1457975)
Das
Delphi-Quellcode:
Datamodule1.ADOQuery3.SQL.Add(query);
solltest Du besser durch
Delphi-Quellcode:
 Datamodule1.ADOQuery3.SQL.Text:=query;
ersetzen.

Falls bei Deiner Lösung der SQL.ext nicht leer ist, könntest Du böse Überraschungen erleben.
Und vorher ein
Delphi-Quellcode:
Datamodule1.ADOQuery3.Close;
ist auch nicht falsch.

Gruß
K-H

Am Anfang steht ein
Delphi-Quellcode:
datamodule1.ADOQuery3.SQL.Clear;
, so dass ein Add unkritisch ist.

p80286 20. Feb 2020 18:58

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Stimmt, aber warum zwei Anweisungen wenn eine genügt?

Gruß
K-H

Reedx 25. Feb 2020 18:57

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Zitat von haentschman (Beitrag 1457965)
Für die Anderen...poste bitte die Lösung. :wink:

Kam erst jetzt wieder dazu :-D
Lösung kommt hier:
Delphi-Quellcode:
procedure TFormneuFrag.ButtonhinzuClick(Sender: TObject);
var antw:integer;
begin
if (EditFach.Text='') or (EditSchw.Text='') or (Editfr.Text='') or (Editl1.Text='') or (Editl2.Text='') or (Editl3.Text='') or (Editlr.Text='') then
     begin
     application.MessageBox('Bitte alle Felder ausfüllen','Fehler');
     end else
      begin
        antw:= MessageDlg('Frage wirklich hinzufügen? ',mtConfirmation,[mbyes,mbNo],0);
                                          //Message mit Fragezeichen, Möglk. Ja/Nein
        Datamodule1.ADOQuery5.SQL.Clear;
      if antw = mrYes then //mrYes - Benutzer auf yes
       begin //Frage hinzufügen              //hier direkt in SQL text rein -> Übersichtlicher
        Datamodule1.ADOQuery5.SQL.Text := 'INSERT INTO Fragen (Fach, Schwierigkeit, Frage, L1, L2, L3, Lösung) VALUES (FA, SW, FR, L1, L2, L3, LO);';
        Datamodule1.ADOQuery5.Parameters.ParamByName('FA').Value:= Editfach.Text;
        Datamodule1.ADOQuery5.Parameters.ParamByName('SW').Value:= Editschw.Text;
        Datamodule1.ADOQuery5.Parameters.ParamByName('FR').Value := Editfr.Text;
        Datamodule1.ADOQuery5.Parameters.ParamByName('L1').Value := EditL1.Text;
        Datamodule1.ADOQuery5.Parameters.ParamByName('L2').Value := EditL2.Text;
        Datamodule1.ADOQuery5.Parameters.ParamByName('L3').Value := EditL3.Text;
        Datamodule1.ADOQuery5.Parameters.ParamByName('LO').Value := EditLr.Text;
        Datamodule1.ADOQuery5.ExecSQL;
        application.MessageBox('Frage wurde hinzugefügt!','Meldung');
   end else
   begin
     application.MessageBox('Frage wird nicht hinzugefügt!','Meldung');
   end;
   end;
end;

Reedx 25. Feb 2020 19:29

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
So, die Probleme gehen weiter :-D
Ich möchte nun endlich beginnen das Quiz zu programmieren. Finde keinen Anfang.. möchte, dass zu Beginn die Fächer aus meiner Datenbank in einer DBRadioGroup erscheinen, dass man eines auswählen kann und dann weiter geht.

1. DBRadioGroup habe ich mit Datasource etc verbunden, aber wie bekomme ich nun die Fächer rein? Ich weiß, dass der Befehl .ItemIndex:= ist.. und nun??

2. Wie kann ich in einem Label die Fragen und dann bei weiteren RadioButtons die Fragen/Antworten zufällig anzeigen lassen, ohne dass sie wiederholt werden (randomize??)?

Vielleicht kann ja jemand helfen!:?

hoika 25. Feb 2020 19:57

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Hallo,
also ich würde mich von den TDB-Komponenten verabschieden und normale Komponenten benutzen.
Eine Query zum Laden der benötigten Daten ist schnell dahergezaubert.

PS:
Ja, ich mag und benutze die datensensitiven Elemente gar nicht.

p80286 25. Feb 2020 22:18

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Zitat von hoika (Beitrag 1458367)
Eine Query zum Laden der benötigten Daten ist schnell dahergezaubert.

Die gibt es schon, Du mußt nur die Daten von der Abfrage zu den Anzeigekomponenten bringen. Und unterwegs kannst Du mit den Daten machen was Du willst.

Gruß
K-H

P.S.
Ok Heiko weiß das. Aber anderen ist das nicht klar.

himitsu 25. Feb 2020 23:11

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Wenn du das QuotedStr bei SQLs von deinem Lehrer hast.

Öffne Word, drucke eine große Zahl aus und gib ihm bitte diese 6.

haentschman 26. Feb 2020 05:57

AW: Datenbank-Programmierung mit UPDATE (SQL)
 
Zitat:

Ja, ich mag und benutze die datensensitiven Elemente gar nicht
+ 1 :thumb:

PS:
Delphi-Quellcode:
Datamodule1.ADOQuery5.SQL.Text := 'INSERT INTO Fragen (Fach, Schwierigkeit, Frage, L1, L2, L3, Lösung) VALUES (FA, SW, FR, L1, L2, L3, LO);';
...
Delphi-Quellcode:
:FA, :SW, :FR, :L1, :L2, :L3, :LO
Parameter Namen beginnen immer mit : :warn:


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