[Calc] Formulaire pour gestion de données complexe

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Calc] Formulaire pour gestion de données complexe

Messagepar Piaf » 15 Oct 2013 19:11

Bonsoir

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
Donnees.png
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.
Les macros.
  • OuvrirDialog
    Code : Tout sélectionner   AgrandirRéduire
    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
    Initialise les contrôles de la boite de dialogue et l'ouvre.
    Elle est affectée au bouton Gérer de la feuille du classeur.
  • MoveRecord
    Code : Tout sélectionner   AgrandirRéduire
    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
    permet le déplacement parmi les enregistrements, l’ajout ou la suppression de données.
    Elle est affectée aux boutons de déplacement, à la liste Rechercher, et au bouton Supprimer
  • Actualiser
    Code : Tout sélectionner   AgrandirRéduire
    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
    Ajoute ou modifie les données.
    Elle est affectée au bouton Enregistrer.
  • BoutonsDeplacement
    Code : Tout sélectionner   AgrandirRéduire
    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
    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).
    Elle est appelée par d’autres macros.
Ce fichier n’est pas une application (pas de gestion d’erreur, etc.) il est juste destiné à regrouper quelques exemples.
Il a été testé sous AOO 4.0.1 et LibO 4.0.5.2.
Toutes remarques, améliorations, etc. sont les bienvenues.
A+
Pièces jointes
Gestion donnees.ods
(28.84 Kio) Téléchargé 2538 fois
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Piaf
GourOOu
GourOOu
 
Message(s) : 5621
Inscrit le : 25 Nov 2011 19:07
Localisation : Guyane

Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité