順番に始めましょう。 データベースに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になります。