[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.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

[Calc] Formulaire pour gestion de données complexe

Message par Piaf »

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

    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

    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

    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

    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+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
liard
Fraîchement OOthentifié
Messages : 9
Inscription : 01 mars 2019 10:15

Re: [Calc] Formulaire pour gestion de données complexe

Message par liard »

Grand merci. Je vais me plonger dans tout cela.
La modération vous a écrit: Pas d'interventions autres que des commentaires ou argumentations dans ce fil SVP. C'est écrit dans le bandeau rouge en haut de page.

OpenOffice 4.0.1 sous MacOS 10.6.8