Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankeintrag über Editfelder (https://www.delphipraxis.net/50980-datenbankeintrag-ueber-editfelder.html)

scuby 3. Aug 2005 17:31

Datenbank: Delphi-Datenbank • Zugriff über: SQL.Query

Datenbankeintrag über Editfelder
 
Hallo habe ein kleines Problem was ich irgendwie nicht beseitigt bekomme.
Ich will einen Datenbankeintrag (über Query) hinzufügen, doch wie mache ich das am bestens, wenn ich nicht das Grid nutzen will, sondern Edit-Felder.
Villeicht kann mir jemand einen Tipp oder den entsprechenden Code geben.

THX
Scuby

Sharky 3. Aug 2005 17:56

Re: Datenbankeintrag über Editfelder
 
Hai scuby,

Es gibt da verschiedene wege.

Zum einen kannst Du dein TDataSet (Query) mit Delphi-Referenz durchsuchen.Edit in den Edit-Modus bzw. mit Delphi-Referenz durchsuchen.Insert in den Einfüge-Modus bringen.

Dann kannst Du mit query.FieldByName('blubb').AsString := Edit1.Text den Inhalt von Edit1 in die Spalte blubb keiner Tabelle schreibe.

In beiden Fällen ist ein abschliessendes Delphi-Referenz durchsuchen.Post notwendig um die Daten in der DB zu speichern.


Von diesem Weg bin ich persönlich abgekommen. Ich arbeite fast nur noch mit reinen SQL-Kommandes.
Zum Beispiel;
SQL-Code:
UPDATE tabelle SET feldname=wert WHERE bedingung
Wenn Du anstelle eines UpDates einen neuen Datensatz einfügen möchtest dann musst Du natürlich mit dem SQL-Kommando INSERT arbeiten.

Texas 3. Aug 2005 18:46

Re: Datenbankeintrag über Editfelder
 
Hallo scuby

Wenn Du über die UpdateSQL Komponente verfügst kannst Du diese mit der Query verbinden.
1 Query UpdateObject
2 mit der rechten Maustaste auf die UpdateSQL UpdateSQL Editor
3 Schlüsselfeld festlegen und Updatefelder
4 SQL erzeugen
(kann man auch gut nutzen wenn man zu faul ist SQL-Code zu tippen)

5 Die Queryeigenschaften AutoRefresh = True und RequestLive = True

dann kannst du DBEditfelder einsetzen
insert edit post....

oder die erzeugten SQLs kopieren und in drei extra SQLs einfügen.
Insert Update Delete
Dann kannst Du die parameter mit Deinen Edit-werten beschreiben

Delphi-Quellcode:
Insertsql.parambyname(´Name´).AsString := Edit1.text;
Insertsql.parambyname(´Strasse´).AsString := Edit2.text;
Insertsql.parambyname(´Zahl´).AsInteger := strtoint(Edit1.text);
//(auf feldtypen achten)
.
.
.insertsql.ExecSQL;
Gruß texas

scuby 4. Aug 2005 08:06

Re: Datenbankeintrag über Editfelder
 
Hm.... Irgendwie hilft mir das alles nicht weiter ich habe momentan die volle Blokade in diesem Bereich. Könnte mir jemand ein kleines beispielprogramm mal geben, amit ich mir das mal in der Praxis anschauen könnte.

THX Scuby

Sharky 4. Aug 2005 08:43

Re: Datenbankeintrag über Editfelder
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hai scuby,

im Anhang ist ein 08/15 Beispiel. Da fehlen natürlich alle möglichen Abfragen usw.

Wie schon erwähnt würde ich normalerweise mit reinen SQL-Befehlen arbeiten. Aber dafür fehlt mir auf die schnelle die Zeit ;-)

P.S.: Das Programm arbeitet mit einer ACCESS-DB

scuby 4. Aug 2005 11:59

Re: Datenbankeintrag über Editfelder
 
Danke für das Programm, doch ich wollte es etwas anders machen, villeicht könnt ihr mal gucken, wo hier der Fehler liegt, das er das nicht einträgt,wiefesagt volle blokade!! *wein*

Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
var s : String;
begin
s := 'select Name,Vorname,Gebdat,Straße,hnr,plz,ort,tel,fahrschule from teilnehmer';
query1.close;
Query1.Sql.Clear;
Query1.Sql.Add(s);
Query1.ExecSQL;
Query1.Active:=true;

if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') or (Edit4.Text = '') or (Edit5.Text = '') or (Edit6.Text = '') then showmessage('Bitte füllen Sie alle Felder mit einem " * " aus!')
else
begin
Query1.FieldByName('Name').AsString := edit1.text;
Query1.FieldByName('Vorname').AsString := edit2.text;
Query1.FieldByName('Gebdat').AsString := edit3.text;
Query1.FieldByName('Straße').AsString := edit4.text;
Query1.FieldByName('Hnr').AsString := edit5.text;
Query1.FieldByName('PLZ').AsString := edit6.text;
Query1.FieldByName('Ort').AsString := edit7.text;
Query1.FieldByName('tel').AsString := edit8.text;
Query1.FieldByName('Fahrschule').AsString := edit9.text;
Query1.FieldbyName('Kurs').ASString := Label2.Caption;
Query1.Insert;
end;
end;

marabu 4. Aug 2005 12:49

Re: Datenbankeintrag über Editfelder
 
Hi Scuby,

in Feldnamen (Straße) solltest du besser keine Sonderzeichen verwenden. Außerdem solltest du deinen Komponenten und der Form einen aussagefähigen Namen geben. Dann solltest du deinen Code besser organisieren, damit er leichter zu lesen ist. Was ist der Primärschlüssel deiner Tabelle? Wenn du die Tabellen-Struktur für ein Insert benötigst, warum holst du dann alle Datensätze aus der Tabelle? Wenn du im Feld Kurs etwas eingeben willst, warum fehlt dann dieses Feld in deiner Abfrage? Bist du sicher, dass deine Prüfbedingung und die Meldung in Ordnung sind?

Beachte bitte meine Änderungen am Quellcode:

Delphi-Quellcode:
function TTeilnehmerDialog.EingabeOK: boolean;
begin
  Result := not (
    (NameEdit.Text = '') or ... or (VornameEdit.Text = '')
  );
end;

procedure TTeilnehmerDialog.SaveButtonClick(Sender: TObject);
const
  SQL_SELECT
    = 'SELECT name, vorname, gebdat, strasse, hausnr, plz, ort, tel, fahrschule, kurs '
    + 'FROM teilnehmer WHERE 1 = 0';
begin
  if not EingabeOK then begin
    ShowMessage('Bitte füllen Sie alle Felder mit einem " * " aus!');
    Exit;
  end;

  with Query1 do begin
    Sql.Text := SQL_SELECT;
    Open;
    Insert;
    FieldByName('Name').AsString := NameEdit.Text;
    ...
    FieldByName('Vorname').AsString := VornameEdit.text;
    Post;
  end;
end;
Grüße vom marabu

franktron 4. Aug 2005 12:54

Re: Datenbankeintrag über Editfelder
 
Sagt mal geht das überhaupt so???
Soweit ich weis muss man da min. ein UPDSQL haben oder per Insert oder UPDATE die Daten in die DB Speichern.

marabu 4. Aug 2005 12:59

Re: Datenbankeintrag über Editfelder
 
Hi Frank,

so geht das:

Delphi-Quellcode:
Query.RequestLive := true;
marabu

shmia 4. Aug 2005 14:01

Re: Datenbankeintrag über Editfelder
 
Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
var s : String;
begin
  s := 'select Name,Vorname,Gebdat,Straße,hnr,plz,ort,tel,fahrschule from teilnehmer';
  query1.close;
  Query1.Sql.Text := s;
//  Query1.ExecSQL; // falsch
  Query1.Active:=true;

if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') or (Edit4.Text = '') or (Edit5.Text = '') or (Edit6.Text = '') then
raise Exception.Create('Bitte füllen Sie alle Felder mit einem " * " aus!');

Query1.Insert; // zuerst Insert (oder eher Append)
Query1.FieldByName('Name').AsString := edit1.text;
Query1.FieldByName('Vorname').AsString := edit2.text;
Query1.FieldByName('Gebdat').AsString := edit3.text;
Query1.FieldByName('Straße').AsString := edit4.text;
Query1.FieldByName('Hnr').AsString := edit5.text;
Query1.FieldByName('PLZ').AsString := edit6.text;
Query1.FieldByName('Ort').AsString := edit7.text;
Query1.FieldByName('tel').AsString := edit8.text;
Query1.FieldByName('Fahrschule').AsString := edit9.text;
Query1.FieldbyName('Kurs').ASString := Label2.Caption;
Query1.Post; // und dann post
end;

franktron 4. Aug 2005 18:58

Re: Datenbankeintrag über Editfelder
 
Zitat:

Zitat von marabu
Hi Frank,

so geht das:

Delphi-Quellcode:
Query.RequestLive := true;
marabu

Braucht man dann nicht eine UpdSQL dafür ??? zumin. brauchte ich die immer bei meine MySQL Comps

marabu 4. Aug 2005 19:38

Re: Datenbankeintrag über Editfelder
 
Hi Frank,

du kannst RequestLive nicht für beliebige Anfragen setzen. Die Komponente TQuery bietet diese property in Verbindung mit CanModify an, um die Arbeit mit einem aktualisierbaren Cursor zu ermöglichen, falls ein solcher von der Datenbank resp. middle-ware unterstützt wird. In der Regel gilt, dass die Projektion einer Basis-Tabelle bearbeitet werden kann, während ein Join nur gelesen werden kann.

Alles klar?

marabu

franktron 4. Aug 2005 20:49

Re: Datenbankeintrag über Editfelder
 
Jop deshalb hat es wohl bei mir nie geklappt :-D

scuby 5. Aug 2005 09:08

Re: Datenbankeintrag über Editfelder
 
Delphi-Quellcode:
begin
Query1.Insert;
Query1.FieldByName('Name').AsString := edit1.text;
Query1.FieldByName('Vorname').AsString := edit2.text;
Query1.FieldByName('Gebdat').AsString := edit3.text;
Query1.FieldByName('Straße').AsString := edit4.text;
Query1.FieldByName('Hnr').AsString := edit5.text;
Query1.FieldByName('PLZ').AsString := edit6.text;
Query1.FieldByName('Ort').AsString := edit7.text;
Query1.FieldByName('tel').AsString := edit8.text;
Query1.FieldByName('Fahrschule').AsString := edit9.text;
Query1.FieldbyName('Kurs').ASString := Label2.Caption;
Query1.Post;
end;
In diesem Bereich steckt irgendwo ein Fehler drin, doch finde ich ihn mal wieder nicht!!! (Überlegt gerade das Programieren naczulassen)
Ich würde mich freuen, wenn ihr den Fehler mal wieer finden könntet.

marabu 8. Aug 2005 06:54

Re: Datenbankeintrag über Editfelder
 
Hi scuby,

du hast vergessen mitzuteilen, welcher Fehler in diesem Bereich gemeldet wird.

marabu

thomas29h2000 9. Aug 2005 09:58

Re: Datenbankeintrag über Editfelder
 
Hallo ich hab da auchmal ne frage aber ich weiß nicht ob da hier überhaupt die passende stelle ist.
Ich hab am Mittwoch mit Delphi angefangen, also noch keinen Ahnung.

Mein Problem ist das ich wenn ich ein neuen Tupel in eine Tabellen einfühgen will erscheint zwar ein neues Tupel aber der der datumswert ist immer auf 1.1.1900 gesetzt. In der Tabelle werden in der Spallte aber auch NULL-Werte zugelasen, und wenn ich die anfrage direkt auf der DB ausführe geht es auch.

Code:
 
if(km <> '') and (term = '') then
        sqlstring := 'INSERT INTO AUTOS_UNTERSUCHUNGEN '+
                     'SELECT Max(PK)+1 AS PK, '+num+' AS PKAUTOS, null AS FESTER_TERMIN, '
                     +km+' AS NACH_KILOMETER, '+besch+' AS BESCHREIBUNG FROM AUTOS_UNTERSUCHUNGEN';

 with Query_AUTOS_UNTERSUCHUNGEN do
    begin
      Close;
      SQL.Clear;
      SQL.Add(sqlstring);
      ExecSQL;
    end;
jetzt hab ich das so wie oben mit dem

Code:
 with Query1 do begin
    Sql.Text := SQL_SELECT;
    Open;
    Insert;
    FieldByName('Name').AsString := NameEdit.Text;
    ...
    FieldByName('Vorname').AsString := VornameEdit.text;
    Post;
  end;
probiert das geht bei mir auchnicht. da gibt die Fehlermeldung das nur Lesender zugriff auf die datenbank gewährt wird. Hab kein Plan was ich machen muss.

Danke im voraus
Thomas

marabu 9. Aug 2005 10:10

Re: Datenbankeintrag über Editfelder
 
Hallo Thomas,

herzlich willkommen in der Delphi-PRAXiS.

Dein erster Lösungsansatz hat doch offenbar funktioniert? Allerdings bin ich nicht sicher, ob ich verstehe, warum du die Aggregate, die du auf deiner Tabelle berechnest, auch in der gleichen Tabelle speichern willst. Sieht nach einer Auswertung aus, aber solche Ergebnisse speichert man doch nicht in der Basis-Tabelle.

Dass der zweite Ansatz nicht funktioniert, könnte daran liegen, dass du bei der Query nicht RequestLive := true eingestellt hast.

Grüße vom marabu

thomas29h2000 9. Aug 2005 10:42

Re: Datenbankeintrag über Editfelder
 
Hi,
danke für die schnelle antwort.

Berechnen tue ich gar nichts, ich schaufe erst ob die eingaben km und term aus Edit-Feldern
vorhanden bzw. nicht vorhanden sind.
Dann will ich ein Tupel einfühgen, sodas bei FESTER_TERMIN (typ: datetime) einen Null-wert hat.
Aber in der Tabelle steht dann immer '1.1.1900' und das soll nicht sein, da soll dann einfach nicht stehen.

Wenn ich RequestLive auf True setze kommt das immernoch. ich weis nicht was ich falsch mache.

thomas

thomas29h2000 9. Aug 2005 10:55

Re: Datenbankeintrag über Editfelder
 
Hi hab meine fehler.
hatte den an ner ganz ander stelle. hatte im vergleich '= null' anstelle von 'is null'
sry für die umstände und nochmals danke für die schnelle hilfe

gruß thomas

scuby 10. Aug 2005 13:06

Re: Datenbankeintrag über Editfelder
 
Delphi-Quellcode:
begin
Query1.Insert;
Query1.FieldByName('Name').AsString := edit1.text;
Query1.FieldByName('Vorname').AsString := edit2.text;
Query1.FieldByName('Gebdat').AsString := edit3.text;
Query1.FieldByName('Straße').AsString := edit4.text;
Query1.FieldByName('Hnr').AsString := edit5.text;
Query1.FieldByName('PLZ').AsString := edit6.text;
Query1.FieldByName('Ort').AsString := edit7.text;
Query1.FieldByName('tel').AsString := edit8.text;
Query1.FieldByName('Fahrschule').AsString := edit9.text;
Query1.FieldbyName('Kurs').ASString := Label2.Caption;
Query1.Post;
end;
In diesem Bereich steckt noch imer mein ehler und zwar bekomme ich immer die Meldung das nur Lesesender zugriff haben aber keine Schreibsender. Wie kann ich das umehen, so das ich aus meinen Editfeldern einen Eintrag in die DB machen kann?!

marabu 10. Aug 2005 13:48

Re: Datenbankeintrag über Editfelder
 
Hast du schon Query1.RequestLive := true gesetzt?

marabu


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