先日のフォームの表示では BASE のファイル名が必要だった。
しかしこれではファイル名を変更してしまうとマクロをすべて書き換えなくてはならない。
そんなの嫌だから自分自身(ドキュメント)のファイル名を取得する手順を追加した。
例によって悩んで探して二日かかった。"Function DatabaseName" が今回の成果。
そのうち もう少しスマートに書き直そう。
sub Main
LoadForm( "商品一覧表")
end sub
sub LoadForm( FormName as string)
subDisplayForm(DatabaseName, FormName)
end sub
Function DatabaseName as string
dim form as object
form = ThisComponent.DrawPage.Forms.GetByIndex(0)
dim connection as object
connection = form.ActiveConnection
dim dataSource as object
dataSource = connection.Parent
DatabaseName = datasource.name
end function
sub subDisplayForm(sDatabaseName as string, sFormName as string)
dim mArgs(1) as new com.sun.star.beans.PropertyValue
dim oForm
oDatabase = fnGetOpenDatabase(sdatabaseName)
oConnection = oDatabase.DataSource.getConnection("","")
mArgs(0).name = "OpenMode"
mArgs(0).value = "open"
mArgs(1).name = "ActiveConnection"
mArgs(1).value = oConnection
oForm = oDatabase.getFormDocuments.getByName(sFormName)
oDatabase.getFormDocuments.loadComponentFromURL(sFormName, "_ blank", 0, mArgs())
end sub
function fnGetOpenDatabase(sDatabaseName as string)
oEnum = StarDesktop.getComponents.createEnumeration
while oEnum.hasMoreElements
oPosDB = oEnum.nextElement
if oPosDB.implementationName = "com.sun.star.comp.dba.ODatabaseDocument" then
if right(oPosDB.DataSource.name, len(sDatabaseName)) = sDatabaseName then
fnGetOpenDatabase = oPosDB
exit function
end if
end if
wend
end function
[03/15 追記]
ショック...。
odb ファイル自身のフォームを呼び出すには sDatabaseName を空に("")すればよかった。
したがってこの日の作業はたった1行でよかった。
subDisplayForm( "", "商品一覧表" )
無知は罪。
[03/16 追記]
sDatabaseName を空に("")した場合はデータベース名の照合で最初に列挙されていた名前が利用される。
if right(oPosDB.DataSource.name,
len(sDatabaseName)) = sDatabaseName then ' ←長さ=0
データベース(データソース)がひとつだけなら多分問題ないけど複数あった場合は例外発生などのエラーに
つながるだろう。だからやっぱり
Function DatabaseName as string は必要。
ついでに小改造。
Sub LoadForm( FormName as string)
subDisplayForm(ThisDatabase.Name, FormName)
End sub
Function ThisDatabase as Object
oForm = ThisComponent.DrawPage.Forms.GetByIndex(0) ' DatabaseForm
oConnection = oForm.ActiveConnection ' ConectionWrapper
ThisDatabase = oConnection.Parent
End function