SQL Abfrage an DBGrid übergeben und weiter Anfängerfrage
-
Guten Morgen!
ICh wüßte gern wie es möglich ist, die SQL Anfragen an irgendwelche Objekte zu übergeben, sodass diese angezeigt werden zum Beispiel im DBGrid.
Auch ist mir noch nicht ganz klar, wie man die Methoden der vorgegebenen Objekte, zB. ein DBGrid manipuliert oder selber Methoden für dieses Objekt schreibt.
Wo findet das statt...??
Edit:
Bin natürlich fleißig am probieren und habe die Fehlermeldung: Zirkuläre Datenverbindungen sind nicht erlaubt bekommen...was ist das???Ich nutze folgende Komponenten: 1TQuery, 1DataSource, 1 DBGrid und 1 Table.
/Edit
Bitte seid gnädig, bin Anfänger in C++....
-
Den Table vergiß mal schnell wieder, der ist nur ein Überbleibsel aus den alten Paradox und dBase Zeiten.
Auch TQuery ist eigentlich nicht mehr zu empfehlen, da es die BDE verwendet, aber zumindest kannst Du damit erworbenes Wissen später weiter verwenden.Bei dem TDataSource mußt Du unter DataSet den Namen der Query eintragen (z.B. Query1). In dem TDBGrid mußt Du unter DataSource den Namen der DataSource eintrage (z.B. DataSource1). In der Query noch einen SELECT und den BDE-Alias eintragen, öffnen, und schon werden im DBGrid die Daten angezeigt.
EDIT: Ach so, ich vermute, Du hast versucht in der TQuery unter DataSource etwas einzutragen. Dort gehört nichts hin, es sei denn, Du hast eine Master-Detail-Beziehung (aber das ist ein anderes Thema).
-
@Joe_M:
Vielen Dank schon mal, das habe ich hinbekommen und verstanden(glaube ich).Wenn ich das Ergebnis aus dem Query in das DBGrid übergeben will, muss ich dann das Form per Update-Befehl updaten sozusagen oder geht das irgendwie dynamisch???
-
Du mußt nichts an das DBGrid übergeben. Du weist dem DBGrid die DataSource zu. Dem DataSource weist Du die Query zu. Somit 'weiß' das DBGrid, ob die Query geöffnet ist und wenn ja, zeigt es automatisch die Daten an.
Du mußt nichts weiter machen, als Query1->Open();
-
Ok das klappt soweit ganz gut, nur eine frage habe ich noch(versprechen kann ich das natürlich nicht).
Ich möchte, dass man in ein Text-Feld ein Datum eingeben kann, dass dann variabel in die SQL-Query über eben eine Variable eingetragen wird und somit die Query komplettiert.
C++ Code
using namespace std; AnsiString s; TDateTime x; DataSource1->DataSet = Query2; Query2->ExecSQL(); Edit1->Text = s; x = StrToDate(s); Query2->Active = true;unktioniert aber nicht!
tipps und links wären sehr nett!

Edit:
Queryselect * from test where su0003 = 'x' limit 100;
-
schau mal in die FAQ
-
ist ein bisschen missverständlich...es geht mir um das casten des eintrags in das textfeld....ist ja glaube ich ein string und der soll ins date format umgesetzt werden...wobei es das sql date format sein muss: jjjj-mm-dd!
-
Wenn Du den aktuell angezeigten, respektive ausgewählten Datensatz modifizieren willst:
Falls Du TQuery verwendest, mußt Du VOR dem Öffnen diese auf RequestLive = true setzen.Query2->Edit(); Query2->FiledByName("NameDesFeldes")->AsDateTime = x; Query2->Post();Es gibt diverse Umstände, die verhindern, dass ein Query bearbeitet werden kann. In einem solchen Fall kannst Du zur Laufzeit ein Query erstellen, eine UPDATE-Anweisung hineinschreiben und diese dann mit ExecSQL() ausführen. Ich würde allerdings eine parametrisierte UPDATE-Anweisung empfehlen (UDATE Tabellenname SET FeldName = :ParaDatum ... WHERE (blah = :ParaBlah).
Die beiden Parameter kannst Du dann über Query->ParamByName... Name setzen. Bei diesem Weg ist eine WHERE-Bedingung unerläßlich, da ansonsten ALLE Datensätze in der Tabelle geändert werden.
-
@Joe_M.
er will nicht das Feld editieren, sondern die WHERE-Bedingung im SQL-Befehl mit einem variablen Datum versehen
ich empfehle Lesen und Denken ...
aber anscheinend ist das immer schwer ...
in deinem Query muss einfach statt
select * from test where su0003 = 'x' limit 100;das stehen
select * from test where su0003 = :Datum limit 100;und dann noch im Quellcode VOR dem Query->Open()
Query2->ParamByName("Datum")->AsDateTime = x;Das Format macht die Datenbank dann schon selbst, allerdings nur, wenn das Feld ein Datums/Zeit-Feld ist
[Edit] bei SELECT-Abfragen nimmt man Query->Open(), nur für INSERT, UPDATE und DELETE verwendet man Query->ExecSQL()
-
Linnea schrieb:
ich empfehle Lesen und Denken ...
Ja, das hätte ich dann wohl besser auch gemacht...
