LibreOffice Baseのプログラミング。 パート3

今日は、LibreOffice Base(OpenOffice Base)でデータを編集する際のダイアログボックスの使用を検討します。 以前の投稿で見たように、LibreOffice Base(OpenOffice Base)フォームは、実際にはLibreOffice(OpenOffice)Writerテキストエディターのインスタンスです。 フォーム内のウィンドウインターフェイスを整理するために、ダイアログが使用されます。ダイアログは組み込みのビジュアルインターフェイスで便利に作成されますが、データベーステーブルとの通信はサポートしていません。 この接続をOO Basicマクロで整理します。



順番に始めましょう。 データベースに2つのテーブルを作成します。



製品

-id(整数、主キー)

-名前(文字列)



注文

-id(整数、主キー)

-productId(整数)

-カウント(整数)

-日付(日付データ型)



注文フォームを作成し、注文という名前のフォーム要素をフォームに追加します。 また、注文データソースを使用したテーブルコントロール。 これを行う方法については、一連のメッセージのパート2で説明しました。



日付列のプロパティを設定するときは、図に矢印でマークされているプロパティに注意してください。これにより、データを目的の形式で表示し、ドロップダウンカレンダーを使用して特定の日付を選択できます。



描画
画像



これで、テーブル内でデータを追加および変更できます。 ある時点まで、これは便利です。これは、テーブルプロセッサを使用するクライアントの通常の作業と同様です。 しかし、ある時点で、テーブルプロセッサでの作業の特徴でもある問題が始まります。 データは気付かずに誤って変更される可能性があります。 そして、すべてをロールバックすることは不可能であることに気付きました。 新しいスピーカー用のスペースはほとんどなく、不快な水平スクロールが発生する場合があります。 列見出しにもサイズ制限があり(そうでない場合は水平に収まりません)、これによりデータの詳細な説明ができなくなります。



半分の方法として、データ入力用の通常のフィールドをテーブルの横に配置できます(テキストコントロール、数値コントロールなど)。 注文テーブルの対応するフィールドをデータソースとして設定すると、すべてが機能します。 データセットをナビゲートすると、入力フィールドのデータが変更されます。 入力フィールドのデータを変更すると、データベーステーブルのデータが変更されます。 しかし、このソリューションはあまり美しくありません。



したがって、ダイアログを使用してこのような機能を実装します。 ダイアログには1つの重要な制限があります。 ダイアログ入力フィールドは、データベーステーブルに関連していません。 したがって、データベーステーブルからダイアログエントリフィールドに入力し、データベーステーブルに入力フィールドを保存する必要があります、OO Basicマクロで。 ただし、これは良いことです。なぜなら OO Basicのプログラミングの可能性を考慮することができます(それ以前は、私のメッセージは環境でのみ動作することを説明しましたが、これはすべて今日のメッセージの準備でした)。



ダイアログエディターを表示するには、メニューからツール->マクロ->マクロの整理-> LibreOffice Basic->オーガナイザー->ダイアログ->新規|編集|削除を選択する必要があります。 このエディターにアクセスするためのより高速な方法が欲しいです。 その後、ダイアログエディターが開きます(alas、最も便利ではありません)、データベーステーブル内のフィールドの名前を持つフィールドを作成します。 お気付きのとおり、ダイアログはデータベーステーブルに自動的にバインドされないため、これを行うマクロを作成します。 そして、命名規則として、入力フィールドの名前とデータベーステーブルのフィールドを同じように定義します。



完成したフォームを持つエディターは次のようになります。



描画
画像



次に、ダイアログに2つのボタンを追加します。 ボタンの名前は任意ですが、データベースフィールドと区別するためにアンダースコアで始めます。 プロパティパレットの各ボタンには、アクションを割り当てることができます。 ボタンにアクションOKを設定しましょう-アクションの確認でダイアログを閉じます。 2番目-キャンセル-アクションを確認せずにダイアログを閉じます。



ダイアログエディターを閉じて、フォームエディターに戻ります。 ダイアログを呼び出すボタンを作成し、Order_Editハンドラープロシージャを割り当てます。ここで、FromBaseToDialogデータベーステーブル(oForm、oDialog)からDialogを設定し、DialogからFromDialogToBaseデータベーステーブル(oDialog、oForm)を保存します。



Sub Order_Edit(Event) Dim oDialog As Object Dim orders As Object orders = Thiscomponent.DrawPage.Forms.GetByName("orders") DialogLibraries.LoadLibrary("Standard") oDialog = CreateUnoDialog(DialogLibraries.Standard.dialogOrder) FromBaseToDialog(orders, oDialog) If oDialog.Execute() = 1 Then FromDialogToBase(oDialog, orders) orders.UpdateRow() End If End Sub Sub FromBaseToDialog(oForm, oDialog) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then ODialog.GetControl(sName).SetText(oForm.Columns.GetByName(sName).String) End If Next I End Sub Sub FromDialogToBase(oDialog, oForm) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then oForm.Columns.GetByName(sName).UpdateString(Trim(oDialog.GetControl(sName).GetText())) End If Next I End Sub
      
      





Dialogは、dialogOrderとして標準ライブラリに保存されていると想定されます。 当然、他の名前を選択できます。 アンダースコアで始まるコントロールの名前はスキップされ、処理されません。 また、テキストフィールドヘッダーに使用されるLabelで始まる名前は処理されません。



oDialog.Execute()= 1を呼び出すと、フォームウィンドウ内にダイアログが表示され、[OK]または[キャンセル]ボタンがクリックされるまでマクロが一時停止します。 [OK]ボタンをクリックすると、戻り値は1になります。



All Articles