Beaucoup d’utilisateurs, utilisent Calc pour gérer des données.
Le fait de rappeler que le module dédié est Base n’y change pas grand-chose.
Les développeurs eux-mêmes semblent encourager ce genre de pratique : Données > Formulaire sous LibO ou l’extension DataForm sous AOO.
On trouve sur le Forum pas mal d’exemples de ce type de gestion, mais il faut tomber dessus.
J’ai essayé de faire un fichier type, en récupérant un peu partout le code des exemples existants.
Merci à tous ceux qui ont crée le code d’origine.
Le classeur ne contient qu’une seule feuille de façon à voir en direct les changements effectués à partir de la boite de dialogue.
Les colonnes Titre ; Genre ;Nom ; Prénom ; Adresse ; CP ; Ville et Tph sont formatées en texte.
La colonne Naissance est formatée en Date.
Les données sont classées par ordre alphabétique sur le Nom et sont reclassées à chaque ajout d’un contact.
La colonne Id est particulière, elle est utilisée comme clef primaire, elle n’apparaît pas dans le formulaire et est renseignée directement par code.
La boite de dialogue Chaque contrôle reprend les colonnes de la feuille de données.
- Titre est un contrôle zone de liste, à l’affichage, le code récupère la valeur dans la colonne et sélectionne l’entrée voulue, inversement, à l’enregistrement, il renseigne la colonne avec la valeur sélectionnée.
- Genre est un ensemble de contrôles boutons d’options, même remarque que pour le contrôle précédent.
- Nom ; Prénom ; Adresse et Ville sont des contrôles Texte.
La saisie du Nom est obligatoire, car le nom est utilisé dans le tri des données et pour la liste Rechercher.
La fonction NOMPROPRE est utilisée pour la mise en forme dans la feuille des champs Nom ; Prénom et Ville. - CP et Tph sont des contrôles masqués.
- Naissance est un contrôle date.
- Rechercher est un contrôle zone de liste, il affiche la liste des noms et prénoms des contacts et permet, à la perte du focus, d’afficher dans le formulaire le contact sélectionné.
Elle est initialisée à l’ouverture du formulaire et actualisée à chaque ajout ou suppression d’un contact. - Les boutons de déplacement essayent de faire (pas sur d’avoir testé tous les cas de figures) ce pourquoi ils sont faits, atteindre le premier enregistrement, le précédent, un nouvel enregistrement, le suivant, le dernier.
- Le contrôle étiquette à côté des boutons de déplacement affiche le « numéro » d’enregistrement en cours sur le total d’enregistrements.
- Les boutons Enregistrer et Supprimer ajoutent ou suppriment l’enregistrement courant.
- Le bouton Quitter ferme la boite de dialogue.
- OuvrirDialog
Initialise les contrôles de la boite de dialogue et l'ouvre.
Code : Tout sélectionner
Sub OuvrirDialog Dim bibli As Object, monDialogue As Object Dim Var() as String, I as Long, oNom as Object Dim oFeuille As Object, oCursor As Object Dim txt as String, x as Long, nomprenom as String, genre as String DialogLibraries.LoadLibrary("Standard") bibli = DialogLibraries.GetByName("Standard") monDialogue = bibli.GetByName("Dialog1") oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1) Var = Array("lstTitre","obM","txtNom","txtPrenom","txtAdresse","txtCP","txtVille","dteNaiss","txtTph") oFeuille = ThisComponent.Sheets.getByName("Donnees") oCursor = oFeuille.createCursor premLig = 1 nLig = premLig oCursor.gotoEndOfUsedArea(False) derLig = oCursor.RangeAddress.EndRow NewReg = False For I = 0 to UBound(Var) oNom = oDlg.GetControl(Var(I)) If oNom.supportsService("com.sun.star.awt.UnoControlListBox") Then txt = oFeuille.getCellByPosition(I, nLig).String oNom.selectItem(txt, True) ElseIf oNom.supportsService("com.sun.star.awt.UnoControlRadioButton") Then genre = oFeuille.getCellByPosition(I, nLig).String If genre = "M" Then oDlg.getControl("obM").State = True Else oDlg.getControl("obF").State = True End If Else oNom.Text = oFeuille.getCellByPosition(I, nLig).String End If Next oDlg.getControl("lblEnreg").Model.Label = "Enreg : " & nLig & " / " & derLig boutonsDeplacement oDlg.getControl("cmdEnregistrer").Enable = False For x = 1 to derLig nomprenom = oFeuille.getCellByPosition(2,x).String & " " & oFeuille.getCellByPosition(3,x).String oDlg.getControl("lstContacts").AddItem(nomprenom,x) Next oDlg.Execute End Sub
Elle est affectée au bouton Gérer de la feuille du classeur. - MoveRecord
permet le déplacement parmi les enregistrements, l’ajout ou la suppression de données.
Code : Tout sélectionner
Sub MoveRecord(oEv as Object) Dim Var() as String, I as Long, oNom as Object, lesLignes as Object Dim oFeuille As Object, maZone as Object, gomme as Long, txt as String, nomprenom as String, x as Long,genre as String oFeuille = ThisComponent.Sheets.getByName("Donnees") Select Case oEv.Source.Model.Name Case "lstContacts" nLig = oEv.Source.SelectedItemPos + 1 oEv.Source.Model.SelectedItems = Array() Case "cmdFirst" nLig = premLig Case "cmdPrevious" nLig = nlig - 1 Case "cmdNext" nLig = nlig + 1 Case "cmdLast" nLig = derLig Case "cmdNew" nLig = derLig + 1 NewReg = True Case "cmdSupprimer" maZone = oFeuille.getCellRangeByPosition(0,nLig, 0,nLig) lesLignes = maZone.Rows lesLignes.removeByIndex(0,1) derLig = derLig - 1 nLig = 1 oDlg.getControl("lstContacts").Model.removeAllItems For x = 1 to derLig nomprenom = oFeuille.getCellByPosition(2,x).String & " " & oFeuille.getCellByPosition(3,x).String oDlg.getControl("lstContacts").AddItem(nomprenom,x) Next End Select oDlg.getControl("lblEnreg").Model.Label = "Enreg : " & nLig & " / " & derLig boutonsDeplacement Var = Array("lstTitre","obM","txtNom","txtPrenom","txtAdresse","txtCP","txtVille","dteNaiss","txtTph") For I = 0 to UBound(Var) oNom = oDlg.GetControl(Var(I)) If oNom.supportsService("com.sun.star.awt.UnoControlListBox") Then txt = oFeuille.getCellByPosition(I, nLig).String oNom.selectItem(txt, True) ElseIf oNom.supportsService("com.sun.star.awt.UnoControlRadioButton") Then genre = oFeuille.getCellByPosition(I, nLig).String If genre = "M" Then oDlg.getControl("obM").State = True Else oDlg.getControl("obF").State = True End If Else oNom.Text = oFeuille.getCellByPosition(I, nLig).String End If Next oDlg.getControl("cmdEnregistrer").Enable = False oDlg.getControl("lstTitre").SetFocus End Sub
Elle est affectée aux boutons de déplacement, à la liste Rechercher, et au bouton Supprimer - Actualiser
Ajoute ou modifie les données.
Code : Tout sélectionner
Sub Actualiser Dim oFeuille As Object Dim Var() as String, I as Long, oNom as Object, x as Long, nomprenom as String Var = Array("lstTitre","obM","txtNom","txtPrenom","txtAdresse","txtCP","txtVille","dteNaiss","txtTph") oFeuille = ThisComponent.Sheets.getByName("Donnees") If oDlg.GetControl("txtNom").Text = "" Then MsgBox("Vous devez renseigner le champ Nom",16,"Gestion données") oDlg.GetControl("txtNom").setFocus End End If For I = 0 to UBound(Var) oNom = oDlg.GetControl(Var(I)) If oNom.supportsService("com.sun.star.awt.UnoControlListBox") Then oFeuille.getCellByPosition(I, nLig).String = oNom.SelectedItem Else Select Case oNom.Model.Name Case "obM" If oNom.State Then oFeuille.getCellByPosition(I, nLig).String = "M" Else oFeuille.getCellByPosition(I, nLig).String = "F" End If Case "txtNom", "txtPrenom","txtVille" oFeuille.getCellByPosition(I, nLig).String = MiseEnMajuscule(oNom.Text) Case "dteNaiss" If onom.Date <> 0 Then oFeuille.getCellByPosition(I, nLig).Value = DateValue(oNom.Text) Case Else oFeuille.getCellByPosition(I, nLig).String = oNom.Text End Select End If Next oDlg.getControl("cmdEnregistrer").Enable = False If NewReg = True Then derLig = derLig + 1 oFeuille.getCellByPosition(I, nLig).Value = Identifiant + 1 TrierDonnees NewName = MiseEnMajuscule(oDlg.GetControl("txtNom").Text) oDlg.getControl("lstContacts").Model.removeAllItems For x = 1 to derLig If oFeuille.getCellByPosition(2,x).String = NewName Then nLig = x End If nomprenom = oFeuille.getCellByPosition(2,x).String & " " & oFeuille.getCellByPosition(3,x).String oDlg.getControl("lstContacts").AddItem(nomprenom,x) Next oDlg.getControl("lblEnreg").Model.Label = "Enreg : " & nLig & " / " & derLig BoutonsDeplacement End If NewReg = False End Sub
Elle est affectée au bouton Enregistrer. - BoutonsDeplacement
Tente de gérer l'accessibilité aux boutons de déplacement en fonction de la place de l’enregistrement en cours dans le jeu d’enregistrements. (Pas sûr que tous les cas de figure soient traités).
Code : Tout sélectionner
Sub BoutonsDeplacement Select Case nLig Case premLig oDlg.getControl("cmdFirst").Enable = False oDlg.getControl("cmdPrevious").Enable = False oDlg.getControl("cmdNext").Enable = True oDlg.getControl("cmdLast").Enable = True oDlg.getControl("cmdSupprimer").Enable = True Case derLig oDlg.getControl("cmdFirst").Enable = True oDlg.getControl("cmdPrevious").Enable = True oDlg.getControl("cmdNext").Enable = False oDlg.getControl("cmdLast").Enable = False oDlg.getControl("cmdSupprimer").Enable = True Case > derLig oDlg.getControl("cmdFirst").Enable = False oDlg.getControl("cmdPrevious").Enable = False oDlg.getControl("cmdNext").Enable = False oDlg.getControl("cmdLast").Enable = False oDlg.getControl("cmdSupprimer").Enable = True Case Else oDlg.getControl("cmdFirst").Enable = True oDlg.getControl("cmdPrevious").Enable = True oDlg.getControl("cmdNext").Enable = True oDlg.getControl("cmdLast").Enable = True oDlg.getControl("cmdSupprimer").Enable = True End Select If derLig = 1 Or derLig = 0 Then oDlg.getControl("cmdFirst").Enable = False oDlg.getControl("cmdPrevious").Enable = False oDlg.getControl("cmdNext").Enable = False oDlg.getControl("cmdLast").Enable = False End If If derLig = 0 Then oDlg.getControl("cmdSupprimer").Enable = False NewReg = True End If End Sub
Elle est appelée par d’autres macros.
Il a été testé sous AOO 4.0.1 et LibO 4.0.5.2.
Toutes remarques, améliorations, etc. sont les bienvenues.
A+