Aujourd'hui, nous examinons l'utilisation des boîtes de dialogue lors de la modification des données dans LibreOffice Base (OpenOffice Base). Comme nous l'avons trouvé dans les articles précédents, le formulaire LibreOffice Base (OpenOffice Base) est en fait une instance de l'éditeur de texte LibreOffice (OpenOffice) Writer. Pour organiser l'interface de la fenêtre à l'intérieur du formulaire, des boîtes de dialogue sont utilisées - qui sont commodément créées dans l'interface visuelle intégrée, mais ne prennent pas en charge la communication avec les tables de base de données. Nous organiserons cette connexion avec les macros OO Basic.
Commençons dans l'ordre. Créez deux tables dans la base de données:
les produits
- id (entier, clé primaire)
- nom (chaîne)
les commandes
- id (entier, clé primaire)
- productId (entier)
- count (entier)
- date (type de données Date)
Créez le formulaire de commandes, ajoutez l'élément Formulaire au formulaire avec le nom de commandes. Ainsi que le contrôle de table avec la source de données des commandes. Comment procéder a été discuté dans la
partie 2 d'une série de messages.
Lorsque vous définissez les propriétés de la colonne de date, faites attention aux propriétés marquées dans la figure avec des flèches qui vous permettent d'afficher les données dans le format souhaité et d'utiliser le calendrier déroulant pour sélectionner une date spécifique.
Maintenant, directement dans le tableau, vous pouvez ajouter et modifier des données. Jusqu'à un certain point, cela est pratique, similaire au travail habituel d'un client avec un processeur de table. Mais à un moment donné, des problèmes commencent également à être caractéristiques du travail avec les processeurs de table. Les données peuvent être modifiées de manière aléatoire sans même le remarquer. Et après avoir remarqué, il est impossible de tout faire reculer tel quel. Il y a peu d'espace pour de nouveaux haut-parleurs et un défilement horizontal désagréable peut se former. Les en-têtes de colonne ont également une taille limite (sinon ils ne rentreront pas horizontalement), ce qui ne permet pas une description détaillée des données.
En demi-mesure, vous pouvez placer des champs réguliers pour la saisie de données à côté du tableau (contrôle de texte, contrôle numérique, etc.). Définissez les champs correspondants de la table des commandes comme source de données et tout fonctionnera. Lors de la navigation dans un jeu de données, les données des champs de saisie changent. Lors de la modification des données dans les champs de saisie, les données de la table de base de données changent. Mais cette solution ne sera pas très belle.
Par conséquent, nous implémentons une telle fonctionnalité à l'aide de dialogues. Les dialogues ont une limitation importante. Les champs d'entrée de boîte de dialogue ne sont pas liés à la table de base de données. Par conséquent, le remplissage des champs d'entrée de boîte de dialogue à partir de la table de base de données et l'enregistrement des champs d'entrée dans la table de base de données devront être effectués avec la macro OO Basic. Cependant, c'est bien, car vous permet de considérer les options de programmation OO Basic (avant cela, mes messages ne décrivaient que le travail avec l'environnement, mais tout cela était une préparation pour le post d'aujourd'hui).
Pour afficher l'éditeur de boîte de dialogue, vous devez sélectionner dans le menu Outils-> Macros-> Organiser les macros-> LibreOffice Basic-> Organiseur-> Boîte de dialogue-> Nouveau | Modifier | Supprimer. J'aimerais avoir un moyen plus rapide d'accéder à cet éditeur. Après cela, l'éditeur de dialogue (hélas, pas le plus pratique) s'ouvrira, dans lequel nous créerons des champs avec les noms des champs dans la table de base de données. Comme vous vous en souvenez, les boîtes de dialogue ne se lient pas automatiquement aux tables de base de données, nous allons donc écrire une macro pour ce faire. Et en tant que convention de dénomination, définissons les noms des champs d'entrée et des champs de la table de base de données de la même manière.
Un éditeur avec un formulaire terminé ressemblera à ceci:
Ensuite, ajoutez deux boutons à la boîte de dialogue. Nous donnerons des noms de boutons arbitraires, mais en commençant par un trait de soulignement, pour les distinguer des champs de la base de données. Chaque bouton de la palette des propriétés peut recevoir une action. Définissons l'action OK sur le bouton - elle ferme la boîte de dialogue avec confirmation de l'action. Et le second - Annuler - ferme la boîte de dialogue sans confirmer l'action.
Fermez l'éditeur de boîte de dialogue et revenez à l'éditeur de formulaire. Créons un bouton qui appelle la boîte de dialogue et affectons-lui la procédure du gestionnaire Order_Edit, dans laquelle nous allons remplir la boîte de dialogue à partir de la table de base de données FromBaseToDialog (oForm, oDialog) et enregistrer les données de la table de base de données 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
Il est supposé que la boîte de dialogue a été enregistrée dans la bibliothèque standard en tant que dialogOrder. Naturellement, vous pouvez choisir d'autres noms. Les noms des contrôles commençant par des traits de soulignement sont ignorés et ne sont pas traités. En outre, les noms commençant par Label, qui sont utilisés pour les en-têtes de champ de texte, ne sont pas traités.
L'appel de oDialog.Execute () = 1 affiche la boîte de dialogue à l'intérieur de la fenêtre Formulaires et suspend la macro jusqu'à ce que le bouton OK ou Annuler soit cliqué. Lorsque vous cliquez sur OK, la valeur de retour est égale à un.