いつも拝見させて貰っています。
前回は大変お世話なりました。
無事組み込み完了しました^^。
本題なのですが、
SQL検索でQueryは白紙なのに、それを読み込んだStringGridに、データベースの一覧が表示されてしまいます。
QueryのSQL文で'管理NO'を検索し、結果をStringGridで手動で表示させています。
問題は、検索結果が0の時、何故か、データベース一覧の最初の行だけ一件が、表示されてしまいます。
試しに行数を手動で増やしてみたところ、2件目3件目のデータも表示されていました。
検索でデータがヒットしないと、自動的にデータベース一覧がStringGrid1に渡されて表示されてしまうようです。
Queryを監視してみると、Query1の中身は白紙です。
Queryは白紙なので、for文は一回しか実行されず、一覧の一行目だけが表示されるようです。
Queryが白紙の時に、StringGridもきちんと白紙にさせる方法は無いでしょうか?
どなたかアドバイスをいただけないでしょうか?
よろしくお願いしますm(__)m。
環境は、VistaSp1,Delphi3.1Proです。
以下はそのコードです。
※長いので、細かいフィールド名は若干省きました。
procedure TForm1.Button1Click(Sender: TObject);
var i,i2:integer;
begin
i := 1;
i2 := 1;
StringGrid1.ColCount := 5;
StringGrid1.RowCount := i +1;
Query1.SQL.Text := 'SELECT * FROM 退去立会表 WHERE 管理NO="' + SpinEdit1.Text + '";';
Query1.Open;
for i := 0 to Query1.RecordCount - 1 do begin
StringGrid1.Cells[1,0] := 'ページ';
StringGrid1.Cells[2,0] := 'NO';
StringGrid1.Cells[3,0] := '→';
StringGrid1.Cells[4,0] := '物件名';
StringGrid1.Cells[18,0] := 'DBNO';
StringGrid1.Cells[0,i+1] := inttostr(i2);
StringGrid1.Cells[1,i+1] := Query1.FieldByName('ページ').AsString;
StringGrid1.Cells[2,i+1] := Query1.FieldByName('NO').AsString;
StringGrid1.Cells[3,i+1] := Query1.FieldByName('物件名フラグ').AsString;
StringGrid1.Cells[4,i+1] := Query1.FieldByName('物件名').AsString;
StringGrid1.Cells[18,i+1] := Query1.FieldByName('DBNO').AsString;
StringGrid1.RowCount := StringGrid1.RowCount + 1;
Query1.Next;
i2 := i2 +1
end;
if Query1.FieldByName('DBNO').asstring <> '' then
StringGrid1.RowCount := StringGrid1.RowCount - 1;
end;
//for i := 0 to Query1.RecordCount - 1 do begin
Query1.RecordCount =0だと
for i := 0 to -1 do begin
早速のアドバイスありがとうございます。
if Query1.RecordCount = 0 then
for i := 0 to -1 do begin
...
end;
でやってみたのですが、正常に動いていた検索もとまってしまいました…。
データベースの中身ですが、
検索 管理NO 20095 で検索すると
ページ NO → 物件名 管理NO(StringGridには非表示)
1 1 False 物件1 20095
1 2 False 物件2 20095
...
1 10 False 物件10 20095
で、管理NO「20098」で検索すると、
ページ NO → 物件名 管理NO(StringGridには非表示)
1 1 False 物件1 20095
と表示されてしまいます。
試しに、
ページ NO → 物件名 管理NO(StringGridには非表示)
1 1 False 物件1 20094
1 2 False 物件2 20095
1 3 False 物件3 20095
1 4 False 物件4 20095
と、試しにNO1番のに管理NOを20094として、20094で検索し、
行数を3固定に設定したところ、
ページ NO → 物件名 管理NO(StringGridには非表示)
1 1 False 物件1 20094
1 2 False 物件2 20095
1 3 False 物件3 20095
と表示されました。
どうやら仕様のようですね…。
検索0件の時に1行目を非表示にすると、
インデックス名の「ページ NO → 物件名…DBNO」にカーソルが移ってしまい、
「DBNOは数値ではありません」
とエラーになってしまいます。
検索0の時は、手動で一行目を空白にし、何とかしてみたいと思います。
進展が何かあったらまた書き込みに来ますのでよろしくお願いしますm(__)m。
>if Query1.RecordCount = 0 then
if Query1.RecordCount <> 0 then では
>for i := 0 to Query1.RecordCount - 1 do begin
只、これはまずいのではと言う事を言いたかっただけです。
While Not(Query1.Eof) do とか
参考
https://www.petitmonte.com/bbs/answers?question_id=5167
蛇足
>for i := 0 to Query1.RecordCount - 1 do begin
Query1.RecordCount =0だとQuery1.RecordCount - 1の部分を計算すると
-1になるので上記の場合
for i := 0 to -1 do begin
になるので、意図しない状態になりますよ、と言う事です。
念のため。
TSさんありがとうございます、
やはり自分の読み間違いだったようですね^^;、
まだまだ初心者なものあり解らない事だらけですが、
ご指摘ありがとうございます^^;
ループのさせ方が良くない方法だったのですね。
確かに-1させてるので、誤作動の原因になるかもですね。
EOFはこれまで使ったことが無かったのですが、
色々試してみたいと思います。
ご指摘ありがとうございましたm(__)m。
> StringGrid1.RowCount := i +1;
で検索結果がなくても1行表示されている。
以前の検索結果が1行表示される。
ここは、ループの中で行いましょう。
自力解決しました。
StringGridに、次のデータベースがヒットしない時は、
次の行を手動で白紙にするようにしたら、無事動作しました。
因みにあの後色々バグだしをしたのですが、
二桁のバグが沢山出ました^^;
ループ処理は未だ勉強中です^^;
今の所は何とか動いているのですが、
学習できたら何とかやって見たいと思います。
それではありがとうございました。
ツイート | ![]() |