SQLで条件一致のレコ−ド件数を取得するには?

解決


Delphi初心者  2010-08-26 09:41:18  No: 39060

再び質問をさせてください

Delphiで初歩的な練習プログラムを組んでいます
基礎的な、登録・更新・削除・検索の練習です(DBとしてACCESSを利用)
※DBとの連携には、TADOQueryコンポ−ネントを使用してます

デ−タの新規登録に際し、INSERT前に既に登録されているのかどうか?
入力したedit1.text が0件か?1件か?で判別させようと思い、以下の
SQL文を作ってみました(0件の時には後続でINSERT文を発行させます)

※※※※※※※※※※※※
Query1.sql.add('SELECT Count(*) AS rec_counter 
                FROM テ−ブル1  
                WHERE  列A ="'+ edit1.text + '"'' );

※※※※※※※※※※※※
Query1.ExecSQL ;での実行直後にShowMessage文でrec_counter
を表示させると、必ず列Aに存在するDATAをedit1.textで指定し
ていても、0件となります
(rec_counterは0を初期値として代入していました)

そこで、 rec_counterの初期値を1や2でも試したところ、実行
直後の ShowMessage文では、初期値のまま1や2で通過している
ことがわかりました

何が原因で、SQLが正しく実行されてないのでしょうか?
今回も相当初歩的な質問ですが、ご教授下さい


igy  2010-08-26 15:59:38  No: 39061

>Query1.ExecSQL ;

Query1.Open;

にしたら、どうなりますか?


igy  2010-08-26 16:07:55  No: 39062

あと、

>ShowMessage文でrec_counter
>を表示させると、必ず列Aに存在するDATAをedit1.textで指定し
>ていても、0件となります
>(rec_counterは0を初期値として代入していました)

この部分のソースコードは、どのように書いていますか?


igy  2010-08-26 16:14:52  No: 39063

あと、(どうでもよいことですが)

>今回も相当初歩的な質問ですが

“相当初歩的な質問”と書かれてますが、
初歩的な質問では、ないと思いますよ。


HOta  2010-08-26 16:30:34  No: 39064

ExecSQLは、Insert,Update,Deleteなどのデータ操作文を実行する場合に使います。
Select文の場合は、ActiveかOpenを使い、結果を参照します。
もう少し、参照する部分のSorceを見せていただきたいですね。

>Delphi初心者
は止めましょう。


Delphi初心者改め中級者?  2010-08-27 02:49:16  No: 39065

ご回答ありがとうございます

まずはigy様、「Query1.Open;」でも結果は同じでした
そしてigy様、HOta様、ShowMessage文でrec_counter・・・ですが
ソ−スは以下の感じです
※※※※※※※※※※※※
var
rec_counter : integer;

〜中略〜

begin
  rec_counter := 0 ;
  //
  if edit1.Text='' then
    begin
      ShowMessage('空欄です!');    
      exit;
    end
  else
    begin
      Query1.sql.clear;
      Query1.sql.add('SELECT Count(*) AS rec_counter 
                      FROM テ−ブル1
                      Where 列A ="'+ edit1.text + '"'' );
      try
        try
          //uery1.ExecSQL   ;
          Query1.Open;
          if rec_counter = 0 then
            begin
              ShowMessage('Query1.sql = '+ Query1.sql.text);
              ShowMessage('新規になります(既に存在しています)');
              Query1.sql.clear;
              Query1.close;
              exit;
            end
          else
            begin
              Query1.sql.clear;
              Query1.close;
            end;
        Except
          ShowMessage('更新処理に失敗しました!');
          Query1.sql.clear;
          Query1.close;
          exit;
        end;
      finally
        Query1.sql.clear;
        Query1.close;
      end;

・・・こんな感じです

※※※※※※※※※※※※
(Delphi初心者改め中級者?)
すいません、入社時によく先輩から「どんな言語でも、登録・更新・
削除・検索は基本中の基本よ!・・・」以下省略、とよく怒られていた
のでどうしてもトラウマになっておりまして・・・
そのようなわけですので宜しく御願い致します


HOta  2010-08-27 03:22:25  No: 39066

>          Query1.Open;
>          if rec_counter = 0 then
rec_counterに検索した値を取り出していないようですね。
選択後は、レコードセットに入っていますから、
rec_counter = Query1.FieldByName('rec_counter').AsInteger;
として、Fieldの値を取り出します。
取り出した値でないと、変数rec_counterにはレコードセットの内容は入りません。元の値のままです。


TS  2010-08-27 03:37:40  No: 39067

>Delphi初心者
>は止めましょう。
>Delphi初心者改め中級者?
も止めましょう。
どうして普通の名前が付けられないんでしょうか。


Alan Smithee  2010-08-28 04:33:20  No: 39068

HOta様、ありがとうございます
Delphiでの、SQL文の取扱いについて初歩的な事がわかっておりませんでした

ご指摘の通り、
>rec_counter = Query1.FieldByName('rec_counter').AsInteger;
を入れると、レコ−ドセットからrec_counterに結果を返す事ができました
ExecSQL/Openの違いの件といい、お恥ずかしい限りです

TS様、失礼しました
指摘を短絡に考えてました
今後は「Alan Smithee」と名乗らせていただきます


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加