Autor Beitrag
haste
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 15.04.07 01:31 
Hallo,
als Benutzer von Turbo Delphi Explorer 2006 und Firebird 1.5.4
möchte ich eine Anfrage (zwei eigentlich) erstellen, bei der überprüft wird, ob der Wert von TEdit.Text (CHAR()) innerhalb einer Spalte der DB vorhanden ist.

Die Tabelle sieht so aus:
[url=img120.imageshack.us...?image=form3qy6.jpg]user defined image[/URL]

Die Form sieht so aus:
[url=img120.imageshack.us...?image=form2mo2.jpg]user defined image[/URL]

Ich habe mit Hilfe von TSQLConnection erfolgreich mit der Datenbank eine Verbindung erstellt.
Später fand ich, dass mit Hilfe entweder TSQLQuery.FindFirst oder TSQLStoredProc.FindFirst die Suche nach einem Element in einer DB möglich ist.

Leider weiß ich nicht, wie TEdit.Caption innerhalb einer Anfrage integriert werden soll. Deswegen bitte ich um Anweisungen/Literaturangaben/Internetadressen/Beispiele/Hinweise!

Edit: Statt Caption, Text (Dank HelgeLange!)


Zuletzt bearbeitet von haste am So 15.04.07 02:41, insgesamt 1-mal bearbeitet
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: So 15.04.07 02:15 
also erstmal hat TEdit keine Caption, sondern einen Text.
Schau doch mal auf die Firebird - Seite, da gibt es immer nette Dokumentationen zu SQL, das ist auch garnicht so schwer, da es ja eigentlich im SQL für Tabellen-Bearbeitung nur 4 Grundbefehle gibt : SELECT, INSERT, UPDATE, DELETE. Du suchst etwas über SELECT.

Das sollte dir weiterhelfen....

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
haste Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 15.04.07 02:42 
HelgeLange: Nach was genau soll ich in der Firebird Seite durchsuchen? Stored Procedure?
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: So 15.04.07 03:06 
nein, nach Queries.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
haste Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 15.04.07 06:38 
Ich probiere mit TSQLQuery die folgende Anweisung auszuführen:
ausblenden SQL-Anweisung
1:
2:
SELECT BNAME FROM BENUTZER
WHERE BNAME = :TEdit1.Text;

Bei der Probe die Anweisung zu aktivieren bekomme ich den folgenden Fehler:
No value for parameter 'TEdit1.Text'
Danach stelle ich von Params im 'Object Inspector' für 'TEdit1.Text' Eigenschaften wie :
DataType: ftString
ParamType: ptInput
ein, aber sehe bei Aktivierung von TSQLQuery die folgende Fehlermeldung:
'Missing query, table name or procedure name.'

Ich verstehe, dass BNAME = TEdit1.Text fehlerhaft ist, aber ich kenne keinen andern Weg meine Idee umzusetzen.

Wie soll ich BNAME = TEdit1.Text umschreiben?

Und bei der Kompilierung in dieser Prozedure
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.LoginBnClick(Sender: TObject);
begin
if (SQLQuery1 = BenNameTxt.Text) and (PasswortTxt.Text = 'haste') then begin
Form1.Visible := false;
Form2.Showmodal;
end else
MessageDlg('Fehlerhaftes Passwort/Benutzername',mtWarning,[mbok],0);
end;

kommt die folgende Fehlermeldung dazu:
[Pascal Error] Unit1.pas(76): E2010 Incompatible types: 'string' and 'TSQLQuery'

(Linie 76 ist 'if (SQLQuery1 = BenNameTxt.Text) and (PasswortTxt.Text = 'haste') then begin')

Deswegen möchte ich wissen, wie 'cast'-e ich TSQLQuery in String?
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: So 15.04.07 10:26 
einen Query castet man gar nicht !
Du benutzt sicher eine Form und hast daruf ein Query-Objekt gezogen ?
Wo schreibst du den SQL-Befehl rein ? Im Objectinspektor oder per Quellcode ?
Objectinspektor kann ich nicht empfehlen, viel zu starr.

im source-code machste das in etwa so
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Query durch deinen Querynamen ersetzen
query.sql.add(Format('SELECT BNAME FROM BENUTZER
WHERE BNAME = '
'%s''', [Edit1.text]);
// sucht aber nur genaue Treffer (gross/Klein)
// folgendes unabhängig von Gross/klein
query.sql.add(Format('SELECT BNAME FROM BENUTZER
WHERE UPPER(BNAME) = '
'%s''', [Uppercase(Edit1.text)]);
// wobei ich im moment nicht sicher bin, ob beide upper-anweisungen 
// richtig geschrieben sind (hab gerade kein Delphi da)
// dann Query öffnen und machen, was immer du auch damit machen willst

das Öffnen scheint dein 2tes Problem zu sein.
Du solltest dem Query der Einfachheit halber die Parameter für
Benutzername und Passwort fest zuordnen und die Abfrage vor dem
Öffnen des Query's machen. Den öffnest du dann nur,
wenn benutzername und passwort richtig sind

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
haste Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mo 16.04.07 00:46 
Danke für die bisherigen Antworten.

Und noch eine Frage. Ich habe probiert
ausblenden SQL-Anweisung
1:
SQLQuery1 <> NULL					

einzugeben, aber es erscheint die folgende Fehlermeldung
'[Pascal Error] Unit1.pas(78 ): E2015 Operator not applicable to this operand type'

Wie könnte ich die obene Anfrage formulieren, um zu prüfen, ob SQLQuery1 etwas gefunden hat?

Änderung:
mit Hilfe von diesem
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.LoginBnClick(Sender: TObject);
  var
    SR: SQLResult;
begin
  try
    SQLQuery1.SQL.Clear;
    SR:=SQLQuery1.sql.add(Format('SELECT BNAME FROM BENUTZER WHERE BNAME = ''%s''',[BenNameTxt.Text]));
    SQLQuery1.Open;
    if (SR <> Null) then
      if (PasswortTxt.Text = 'haste') then
        begin
          Form1.Visible := false;
          Form2.Showmodal;
        end
        else begin
          Form1.Close;
          Form2.Close;
    end
  finally
    SQLQuery1.Active := false;
    SQLQuery1.sql.clear;
  end
end;

Quelcode habe ich der vorherige Fehler ("Operator not applicable to this operand type") behoben, aber leider reagiert das Program nicht wie erwart.
Es sieht so aus, als ob das Program alle Werten von BenNameTxt.Text akzeptiert. Nicht nur die Werten, die sich innerhalb der Spalte BNAME, sondern alle.

Hat jemand eine Idee, warum es so etwas passiert? Hilft bitte einem Anfänger!

Änderung:
Mit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.LoginBnClick(Sender: TObject);
begin
  try
    SQLQuery1.SQL.Clear;
    SQLQuery1.sql.add(Format('SELECT BNAME FROM BENUTZER WHERE BNAME = ''%s''',[BenNameTxt.Text]));
    SQLQuery1.Open;
    if ( Not (SQLQuery1.IsEmpty) and (PasswortTxt.Text = 'haste')) then
        begin
          Form1.Visible := false;
          Form2.Showmodal;
        end
        else begin
          Form1.Close;
          Form2.Close;

    end
  finally
    SQLQuery1.Active := false;
    SQLQuery1.sql.clear;
  end
end;


schaffte ich, was ich wollte!

DANKE AN zuma UND HelgeLange FÜR DIE HILFE!
Jetzt kann ich ruhig schlaffen!


Zuletzt bearbeitet von haste am Do 19.04.07 01:25, insgesamt 1-mal bearbeitet
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 18.04.07 20:04 
Hallo,
kann dein problem nicht so ganz nachvollziehen ...
wenn du wissen willst, warum der erste Code nicht geht und der zweite doch:
liegt einzig daran, das die If (SR <> Null) nicht gegriffen hat
(ist immer true bei dir, es sei den, das zuweisen des SQL-befehl an den Query hat nicht geklappt)

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Mi 18.04.07 20:27 
Hallo!

Für solche Art der Abfragen ist das Select Count(Spaltenname) from Tabelle where Bedingung da.

LG
Stefan

_________________
Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: Mi 18.04.07 22:12 
wenn man wissen will, ob ein oder mehrere Ergebnisse zu einem Query zurückkamen, dann macht man das nicht mit sqlquery <> nil, sondern so :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
// eventuell query auf den Anfang setzen, manche Comps machen das von allein
SQLQuery1.First;
If Not SQLQuery1.Eof Then begin
  SQLQuery1.Fields[FieldNo].As(integer)(String)(Whatever); 
end;

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
haste Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 19.04.07 01:25 
Verzeihung bitte!
Ich war so müde, dass ich nicht bemerkt habe, dass es in meiner Nachricht keine Korrektursmeldung gibt!