1. マクロで BASE を操る
記述あれこれ
Dec 9 2018 8th 九州 Libreoffice 勉強会
LibreOffice BASE
マクロで操作しよう
Koutarou Watanabe
CC-BY-SA4.0
Let's operate with macros
Manipulate BASE with macros
Description
4. Base User ≒ Access User
Access コンバートやってみたけど、情報が少なくて
挫折した過去を持つユーザー向けです。
BASE のマクロで、これだけはできてほしいことの中
から、とりあえず動作したものを個人的判断で紹介す
るものです。
大多数の人が「よくわからないと投げ出す」BASE マ
クロ。でもマクロができれば、手間を減らせる事 10 倍
です。何ができるのか確認しましょう
tried access converting, but it is for users who have past information
that is less frustrated.
5. 本セミナーの対象バージョン
本セミナーは
LibreOffice : Ver 6 . 1 . 3
OS : Windows10 ー 64 ビット
で動作確認できた内容について話します。
他のバージョンや OS では、セミナー内容とは違う場
合がありますのでご了承ください。
ちなみに Ver6.1.3 の BASE ではレポートフッターにページや日付を挿入
しようとすると LibreOffice 本体がダウンします!
I will talk about contents that I can check the operation
Target version of this seminar
6. BASE ってどうなの?
1.どうなの?って?
・とにかく、情報が少なすぎる
・何ができて、なにができないのかわからない
2.BASE のユーザー数が少ない
・ Access-User ≧ BASE-User
・ユーザーが少ない = 情報も少ない
3.求められている情報は何か?
・ Access と同じことは如何にしてやれるのか
How can I do the same with Access?
What are the required information?
Anyway, too little information
We do not know what We can do and what We can not do
Few users, so little information
What about BASE?
What about ?
9. MACRO の動作を見てみよう( Form )
1.フォームの自動オープン
2.フォーム・レポートのオープン
3.レコードの移動
4.新規レコード画面の表示
5.特定コントロールへのフォーカス移動
6.フォーム値の SQL ・クエリーへの反映
FormAutomatic form open
Opening a form and report
Move record
Display of new record screen
Focus movement
Parameter Query
※ フォームマクロはフォームにセットしたボタンに関連付けして利用
します、モジュールだけ流してもDrawpage の所でエラーになります。
Form macros are used in association with
buttons set in the form
10. MACRO の動作を見てみよう
1.テーブルインポート・エクスポート
2.クエリーのエクスポート
3.SQL のエクスポート
BASE には Access のようなインポート・エクスポート命令が用意されて
いません。
BASE does not have import / export instructions like Access.
Import / Export
Export Query
Export SQL
There is no example as it will be a very long description
記述が長いので例はありません。 ごめんなさい。
11. フォームの自動オープン Automatic form open
Sub Auto_FormOpen( )
Dim ObjectType As Variant
Dim FormMei As String
ObjectType = com.sun.star.sdb.application.DatabaseObject.FORM
FormMei = " 売上メイン MTF" ' 見かけのフォーム名(呼び名) Form Name
If ThisDatabaseDocument.FormDocuments.hasbyname(FormMei) Then
ThisDataBaseDocument.CurrentController.Connect()
ThisDatabaseDocument.CurrentController.loadComponent(ObjectType, FormMei, FALSE)
Else
MsgBox " 指定フォームが見つかりません。"& chr(13) & " フォーム名: " & FormMei &
chr(13) &" フォームの存在を確認ください! " ,16, " エラーです "
End if
End Sub
12. フォーム・オープンとクローズ
'***** フォームを開くマクロ例 ***** (開く) ボタンの「実行時」イベントに割り当てます。
Sub FormOpen
Dim oDoc As Object
oDoc = ThisDatabaseDocument
If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = false Then
Exit Sub
End If
oDoc.FormDocuments.getByName("FRM_parameter").open()
End Sub
'***** フォームを閉じるマクロ例 ***** (閉じる)
Sub FormClose
Dim oDoc As Object
oDoc = ThisDatabaseDocument
If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = false Then
Exit Sub
End If
oDoc.FormDocuments.getByName(" 売上メイン MTF").close()
End Sub
Opening a form and Close
13. レポート・オープン
'***** レポートを開くマクロ例 ******
Sub ReportOpen01
Dim oDoc As Object
oDoc = ThisDatabaseDocument
If oDoc.supportsService("com.sun.star.sdb.OfficeDatabaseDocument") = false Then
Exit Sub
End If
oDoc.ReportDocuments.getByName(" レポート名 ").open()
End Sub
Opening a Report
14. レコード移動
Sub Move_Record(FormName As String)
' レコードを移動する
Dim oForm As Object
'oForm = ThisComponent.Drawpage.Forms.getByName("MainForm")
oForm = ThisComponent.Drawpage.Forms.getByName(FormName)
' oForm.previous ' 前のレコードへ移動
oForm.Next ' 次のレコードへ移動
' oForm.first ' 最初のレコードへ移動
' oForm.Last ' 最後のレコードへ移動
End sub
‘Example
Sub GotoRec
call Move_Record("MainForm")
end sub
Move record
15. 新規レコード画面の表示
Sub Move_New_Record(FormName As String)
' 新規入力レコードに移動する
Dim oForm As Object
'oForm = ThisComponent.Drawpage.Forms.getByName("MainForm")
oForm = ThisComponent.Drawpage.Forms.getByName(FormName)
oForm.moveToInsertRow
End sub
‘Example
Sub GotoNewRec
call Move_New_Record("MainForm")
end sub
Display of New Record screen
16. 特定コントロールへのフォーカス移動
Sub Focuscontrol
Dim oDoc As Object
Dim oForm As Object
Dim oTxtControl As Object
oDoc = ThisComponent
oForm = oDoc.getDrawPage().getForms().getByName("MainForm")
oTxtControl = oDoc.getCurrentController().getControl(oForm.getByName("dat 売上計上日 "))
oTxtControl.setFocus()
End sub
Focus movement
17. フォーム値の SQL ・クエリーへの反映
Sub LikeTxt 'Fuzzy search
Dim pProp(1) As New com.sun.star.beans.PropertyValue
Dim oFilter as string
Dim oDoc As Object
Dim oDraw As Object
Dim oForm As Object
Dim oAConnection As Object
Dim oQueries As Object
Dim oQuery As Object
oDoc = ThisComponent.getParent()
oAConnection = oDoc.CurrentController.ActiveConnection
oDraw = ThisComponent.getDrawPage()
oForm = oDraw.getForms().getByName("FRM0002") '*** 「フォームの属性」での名前*** FormName is Confirm a Form Navigator
Dim kmoji as String '*** 検索文字列 *** Search string
kmoji = oForm.getByName("txtlike01").text '*** テキストボックスの値を変数に代入
oFilter = "SELECT * FROM ""TABLE_A1"" WHERE "" 名称 "" LIKE '" & "%" & kmoji & "%" & "'"
print oFilter 'Confirm a SQL
oQueries = oAConnection.getQueries()
If oQueries.hasByname("TxtLikeQuery") then '*** 変更するクエリー名 *** Query Name
oQuery = oQueries.getByname("TxtLikeQuery")
oQuery.command = oFilter
Else
msgbox " 変更するクエリーがありません。" & chr(10) & chr(10) & "TxtLikeQuery という名のクエリーを作成してください "
Exit sub
End if
End sub
Parameter Query
18. 表示レコードの削除
Sub Delete_Record(FormName As String)
' 表示レコードを削除する
Dim oForm As Object
'oForm = ThisComponent.Drawpage.Forms.getByName("MainForm")
oForm = ThisComponent.Drawpage.Forms.getByName(FormName)
oForm.DeleteRow
'oForm.reload
End sub
‘Example
Sub Delete_RecP
' 削除モジュールの呼び出し
Dim Chkflg As String
Chkflg = MsgBox( " 表示しているレコードを削除しますか。" , 256 + 32 + 4 ," 確認 ")
If Chkflg = 6 Then
call Delete_Record("MainForm")
' call Move_New_Record("MainForm")
Else
MsgBox " 操作を中止します。"
Exit Sub
End If
End Sub
Delete Record
19. コンボボックスで選択に対応した値を返す
Sub Cbox_setvalue
' コンボボックスに対応した項目を隣のテキストボックスに表示する vlookup 的な動作です
Dim sSql As String
Dim oDraw As Object
Dim oForm As Object
Dim oResult As Object
Dim sValue As String
Dim oTextbox2 As Object
oDraw=ThisComponent.getDrawPage()
oForm=oDraw.getForms().getByName("MainForm") 'form を指定
' 例では選択した数字に対応した人物名を隣のテキストに表示します
sSql ="select "" 名称 "" from "" 幕末人物 MT"" where "" 名簿 ID"" = '" &
oForm.getByName("combotext").text & "';"
oResult =
ThisDataBaseDocument.DataSource.getconnection("","").createstatement.executequery(sSql)
While oResult.next()
sValue = oResult.getString(1)
Wend
oTextbox2 = oForm.getByName( "name_txt01" )
oTextbox2.Text = sValue
End Sub
20. コンボボックスのデータソースを絞り込む
Sub Cbox_selection
' コンボボックス 1 の内容で次のコンボボックス 2 のデータソースを絞り込む
Dim pProp(1) As New com.sun.star.beans.PropertyValue
Dim oFilter as string
Dim oDoc As Object
Dim oDraw As Object
Dim oForm As Object
Dim oAConnection As Object
oDoc = ThisComponent.getParent()
oAConnection = oDoc.CurrentController.ActiveConnection
oDraw = ThisComponent.getDrawPage()
oForm = oDraw.getForms().getByName("MainForm") '*** 「フォームの属性」での名前***
oFilter = "SELECT "" 出身地 CD"", "" 出身藩 "", "" エリア ID"" FROM "" 出身地MT "" where
"" エリア ID"""
oFilter = oFilter & " = '" & oForm.getByName("combotext1").text & "';"
print oFilter
oForm.getByName("combotext2").ListSource = oFilter
oForm.getByName("combotext2").refresh
End sub
21. There is no time like the present!
今が最適時です!
さあ!これで
あなたも BASE 使い!
~ Base Macro ?
使ってみたことあるよ と言おう~
Let's say I've used it!
22. 今日の講演を聞いたから
きっと大丈夫!!
There is no time like the present!
SlideShare にも色々上げてるから見てね!
I heard today's lecture
it must be no problem!