Heute betrachten wir die Verwendung von Dialogfeldern beim Bearbeiten von Daten in LibreOffice Base (OpenOffice Base). Wie wir in früheren Beiträgen festgestellt haben, ist das LibreOffice Base-Formular (OpenOffice Base) tatsächlich eine Instanz des LibreOffice Writer-Texteditors (OpenOffice). Zum Organisieren der Fensterschnittstelle innerhalb des Formulars werden Dialogfelder verwendet, die bequem in der integrierten visuellen Oberfläche erstellt werden, jedoch keine Unterstützung für die Kommunikation mit Datenbanktabellen bieten. Wir werden diese Verbindung mit OO Basic-Makros organisieren.
Beginnen wir in der richtigen Reihenfolge. Erstellen Sie zwei Tabellen in der Datenbank:
Produkte
- id (Ganzzahl, Primärschlüssel)
- Name (Zeichenfolge)
Bestellungen
- id (Ganzzahl, Primärschlüssel)
- productId (Ganzzahl)
- count (Ganzzahl)
- Datum (Datentyp Datum)
Erstellen Sie das Bestellformular und fügen Sie dem Formular das Formularelement mit den Namensbestellungen hinzu. Sowie Table Control mit Auftragsdatenquelle. Wie das geht, wurde in
Teil 2 einer Reihe von Nachrichten besprochen.
Beachten Sie beim Festlegen der Eigenschaften der Datumsspalte die in der Abbildung mit Pfeilen gekennzeichneten Eigenschaften, mit denen Sie Daten im gewünschten Format anzeigen und mithilfe des Dropdown-Kalenders ein bestimmtes Datum auswählen können.
Jetzt können Sie direkt in der Tabelle Daten hinzufügen und ändern. Bis zu einem bestimmten Punkt ist dies praktisch, ähnlich der üblichen Arbeit eines Clients mit einem Tabellenprozessor. Aber irgendwann beginnen Probleme, die auch für die Arbeit mit Tabellenprozessoren charakteristisch sind. Daten können zufällig geändert werden, ohne es zu merken. Und nachdem ich bemerkt habe, dass es unmöglich ist, alles so zurückzusetzen, wie es war. Es gibt wenig Platz für neue Lautsprecher, und es kann sich ein unangenehmes horizontales Scrollen bilden. Die Spaltenüberschriften haben auch eine Größenbeschränkung (andernfalls passen sie nicht horizontal), und dies ermöglicht keine detaillierte Beschreibung der Daten.
Als halbe Maßnahme können Sie reguläre Felder für die Dateneingabe neben der Tabelle platzieren (Textsteuerung, numerische Steuerung usw.). Stellen Sie die entsprechenden Felder der Auftragstabelle als Datenquelle ein und alles wird funktionieren. Beim Navigieren in einem Datensatz ändern sich die Daten in den Eingabefeldern. Wenn Sie Daten in den Eingabefeldern ändern, ändern sich die Daten in der Datenbanktabelle. Aber diese Lösung wird nicht sehr schön aussehen.
Daher implementieren wir solche Funktionen mithilfe von Dialogen. Dialoge haben eine wesentliche Einschränkung. Dialogeingabefelder beziehen sich nicht auf die Datenbanktabelle. Daher muss das Ausfüllen der Dialogfeldeingabefelder aus der Datenbanktabelle und das Speichern der Eingabefelder in der Datenbanktabelle mit dem OO Basic-Makro erfolgen. Dies ist jedoch gut, weil ermöglicht es Ihnen, OO Basic-Programmieroptionen in Betracht zu ziehen (zuvor wurde in meinen Nachrichten nur die Arbeit mit der Umgebung beschrieben, aber all dies war die Vorbereitung für den heutigen Beitrag).
Um den Dialogeditor aufzurufen, müssen Sie im Menü Extras-> Makros-> Makros organisieren-> LibreOffice Basic-> Organizer-> Dialog-> Neu | Bearbeiten | Löschen auswählen. Ich hätte gerne einen schnelleren Weg, um zu diesem Editor zu gelangen. Danach öffnet sich der Dialogeditor (leider nicht der bequemste), in dem wir Felder mit den Namen der Felder in der Datenbanktabelle erstellen. Wie Sie sich erinnern, werden Dialoge nicht automatisch an Datenbanktabellen gebunden, daher schreiben wir dazu ein Makro. Und als Namenskonvention definieren wir die Namen der Eingabefelder und Felder der Datenbanktabelle gleich.
Ein Editor mit einem fertigen Formular sieht ungefähr so aus:
Fügen Sie als Nächstes dem Dialogfeld zwei Schaltflächen hinzu. Wir geben die Namen der Schaltflächen beliebig an, beginnen jedoch mit einem Unterstrich, um sie von den Datenbankfeldern zu unterscheiden. Jeder Schaltfläche in der Eigenschaftenpalette kann eine Aktion zugewiesen werden. Setzen wir die Aktion OK auf die Schaltfläche - sie schließt den Dialog mit der Bestätigung der Aktion. Und das zweite - Abbrechen - schließt den Dialog, ohne die Aktion zu bestätigen.
Schließen Sie den Dialogeditor und kehren Sie zum Formulareditor zurück. Erstellen Sie eine Schaltfläche, die den Dialog aufruft, und weisen Sie ihm die Order_Edit-Handlerprozedur zu, in der wir den Dialog aus der Datenbanktabelle FromBaseToDialog (oForm, oDialog) füllen und die Daten aus der Dialog-Datenbanktabelle FromDialogToBase (oDialog, oForm) speichern.
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
Es wird davon ausgegangen, dass der Dialog in der Standardbibliothek als dialogOrder gespeichert wurde. Natürlich können Sie auch andere Namen wählen. Namen von Steuerelementen, die mit Unterstrichen beginnen, werden übersprungen und nicht verarbeitet. Namen, die mit Label beginnen und für Textfeldüberschriften verwendet werden, werden ebenfalls nicht verarbeitet.
Wenn Sie oDialog.Execute () = 1 aufrufen, wird der Dialog im Formularfenster angezeigt und das Makro angehalten, bis auf die Schaltfläche OK oder Abbrechen geklickt wird. Wenn Sie auf OK klicken, ist der Rückgabewert gleich eins.