Entwickler-Ecke

Datenbanken - DBEdit aktualisiert bei Eintrag die Datenbank


Xong - Mo 14.01.08 14:52
Titel: DBEdit aktualisiert bei Eintrag die Datenbank
Hallo,
ich habe mit ADO eine DB-Verbindung aufgestellt. Ein mit einer Tabelle und darin enthaltenden Feld verbundenes DBEdit-Feld speichert bei einem Eintrag sofort den geänderten Wert.
Wie kann ich das verhindern?
Wie kann ich also realisieren, dass die Datenbank nur auf Knopfdruck aktualisiert wird? (Wollen Sie den Eintrag wirklich ändern? JA | NEIN)

Danke für eure Hilfe,
Robert


Mike19 - Mo 14.01.08 15:34

Hallo,

nimm doch einfach nur ein Edit Feld. Das ist nicht direkt mit der Datenbank verbunden. Änderungen werden dann erst auf die Anweisung Post vollzogen und das lässt sich steuern.

Gruß Micha


Xong - Mo 14.01.08 16:16

Okay,
das ist wahrscheinlich sowieso die beste Lösung. Das mit dem Editieren habe ich auch hinbekommen.
Wie kann ich aber den Rückgabewert einer SELECT-Anweisung in solch einem Edit-Feld anzeigen?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  with StartForm.ADOQuery1 do begin
    with SQL do begin
      Clear;
      Add('SELECT *');
      Add('FROM foo');
      Add(Format('WHERE ID=''%d''',[bar]);
    end;
    Open;
  end;

Wie komme ich an das Resultat einer SELECT-Anweisung?
Mit welchen Komponenten kann ich arbeiten?

Danke, Robert


Mike19 - Mo 14.01.08 17:03

Hallo,

wie das in SQL geht kann ich Dir nicht sagen, ich hätte es mit einer Table gemacht.


Xong - Mo 14.01.08 17:19

Ich habe es jetzt folgendermaßen hinbekommen:
Ich habe ein neues ADODataSet mit dem Namen AbfrageDataSet angelegt.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
with StartForm.AbfrageDataSet do begin
  Active := False;
  CommandText := Format('SELECT * FROM foo WHERE ID=''%d''',[bar]);
  Active := True;
  with Recordset.Fields do begin
   // Über Item['Spaltenname'] kann ich jetzt auf die einzelnen Felder zugreifen.
   // (Und sie ggf. einem Editfeld zuordnen.)
   // Natürlich geht das nur, wenn nur ein Datensatz existiert.
   // Bei mehreren Datensätzen muss man den Cursor weitersetzen (Next)
  end;
end;

Kennst du eine elegantere Methode?
Wie löst man das mit einer Tabelle?


Mike19 - Mo 14.01.08 17:24

Hallo,

bei einer Table würde ich mit Locate oder Find genau den Datensatz auswählen, den ich brauche und dann das entsprechende Feld mit

z.B.

Edit1.Text:= Table1.FieldByName('...').As String

anzeigen lassen.

Gruß Micha


raiguen - Mo 14.01.08 20:51

Ob nun Table oder Query, in beiden Fällen kann man EditFelder (vorzugsweise) im AfterScroll mit den entsprechenden Feldwerten befüllen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Query1AfterSroll(DataSet: TDataSet);
{bzw procedure Table1AfterSroll(DataSet: TDataSet);}
begin
  Edit1.Text := DataSet.FieldByName('Bla').Text;
  Edit2.Text := DataSet.FieldValues['dumdidum'];
  EditXYZ.Text := DataSet.FieldByName('irgendwas').Value;
  ...
end;


Xong - Di 15.01.08 09:48

Danke!
Ihr habt mir sehr weiter geholfen!

Bis bald,
Robert =)