| Autor |
Beitrag |
MikeP
Hält's aus hier
Beiträge: 15
|
Verfasst: Mo 27.01.03 00:16
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
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 27.01.03 00:28
| 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 27.01.03 00:43
Hi,
welche Komponenten benutzt Du denn ?
Gruß
Hansa
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mo 27.01.03 11:08
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:
- Open: Diese Funktion verwendet man wenn man ein Abfragendes Query ausführen möchet. Also eines, bei dem Daten zurückgeliefert werden, durch weche man dan navigieren kann. (z.B. SELECT anweisungen)
- ExecSQL: Dies verwendet man, wenn man Manipulative Querys ausführen möchte. Also Querys, die keine daten zurückliefer, wo es also nichts zu öffnen gibt. Die können z.B. UPDATE nweisungen sein.
Wenn du an weiteren Informationen zum Arbeiten mit tDataset Komponenten interessiert bist, dann kannst du ja mal in dieses Tutorial schauen.
Gruß
Klabautermann
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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); ... |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Di 28.01.03 16:13
Hallo,
schau in der Hilfe einmal nach den Funktion "TrimLeft" und/oder "TrimRight".
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
Nikola
      
Beiträge: 55
Win 3.11, Win 98, Win 2000, Win XP
D 1.0 C/S, D6 Prof. 2005 Prof.
|
Verfasst: Di 28.01.03 19:39
Hallo,
zB.
Quelltext 1:
| if StrToIntDef(Edit1.text,0)=0 then |
mfg.
Nikola
|
|
MikeP 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
|
|