Delphiから、OLEでACCESSのレポートを印刷するときの話。

PCごとに、印刷出来るレポートを制御したく、
単純に、指定のレポート名があるか、ないかを調べたかった。

Ar.SysCmd(acSysCmdGetObjectState, acReport, ARTitle);

まず、acSysCmdGetObjectStateを使う方法。

この場合、
「ファイルが開いていない、存在しない場合に、0を返す」ので、
レポートがあるか、ないか、を調べる目的としては、使えない。

印刷せずに、レポートがあるか、ないかが、知りたい!!

 

ま、2時間ほど、探した結果、見つけた答え。

'AllReports コレクションから検索
For Each obj In dbs.AllReports
  Write #dsn, strPath, strFile, "レポート", obj.Name
Next obj

http://d.hatena.ne.jp/ogohnohito/20140116/p1 より

全レポート情報が引き出せるみたいなので、

これを基に、Delphiのコードを作成

var
? obj: AccessXP.AccessObject;

for i := 0 to AR.CurrentProject.AllReports.Count - 1 do begin
? obj := AR.CurrentProject.AllReports[i];
? if (obj.name = ARTitle) then?
? ? ;
end;

「とりあえず、印刷プレビューしてみて、エラーだったら・・・」
みたいなアホなコードを書かずに、良かった♪

アクセスレポートの存在チェック