Autor Beitrag
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 27.09.02 14:59 
Hallo,
:roll:
Habe hier ein DataModul mit:

- Database
- Transaction
- DataSource
- DataSet

Nun will ich eine Datenmenge insoweit eingrenzen, um sie in einem Grid anzeigen zu lassen. Seltsamerweise zeigt das Grid in der IDE alle Datensätze an, lasse ich das Programm laufen ist es leer (das Grid). Muß ich da noch eine Query reinsetzen oder was fehlt sonst ? Vor Wochen hatte ich das schon hingekriegt, weiß aber nicht mehr wie. Das DataModul kommt mir irgendwie mickrig vor.

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 27.09.02 15:45 
Hi hansa,

ja, Du mußt noch eine Query-Kompo reinsetzen. Dann kannste mit dem SQL-Befehl SELECT * FROM Tabellenname WHERE Spaltenname='xy'. Mit diesem Befehl suchst Du jeden Eintrag aus der Tabelle raus der XY heißt.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 27.09.02 21:29 
Hi bis 11,

um 11 p.m. ist bei mir heute auch Schluß. AAAABER jetzt sehe ich doch noch wo der Fehler ist. Ich Idiot habe die Query in das DataModul gesetzt. :think:

:hair: Dadurch kam ich in der Query nicht an die Datasource heran!!

Gruß
Hansa
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 27.09.02 21:48 
Hallo,

habe jetzt eine Query in das Formular gesetzt, aber irgendwo stehe ich aufm Schlauch. Die DataSource ist jetzt verfügbar, aber das Ergebnis dasselbe wie vorher auch. . Ich kann doch der Query nur mitteilen (per SQL ) was ich suche. Der SQL-string wird aber nicht ausgeführt, zumindest nicht automatisch, Fehlermeldung kommt auch keine.

Es geht darum, Daten in einem Grid anzuzeigen, sobald ein Button gedrückt wird. In der IDE werden die Daten ja auch angezeigt, deshalb müßte die DB-Struktur eigentlich richtig sein. :lol:

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 27.09.02 22:04 
Probiere mal folgende Abfrage :

ausblenden Quelltext
1:
2:
3:
4:
    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Add('Select * FROM Tabellenname WHERE Datafield1='+QuotedStr('xy'));
    Query1.Open;


So mache ich meine Abfragen und gebe das dann im DBGrid an. Das DBGrid muß mit der DataSource verbunden sein.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 27.09.02 22:10 
Hi bis11,

Zitat:
So mache ich meine Abfragen und gebe das dann im DBGrid an. Das DBGrid muß mit der DataSource verbunden sein.


Nur an welcher Stelle kan ich denn genau sagen, daß er das anzeigen soll? In diesem Fall sollte es so sein, daß beim Drücken eines Buttons das Grid erscheint. :roll:

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 27.09.02 22:16 
Hi hansa,

folgende Verbindungen müssen bestehen :

DBGrid --> Datasource

Datasource --> Query1

Dann einfach den Code von meinem letzten Posting in ein Button Click Event schreiben und schon sollte es funzen.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 27.09.02 22:35 
Hallo Bis11,

Zitat:

folgende Verbindungen müssen bestehen :

DBGrid --> Datasource

Datasource --> Query1

In der DataSource kann ich nur ein Dataset angeben
Im DBgrid steht die DataSource drin.

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 27.09.02 23:22 
Die Query1 muß bei Dataset drinstehen.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 28.09.02 12:25 
Hi bis11,

Zitat:
Im DBgrid steht die DataSource drin


Da liegts dran. Ich kann dort keine angeben, zumindest bringt er mir keine zur Auswahl. Vermute, daß vorher noch irgendwas fehlt/falsch ist.

Es sieht jetzt so aus :
Zitat:

Habe hier ein DataModul mit:
- Database
- Transaction
- DataSource
- DataSet


Auf der Form selber liegt noch die Query. um an das DataModul ran zu kommen habe ich es in der Form von Hand so eingebunden :
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
var
  Form1: TForm1;

implementation

USES DataMod;


Ohne das USES ging gar nichts. Da bin ich sogar selber drauf gekommen :mrgreen: . Zur Runtime kommt nun der Fehler : DataBase not assigned to Query. Ist ja auch klar, bei dem DBgrid ist keine DataSource hinterlegt.

Was mich noch stört : Er beschwert sich, die DataBase not assigned und nicht DataSource. Im DBgrid kann ich doch nur die Datasource angeben.

Moment mal, habe gerade festgestellt, daß mein DataSet gar keine DataSource enthält. Wo ist denn die jetzt ? :shock: Mist, das ganze lief bereits. :hair:

Gruß
Hansa
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 28.09.02 12:29 
Kommando zurück. Sowohl Transaction, als auch DataSet waren active=false. Jetzt kann ich mit der Query weitermachen.

Gruß
Hansa
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 28.09.02 14:49 
Hi bis11,

Das Grid ist jetzt ungefähr so, wie ich es haben möchte, aber noch Prototyp. D.h. Die Felder weden jetzt alle richtig angezeigt, aber es gibt doch noch einiges :

Bei dem DataSet habe ich jetzt folgende SQLs:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
SELECT * FROM KG8  ORDER BY NR

UPDATE KG8 SET 
    NR = ?NR,
    BEZ = ?BEZ
 WHERE     
            ID = ?OLD_ID

INSERT INTO KG8(
    ID,
    NR,
    BEZ
)
VALUES(
    ?ID,
    ?NR,
    ?BEZ
)

DELETE FROM KG8
WHERE     
            ID = ?OLD_ID
    
select * from KG8
 WHERE 
    (    
            KG8.ID = ?OLD_ID
    )


In dem Grid stehen dann alle Datensätze, im Moment 3 :mrgreen:

Um zu sehen, wie das ganze sich überhaupt verhält, habe ich nun folgendes getan (der code geht so sowieso nicht, aber einfach mal weiter lesen, es geht um das select) :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.KGgridCellClick(Column: TColumn);
begin
  KGquery.Close;
  KGquery.SQL.Add('Select * FROM KG8 WHERE NR=88');
  KGquery.ExecQuery;
end;


Das erste Problem ist, daß das Grid automatisch, sobald es auf dem Bildschirm erscheint, nur bestimmte Daten anzeigen soll und nicht erst bei CellClick oder so. Wichtiger daran ist aber, daß nicht alle DS angezeigt werden, sondern nur bestimmte. Dafür dient doch die Query ?

Nun kann ich ja dort ein SQL-Statement eintragen. Was ich noch nicht so ganz verstehe ist, wozu genau obige Statements gut sind und der SQL String den ich der Query zuordnen kann. Soweit ich das sehe geht ohne die ersteren gar nix. Will ich aber dem Benutzer die Auswahl lassen, nur bestimmte Datensätze zu sehen, muß ich das dann bei dem ersten select oder bei der Query machen?

Egal was ich bei der Query als SQL eingebe, es tut sich nichts.
Gebe ich statt der obigen SELECT folgendes ein :

select * from KG8 where NR = 88 ORDER BY NR

Dann zeigt er mir im Grid nur den Satz mit der Nr. 88 an. Wozu brauche ich denn dann die Query ? Oder anders rum gefragt : Muß ich die Einschränkung der Datenmenge in der SQL Eigenschaft des Dataset bereits festlegen oder wie oder wo ? :shock:

Ich will dem Benutzer zur Laufzeit z.B. die Möglichkeit geben, alle Datensätze von Nr. 88 bis 90 zu sehen und zu editieren.

Was mir noch nicht gefällt ist, daß die ID auch im Grid steht.

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 28.09.02 15:34 
Hi hansa,

Zitat:

procedure TForm1.KGgridCellClick(Column: TColumn);
begin
KGquery.Close;
KGquery.SQL.Add('Select * FROM KG8 WHERE NR=88');
KGquery.ExecQuery;
end;


Erstmal hast Du hier einen grundsätzlichen Fehler gemacht. Deine letzte Zeile muß heißen KGquery.Open und nicht KGquery.ExecQuery.

Dann bei Deiner Select-Anweisung ist es klar, das dort nur der Datensatz mit der Nr. 88 angezeigt wird, wenn dieser einmal vorkommt. Die Anweisung bedeutet ja, selektiere alle Datensätze aus der Datenbank die im Feld Nr. 88 stehen haben.

Um jetzt die Datensätze von 88 bis 90 anzuzeigen, sollte es mit folgenden Befehl klappen : (nicht getestet)

ausblenden Quelltext
1:
Select * FROM KG8 WHERE Nr>=88 AND Nr<=90					


Ich kann Dir eine recht gute Seite empfehlen für SQL-Befehle . Von dieser Seite habe ich viel über SQL-Befehle gelernt. 8)
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 28.09.02 15:58 
Hi,

Weiß gar nicht wie ich das schreiben soll. :hair:

Select * FROM KG8 WHERE Nr>=88 AND Nr<=90

Das geht bestimmt. :D Aber mir geht es im Moment darum, an welcher Stelle ich solch ein Select einsetzen soll. Wenn ich es bereits in der select Eigenschaft des Datensatzes hinterlege geht das ja jetzt schon.

Aber kann doch kein Programm schreiben, das nur Nummern zwischen 88 und 90 anzeigt. Also müssen Parameter her. Wo und in welches select soll ich die reinsetzen ?

Oder anders gesagt : Kann mir jemand sagen welche GENAUE Bedeutung und Auswirkungen die SQLs in der Property des DataSet haben? Mit Generate SQLs hat er mir sie automatisch erstellt.

Select * FROM KG8 WHERE Nr>=88 AND Nr<=90

Würde ich so etwas mit Parametern dort bei selectSQL reinschreiben, dann geht es ja, aber ist dann nicht diese Eigenschaft festgelegt. Kann ich sie danach mit SQL.clear wieder löschen und mit Add eine andere Abfrage reinsetzen und wo bleiben in diesem Zusammenhang die Queries ?

Guck mir das mit den SQL-Befehlen mal an, aber im groben kenne ich die, wenn auch nicht auswendig :mrgreen: Mir fällt es noch schwer die in Delphi umzusetzen. Überall stehen die SQL-Befehle, aber finde einfach nichts Brauchbares (am besten nachvollziehbare Beispiele) mit Delphi, weder in der Online-Hilfe noch in Büchern (entweder sind sie zu oberflächlich oder gehen davon aus, daß der Leser alles sowieso schon weiß) :bawling:

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 28.09.02 16:19 
Hi hansa,

Du kannst ja Deinen select Befehl in das FormCreate-Ereignis reinschreiben. So werden gleich die ausgewählten Datensätze angezeigt. Ersetze doch die 88 & die 90 durch variablen.

Das könnte so aussehen :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  nr_anfang : integer;
  nr_ende : integer;

  KGquery.Close;
  KGQuery.SQL.Clear;  
  KGquery.SQL.Add('Select * FROM KG8 WHERE NR>=' + IntoStr(nr_anfang) + ' AND Nr<=' + IntToStr(nr_ende)); 
  KGquery.Open;


Damit kannst Du jetzt ganz variabel angeben, welche Datensatznummern angezeigt werden sollen. Bei diesem Beispiel muß der Typ des Feldes Nr. numerisch sein.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  nr_anfang : string;
  nr_ende : string;

  KGquery.Close;
  KGQuery.SQL.Clear;  
  KGquery.SQL.Add('Select * FROM KG8 WHERE NR>=' + QuotedStr(nr_anfang) + ' AND Nr<=' + QuotedStr(nr_ende)); 
  KGquery.Open;


Hast Du Deinen Typ für das Feld Nr. in der Datenbank als Text festgelegt so mußt Du diesen Quelltext verwenden.

Mit dem Befehl KGQuery.SQL.Clear löscht Du jedesmal vor jedem neuen SQL-Befehl den Buffer von der Query-Kompo.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 28.09.02 16:37 
Hi bis11,

Du schreibst was mit QuotedStr. Vielleicht kannst Du dir das hier mal ansehen :

www.delphipraxis.net/viewtopic.php?t=934

Gruß
Hansa
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 28.09.02 16:50 
Also, bei mir haut das ganz hervorragend hin. Ich benutze QuotedStr bei Paradox, dbase & MySQL. Da habe ich keine Probleme. Mit den anderen habe ich noch nicht so viel Erfahrung, mag sein das IB statt einfachen Anführungszeichen die doppelten braucht. Dann lässte einfach das QuotedStr einfach weg.
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Sa 28.09.02 16:58 
Hi bis11,

Schreibe ich alles groß, brauche ich gar nix (weder " noch '). 8) Hab das nur geschrieben, weil von irgendwoher die " auftauchen, ob in den SQL-Scripten oder Deinen Quelltexten. :mrgreen: Keiner weiß, warum genau.

Gruß
Hansa
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: So 29.09.02 10:58 
Hi Hansa
Grundsätzlich wäre mal zu sagen, dass du dir den Aufwand mit der Query gar nicht machen musst. TQuery ermöglicht es einen SQL Befehl zur Datenbank zu schicken oder eine Datenmenge aufzubauen (mit SELECT).
Allerdings ist diese Datenmenge in der Regel ReadOnly.
Genau das selbe macht auch ein IBDataSet. Die Eigenschaft SELECTSQL entspricht der Eigenschaft SQL bei der Query. Darüberhinaus verwendet IBDataset auch SQL Anweisungen um Datensaätze einzufügen (InsertSQL), zu löschen (DeleteSQL), zu ändern (UpdateSQL) und zu aktualisieren (RefreshSQL). Das sind die Anweisungen die auf der Basis von deinem SelectSQL automatisch erzeugt werden.
Was du machst ist also im Grunde genommen doppelt gemoppelt. Um die Datenmenge einzuschränken kannst du die SelectSQL mit einer WHERE Klausel versehen. Du musst dabei nur darauf achten, dass sich die Anzahl der Felder oder die Reihenfolge nicht verändert, weil sonst die anderen SQL-Anweisungen nicht mehr passen. Solange du immer mit SELECT * arbeitest ist das kein Problem.
Du könntest also einfach immer mit deinem Dataset arbeiten und bei Bedarf einfach die SelectSQL ändern.
Ich hoffe das hilft dir erst mal weiter.
Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 29.09.02 12:35 
Hi Lothar,

Zitat:
Grundsätzlich wäre mal zu sagen, dass du dir den Aufwand mit der Query gar nicht machen musst.


Habs auch schon fast geschnallt.

Zitat:
Du könntest also einfach immer mit deinem Dataset arbeiten und bei Bedarf einfach die SelectSQL ändern.


Also ich hab gedacht, die SQLselect und die anderen des Dataset seien dazu da, daß überhaupt alle Felder zu sehen sind und der Zugriff auf alle Datensätze möglich ist. Trage ich dort nicht SELECT * FROM KG8 ein, ging nämlich gar nichts.

Die anderen Selects brauche ich dann zur Laufzeit, damit der Benutzer sagen kann, was er will. Deshalb wollte ich die SQLs im OI in Ruhe lassen und die selects (WHERE usw.) Bedingungen halt zur Laufzeit erzeugen. So kam ich auf die Query :mrgreen:.

Zitat:
weil sonst die anderen SQL-Anweisungen nicht mehr passen.


Deshalb wollte ich die DataSet SQLs ja nicht verändern. Wie rum soll ichs denn jetzt machen ?

Gruß
Hansa