AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Umgang mit Query's

Ein Thema von Ykcim · begonnen am 2. Dez 2016 · letzter Beitrag vom 2. Dez 2016
Antwort Antwort
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#1

Umgang mit Query's

  Alt 2. Dez 2016, 12:01
Datenbank: MySQL • Version: 5 • Zugriff über: UniDac
Hallo Zusammen,

ich benötige noch einmal einen kleinen Schupser.

Ich habe in der Vergangenheit nie DB-Komponenten (DBEdit, DBGrid, etc.) verwendet, sondern immer alles "von Hand" programmiert. Das bedeutet, dass ich für alle Felder alle Edits und Grids die Insert/Update-Anweisungen manuel erstellt habe, was echt viel Arbeit ist und die Gefahr von Fehlern beinhaltet.

In dem neuen Projekt arbeite ich mit den DB-Komponenten und freue mich, dass mache Sachen so schön schnell und einfach funktionieren. Ich habe aber Probleme bei der Zuweisung von Parametern.

Beispiel:

Ich habe ein DBGrid einer DataSource zugewiesen und bekomme die Daten aus der Query in dem DBGrid angezeigt. Es geht um Kommentare. Mit einem MemoFeld auf die gleiche DataSource und auf das Kommentarfeld gelinkt, kann ich den Kommentar auch verändern. Ich habe einen Navigator noch im Einsatz.
Wenn ich jetzt aber einen neuen Kommentar hinzufügen möchte, benötige ich aber neben dem Kommentar auch die User_ID. Den Kommentar bekomme ich über das MemoFeld automatisch, aber wie füge ich jetzt dem SQL_Statement die User_ID dazu?

Bin mir nicht sicher, ob das nachvollziehbar erklärt ist. Wenn ich irgendetwas besser erklären soll, bitte ich um einen Hinweis.

Vielen Dank!

Patrick
Patrick
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:12
Die Query-Komponente hat (höchstwahrscheinlich) mehrere Ereignisse, u. a. auch BeforeInsert.

Wenn Du diese Ereignisroutine mit "Leben" füllst, solltest Du dort eigentlich auch den Parameter User_ID befüllen können.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:25
Das habe ich versucht:

das habe ich in das "Insert_SQL-Statement" geschrieben:
Delphi-Quellcode:
insert into kommentar
(ticket_id, user_id, kommentar_datum, kommentar)
values
(:ticket_id, :user, :Datum, :kommentar)

und das habe ich in die procedure geschrieben:
Delphi-Quellcode:
procedure TForm1.UniQuery4BeforeInsert(DataSet: TDataSet);
begin
   UniQuery4.ParamByName('ticket_id').AsInteger:=UniQuery1.FieldByName('ticket_id').AsInteger;
   UniQuery4.ParamByName('user').AsInteger:=2;
   UniQuery4.ParamByName('datum').AsDateTime:=now;
   UniQuery4.ParamByName('kommentar').AsString:=DBAdvMemo2.Lines.Text;
end;
Aber die Parameter werden nicht gefunden. Sie tauchen auch nicht in der Parameterliste der Query auf. Siehe Anhang
Der Parameter Ticket_ID stammt aus dem Select Statement.

Vielen Dank
Patrick
Miniaturansicht angehängter Grafiken
query4_parameterliste.jpg  
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:32
Warum lässt du dir die Statements nicht automatisch generieren? Doppelklick auf die Komponente, 3. Reiter Generate, auswählen, welche Statements erstellt werden sollen (Obacht, es werden nur die Statements erzeugt, die aktiviert sind, vorher werden alle anderen Statements gelöscht!), Button Generieren drücken und auf dem 2. Reiter die Statements kontrollieren.

Dabei wirst du feststellen, dass UniDAC als Parameter die Feldnamen mit vorgestelltem Doppelpunkt verwendet und diese Parameter auch nicht in der Parameterliste der Query auftrauchen...

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:47
Das habe ich jetzt versucht. (Bild 1)

An der Parameterliste hat sich nichts geändert.

Wenn ich auf insert klicke bekomme ich den Fehler das der Parameter "user_id" nicht gefunden wurde...
Und wenn ich die user_id weglasse und nur die ticket_id zuweise, bekomme ich zwar nicht die Fehlermeldung, aber der zugewiesene Wert wird nicht angezogen...

Also auf der einen Seite kann ich die Parameter nicht definieren und auf der anderen kann ich ihnen keinen Wert zuweisen. Ich habe offensichtlich die Funktionsweise noch nicht geblickt...

Könnt Ihr mir helfen?

Vielen Dank
Patrick
Miniaturansicht angehängter Grafiken
query4_sql_statement.jpg  
Patrick
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:51
Ist ParamCheck true?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:52
Hallo...
Zitat:
Ich habe in der Vergangenheit nie DB-Komponenten (DBEdit, DBGrid, etc.) verwendet, sondern immer alles "von Hand" programmiert.
Da du grade am Anfang bist ein paar Tipps...

[meine Meinung]
1. Lass die Finger von datensensitiven Controls. Auch wenn das Klick - Bunti erstmal besser gefällt, später wirst du es verfluchen. Mit der Zeit steigen auch die Anforderungen und dann können die Controls nicht mehr das bieten was du brauchst. Du stößst schnell an die Grenzen. (Optik, Daten über verschiedene Tabellen (Join))
2. Da du es früher per Hand gemacht hast war besser. Vieleicht war die Umsetzung verbesserungswürdig.
3. Tipps:
* Niemals die SQL Anweisungen über das ganze Programm verteilen. (früher war ich auch so...). Auch wenn es einfacher ist die Anweisungen in der Query zu hinterlegen. (Doppelklick) Je komplexer das Programm um so schlechter ist es den Überblick zu behalten.
* Alle Anweisungen in einem Interface oder einer Klasse kapseln. (Austauschbarkeit des DBMS)
* Optional: Verlagern der Anweisungen nach extern in Ressource (weniger Qelltextänderungen bei SQL Änderungen) http://www.delphipraxis.net/49505-sq...einbinden.html
* Normale Controls wegen u.a. der Optik. Den Controls ist es wurscht wo die Daten herkommen. Die kennen die Datenbank nicht!
* Die Daten hällst du in Datenklassen ohne jegliche Logik in Listen. Die Verteilung der Daten der Datenklasse auf die Tabellen übernimmt die "Speichern" Funktion deiner Datenbankklasse (Interface). So kannst du mit komplexen Objekten arbeiten, sie laden und speichern.
[/meine Meinung]


Geändert von haentschman ( 2. Dez 2016 um 13:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Umgang mit Query's

  Alt 2. Dez 2016, 12:56
Dein Fehler ist bereits hier begründet:

Zitat:
procedure TForm1.UniQuery4BeforeInsert(DataSet: TDataSet);
begin
UniQuery4.ParamByName('ticket_id').AsInteger:=UniQ uery1.FieldByName('ticket_id').AsInteger;
UniQuery4.ParamByName('user').AsInteger:=2;
UniQuery4.ParamByName('datum').AsDateTime:=now;
UniQuery4.ParamByName('kommentar').AsString:=DBAdv Memo2.Lines.Text;
end;
Ich verwende normalerweise das Event OnNewRecord, aber es sollte auch in dem gewählten Event funktionieren.

Dann verwende ich den Variablennamen DataSet, weil es mir einfach zu lästig ist, über den Query-Namen nachzudenken...

Aber der Fehler ist dein Versuch, über die Parameterliste zu gehen. Gehe über die Feldnamen und weise diesen die Werte zu...

Code:
procedure TForm1.UniQuery4BeforeInsert(DataSet: TDataSet);
begin
    UniQuery4.FieldByName('ticket_id').AsInteger:=UniQuery1.FieldByName('ticket_id').AsInteger;
    UniQuery4.FieldByName('user').AsInteger:=2;
    UniQuery4.FieldByName('datum').AsDateTime:=now;
    UniQuery4.FieldByName('kommentar').AsString:=DBAdvMemo2.Lines.Text;
Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Umgang mit Query's

  Alt 2. Dez 2016, 13:54
Hervorragend! Damit funktioniert es. Ich bin nicht darauf gekommen, dass ich über die Felder gehen muss...

Aber bedeutet das, das wenn ich einen Parameter habe, der nicht mit Hilfe eines DBEdit-Feldes eingegeben wird, ich das Update-Statement für alle Felder manuell machen muss?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Umgang mit Query's

  Alt 2. Dez 2016, 13:57
@haentschman

Vielen Dank für Deine guten Tipps. Ich werde sie beherzigen. Ich denke an eine Kombination. Ich möchte schon eine klasse für alle Datenbank-Interaktionen haben. In dieser würde ich reinschreiben, was ich gerade zu Testzwecken zusammenklicke. Ich finde die Verwendung von DB-Komponenten bei Eingaben sehr charmant. Bei nur anzeigenden oder berechnenden Prozeduren würde ich es auch ohne DataSources und DB-Komponenten wieder von Hand machen.

Vielen Dank.
Patrick
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:04 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