SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
マクロで BASE を操る
記述あれこれ
Dec 9 2018   8th 九州 Libreoffice 勉強会
LibreOffice BASE
マクロで操作しよう
Koutarou Watanabe
CC-BY-SA4.0
Let's operate with macros
Manipulate BASE with macros
Description
Agenda   ~アジェンダ~
講師紹介
BASE のマクロでできたこと
マクロの動作を見てみよう(フォーム)
データインポートとエクスポート
マクロを使った処理のあれこれ
などなど 
講師紹介   ~ Lecturer Profiles ~
渡 浩太郎(邊 Koutarou Watanabe )
福岡市出身
某団体 2011 年 LibreOffice 導入時の
メイン担当&マニュアル作成 + 苦情処理係
(現在はシステム担当ではありません)
LibreOffice 日本語チーム( 2018/11 ~)
質問や悩み事等は直接本人まで!
今日もプライベート参加です
このプレゼンは渡辺の個人的見解であり、所属団体の見解ではございません
  
Base User ≒ Access User
Access コンバートやってみたけど、情報が少なくて
挫折した過去を持つユーザー向けです。
BASE のマクロで、これだけはできてほしいことの中
から、とりあえず動作したものを個人的判断で紹介す
るものです。
大多数の人が「よくわからないと投げ出す」BASE マ
クロ。でもマクロができれば、手間を減らせる事 10 倍
です。何ができるのか確認しましょう
tried access converting, but it is for users who have past information
that is less frustrated.
本セミナーの対象バージョン
本セミナーは
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
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 ?
Access の構成と比べてみる
System Image
Access
テーブル (TABLE)
フ
ォ
ー
ム
Form
ク
エ
リ
ー
Query
レ
ポ
ー
ト
Report
フ
ォ
ー
ム
Form
BASE
ク
エ
リ
ー
Query
レ
ポ
ー
ト
Report
Firebird (TABLE)
DataSource
Writer
Firebird 埋込 Embedded→
BASE のマクロでできたこと
1.フォームの自動オープン
2.フォーム・レポートのオープン
3.レコードの移動
4.新規レコード画面の表示
5.特定コントロールへのフォーカス移動
6.フォーム値の SQL ・クエリーへの反映
7.テーブルインポート・エクスポート
8.クエリーのエクスポート
9.SQL のエクスポート
Automatic form open
Opening a form and report
Move Record
Display of New Record screen
Focus movement
Parameter query
Import / Export
Export Query
Export SQL
Can do with macro
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
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
記述が長いので例はありません。 ごめんなさい。
フォームの自動オープン 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
フォーム・オープンとクローズ
'***** フォームを開くマクロ例   *****  (開く) ボタンの「実行時」イベントに割り当てます。
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
レポート・オープン
'***** レポートを開くマクロ例 ******
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
レコード移動
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
新規レコード画面の表示
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
特定コントロールへのフォーカス移動
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
フォーム値の 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
表示レコードの削除
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
コンボボックスで選択に対応した値を返す
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
コンボボックスのデータソースを絞り込む
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
There is no time like the present!
今が最適時です!
さあ!これで
 あなたも BASE 使い!
~ Base Macro ?
 使ってみたことあるよ と言おう~
Let's say I've used it!
今日の講演を聞いたから
きっと大丈夫!!
There is no time like the present!
SlideShare にも色々上げてるから見てね!
I heard today's lecture
it must be no problem!
何かご質問はありませんか?
Base-M
Base-IM
Any questions?
In Japanese please
ご清聴ありがとうございました
CC-BY-SA4.0
thank you for your attention

Contenu connexe

Tendances

Tendances (20)

Cassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sqlCassandraとh baseの比較して入門するno sql
Cassandraとh baseの比較して入門するno sql
 
NoSQL3
NoSQL3NoSQL3
NoSQL3
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
AIシステムの要求とプロジェクトマネジメント-前半:機械学習工学概論
 
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
 
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)Apache Airflow入門  (マーケティングデータ分析基盤技術勉強会)
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
データ仮想化を活用したデータ分析のフローと分析モデル作成の自動化のご紹介
データ仮想化を活用したデータ分析のフローと分析モデル作成の自動化のご紹介データ仮想化を活用したデータ分析のフローと分析モデル作成の自動化のご紹介
データ仮想化を活用したデータ分析のフローと分析モデル作成の自動化のご紹介
 
ログ解析基盤におけるストリーム処理パイプラインについて
ログ解析基盤におけるストリーム処理パイプラインについてログ解析基盤におけるストリーム処理パイプラインについて
ログ解析基盤におけるストリーム処理パイプラインについて
 
BERTによる文書系AIの取り組みと、Azureを用いたテーブルデータの説明性実現!
BERTによる文書系AIの取り組みと、Azureを用いたテーブルデータの説明性実現!BERTによる文書系AIの取り組みと、Azureを用いたテーブルデータの説明性実現!
BERTによる文書系AIの取り組みと、Azureを用いたテーブルデータの説明性実現!
 
リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例
 
Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門Data Factory V2 新機能徹底活用入門
Data Factory V2 新機能徹底活用入門
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
 
DXのための内製化のススメ
DXのための内製化のススメDXのための内製化のススメ
DXのための内製化のススメ
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
 
DXの推進において企業内に求められる人材やデジタル人材の育て方
DXの推進において企業内に求められる人材やデジタル人材の育て方DXの推進において企業内に求められる人材やデジタル人材の育て方
DXの推進において企業内に求められる人材やデジタル人材の育て方
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイントPostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
 

Similaire à マクロでBASEを操作しよう BASE Let's operate with macros

Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
totty jp
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Yuta Ohashi
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
 
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
Sadao Tokuyama
 

Similaire à マクロでBASEを操作しよう BASE Let's operate with macros (20)

Movable TypeのWebアプリケーションフレームワークの基本
Movable TypeのWebアプリケーションフレームワークの基本Movable TypeのWebアプリケーションフレームワークの基本
Movable TypeのWebアプリケーションフレームワークの基本
 
Sc2009autumn s2robot
Sc2009autumn s2robotSc2009autumn s2robot
Sc2009autumn s2robot
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
 
Ext.direct
Ext.directExt.direct
Ext.direct
 
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとりVue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版
 
第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話
 
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
 
第4回Symfony2勉強会 基礎編ワークショップ.1
第4回Symfony2勉強会 基礎編ワークショップ.1第4回Symfony2勉強会 基礎編ワークショップ.1
第4回Symfony2勉強会 基礎編ワークショップ.1
 
Lt 111119
Lt 111119Lt 111119
Lt 111119
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
2011年2月9日第130回FxUG勉強会@東京第一打者空振り三振
 

Plus de koutarou watanabe

Plus de koutarou watanabe (10)

Officeマクロ仕事で使う勘所
Officeマクロ仕事で使う勘所Officeマクロ仕事で使う勘所
Officeマクロ仕事で使う勘所
 
文系でも学んでおきたいOfficeマクロプログラミング
文系でも学んでおきたいOfficeマクロプログラミング文系でも学んでおきたいOfficeマクロプログラミング
文系でも学んでおきたいOfficeマクロプログラミング
 
LibreOffice運用心得の條
LibreOffice運用心得の條LibreOffice運用心得の條
LibreOffice運用心得の條
 
Libre office導入後の今を語る
Libre office導入後の今を語るLibre office導入後の今を語る
Libre office導入後の今を語る
 
Libre office導入してわかったこと
Libre office導入してわかったことLibre office導入してわかったこと
Libre office導入してわかったこと
 
Advice to LibreOffice migration Example in Fukuoka, Japan
Advice to LibreOffice migration Example in Fukuoka, JapanAdvice to LibreOffice migration Example in Fukuoka, Japan
Advice to LibreOffice migration Example in Fukuoka, Japan
 
LibreOffice導入へのアドバイス
LibreOffice導入へのアドバイスLibreOffice導入へのアドバイス
LibreOffice導入へのアドバイス
 
LibreOffice導入のポイント10
LibreOffice導入のポイント10LibreOffice導入のポイント10
LibreOffice導入のポイント10
 
LibreOffice導入で遭遇する事項と運用中に思うこと
LibreOffice導入で遭遇する事項と運用中に思うことLibreOffice導入で遭遇する事項と運用中に思うこと
LibreOffice導入で遭遇する事項と運用中に思うこと
 
実務で使えたLibreOffice
実務で使えたLibreOffice実務で使えたLibreOffice
実務で使えたLibreOffice
 

マクロでBASEを操作しよう BASE Let's operate with macros

  • 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
  • 3. 講師紹介   ~ Lecturer Profiles ~ 渡 浩太郎(邊 Koutarou Watanabe ) 福岡市出身 某団体 2011 年 LibreOffice 導入時の メイン担当&マニュアル作成 + 苦情処理係 (現在はシステム担当ではありません) LibreOffice 日本語チーム( 2018/11 ~) 質問や悩み事等は直接本人まで! 今日もプライベート参加です このプレゼンは渡辺の個人的見解であり、所属団体の見解ではございません   
  • 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 ?
  • 7. Access の構成と比べてみる System Image Access テーブル (TABLE) フ ォ ー ム Form ク エ リ ー Query レ ポ ー ト Report フ ォ ー ム Form BASE ク エ リ ー Query レ ポ ー ト Report Firebird (TABLE) DataSource Writer Firebird 埋込 Embedded→
  • 8. BASE のマクロでできたこと 1.フォームの自動オープン 2.フォーム・レポートのオープン 3.レコードの移動 4.新規レコード画面の表示 5.特定コントロールへのフォーカス移動 6.フォーム値の SQL ・クエリーへの反映 7.テーブルインポート・エクスポート 8.クエリーのエクスポート 9.SQL のエクスポート Automatic form open Opening a form and report Move Record Display of New Record screen Focus movement Parameter query Import / Export Export Query Export SQL Can do with macro
  • 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!