[Résolu][Calc] Remplir tableau a partir d'un dialogue

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

[Résolu][Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Bonjour,

Ce message fait au suite au post précédement posté:https://forum.openoffice.org/fr/forum/v ... =8&t=64734
Je souhaiterais remplir un tableau à partir d'une boite de dialogue mais j'ai quelque difficulté.
voila ce que je souhaiterais faire, il faudrait remplir chaque colonne du tableau en fonction de leur champs respectif dans la boite de dialogue.
resultat.png
Le code actuel est le suivant:

Code : Tout sélectionner

REM  *****  BASIC  *****
Global oDoc as object, oDlg as object

Sub Main
	oDoc = ThisComponent
	oBib = oDoc.DialogLibraries.GetByName("Standard")
	zDlg = oBib.GetByName("Dialog5") 
	oDlg = CreateUnoDialog(zDlg)
	aMarque = RecupMarque("A1:C1")
	RemplirListe("Services", aMarque)

	cOK = com.sun.star.ui.dialogs.ExecutableDialogResults.OK
	if oDlg.Execute = cOK then
		sRet = oDlg.getControl("Services").SelectedItem & " " & _
				 oDlg.getControl("Subservices").SelectedItem
		oDlg.dispose
		oDoc.CurrentSelection.String = sRet
	else
		exit Sub
	end if
	
End Sub

Sub RemplirListe(sListe, sTab)
	oListe = oDlg.getControl(sListe)
	oListe.Model.stringItemList = sTab
	oliste.selectItemPos(0, true)
End Sub

Function RecupMarque(sZone)
	oFeuil = oDoc.Sheets(1) ' La 1ere feuille est indexée à 0
	oPlage = oFeuil.getCellRangeByName(sZone)
	aTab = oPlage.DataArray
	nMax = UBound(aTab(0))
	Dim sTab(nMax)
	For i = 0 to nMax
		sTab(i) = aTab(0)(i)
	Next i
	RecupMarque = sTab 
End function

Function RecupModele(sMarque)
	oPlages = oDoc.NamedRanges
	oPlage = oPlages.getByName("Z_" & sMarque).getReferredCells()
	aTab = oPlage.DataArray
	nMax = UBound(aTab)
	Dim sTab(nMax)
	For i = 0 to nMax
		if sTab(i)(0) = "" then exit for
		sTab(i) = aTab(i)(0)
	Next i
	RecupModele = sTab
End Function

Sub ChangeListe(oEvt)
	oSrc = oEvt.Source
	sMarque = oSrc.SelectedItem
	aModele = RecupModele(sMarque)		
	RemplirListe("Subservices", aModele)
End Sub	
Voici mon fichier exemple:
exemple.ods
Pourriez vous m'aider svp?
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par kikoo74910 le 08 janv. 2022 10:54, modifié 3 fois.
Version: librroffice 7.5.9; windows 10(x64)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25965
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par Dude »

Salut,

Reprends ce suprême de code : https://forum.openoffice.org/fr/forum/v ... =15&t=6364
Il montre les grands principes que tu cherches.
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Bonjour,

J'ai repris le suprème de code dans le lien fourni et c'est désormais beaucoup simple que le code utilisé auparavant,
Cela donne:

Code : Tout sélectionner

Option Explicit
Public Action as string, Wp as String, Reg as string, Priority as string, Note as string, Seq as string, Services as string , Subservices as string ' on doit récupérer cette valeur dans le module registre donc variable public
Sub lancedialogue
Dim Dlg As Object, bibli As Object
Dim monDialogue As Object, Validation As Integer
Dim ChampAction As Object, ChampWP as object, ChampReg as Object, ChampPriority as Object, ChampNote as Object, ChampSeq as Object, ChampsServices as Object, ChampsSubservices as Object
Validation = com.sun.star.ui.dialogs.ExecutableDialogResults.OK ' Clic sur Validation ===>OK
DialogLibraries.Loadlibrary("Standard") ' on charge l'ensemble de la Bibli Standard de ce document en mémoire
bibli = DialogLibraries.GetByName("Standard") ' On rérérence Bibli
monDialogue = bibli.GetByName("Dialog5") ' on référence Mon dialogue
Dlg = CreateUnoDialog(monDialogue)
ChampAction = Dlg.GetControl("Actions") 'action
ChampWP = Dlg.Getcontrol("Wp") 'wp
ChampReg = Dlg.Getcontrol("Reg")
ChampPriority = Dlg.Getcontrol("Priority")
ChampNote = Dlg.Getcontrol("Notes")
ChampSeq = Dlg.Getcontrol("Seq")
ChampsServices = Dlg.Getcontrol("Services")
ChampsSubservices = Dlg.Getcontrol("Subservices")

		if Dlg.Execute = Validation then
 							Action = ChampAction.Text ' on assigne les valeurs de la boite
 							Wp = ChampWP.Text
  							Reg = ChampReg.Text
 							Priority = ChampPriority.Text
 							Note = ChampNote.Text
 							Seq = ChampSeq.Text
                            Services = ChampsServices.SelectedItem
                            Subservices = ChampsSubservices.SelectedItem
                           
Dlg.Dispose
End Sub

End Sub
et

Code : Tout sélectionner

Sub Registre3
 LireFichierConfig
    MonDoc = ThisComponent 'Sélectionne le document en cours
    MaFeuille = MonDoc.CurrentController.ActiveSheet 'Attribue la feuille en cours à la variable
    oCurseur = MaFeuille.createCursor ' création du curseur
   
    oCurseur.GotoEndOfUsedArea(True) ' Le curseur sur la dernière ligne
    NumDerligne = oCurseur.getRangeAddress.EndRow'assignation à NumDerligne de sa valeur ( dernière ligne du tableau)
   	DerEnrg = MaFeuille.getCellByPosition(0,NumDerligne).Value '0 =colonne A auquel on va ajouter 1 pour incrémenter le numéro
   	Lancedialogue ' on lance la boite de dialogue1 dont le code se trouve dans le moduleDialog
    
  		 MaFeuille.getCellByPosition(0,NumDerligne+1).string = Wp 
  		 MaFeuille.getCellByPosition(1,NumDerligne+1).string = Reg 
 		 MaFeuille.getCellByPosition(2,NumDerligne+1).string = Action 
      	 MaFeuille.getCellByPosition(3,NumDerligne+1).string = Priority 
      	 MaFeuille.getCellByPosition(4,NumDerligne+1).string = Note 
      	 MaFeuille.getCellByPosition(5,NumDerligne+1).string = Seq 
      	 MaFeuille.getCellByPosition(6,NumDerligne+1).string = Services 
      	 MaFeuille.getCellByPosition(7,NumDerligne+1).string = Subservices 
      	
End sub

Sub LireFichierConfig()
Dim f1 As Integer
Dim unTexte As String

f1 = FreeFile ' obtenir un numéro de fichier ouvert
On error resume next
Open nomFichier For Input As #f1
Input #f1, unTexte
Grade = unTexte
Input #f1, unTexte
Nom = unTexte
Input #f1, unTexte
Service = unTexte
Close #f1
End Sub


Ces codes permettent d'insérer les données de la boite de dialogue dans le tableau.
Cependant je n'arrive toujours pas a lier les listebox "services" et Subservices" en fonction de la feuille données (code du module 2):

Code : Tout sélectionner

REM  *****  BASIC  *****
Global oDoc as object, oDlg as object

Sub Main
	oDoc = ThisComponent
	oBib = oDoc.DialogLibraries.GetByName("Standard")
	zDlg = oBib.GetByName("Dialog5") 
	oDlg = CreateUnoDialog(zDlg)
	aMarque = RecupMarque("A1:C1")
	RemplirListe("Services", aMarque)

	cOK = com.sun.star.ui.dialogs.ExecutableDialogResults.OK
	if oDlg.Execute = cOK then
		sRet = oDlg.getControl("Services").SelectedItem & " " & _
				 oDlg.getControl("Subservices").SelectedItem
		oDlg.dispose
		oDoc.CurrentSelection.String = sRet
	else
		exit Sub
	end if
	
End Sub

Sub RemplirListe(sListe, sTab)
	oListe = oDlg.getControl(sListe)
	oListe.Model.stringItemList = sTab
	oliste.selectItemPos(0, true)
End Sub

Function RecupMarque(sZone)
	oFeuil = oDoc.Sheets(1) ' La 1ere feuille est indexée à 0
	oPlage = oFeuil.getCellRangeByName(sZone)
	aTab = oPlage.DataArray
	nMax = UBound(aTab(0))
	Dim sTab(nMax)
	For i = 0 to nMax
		sTab(i) = aTab(0)(i)
	Next i
	RecupMarque = sTab 
End function

Function RecupModele(sMarque)
	oPlages = oDoc.NamedRanges
	oPlage = oPlages.getByName("Z_" & sMarque).getReferredCells()
	aTab = oPlage.DataArray
	nMax = UBound(aTab)
	Dim sTab(nMax)
	For i = 0 to nMax
		if sTab(i)(0) = "" then exit for
		sTab(i) = aTab(i)(0)
	Next i
	RecupModele = sTab
End Function

Sub ChangeListe(oEvt)
	oSrc = oEvt.Source
	sMarque = oSrc.SelectedItem
	aModele = RecupModele(sMarque)		
	RemplirListe("Subservices", aModele)
End Sub
resultat1.png
Voici mon nouveau fichier:
LIE LIST.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: librroffice 7.5.9; windows 10(x64)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25965
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par Dude »

Merci de fournir quelque chose de fonctionnel avec un mode pas-à-pas détaillé.
Lorsque j'ouvre le dialogue et que je sélectionne un item dans la liste "SERVICES", ça plante :
capture.png
Tes plages nommées sont incorrectes.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Bonjour,

Autant pour moi, mauvais fichier test, il commence a en avoir beaucoup!
Ci-joint le bon fichier:
dialogue .ods
Dans ce fichier,

le bouton 5/6 fait appel au dialogue du module 5 et 6. Dans ce cas, les champs "Services" et "Subservices" ne sont pas liés car je n'y arrive pas mais collent une partie des données dans le tableau.

Le bouton module 2 lui, permet de lier les liste box "services" et "subservices" mais ne permets pas d'inserer les données dans le tableau, c'est la le problème.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: librroffice 7.5.9; windows 10(x64)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25965
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par Dude »

Tu devrais te servir de XRay pour comprendre ce que tes objets affichent et quelles données ils peuvent recevoir.
Dans ton code :

Code : Tout sélectionner

Sub Main
	oDoc = ThisComponent
	oBib = oDoc.DialogLibraries.GetByName("Standard")
	zDlg = oBib.GetByName("Dialog5") 
	oDlg = CreateUnoDialog(zDlg)
	aMarque = RecupMarque("A1:C1")
	RemplirListe("lMarque", aMarque)

	cOK = com.sun.star.ui.dialogs.ExecutableDialogResults.OK
	if oDlg.Execute = cOK then
		sRet = oDlg.getControl("lMarque").SelectedItem & " " & _
				 oDlg.getControl("lModele").SelectedItem
		oDlg.dispose
		oDoc.CurrentSelection.String = sRet
	else
		exit Sub
	end if
	
End Sub
Par quelle magie penses-tu que tu vas insérer ce que te renvoie le contrôle lMarque et lModele ?

Code : Tout sélectionner

oDoc.CurrentSelection.String = sRet
Cette ligne ne fait que placer ce qui est dans sRet vers la cellule courante.
Si tu te places sur la cellule O57 et que tu appelles ton dialogue, cela fonctionne.
no_problemo.gif
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Bonjour,

Je viens de m'appercevoir que c'était pas encore le bon fichier...Il faut dire que je me casse les dents depuis un moment.
Avec le bon fichier c'est mieux, toutes mes escuses:
exemple.ods
J 'ai effectivement constaté que du texte est inseré dans une cellule, mais ce n'est pas ce que je recherche.
Moi je souhaites juste coller le contenu de la boite de dialogue dans le tableau toute en utilisant les boites "services" et "subservices" liées pour diminuer les possibilités de choix. Chaque champs de la boite de dialogue doit corresondre à une cellule d'une ligne du tableau.
Si il n'y aurait que quelques choix possible j'utilserais simplement les modules 5 et 6 qui font le travail,mais mon fichier reel comporte plus de 50 choix possible et c'est très fastidieux de remplir la boite de dialogue rapidement. C'est pourquoi je souhaite utiliser les boites liés.
resultat1.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: librroffice 7.5.9; windows 10(x64)
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25965
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par Dude »

kikoo74910 a écrit :Je viens de m'appercevoir que c'était pas encore le bon fichier.
Te rends-tu compte de la perte de temps ?
Je laisse ton problème à d'autres.

Bon courage
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1480
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par jeanmi2403 »

Bonsoir,
Il nous faut un cahier des charges plus détaillé pour répondre efficacement.
Dans l'état actuel, c'est encore bien trop flou.
Peut-être faudrait-il commencer par un exemple simplifié.
Bonne soirée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

bonjour,

Ci-joint un fichier exemple simplifié ( c'est celui de mon dernier message).
exemple simplifie.ods
resultat1.png
Je souhaite obtenir le meme résultat que losque que j'appuie sur le bouton "module 5 et 6" mais en ayant la fontionnalité du bouton "module 2".
Concretement, lorsque le dialogue est ouvert, j'insère mes données au travers des listbox et combobox (avec les listbox lié "services" et sub services"). Chaque box insère chaque donnée dans chaque cellule du tableau.


Le résultat que je souhaite obtenir est identique au résultat du bouton "module 5 et 6". Je n'arrive pas a integrer la fonction boite liés (services et subservices) dans le code "moule 5 et 6".
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: librroffice 7.5.9; windows 10(x64)
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Bonjour à tous,

Petit up pour les grands samaritains de libreoffice.
Il y aurait t'il une ame charitable pour aider un naufragé du forum :lol:
Pour les plus courageux, mon fichier exemple:
exemple simplifie.ods
Encore merci à tous !
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: librroffice 7.5.9; windows 10(x64)
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1480
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par jeanmi2403 »

Bonsoir,
Bon, après lecture et analyse (pas facile, c'est un peu le bazar, non ?), on voit bien qu'il manque des choses.
D'abord quelques mots de l'organisation. Pour moi Module 6 registre 3 est la procédure originale ? Et ce qui ne fonctionne pas est dans Module 2 ?
  • La procédure LireFichierConfig ne sert visiblement à rien
  • Les noms des procédures sont incohérents ; RecupMarque pour les entêtes de colonne et RecupModele pour le contenu des mêmes colonnes
  • Il manque EndIf à la fin de LanceDialogue
Je pense avoir compris que ce code provient d'une copie d'un autre projet.
Pour ce qui est de Module 2, évidemment il ne récupère rien d'autre que les deux sélections des listes.
Il reste à lancer le dialogue avec la même procédure que l'original (LanceDialogue) qui elle, récupère bien tous les éléments. Et intégrer également la gestion de la dernière ligne.
 Ajout : Il faudrait aussi écrire un petit cahier des charges avec les tenants et aboutissants, et un descriptif clair sur ce que représentent les données de manière à pouvoir répondre intelligemment. Sinon on passe trop de temps à fouiller dans le code pour comprendre les branchements. 
Mon conseil : pour adapter ce code à ton usage, désosser complètement les deux modules, bien les comprendre, et reconstruire un projet personnel à partir de Zéro...
S'il faut écrire un mini-cours sur ce sujet, ça m'intéresse, mais ça prendra du temps.
Bonne soirée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1480
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par jeanmi2403 »

Bonjour,
Je fais ici quelque chose dont je n'ai pas l'habitude, fournir une solution fonctionnelle.
J'ai fait le ménage en supprimant les modules et procédures inutiles, en renommant certains objets avec un vocabulaire qui me semble plus adapté, pour que ce soit plus clair.
Il resterait d'autres simplifications à faire..... A voir dans le futur si nécessaire.
Je pense décrire un exercice complet sur ce sujet, si je trouve un exemple d'usage adapté, sachant que cet exemple est en deux questions :
  1. Remplir une liste dans un dialogue à partir d'une zone Calc
  2. remplir une zone Calc à partir des éléments d'un dialogue
Kikoo74910-ExempleModifié.ods
Bonne soirée,
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Bonjour et bonne année à tous.

Merci Jeanmi2403! c'est exactement le résultat que je souhaite.
Par contre, il semble y avoir un bug:
A l'ouverture du fichier et à la premiere activation du bouton (seulement la premiere activation), un code panne apparait. Ensuite le bouton fonctionne normalement.
resultat1.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Version: librroffice 7.5.9; windows 10(x64)
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1480
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par jeanmi2403 »

Bonjour,
kikoo74910 a écrit :A l'ouverture du fichier et à la premiere activation du bouton, un code panne apparait
il manquait simplement

Code : Tout sélectionner

DialogLibraries.LoadLibrary( "Standard" ) 
Avant la création du dialogue. Il arrive que ça marche sans .....
Voici la nouvelle version épurée,
Il n'y a plus que le programme principal (suppression de LanceDialogue) et les procédures de service (dans le module Outils).
Suppression également des variables intermédiaires pour les champs et les valeurs des champs. Le code est maintenant plus lisible (je pense ).
Kikoo74910-ExempleModifié2.ods
 Ajout : PS : Dude a raison, il faut fournir quelque chose de plus "propre". J'ai fait le ménage parce que ça m'amuse, mais pas mal de temps perdu pour éliminer ce qui ne sert à rien.... 
Tu peux baliser [Résolu] avec la coche verte....
Bonne soirée,
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
kikoo74910
Membre hOOnoraire
Membre hOOnoraire
Messages : 176
Inscription : 03 août 2012 09:45

Re: [Calc] Remplir tableau a partir d'un dialogue

Message par kikoo74910 »

Super! :bravo: :bravo: :bravo:

Merci pour votre temps et surtout votre patience. Le code est désormais fonctionnel.

Je suis sur que ce code va servir à beaucoup d'entre nous.

MERCI!
Version: librroffice 7.5.9; windows 10(x64)