データベースを検索するには?

解決


ボブ  2003-02-10 02:41:32  No: 2861  IP: [192.*.*.*]

データベースの勉強をしている所でつまずいてしまったので、質問させて下さい。

begin
    Table1.Open;
    Table1.Append;
    Table1.FieldByName('Title').AsString := DBEdit1.Text;
    Table1.FieldByName('Comment').AsString := DBEdit2.Text;
    Table1.Post;
end;

という形で、自分で入力したタイトルとコメントをデータベース(Paradox)に登録し、

procedure TForm1.Button1Click(Sender: TObject);
begin
    Table1.Open;

    if DBEdit3.Field.AsString = Table1.FieldByName('Title').AsString then
    begin
        DBEdit4.Text := Table1.FieldByName('Comment').AsString;
    end
    else
        Application.MessageBox('登録内容はありません','エラー',MB_OK + MB_ICONEXCLAMATION);
end;

タイトルを入力し、ボタンを押せばそのタイトルと一致して登録されているコメントが表示され、登録されていなかったら「登録内容はありません」というメッセージを表示するという風にしたいのですが、これではうまく行きませんでした。
if文でタイトルと一致するものを探すやり方が悪いと思うのですが、アドバイスして頂ければ幸いです。
よろしくお願いします。

編集    削除
ボブ  2003-02-10 08:16:39  No: 2862  IP: [192.*.*.*]

自己レスですいません。  最初に書き込んでから色々調べてみてできました。

procedure TForm1.ButtonClick(Sender: TObject);
begin
    Table1.Open;
    Table1.First;

    while not Table1.Eof do
        begin
            if DBEdit3.Text = Table1.FieldByName('Title').AsString then
            begin
                DBEdit4.Text := Table1.FieldByName('Comment').AsString;
                break;
            end;
        Table1.Next;
        end;

    if DBEdit4.Text = '' then
        Application.MessageBox('登録内容はありません','エラー',MB_OK + MB_ICONEXCLAMATION);

end;

if文をおかしな使い方していますが、他の初心者の方の参考になれば幸いです。
お騒がせしてすいませんでした。

編集    削除
kazu  2003-02-10 18:13:25  No: 2863  IP: [192.*.*.*]

解決しておられるようですが、参考になれば...
【Edit1.Textに検索したいタイトル名】

if Table1.FindKey([Edit1.Text]) then
begin
  //見つかったときの処理
end
else begin
  //見つからなかったときの処理
end;

または

Table1.SetKey;
Table1.FieldByName('Title').AsString := Edit1.Text;
if Table1.GotoKey then
begin
  //見つかったときの処理
end
else begin
  //見つからなかったときの処理
end;

編集    削除
ボブ  2003-02-12 03:40:11  No: 2864  IP: [192.*.*.*]

>kazuさん
返事が遅くなって申し訳ありません。レスありがとうございます。
両方試してみたのですが、FindKeyの方では「'Edit1に入力した文字'は項目'Tableのキー項目'に適した整数値ではありません」というエラーが出てしまいます。
プログラミングバイブルDelphi4(Delphi6でやっているのでバージョンがあっていませんが)を参考にして、TableコンポーネントのIndexFieldNamesプロパティに適切な値を設定する必要があると書いてあったので、そこにTableのキー項目を設定したのですが、やはりうまく行きませんでした。
SetKeyの方では「項目'Title'にはインデックスが無く変更できません」というエラーが出てしまいます。
設定するプロパティが間違っているのでしょうか?インデックスの設定が間違っているのでしょうか?
よろしかったらアドバイスお願いします。

編集    削除
ボブ  2003-02-12 03:56:25  No: 2865  IP: [192.*.*.*]

すいません、追加します。

FindKeyメソッド、SetKeyメソッドはインデックスを適切に設定されていればという条件なので、インデックスがなければLocateメソッドを使えば良いと書いてあったので、試してたらこちらでできました。

ただ、例えば「Delphi6」とデータベースに入れておいて、「Delphi」と検索しても、完全に一致していないので検索にかかってくれません。
これはFindNearestメソッドを使えばよいのでしょうか? SQLのLikeを使えばできると書いてあったので、そちらの方も試してみたいのですが、このやり方も勉強してみたいので、よろしければアドバイスお願いします。

編集    削除
kazu  2003-02-12 08:29:53  No: 2866  IP: [192.*.*.*]

>FindKeyメソッド、SetKeyメソッドはインデックスを適切に設定されて
>いればという条件なので、インデックスがなければLocateメソッドを
>使えば良いと書いてあったので、試してたらこちらでできました

どちらにしても、検索を行われるのがわかっているのならインデックスは
必要ですね。

>ただ、例えば「Delphi6」とデータベースに入れておいて、「Delphi」と
>検索しても、完全に一致していないので検索にかかってくれません。
>これはFindNearestメソッドを使えばよいのでしょうか? 

そうですね。それでもインデックスは必要です。

>SQLのLikeを使えばできると書いてあったので、そちらの方も試してみたい
>のですが、

SQLはTQueryを使わなければならなかったと思いますが。
私は(仕事で)DBやるときは、ACCESSかPerl+DBMS(MySQLとか)なので、
SQLをたたくほうが好きですが...
データベースはアプリを作るよりも、設計の方が難しいです。(^^;

編集    削除
ボブ  2003-02-12 20:30:04  No: 2867  IP: [192.*.*.*]

>kazuさん
レスありがとうございました。
まずインデックスの設定を調べて、試してみたいと思います。
今回はTableのみでやっているので、SQLも勉強してTQueryも使うようにしてみたいと思います。  ありがとうございました!

編集    削除