概要
LibreOffice Baseの使い方でわかりやすいものが少なかったので、まとめてみました。
Accessの様にプログラマーでなくても、簡単に扱えるデータベースソフトって非常に貴重ですよね。
しかも、無料で使えます。
テーブルの正規化などのデータベースの基本的なことは、ほかのサイトでも詳しく説明されているので割愛します。
LibreOffice Baseの使い方のキモの部分に集中して説明したいと思います。
テーブルの作成
例として、商品の明細のデータベースを作成してみます。
ある会社が顧客に文房具を売ったときの明細を記録するデータベースです。
あえて、必要なデータを少なめにして、わかりやすくしています。
4つのテーブルを作成します。
売上テーブル:売上伝票で言うと伝票番号を記録するテーブルです。
売上明細テーブル:伝票の中身(売上内容)を記録するテーブルです。
得意先テーブル:顧客情報を記録するテーブルです。
商品テーブル:商品情報を記録するテーブルです。
- 売上_テーブル
売上_id(主キー):BIGINT,自動値
得意先_id:BIGINT
売上_日付:DATE - 売上明細_テーブル
売上明細_id(主キー):BIGINT
商品_id(主キー):BIGINT
売上明細_数量:BINGINT
※主キーが二つあるテーブルです。それぞれほかのテーブルのID(外部キー)を使っていますのでこのテーブルでは自動値を設定する必要はありません。「売上テーブル.売上_id = 売上明細テーブル.売上明細_id 」
かつ
「商品テーブル.商品_id = 売上明細.商品_idです。」この設定のおかげで、サブフォームが機能するようになります。
売上明細_idと商品_idの両方が同じ値を持つデータがテーブル上に書き込むことが出来なくなります。
同じ明細に複数の商品が登録されることは、なくなるわけです。
実際に、一つの明細に同じ商品を登録するとエラーが出ます。 - 得意先_テーブル
得意先_id(主キー):BIGINT,自動値
得意先_名:VARCHAR(100)
得意先_備考:VARCHAR(100) - 商品_テーブル
商品_id(主キー):BIGINT,自動値
商品_名:VARCHAR(100)
商品_単価:BIGINT
商品_備考:VARCHAR(100)
以上の内容でテーブルを作成します。
リレーションの設定
図の様にリレーションを設定します。
気を付ける点は、”売上_テーブル”と”売上明細_テーブル”のリレーションで
テーブル間の線をクリックしてから右クリックで編集を選択します。
表示された”リレーション”で”商品明細_テーブル”側の設定を”カスケードを更新”に変更します。
これは、”売上_テーブル”のIDが更新されると”売上明細_テーブル”のIDも更新されると言う設定です。
それと、もしこのリレーションが1対多になっていない場合主キーの設定が2項目にされていないはずです。
“商品明細_id”と”商品_id”の両方を選択して、”主キー”に設定します。
クエリの作成
今回は、クエリは使いません。
リストボックスの中での選択肢としてのクエリだけを使っています。
フォームの作成
ウィザードを使って基本的なところを作ってからコントロールを変更する等して作るのが実際の使い方になるかと思います。
ただ、今回は理解のため手動で行います。
これから作るフォームは”売上_テーブル”の内容を表示したり編集した入りするためのフォームです。
“売上_テーブル”のサブフォームとして複数の”売上明細_テーブル”の内容を表示します。
つまり、伝票として考えたとき伝票1セット分という事です。
フォーム画面から”デザイン表示でフォームを作成”をクリックしてデザイン画面を開きます。
分かりやすいようにラベルを配置します。
フォームの設定
LibreOfficeのコントロールは、”フォーム”と言う単位でまとまっています。
今回は、デフォルトのまま使ってしまったので”フォーム”の下に”フォーム”がありますが名前を変えたほうが良かったかもしれません。
メニューの”フォーム”->”フォームナビゲータ”でフォームナビゲータを表示します。(ツールバーからも表示できます。)
そうすると”フォーム”のツリー構造が表示されます。
ルートの”フォーム”の下の子”フォーム”を右クリックして”フォームの属性”を表示します。
“データ”タブを開いて”内容の種類”を”テーブル”に変更します。
“内容”で”売上_テーブル”を選択します。
これで、子”フォーム”で使われるコントロールは、”売上_テーブル”の内容を表示するようになります。
それぞれのコントロール内で、どのカラムのデータを表示するかを設定します。
さらに、サブフォームの設定を行います。
子”フォーム”で右クリックし
“新規作成”->”フォーム”でサブフォームを作成します。
作成した後に、フォームナビゲータ―の新しいフォームの名前の上でダブルクリック(もしくわF2キー)すると名前を変更できるようになります。
サブフォームの”データ”タブを設定します。
“内容の種類”:テーブル
“内容”:売上明細_テーブル – “売上明細テーブル”のデータを表示します。
”リンク元”:”売上_id” – 親フォームの”売上_id”とリンクします。
“リンク先”:”売上明細_id” – 親フォームの”売上_id”のデータが入り(リンク)ます。
“ナビゲーションバー”:親フォーム – サブフォームにもナビゲーションバーがありますが、親フォームのナビゲーションバーを使います。
※注意事項として”サブフォーム”のデータの取得元(”データ”->”内容”)は、”クエリー”を指定しあ場合はほぼデータの書き込みはできないものと思ったほうが良いです。
閲覧は、問題なく行えます。
入力欄の配置
“売上_ID”は、テキストボックスで表示します。
“売上_日時”は、日付フィールドで表示します。
“得意先_ID”は、リストボックスで表示します。
売上_IDの設定
フォームナビゲーターで”売上_ID”のテキストボックスを選択して、右クリックで”属性”を選択します。
“全般”タブで”ラベルフィールド”で”売上_ID”を選択します。
これは、ラベルと関連付けるための設定です。特に関連付ける必要がないかもしれません。
プロパティ画面が開いたら、”データ”タブを選択します。
“データフィールド”:”売上_id”を選択します。
売上_日時の設定
同様にプロパティを開きます。
“全般”タブで”日付の書式”で、今回は”YYYY/MM/DD”を選択します。”
“データ”タブで、”データフィールド”を”売上_日時”に設定します。
得意先_IDの設定
同様に設定します。
“全般”タブで”ドロップダウン”を”はい”に設定します。これは、好みで設定してください。
“データ”タブで
“データフィールド:”得意先_id”を選択します。
“リスト内容の種類”:”Sql”を選択します。
“リスト内容”で右側の”…”と表示されているボタンをクリックします。
そうするとSQLの編集画面が開きます。
ここでは、このリストボックスから顧客先を選択したいので,得意先_テーブルの内容を表示します。
そして、”得意先_名”を選択し次に”得意先_id”を選択します。
で、画面を閉じると”リストの内容に
SELECT “得意先_名”, “得意先_id” FROM “得意先_テーブル”
と表示されます。
このSELECT文のカラム名で先頭に表示されているものがリストボックスに表示されます。
“得意先_id”の順番が先頭であれば表示されるのは”得意先_id”になります。
また、
SELECT “得意先_id”||’:’||”得意先_名”, “得意先_id” FROM “得意先_テーブル”
このように書くと、”1:得意先名”のように表示されます。
||が文字の連結
”が文字列になりますので
idと名前が”:”で区切られて表示されます。
※何度もデータを書き換えると割と簡単にフォームが壊れるので、注意が必要です。
動作が怪しければ、あきらめてフォームを作り直すことをお勧めします。
サブフォームの配置
“フォームナビゲータ―”で、先ほど作成した”サブフォーム”を選択してから
“テーブルコントロール”を配置します。
配置したテーブルの上部のふちで右クリックすると
“列の挿入”と表示されるので”リストボックス”を追加します。
“列の挿入”もう一列”テキストボックス”を追加します。
1列目の”リストボックス”は、商品の名前と単価を表示するように。
2列目の”テキストボックス”には、購入した商品の数量を表示するようにします。
“リストボックス_商品名”の設定
商品名を表示する列を作ります。
商品名と一緒に単価も表示したいので、”リストの内容”にクエリを使います。
“全般”タブ”で
“名前” : “リストボックス_商品名”
“タイトル” : “商品名 – 単価”
“データ”タブ”で
“データフィールド” : “商品_id”
これは、すでにサブフォームでデータの取得先を”売上明細_テーブル”と
していますので”売上明細_テーブル”中の”フィールド名”になります。
“リストの内容の種類” : “Sql”
“リストの内容” : “SELECT “商品_名”||’ – ‘||”商品_単価”||’円’, “商品_id” FROM “商品_テーブル”
こうすることで2つのフィールドの内容がセルに表示されます。
繰り返しになりますが “||”が文字列結合の記号で
‘xxxxx’の様に単なる文字は、シングルクォーテーションで囲みます。
“テキストボックス_数量”の設定
商品の購入した数量を表示する列を作ります。
“全般”タブ
“名前” : “テキストボックス_数量”
“タイトル” : “数量”
“データ”タブ
“データフィールド” : “売上明細_数量”
とします。
ここまで作業が終わると以下のような画面になっています。
動作確認
ここまで出来たらマスターにデータを入力して動作を確認してみましょう。
本来は、マスターの入力画面も作ればよいですが練習なのでテーブルに直接データを書き込みました。
“商品_テーブル”
“得意先_テーブル”
それでは、改めて”商品_フォーム”を開いてください。
以下の様な画面になっているかと思います。
データを追加したり色々試してください。
データを変更したあとは、別の行へ移動した時点でデータが書き換えられます。
データの書き換えが確定しない状態で何かをすると表示が元に戻ることが有ります。
これは、見た目の情報は書き換えられますがテーブルのデータが書き換わっていないため改めてテーブルの内容に合わせて表示が書き換わるためです。
なお、商品名が重複するとエラーが出ます。
そのような場合は、もっと丁寧な警告ダイアログを出すほうが良いですよね。
アプリとしては、改善すべき点ですね。
改良すべき点
このアプリは、練習用なのでここまでとしますが本当に使用するには足りない部分が多々あります。
たとえば、商品単価と購入数量が分かれば購入金額(単価x数量)も表示したいですよね。
それにサブフォームに表示されたものの合計金額も知りたいですよね。
それ等を表示させるには、また別の手段が必要なので別の記事としたいと思います。
アプリケーション中で計算などの必要のないものは、ここまでの知識で色々できるかと思います。
まぁ、でも何かの在庫管理でもなんでも合計とか計算の必要なものは出てきそうですよね。
そのような場合、マクロやSqlを使って計算します。
その方法については、以下に記事を書きました。
Base 練習用ファイル
今回の記事で出来上がったファイルを見本の為に保存しておきます。
ダウンロードして使ってください。
マクロは、使っていません。
Base練習用ファイル ダウンロード
Commnts