処理内容
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を取得してしまうのでしょうか?色々と調べたりしたのですが解りません。宜しくお願い致します。
記述に間違いがありました。
ixは0から順次カウントアップしてるのですが、ix=1の時にどうして、000408,1,bを取得してしまうのでしょうか?←誤
ixは0から順次カウントアップしてるのですが、ix=1の時にどうして、000408,1,aを取得してしまうのでしょうか?←正
すみませんでした。
neoさん
DBGrid1のDataSourceがqurey1につながっていない。
for ix := 0 to DBGrid1.SelectedRows.Count - 1 do
begin
qurey1.bookmark := DBGrid1.SelectedRows[i];
も同じですが、ちょっと判りにくいですね。
もう少し、ソースを表示してみたらいかがでしょうか?
できれば、For begin〜end;まで
指定のボタンを押すと全件選択の状態にします。↓ソースです。
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と続いている時に処理がうまくいきません。
これぐらいの情報で大丈夫でしょうか?宜しくお願い致します。
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
の様になっていたりはしませんか?
TBookMarkList.Find のソースコードを見て下さい。
レコードの並びに順ずるとは限らないのでは?
TBookMarkListが保持しているのはTBookMarkStrですから、
この並びに従っているだけだと思われます...
>qurey1のOrderは大丈夫でしょうか?
>1項目目のOrderが2項目目,3項目目の後になっていませんでしょうか?
→確認しました。大丈夫でした。
>TBookMarkList.Find のソースコードを見て下さい。
>レコードの並びに順ずるとは限らないのでは?
>TBookMarkListが保持しているのはTBookMarkStrですから、
>この並びに従っているだけだと思われます...
TBookMarkListについて理解が出来てません。TBookMarkListについて、ソースを書くとか、プロパティの設定などはしてません。TBookMarkListについてもう少し教えていただけないでしょうか。TBookMarkListってコンポーネントじゃないですよね?すみません!
TCustomDBGrid.SelectedRows が返す型は TBookmarkList です。
このクラスは選択したレコードのブックマーク文字列を保持しています。
そして、下記のようにした時、
>DBGrid1.SelectedRows.CurrentRowSelected := True;
内部ではまず、カレントレコードのブックマーク文字列を取得します。
そしてそのブックマーク文字列がリストに既に登録されているかを調べます。
この検索結果と設定しようとしているフラグが矛盾する場合に挿入・削除が発生します。
ここで問題なのは挿入位置ですが、行われている検索アルゴリズムが2分検索なので
登録順序はTBookmarkStr(文字コード) の並びになるということです。
詳しくは DBGrids.pas の中を見てください。
TBookmarkList.SetCurrentRowSelected
TBookmarkList.Find
ツイート | ![]() |