「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:3490
現在:4


フォーム上のボタンからあるフィールドに関連した別のフォームを開くには

ページOpenOffice.org FAQの登録ページ
投稿者shouzo_n
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-06-02 14:02:44 (水)
OSWindows XP
依存するページfaq/1/405 Base データベース ボタンを押して、別のフォームを開きたい
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

OpenOffice baseでフォーム上のボタンから別のフォームを開くマクロは
Sub Test

On Error Goto ErrTrap

oDoc = ThisDatabaseDocument

If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = False Then Exit Sub

oDoc.FormDocuments.getByName("開きたいフォーム名").open()

Exit Sub

ErrTrap:

End Sub
で開くことができますが、例えばAというフォームの氏名フィールドのCさんに連動した
Bというフォーム上のCさんの情報を開くにはどのようなマクロを書き足せばよいですか?


フィルターでOKの場合

ike@九州 (2010-06-02 16:20:40 (水))

以下をフォームAのボタンに割り当てるとフォームBにフィルターをかけます

Sub click(oEv)
'ボタンの親のフォームを取得
 oFormA = oEv.Source.getModel().getParent()
'フォームA の現在位置の name フィールドの内容を取得
 sName = oFormA.getString(oFormA.findColumn("name"))
'Base ドキュメントを取得 
 oDoc = oFormA.getParent.getParent.getParent 
 If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = False Then Exit Sub
'フォームB を開く 
 oFormDoc = oDoc.FormDocuments.getByName("フォームB")
 oFormDoc.Open()
'開いた後にフォームB の MainForm を取得
 oFormB = oFormDoc.getComponent.getDrawPage.getForms.getByName("MainForm")
'フィルターをセットして再読み込みする 
 oFormB.Filter = """" & "name" & """ = '" & sName & "'"
 oFormB.ApplyFilter = True
 oFormB.reload()
End Sub

ありがとうございます

shouzou_n (2010-06-02 22:11:27 (水))

ike@九州さん、早速のご指導ありがとうございました。ご指導頂いた通りにマクロを割り当てました。私が意図していたようにフォームを開くことができました。
同じファイル内の他のフォームで同様のボタンを2つ配置してフォームを開くように設定し、テストしたらうまく動いてくれましたが、一度ファイルを閉じて再度ファイルを開くとランタイムエラーのダイヤログがでました。ファイルが全く開かなくなったのでファイルを削除しバックアップしていたファイルを入れ直し、1つのフォームに1つのボタンを設定し、その他のフォームには設定するのを止めたら正常に動いてくれました。エラーのダイヤログにはOpenOffce.orgの開発チームに連絡しなさいと言うような英語のメッセージが出ていましたが、一番必要なフォーム上にボタンを設定し使えるようにしました。ike@九州さんのおかげで操作が楽になりました。大変勉強になりました。ありがとうございました。

無題

ike@九州 (2010-06-06 13:08:12 (日))

幾つものフォームに割り当ててみましたが当方では再現しませんでした。

コードそのものには致命的な記述は無いはずですが、他のマクロ操作も関連しているかも知れませんね。
サンプルがあれば添削できます

画面を広くとる事ができれば
新たにフォームを開く事なく、リアルタイムでリンクしたサブフォームとして現在のフォームの中に表示する事が出来ます。(マクロ未使用)

返信遅くなりました。すみません!再現して頂いたそうでありがとうございます。

shouzou_n (2010-06-11 21:04:28 (金))

ike@九州さん、返事が遅くなりました。すみません。わざわざ再現して頂きありがとうございます。開かなくなったファイルは削除したので貼付できませんが、以下のような作業をしました。教えて頂いたマクロは住所録のクエリ表示フォームにボタンを作り住所録のマクロ管理タグのmodule1に登録しました。

Sub click(oEv)
  'ボタンの親のフォームを取得
  oFormA = oEv.Source.getModel().getParent()
  'フォームA の現在位置の name フィールドの内容を取得
  sName = oFormA.getString(oFormA.findColumn("名前"))
  'Base ドキュメントを取得 
  oDoc = oFormA.getParent.getParent.getParent 
  If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = False Then Exit Sub
  'フォームB を開く 
  oFormDoc = oDoc.FormDocuments.getByName("地図表示")
  oFormDoc.Open()
  '開いた後にフォームB の MainForm を取得
  oFormB = oFormDoc.getComponent.getDrawPage.getForms.getByName("MainForm")
  'フィルターをセットして再読み込みする 
  oFormB.Filter = """" & "名前" & """ = '" & sName & "'"
  oFormB.ApplyFilter = True
  oFormB.reload()
End Sub

と変更ました。次に、住所録の入力フォームに「はがき登録」のボタンを貼り付け、

Sub Test
  On Error Goto ErrTrap
  oDoc = ThisDatabaseDocument
  If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = False Then Exit Sub
    oDoc.FormDocuments.getByName("はがき登録フォーム").open()
  Exit Sub
  ErrTrap:
End Sub

としmodule2に登録。次に住所録の入力フォームに地図入力フォームのボタンを貼り付け

Sub Test
  On Error Goto ErrTrap
  oDoc = ThisDatabaseDocument
  If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = False Then Exit Sub
    oDoc.FormDocuments.getByName("地図入力フォーム").open()
  Exit Sub
  ErrTrap:
End Sub

としてmodule3に登録しました。
その後、各フォームを開きボタンをクリックしてフォームが開くことを確認しました。
この時点で作業を中断し、ファイルを閉じ、その後ファイルを開こうとすると
ランタイムエラーのダイアログが出て、BASEを開けず、ファイルの復元作業のダイアログで復元完了しても、また、同じエラーが出る繰り返しでした。
マクロは初心者なので原因はわかりません。今はバックアップしていたファイルにike@九州さんのマクロだけを使っています。
実はデータの表示フォームには住所録以外のデータに顔写真やQRコード、さらにハガキの送受信記録のサブフォームと頂いたハガキ画像を表示するサブフォームと2つのサブフォームを入れていて画面がいっぱいです。^^;
私は脱マイクロソフトに燃え、BASEを勉強中です!

お詫びいたします

ike@九州 (2010-06-12 11:03:26 (土))

検証不足でした

致命的なコードの記述がありました。

'フォームB を開く 
oFormDoc = oDoc.FormDocuments.getByName("フォームB")
oFormDoc.Open()
'開いた後にフォームB の MainForm を取得
oFormB = oFormDoc.getComponent.getDrawPage.getForms.getByName("MainForm")

の部分ですね。
これにより、Baseを終了した後でも soffice.bin プロセスが残ってました。

shouzo_n さんの反応が無ければ致命的なコードを掲載したままで多大なご迷惑をおかけするところでした。有難うございました。

以下に修正したコードを提示します

Sub click(oEv)
 'ボタンの親のフォームを取得
 oFormA = oEv.Source.getModel().getParent()
 'フォームA の現在位置の "名前" フィールドの内容を取得
 sName = oFormA.getString(oFormA.findColumn("名前"))
 'Base ドキュメントを取得 
 oDoc = oFormA.getParent.getParent.getParent
 'フォームB の MainForm を取得
 oFormDoc = fnGetFormDoc(oDoc,"フォームB")
 oFormB = oFormDoc.getDrawPage.getForms.getByName("MainForm")
 'フィルターをセットして再読み込みする 
 oFormB.Filter = """" & "名前" & """ = '" & sName & "'"
 oFormB.ApplyFilter = True
 oFormB.reload()
End Sub

Function fnGetFormDoc(oBaseDoc As Object,sFormName As String) As Object
 oController = oBaseDoc.getCurrentController
 If Not oController.IsConnected Then oController.Connect() 
 'フォームを開く
 Dim args(1) As New com.sun.star.beans.PropertyValue
 args(0).Name = "ActiveConnection"
 args(0).Value = oController.ActiveConnection
 args(1).Name = "OpenMode"
 args(1).Value = "open" 
 oForms = oBaseDoc.getFormDocuments()
 fnGetFormDoc = oForms.loadComponentFromURL(sFormName, "_blank", 0, args)
End Function

困ったときは はにゃ?さん のサイトを見直す事ですね

お詫びだなんてとんでもない!

shouzou_n (2010-06-12 14:21:32 (土))

マクロについて、ずぶの素人でこちらこそご迷惑をお掛けしています。素早い対応をしていただきただただ感謝です!!
修正のマクロを登録し、他のフォーム上にフォームを開くボタンやレポートを開くボタンを設置し動作させてみました。ファイルを一旦終了し、再度開いてみました。正常に動作しました。ランタイムエラーのダイアログはでません。
私の思い描いたとおりの動作が出来るようになりました。前回の投稿から何日も経ってからの返信に対していち早く修正をしていただきike@九州さんありがとうございました。ちなみに私は福岡市近郊に住んでいる’おやじ’です。
質問にたいして完璧な回答、ご指導をしていただいたのでこれで終了とさせていただきたいと思います。再度、お礼を申し上げます。ありがとうございました。m(_ _)m

お名前:
題名: