Entwickler-Ecke

Datenbanken - Query Probleme bzw. Fragen


MikeP - Mo 27.01.03 00:16
Titel: Query Probleme bzw. Fragen
Hallo!

Ich hätt da mal ein paar Fragen zu Query!

1) Wozu dient der Befehl Query1.Open; Das Open ist doch nicht notwendig, da ich auch ohne diesen Befehl mit Query arbeiten kann!

2) Nach einem Query1.ExecSQL; ist es einfach die Daten auf eine Datenbankkomponente DBLabel etc. zu schreiben! Wenn ich eine Datenbank mit 3 Spalten habe wie kann ich den einer Spalte einer Variable übergeben! x:=<Query1.Spalte1> ???? Und wie kann ich nach einer Funktion wie MIN bzw. MAX (bsp. Select max(id) as maxid from tabelle) den Wert in diesem fall maxid einer Variable zuweisen???

Ich hoffe, dass mir jemand helfen wird!! Besonders Punkt 2 würde mich interessieren!


UGrohne - Mo 27.01.03 00:28
Titel: Re: Query Probleme bzw. Fragen
MikeP hat folgendes geschrieben:

1) Wozu dient der Befehl Query1.Open; Das Open ist doch nicht notwendig, da ich auch ohne diesen Befehl mit Query arbeiten kann!

Er ist wichtig, wenn Du dem Query zur Laufzeit eine Anweisung zuweist und sie damit ausführen willst. Alternativ geht glaub ich auch Active:=True. Den genauen Unterschied kenne ich auch nicht.

MikeP hat folgendes geschrieben:


2) Nach einem Query1.ExecSQL; ist es einfach die Daten auf eine Datenbankkomponente DBLabel etc. zu schreiben! Wenn ich eine Datenbank mit 3 Spalten habe wie kann ich den einer Spalte einer Variable übergeben! x:=<Query1.Spalte1> ???? Und wie kann ich nach einer Funktion wie MIN bzw. MAX (bsp. Select max(id) as maxid from tabelle) den Wert in diesem fall maxid einer Variable zuweisen???


Um einen Wert zu bekommen, gibt es 3 (eigentlich mehr aber egal) Möglichkeiten
1. Query1.FieldByName('Feldname').AsString

Oder eben AsInteger usw.

2. Query1.Fields[0].AsString

Gibt Dir den Wert der ersten Spalte

3. Query1.FieldValues['Feldname']

Dieses gibt den Feldwert als Variant zurück, ist aber nicht zu empfehlen, da die Umwandlung in den Typ, den die Variable erwartet Zeit beansprucht, lieber mit einem der obigen arbeiten!

Hoffe, dass ich Dir damit genug geholfen hab.

Gruß und gute N8.


MikeP - Mo 27.01.03 00:40
Titel: Das ging ja schnell!
Zu Punkt 1 kann ich nur sagen, dass ich immer mit Active arbeite! Ich war allerdings der Meinung, dass Active lediglich ExecSQL ersetzt! Aber egal!

Danke für die Hilfe!


hansa - Mo 27.01.03 00:43

Hi,

welche Komponenten benutzt Du denn ?

Gruß
Hansa


Klabautermann - Mo 27.01.03 11:08
Titel: Re: Query Probleme bzw. Fragen
Hallo,
UGrohne hat folgendes geschrieben:
Alternativ geht glaub ich auch Active:=True. Den genauen Unterschied kenne ich auch nicht.

Es gibt keinen. Wenn du in die DB.PAS guckst wirst du folgendes finden:

Quelltext
1:
2:
3:
4:
procedure TDataSet.Open;
begin
  Active := True;
end;

Es ist also nur ein kürzere Schreibweise von Active := TRUE.

MikeP hat folgendes geschrieben:
Ich war allerdings der Meinung, dass Active lediglich ExecSQL ersetzt!

Nein, es ersetzt nicht ExecSQL. Diese Beiden Funktionen sind für zwei unterschiedliche Fälle:


Wenn du an weiteren Informationen zum Arbeiten mit tDataset Komponenten interessiert bist, dann kannst du ja mal in dieses Tutorial [http://www.delphi-forum.de/viewtopic.php?t=363] schauen.

Gruß
Klabautermann


MikeP - Mo 27.01.03 11:49
Titel: danke
Zu deine Erklärung!

Kann es sein, dass ich kein Ergebnis auslesen kann (sprich einer Variable zuweisen kann) wenn ich nicht mit Open sondern mit ExecSQL gearbeitet habe! Dann hätte ich nämlich die Lösung für so einige Probleme gefunden!

Der Grund, warum ich die Datensätze einer Variable zuweisen möchte ist einfach der, dass ich vor einer "Insert Into" Abfrage, abfragen möchte ob bereits solch ein Datensatz vorhanden ist um doppelte Einträge zu vermeiden! Geht das auch einfacher!

zB.. Select * From tabelle Where spalte1=Edit1.text

Dann müsste ich jedoch kontrollieren können ob ich ein Ergebnis erhalte oder nicht! Wie stelle ich das an?? In PHP bräuchte man nur die Variable abfragen, das müsste in Delphi theoretisch :?: so aussehen


Quelltext
1:
if (Query1.ExecSQL) then showmessage('Datensatz bereits vorhanden');                    


Das funktioniert nat. nicht! Aber irgendwie so könnte das ja funktionieren oder?

Ich findes es super, dass mir so schnell geholfen wurde und möchte mich auf diesem Weg bedanken!


DANKE!


Klabautermann - Mo 27.01.03 12:07
Titel: Re: danke
MikeP hat folgendes geschrieben:
Kann es sein, dass ich kein Ergebnis auslesen kann (sprich einer Variable zuweisen kann) wenn ich nicht mit Open sondern mit ExecSQL gearbeitet habe! Dann hätte ich nämlich die Lösung für so einige Probleme gefunden!

Das ist richtig. Bei ExecSQL gibt es nichts was man auslesen könnte.
Dein Query musst du also so Ausführen:

Quelltext
1:
2:
3:
4:
5:
6:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.ADD('Select * From tabelle Where spalte1=' + Edit1.text);
Query1.Open;
IF NOT Query1.IsEmpty THEN BEGIN
  [...]


Wietere Informationen zum Arbeiten mit den Ergebnis findest du in dem oben angegebenen Tutorial.
Gruß
Klabautermann


MikeP - Mo 27.01.03 22:32

Habe den Code versucht und meine SQL Anweisung so forumuliert!


Quelltext
1:
Query1.SQL.ADD('Select * From ort Where kurzzeichen=' + Edit1.Text+' AND positionx='+Edit2.Text+' AND positiony='+Edit3.Text);                    


Warum funktioniert diese Abfrage nicht??

Ich hoffe mir kann wieder geholfen werden! ;-)


smiegel - Mo 27.01.03 22:39

Hallo,

Zeichenketten musst Du in doppelte Anführungszeichen setzen:


Quelltext
1:
2:
3:
4:
5:
6:
var s:String;

  ...
  s:=Format('Select * From ort Where kurzzeichen="%s"', [Edit1.Text]);
  Query1.SQL.ADD(s);
  ...


Klabautermann - Di 28.01.03 11:05

Hallo,
smiegel hat folgendes geschrieben:
Zeichenketten musst Du in doppelte Anführungszeichen setzen:

Stimmt, das hatte ich in meinem Beispiel Unterschlagen. Eigenlich sind es nur einfache Anführungszeichen im String, da dies aber auch das Stringbegrenzungszeichen ist muss man es doppelt angeben. Wenn es am String Anfand oder ende ist muss es sogar 3x darstehen (einmal zum öffnen des Strings und zwei mal um es einmal in den String zu bekommen ;)).
Ohne Format sähe das so aus:

Quelltext
1:
Query1.SQL.ADD('Select * From ort Where kurzzeichen=''' + Edit1.Text+''' AND positionx='''+Edit2.Text+''' AND positiony='''+Edit3.Text + '''');                    

Generell ist gegen die Format Funktion aber nichts einzuwenden, dieses Beispiel ist nur der vollständigkeithalber angegeben.

Gruß
Klabautermann


MikeP - Di 28.01.03 12:21
Titel: Wiedermal Danke!
Ok! Ich mach es jetzt so! Muss ich ja auch :) ! Geschnallt habe ich das noch nicht aber vielleicht wird's ja noch!


MikeP - Di 28.01.03 16:10
Titel: Kontrolle der Sinnhaftigkeit
Wenn ich die Eingaben aus meinen Editfeldern bzw. Memo in die Datenbankschreiben möchte, wäre eine Kontrolle der Eingabe von Vorteil! Ich habe jedoch lediglich if Edit1.text='' then abgefragt! Wenn jedoch mehrere Leerzeichen oder ein Leerzeichen gemacht wird, funktioniert das natürlich nicht! Kann ich irgendwie eine Kontrolle machen ob wirklich Text in den Feldern steht? Die Datenbank könnte sonst inkonsistent werden und das möchte ich unter allen Umständen vermeiden!


smiegel - Di 28.01.03 16:13

Hallo,

schau in der Hilfe einmal nach den Funktion "TrimLeft" und/oder "TrimRight".


Nikola - Di 28.01.03 19:39

Hallo,

zB.


Quelltext
1:
if StrToIntDef(Edit1.text,0)=0 then                    
:lol:

mfg.

Nikola


MikeP - Di 28.01.03 20:35
Titel: Jetzt wird es ernst
Ok! Vielen Dank für die Hilfe!

Jetzt wo das Lesen bzw. Schreiben aus bzw. in die Datenbank funktioniert hätte ich gern eine schöne Lösung für mein Problem!

Ich habe eine Tabelle X und eine Tabelle Y! Jetzt möchte ich eine neue Tabelle Z in der ich X und Y in Beziehung setzen kann! Meine neue Tabelle Z soll so aussehen! Z(Z_id,X_id,Y_id);

Ich liste jetzt meine Tabelle X in einem DBGrid auf! (Funktioniert natürlich)
Jetzt möchte ich, wenn der User mit der rechten Maustaste auf eine Zeile klickt, dass sich ein neues Formular bzw. ein Popup mit der Auswahlmöglichkeit "zuordnen" öffnet in dem dann meine Tabelle Y aufgelistet wird. (Auch in einem DBGrid)!

Wie kann ich das realisieren???

Wenn der User auf eine Spalte in meinem Grid klickt brauche ich nicht nur den Werte der Spalte sondern ich möchte jeden beliebigen Wert der Zeile lesen können um eine Abfrage nach dem richtigen Datensatz zu formulieren!

Ich hoffe jemand kann mir helfen!

WARUM funzt das nicht??????

Query1.SQL.Add('DELETE FROM ort WHERE id='+DBText1.Field.Value);

Noch etwas! Ich habe Probleme mit DBCombobox! Ich kann die Werte meiner Tabelle zwar anzeigen, jedoch wenn ich neben DBCombobox ein DBMemo mache wird die dazugehörende Spalte nicht angezeigt wie bei DBGrid! zB. Wenn man ein DBGrid hat und ein DBEdit macht wird in DBEdit immer der "aktive" Datensatz angezeigt!

Ich hoffe es nimmt sich wiedereinmal jemand die Zeit mir zu helfen!

Mike