VB2010でAccess2000のレポート表示


てぃん  2012-07-13 21:57:26  No: 147677

VB2010にてアクセス2000のレポートを以下の構文で表示させています。

Dim acc As Object = CreateObject("Access.Application")
            acc.Visible = True
Dim de As Object = acc.DBEngine
Dim db As Object = de.OpenDatabase(DataMdb, False, False, ";PWD=" & SPass) 'SPass=パスワード
   acc.OpencurrentDatabase(DataMdb)
   acc.DoCmd.RunCommand(10) ' ウィンドウの最大化
   db.Close()
   System.Runtime.InteropServices.Marshal.ReleaseComObject(db)
   System.Runtime.InteropServices.Marshal.ReleaseComObject(de)
   Dim doCmd As Object = acc.DoCmd
   Const acViewPreview As Integer = 2
   doCmd.OpenReport(RepName, acViewPreview)
   doCmd.Restore()
   doCmd.Maximize() 'レポートの最大化
   System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
   System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
今までこれで、レポートのプレビュー画面を表示させていました。
ところが、アクセス側でレポートに日付(挿入→日付と時刻)を配置してあったのを削除したところ、VBからアクセスを起動しても、開いた直後に閉じてしまうようになりました。再度日付を配置すると、表示されるようになります。どうしても原因がわかりません。
詳しい方いましたら教えてください。よろしくお願いいたします。
なお、OSはXPです。


てぃん  2012-07-14 18:07:50  No: 147678

再度、調査したところ元々、日付かページ数のいづれかがレポートに配置
されていた場合、それを削除してしまうと上記のような現象が起こるみたい
です。日付とページ数を両方配置している場合はどちらか一方を削除した場合は現象は起こらないですが、両方削除すると起こります。
上記の構文に問題があるのか、Access側の問題なのかもわかりません。
一応Accessで直接レポートを開くことはできます。
VBから起動したときだけ、この現象が起こるみたいです。


てぃん  2012-07-14 18:18:03  No: 147679

追記:
最後の構文の
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)
の部分でアクセスが終了してしまうようです。
これをしないとプロセスが残ってしまうので必要ですが、なぜこの構文
で、レポートによって、アクセスが終了する場合とプレビュー画面のまま
の場合があるのでしょうか?


魔界の仮面弁士  2012-07-15 07:47:05  No: 147680

CreateObject するのを止めて、Process.Start 等で起動してから
GetObject で拾いなおすようにしてみては如何でしょうか?


てぃん  2012-07-18 00:29:04  No: 147681

アクセスファイルにパスワードをかけているのですが、Process.Start の場合パスワードを聞いてこられます。
パスワードの入力なしに起動はできないでしょうか?


ばーやん  2012-07-19 00:31:11  No: 147682

Process.StartでAccessを起動する場合の起動時オプション一覧です。

http://www.geocities.jp/masa7251/tips/access/acs00038.html


魔界の仮面弁士  2012-07-19 07:48:42  No: 147683

> Process.StartでAccessを起動する場合の起動時オプション一覧です。
Process.Start 経由ではパスワードを指定できません。

一応、/pwd というオプションはありますが、これは
ユーザーレベルセキュリティのパスワード指定であって、
データベースファイルのパスワード指定ではありません。

> Dim de As Object = acc.DBEngine
パスワード指定を DAO の OpenDatabase 経由で行っているようですが、
それを OpenCurrentDatabase メソッドにしてみた場合はどうでしょうか?

Dim acc As Object
'If CheckBox1.Checked Then
'    'GetObject法
'    Dim p As Process = Process.Start("msaccess")
'    p.WaitForInputIdle()
'    acc = GetObject(, "Access.Application")
'Else
    'CreateObject法
    acc = CreateObject("Access.Application")
    acc.Visible = True
'End If
DataMdb = "C:\temp\test.mdb"
SPass = "sato-c"
acc.OpenCurrentDatabase(DataMdb, , SPass)

Dim doCmd As Object = acc.DoCmd
doCmd.RunCommand(10)    '最大化

Const acViewPreview As Integer = 2
doCmd.OpenReport("REPORT1", acViewPreview)
System.Runtime.InteropServices.Marshal.ReleaseComObject(doCmd)
'acc.Quit()   
System.Runtime.InteropServices.Marshal.ReleaseComObject(acc)


てぃん  2012-07-19 17:52:15  No: 147684

教えていただいた方法で試してみましたが、結果は同じでした。
最終手段としては、日付・ページ数は消さずに可視のプロパティをいいえにしてやり過ごすしかないかなと考えています。


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




  


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