質問する
0

【libreOffice base】呼び出した先のフォームに、親画面の情報を引き継ぎたい。

質問日 2020-05-08 12:40:06 +0200

TOMA のGravatar画像

updated 2020-05-09 03:45:15 +0200

libreOffice6.4.3.2 baseを利用しています。

マクロにて取得した「フォーム1」のテキストボックスの値を、「フォーム2」のテキストボックスに入力する方法がわかりません。

「フォーム1」に表示されているテキストボックス(中身はidで主キー)を、 マクロのOpen(id)で開いた次の「フォーム2」に引き継ぎたいのですが、 方法がよくわかりません。

具体的なやりたいことは、 利用者ID(主キー)と利用者情報を入力する親画面から呼び出された子画面で、 利用者ID(外部キー)に紐づく情報を入力していく画面遷移を作りたいのです。

初歩的なことで申し訳有りません。 方法がわかる資料へのURLでも構いませんのでご教授いただければ幸いです。

<現在のソースコード>

Dim userid as String
Dim oForm1 as Object
Dim oForm2 as Object
Dim oTxtControl as Object

'親画面のUserIDの取得
oForm1 = ThisComponent.getDrawPage().getForms().getByName("01_UserInfo")
userid = oForm1.getByName("fmtUSERID").Text)

'子画面へUserIDを入力
oForm2 = ThisComponent.getDrawPage().getForms().getByName("03_AgreeInfo") 
                             '↑ここでNoSuchエラー。子画面のテキストボックスにUserIDを入れたい
   oForm2.????????????????.text = userid
edit retag flag offensive close merge delete

Comments

こんなソースコード書いてみました。

REM  事前にデータベースペインから「テーブル」を選択するなりフォームを一度開くなどしてデータベースを認識させておかないと以下のエラーになる
REM Type: com.sun.star.lang.WrappedTargetException
REM Message: 
REM TargetException:
REM Type: com.sun.star.sdbc.SQLException
REM Message: [OOoBase] データベースへの接続がありません。。

Option Explicit

Sub Main
    Dim form1def As Object
    Dim form2def As Object
    Dim form1 As Object
    Dim form2 As Object

    REM DocumentDefinitionになっているのは、EmbeddedObjectとして格納するため。

    form1def = ThisDatabaseDocument.FormDocuments.getByName("FormA")
    form2def = ThisDatabaseDocument.FormDocuments.getByName("FormB")

    form1def.Open
    form2def.Open
    Wait 500

    form1 = form1def.Component.Drawpage.Forms.getByName("Form1")
    form2 = form2def.Component.Drawpage.Forms.getByName("Form2")

    REM コミットはされない
    form1.getByName("TextBox1").Text = form2.getByName("TextBox1").Text
End Sub
himajin100000 のGravatar画像himajin100000 ( 2020-05-09 15:19:05 +0200 )edit

差別化のために、FormAやFormBに変更。 データベースペインで「フォーム」を選んだとき、右下「フォーム」に並ぶときの名前がこれら。右クリックした時に名前を変更できる。

これとは別に、FormAやFormBを編集するとき、「フォームのプロパティ」から編集したのがForm1とForm2

必須ではないものの、念の為英語版の表記を用い、スペースを取り除きました。好みの問題で。

himajin100000 のGravatar画像himajin100000 ( 2020-05-12 22:16:03 +0200 )edit

ありがとうございます! 親画面のデータが子画面に引き継げました!!

FormAという画面名で取得したオブジェクトから、 更にForm1というフォーム名でフォームを取得し、 そこからgetByNameでフォームに配置されたテキストオブジェクトにアクセスするのですね。

とてもわかり易かったです!

TOMA のGravatar画像TOMA ( 2020-05-13 17:21:46 +0200 )edit

1 Answer

0

回答日 2020-05-10 08:55:02 +0200

KWatanabe のGravatar画像

updated 2020-05-10 08:56:10 +0200

お尋ねの件についての回答にはなっていませんしマクロモジュールでもありません事をご了承ください。

お尋ねの件で「サブフォーム」は検討されましたでしょうか?

例えば、下記のような条件でDBを作成されていると仮定して 利用者テーブルのID(主キー)と利用者明細テーブルの外部キーをセットするのであれば 「サブフォーム」を使うことで対応できると思ったのです。

利用者テーブル・・・利用者情報(氏名・住所など)

利用明細テーブル・・・利用したサービス明細を登録していく(利用サービスの種類や内容など、あるいはサービス購入内訳など)

利用者テーブルをベースに作成したフォーム内に利用者明細テーブルを入力するサブフォームをセットすることで 利用者テーブルの主キーを利用者明細テーブルの外部キーにセットできると思います。

サブフォームの作り方 JA福岡市のBASEマニュアル:HSQLDB用ですので画面が多少違うと思います

https://www.ja-fukuoka.or.jp/upload/u...

  1. 既にサブフォームがあるフォームに、さらにサブフォームを追加する  .........................6

  2. ウィザードを使わないでサブフォームを作るには?  ......................................................10

WEB上で

Libreoffice BASE サブフォーム

Openoffice BASE サブフォーム

で検索するといろんな事例が出てくると思います。

必ずしも別々にフォームを立ち上げての処理が必要無いのであれば、サブフォームもお試しください。

edit flag offensive delete link もっと

Comments

丁寧なご説明と対応案、ありがとうございます。 一画面で複数のテーブルの情報を表示して、INSERTやUPDATEをするということですね。 わかりました、やってみます!

後日、結果を投稿いたします。

TOMA のGravatar画像TOMA ( 2020-05-11 11:49:24 +0200 )edit
ログイン/サインアップして回答する

質問ツール

2 followers

Stats

Asked: 2020-05-08 12:40:06 +0200

Seen: 79 times

Last updated: May 10