DBGRIDの複数選択後の取得?


なま  2007-06-22 01:27:04  No: 26781

処理内容
dbgridに一覧を表示後に、任意選択又は全件選択を行い、選択された内容を取得しvbレポートを使用して印刷をしたい。

dbgridのoption、dgrowselect,dgmultselectは、tureに設定してあります。

dbgridの一覧の内容は以下の通りの表示してあります。

000407,1,a
000407,1,b
000408,1,a
000408,1,b

for ix := 0  to  DBGrid1.SelectedRows.Count - 1  do
      begin
      qurey1.gotobookmark(pointer(DBGrid1.SelectedRows.items[ix]));
このロジックにより、000407,1,aを取得し、次に000407,1,bが取得出来るはずなのですが、000408,1,aを取得してしまいます。ixは0から順次カウントアップしてるのですが、ix=1の時にどうして、000408,1,bを取得してしまうのでしょうか?色々と調べたりしたのですが解りません。宜しくお願い致します。


なま  2007-06-22 01:34:40  No: 26782

記述に間違いがありました。

ixは0から順次カウントアップしてるのですが、ix=1の時にどうして、000408,1,bを取得してしまうのでしょうか?←誤

ixは0から順次カウントアップしてるのですが、ix=1の時にどうして、000408,1,aを取得してしまうのでしょうか?←正

すみませんでした。


aaa  2007-06-22 02:17:48  No: 26783

neoさん
DBGrid1のDataSourceがqurey1につながっていない。


HOta  2007-06-22 16:21:21  No: 26784

for ix := 0  to  DBGrid1.SelectedRows.Count - 1  do
  begin
    qurey1.bookmark := DBGrid1.SelectedRows[i];
も同じですが、ちょっと判りにくいですね。
もう少し、ソースを表示してみたらいかがでしょうか?
できれば、For begin〜end;まで


なま  2007-06-22 18:37:39  No: 26785

指定のボタンを押すと全件選択の状態にします。↓ソースです。

begin
   DBGrid1.SelectedRows.Clear;
   with DBGrid1.DataSource.DataSet do
   begin
     DisableControls;
     First;
     try
       while not EOF do
       begin
         DBGrid1.SelectedRows.CurrentRowSelected := True;
         Next;  
       end;
     finally
       EnableControls;
     end;
   end;
 end;

上記処理後に印刷のボタンを押すとdbgridを読み込みます。↓ソースです。

 begin
     if    DBGrid1.SelectedRows.Count = 0 then
     begin
           DBGrid1.SelectedRows.currentrowselected := true;
     end;
     
     if    DBGrid1.SelectedRows.Count > 0 then
     begin
     Sel_XLSFILE         := 'xxxxxxxx_01.xls';
     XlsReport1.FileName := ExtractFilePath(Application.ExeName) +  Sel_XLSFILE;
     XlsReport1.Start._File;
     XlsReport1.Page._Begin('xxxxxxxx','1');
      for ix := 0  to  DBGrid1.SelectedRows.Count - 1  do
      begin
      query1.gotobookmark(pointer(DBGrid1.SelectedRows.items[ix]));
      rh_ohcd := query1.FieldByName
                                  ('RHOHCD').AsString;
      rh_edno := query1.FieldByName
                                  ('RHEDNO').Asstring;
      rh_type := query1.FieldByName
                                  ('RHTYPE').AsString;
      
       次に、rh_ohcd,rh_edno,rh_typeをセレクト条件にしてsql文を実行
        印刷に必要な項目を取得しています。
        ここで使用してる、tqueryは、dbgridで使用してるtqueryと名前は
        別にしてあります。(datasourceも同様)
        データベースは、as400です。
      sql文実行前にデバッグでrh_ohcdをみると、000407,000407,000408と続いて欲しいのですが、000407,000408となってしまいます。
但し、同じコードが続かない時は、問題なく処理できます。000407,000407と続いている時に処理がうまくいきません。

これぐらいの情報で大丈夫でしょうか?宜しくお願い致します。


HOta  2007-06-22 19:39:38  No: 26786

qurey1のOrderは大丈夫でしょうか?
1項目目のOrderが2項目目,3項目目の後になっていませんでしょうか?
000407,1,a
000407,1,b
000408,1,a
000408,1,b
のつもりが、
000407,1,a
000408,1,a
000407,1,b
000408,1,b
の様になっていたりはしませんか?


Basser  2007-06-22 20:42:21  No: 26787

TBookMarkList.Find のソースコードを見て下さい。
レコードの並びに順ずるとは限らないのでは?
TBookMarkListが保持しているのはTBookMarkStrですから、
この並びに従っているだけだと思われます...


なま  2007-06-22 22:55:52  No: 26788

>qurey1のOrderは大丈夫でしょうか?
>1項目目のOrderが2項目目,3項目目の後になっていませんでしょうか?

→確認しました。大丈夫でした。

>TBookMarkList.Find のソースコードを見て下さい。
>レコードの並びに順ずるとは限らないのでは?
>TBookMarkListが保持しているのはTBookMarkStrですから、
>この並びに従っているだけだと思われます...

TBookMarkListについて理解が出来てません。TBookMarkListについて、ソースを書くとか、プロパティの設定などはしてません。TBookMarkListについてもう少し教えていただけないでしょうか。TBookMarkListってコンポーネントじゃないですよね?すみません!


Basser  2007-06-22 23:40:20  No: 26789

TCustomDBGrid.SelectedRows が返す型は TBookmarkList です。
このクラスは選択したレコードのブックマーク文字列を保持しています。

そして、下記のようにした時、

>DBGrid1.SelectedRows.CurrentRowSelected := True;

内部ではまず、カレントレコードのブックマーク文字列を取得します。
そしてそのブックマーク文字列がリストに既に登録されているかを調べます。
この検索結果と設定しようとしているフラグが矛盾する場合に挿入・削除が発生します。

ここで問題なのは挿入位置ですが、行われている検索アルゴリズムが2分検索なので
登録順序はTBookmarkStr(文字コード) の並びになるということです。

詳しくは DBGrids.pas の中を見てください。

  TBookmarkList.SetCurrentRowSelected
  TBookmarkList.Find


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

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






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