Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Ausführen / Listbox aktualisieren (https://www.delphipraxis.net/110373-sql-ausfuehren-listbox-aktualisieren.html)

detom 17. Mär 2008 08:33

Datenbank: Access • Version: 2k • Zugriff über: ADO

SQL Ausführen / Listbox aktualisieren
 
Hallo NG,

ich habe folgendes Schema:

AccessDB -> ADOConn => [ADOQuerys]

=> ADOQuery1 -> DataSource1 -> DBLookupListBox1
=> ADOQuery2 -> DataSource2 -> DBLookupListBox2

ADOQuery1 greift auf Tab1 zu und der Inhalt eines Feldes in Tab1 soll als Where Klausel für ADOQuery2 dienen.

Also zeige ich den Inhalt der Tab1 in der DBLookupListbox1 an.
Nach Auswahl des Inhalts in der Box1 soll der Inhalt in Box2 aktualisiert werden (entsprechend der neuen Where Klausel aus Box1).

str_sql:='SELECT PEmployee.personalId, PEmployee.name, PEmployee.forename, PEmployee.rotation, PEmployee.workcenter ';
str_sql:=str_sql + 'FROM PEmployee ';
str_sql:=str_sql + 'WHERE ';
str_sql:=str_sql + dblookuplistbox1.KeyValue + ';';

ADOQry2.SQL.Clear;
ADOQry2.SQL.Add(str_sql);

und was kommt dann ????

Wie aktualisiere ich den Inhalt in der Box2
Ich habe jetzt schon alles Mögliche probiert, aber irgendwie habe ich ein großes Anfängerbrett vor dem Kopf
Danke für alle Hinweise

Tom

Relicted 17. Mär 2008 08:35

Re: SQL Ausführen / Listbox aktualisieren
 
Delphi-Quellcode:
ADOQry2.Open;
das fehlt noch dann sollte es klappen

gruß
reli

Peinhard 17. Mär 2008 08:53

Re: SQL Ausführen / Listbox aktualisieren
 
Ausserdem dürfte der WHERE-Clause ungültig sein, da er keinen Vergleich, sondern nur einen Wert enthält. Es fehlt vor dem Wert ein 'Feldname = '. Ausserdem - muss Access-SQL mit einem ';' terminiert werden...?

detom 17. Mär 2008 09:08

Re: SQL Ausführen / Listbox aktualisieren
 
ADOQyr2.Open funktioniert bei mir nicht. Ich bekomme zwar keine Fehlermeldung aber Box2 bleibt leer.
Ich habe jetzt was anderes gemacht und jetzt scheint es zu funktionieren:

ADOQry2.active:=false;
DataSet2.Enabled:=false;
DataSet2.Enabled:=true;
ADOQry2.active:=true;

Ich hoffe das geht so auf Dauer und ich bekomme nicht irgendwann eine Fehlermeldung.

Danke trotzdem.

Eine Frage noch zur IDE bzw dem Code Editor. Ich komme von der MS Schiene (VB Net) und habe nur Delphi nutzen wollen weil ich in dem Fall keine weiteren Dateien oder sonstige Installationsnotwendigkeiten (NET Framework, DLL's usw.) haben wollte.

Aber die Funktionalität des Editors in Delphi ist für mich schon sehr gewöhnungsbedürftig.
Die Codevervollständigung funktioniert seltsam zb:

----------------------
box1.enabled:=True -> hier bekomme ich VB gleich TRUE oder FALSE zur Auswahl - oder

box1. -> manchmal funktioniert das Anzeigen der Auswahlmöglichkeiten und manchmal nicht. - meistens nicht bei copy/paste code

der Cursor springt bei Zeilenwechsel nicht zum Ende des Codes sondern steht "irgendwo" (Tabulator funktioniert "komisch" )
----------------------

Kann man die Funktionalität irgendwo einstellen oder gibt es Editorfunktionalitätserweiterungen?
Aber na gut, muß man sich vielleicht nur daran gewöhnen :-)

Tom

detom 17. Mär 2008 09:14

Re: SQL Ausführen / Listbox aktualisieren
 
Hallo,

Zitat:

Zitat von Peinhard
Ausserdem dürfte der WHERE-Clause ungültig sein, da er keinen Vergleich, sondern nur einen Wert enthält. Es fehlt vor dem Wert ein 'Feldname = '. Ausserdem - muss Access-SQL mit einem ';' terminiert werden...?

das ";" ist denke ich notwendig - es funktioniert jedenfalls sehr gut.
Die Where Klausel beinhaltet alle notwendigen Angaben. Sie sind in einer Tabelle als String hinterlegt.
zb.:

Titel='General' and Marker='XX'

So habe ich die Möglichkeit nachträglich Abfragen hinzuzufügen oder zu ändern - ohne etwas am Code zu ändern.
Das ist für Reporte sehr nützlich.

Gruß Tom

Relicted 17. Mär 2008 09:15

Re: SQL Ausführen / Listbox aktualisieren
 
Zitat:

Zitat von detom

----------------------
box1.enabled:=True -> hier bekomme ich VB gleich TRUE oder FALSE zur Auswahl - oder

box1. -> manchmal funktioniert das Anzeigen der Auswahlmöglichkeiten und manchmal nicht. - meistens nicht bei copy/paste code

der Cursor springt bei Zeilenwechsel nicht zum Ende des Codes sondern steht "irgendwo" (Tabulator funktioniert "komisch" )
----------------------

1. naja es gibt ja noch mehr wie true/false... wie wärs mit box1.enabled := (box2.itemindex > 2); oder so? kann er ja nicht wissen was du da machen willst :-)

2. bei c&p liegt meistens irgendwo ein fehler vor - wenn vor dem eintrag irgendwo was ned klappt dann will er dass du zuerst den fehler beseitigst bevor er dir da was vernünftiges anzeigt -> warum kA

3. du meinst mit enter oder mit pfeiltasten? bei enter rückt er (in den neueren delphi versionen - hab ja kA welche du benutzt) um 2 leerzeichen ein. delphianer nutzen leerzeichen anstelle der tabs aus der MS welt. der tabulator sollte auch defaultmäßig 2 leerzeichen anstatt eines tabs machen :-)
es gibt unter tools->optionen->editor-optionen eine editor einstellung. damit kannste tasten usw auf die VS welt umstellen. (gerade bei delphi 2006 geschaut weil gerade offen)

gruß
reli

edit: ";" muss nicht aber kann...

Peinhard 17. Mär 2008 09:19

Re: SQL Ausführen / Listbox aktualisieren
 
Statt DataSet2 soll es DataSource2 heissen, nehme ich an? Der ganze Zinnober sollte aber nicht nötig sein, ein AdoQry2.Close vor dem Ändern des SQL-Statements und ein AdoQry2.Open danach sollten reichen, sonst 'is da was komisch'. Open bzw Close sind übrigens identisch mit Active:=True bzw False.

detom 17. Mär 2008 09:26

Re: SQL Ausführen / Listbox aktualisieren
 
Hallo,
Zitat:

Zitat von Peinhard
Statt DataSet2 soll es DataSource2 heissen, nehme ich an? Der ganze Zinnober sollte aber nicht nötig sein, ein AdoQry2.Close vor dem Ändern des SQL-Statements und ein AdoQry2.Open danach sollten reichen, sonst 'is da was komisch'. Open bzw Close sind übrigens identisch mit Active:=True bzw False.

Du hast recht DataSource2 war gemeint.

Aber ohne diesem "Zinnober" :-) funktioniert es nicht. Habe es gerade noch mal ausprobiert. Die Box2 bleibt leer.

wt2_ADOQryFilterGroup.Close;
wt2_ADOQryFilterGroup.SQL.Clear;
wt2_ADOQryFilterGroup.SQL.Add(str_sql);
wt2_ADOQryFilterGroup.Open;


Tom

detom 17. Mär 2008 09:30

Re: SQL Ausführen / Listbox aktualisieren
 
1. naja es gibt ja noch mehr wie true/false... wie wärs mit box1.enabled := (box2.itemindex > 2); oder so? kann er ja nicht wissen was du da machen willst :-)

Das ist wirklich anders bei Delphi - Boolsche Funktionen ermöglichen in VB nun mal nur 0/1
Bei Delphi ist enabled also nicht nur 0/1 habe ich jetzt gelernt :-)

2. bei c&p liegt meistens irgendwo ein fehler vor - wenn vor dem eintrag irgendwo was ned klappt dann will er dass du zuerst den fehler beseitigst bevor er dir da was vernünftiges anzeigt -> warum kA

Kann sein das bei c/p irgendwelche Leerzeichen oder Tabs mit kopiert werden.

3. du meinst mit enter oder mit pfeiltasten? bei enter rückt er (in den neueren delphi versionen - hab ja kA welche du benutzt) um 2 leerzeichen ein. delphianer nutzen leerzeichen anstelle der tabs aus der MS welt. der tabulator sollte auch defaultmäßig 2 leerzeichen anstatt eines tabs machen :-)
es gibt unter tools->optionen->editor-optionen eine editor einstellung. damit kannste tasten usw auf die VS welt umstellen. (gerade bei delphi 2006 geschaut weil gerade offen)

Ich benutze noch D6 - Asbach Version :-(


gruß tom

Sorry - habe falsch zitiert.

Peinhard 17. Mär 2008 09:35

Re: SQL Ausführen / Listbox aktualisieren
 
Warum verwendest du übrigens eine DBLookupListbox und keine einfache DBListBox? Zur Codevervollständigung noch: der Punkt muss 'frisch' sein, sonst springt das Ding nicht an. Also zB nach c&p den Punkt noch mal wegmachen und neu eingeben.

Relicted 17. Mär 2008 09:36

Re: SQL Ausführen / Listbox aktualisieren
 
Zitat:

Zitat von detom
1. naja es gibt ja noch mehr wie true/false... wie wärs mit box1.enabled := (box2.itemindex > 2); oder so? kann er ja nicht wissen was du da machen willst :-)

Das ist wirklich anders bei Delphi - Boolsche Funktionen ermöglichen in VB nun mal nur 0/1
Bei Delphi ist enabled also nicht nur 0/1 habe ich jetzt gelernt :-)

(box2.itemindex > 2) ist auch ein boolscher ausdruck. denn er gibt auch nur 0/1 zurück. so umgeht man halt konstrukte wie z.B.
Delphi-Quellcode:
if box2.itemindex > 2 then
  box1.enabled := true
else
  box2.enalbed := false;
alles in einer zeile :-)

Zitat:

Zitat von detom
2. bei c&p liegt meistens irgendwo ein fehler vor - wenn vor dem eintrag irgendwo was ned klappt dann will er dass du zuerst den fehler beseitigst bevor er dir da was vernünftiges anzeigt -> warum kA

Kann sein das bei c/p irgendwelche Leerzeichen oder Tabs mit kopiert werden.

daran glaub ich eher weniger. kann sein dass delphi 6 damit noch ned zurecht kommt... nie mit gearbeitet.

Zitat:

Zitat von detom
Ich benutze noch D6 - Asbach Version :-(

tools -> editor optionen -> auf der erste seiten unten kannste die tastaturbelegung ändern (hoffe ich) - delphi 7 geschaut eine 6er version hab ich ned da..


gruß
reli

Peinhard 17. Mär 2008 09:44

Re: SQL Ausführen / Listbox aktualisieren
 
Verschiedene Editor-Schemata waren mW seit D1 dabei - 'macht' ja auch Sinn, wenn man 'Migranten' anlocken will... ;)

Peinhard 17. Mär 2008 09:51

Re: SQL Ausführen / Listbox aktualisieren
 
Zitat:

Zitat von Peinhard
Warum verwendest du übrigens eine DBLookupListbox und keine einfache DBListBox?

Die Frage ziehe ich wg erwiesener Blödsinnigkeit zurück... :stupid:

detom 17. Mär 2008 10:16

Re: SQL Ausführen / Listbox aktualisieren
 
Hallo,

Zitat:

Zitat von Peinhard
Zitat:

Zitat von Peinhard
Warum verwendest du übrigens eine DBLookupListbox und keine einfache DBListBox?

Die Frage ziehe ich wg erwiesener Blödsinnigkeit zurück... :stupid:

Wenn hier einer blödsinnige Fragen stellt dann ich - wie du gleich merken wirst :-)

Jetzt möchte in meiner Box nicht nur ein Feld sondern Vor- und Zuname anzeigen.
Das soll gehen indem man in der Listfield Eigenschaft die Feldnamen trennt:

fld_name;fld_forename

in der IDE wird mir auch das richtige Ergebnis angezeigt - wenn ich starte erscheint aber in der box wieder nur der name .. Kopfkratz

Tom

Relicted 17. Mär 2008 10:26

Re: SQL Ausführen / Listbox aktualisieren
 
prüf mal nach dem ausführen nochmal was in der property Listfield steht. falls das nicht stimmt nochmal händisch setzen. könnte sich evtl. ändern wenn man das query aktualisiert.

Peinhard 17. Mär 2008 10:28

Re: SQL Ausführen / Listbox aktualisieren
 
Ich sach doch, da is was komisch. Ohne mehr 'Input' könn mer aber auch nur raten. Kannst du die Sourcen (mindestens dpr,dfm und pas) vielleicht mal zippen und hier reinstellen?

detom 17. Mär 2008 10:43

Re: SQL Ausführen / Listbox aktualisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Zitat:

Zitat von Peinhard
Ich sach doch, da is was komisch. Ohne mehr 'Input' könn mer aber auch nur raten. Kannst du die Sourcen (mindestens dpr,dfm und pas) vielleicht mal zippen und hier reinstellen?

im Anhang meine "Versuche"
Tom

Peinhard 17. Mär 2008 11:20

Re: SQL Ausführen / Listbox aktualisieren
 
Was mir als erstes auffiel, war das Enabled := False der zweiten Datasource in FormCreate. Das dürfte den späteren 'Zinnober' erklären, ich würde mal sämtliche Enabled auskommentieren. Dann verhält es sich so, dass TADOQuery beim Ändern des SQL automatisch schliesst, sie hinterher zu schliessen macht ohnehin keinen Sinn, wenn dann vorher explizit. Wie du es ja auch beim Ändern des Parameters mit der ersten Query machst - obwohl es da gar nicht nötig wäre und ein Requery prinzipiell reicht. Allerdings würde ich in FormCreate auch nie davon ausgehen, dass die Queries aktiv sind bzw sie 'sicherheitshalber' erstmal alle schliessen. Was die zwei Listfelder angeht, müsstest du wirklich mal einen Breakpoint vor und nach dem Öffnen der Query setzen und Listfields untersuchen. 'Eigentlich' sollte sich da allerdings nichts tun.

detom 17. Mär 2008 12:53

Re: SQL Ausführen / Listbox aktualisieren
 
Zitat:

Zitat von Peinhard
Was mir als erstes auffiel, war das Enabled := False der zweiten Datasource in FormCreate. Das dürfte den späteren 'Zinnober' erklären, ich würde mal sämtliche Enabled auskommentieren. Dann verhält es sich so, dass TADOQuery beim Ändern des SQL automatisch schliesst, sie hinterher zu schliessen macht ohnehin keinen Sinn, wenn dann vorher explizit. Wie du es ja auch beim Ändern des Parameters mit der ersten Query machst - obwohl es da gar nicht nötig wäre und ein Requery prinzipiell reicht. Allerdings würde ich in FormCreate auch nie davon ausgehen, dass die Queries aktiv sind bzw sie 'sicherheitshalber' erstmal alle schliessen. Was die zwei Listfelder angeht, müsstest du wirklich mal einen Breakpoint vor und nach dem Öffnen der Query setzen und Listfields untersuchen. 'Eigentlich' sollte sich da allerdings nichts tun.

In lb_name.ListField steht "name;forename"

Edit->

Habe jetzt festgestellt das die Spalten da sind. Sie sind nur so breit das sie in meiner Liste nicht mehr angezeigt werden. Kann man die Breite der ListField Spalten nicht festlegen.
Im Code ging das bei VB mit .ColumnWidth = ???? (twips)

tom


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz