[Résolu][Base] Maintenir sélection table d'un formulaire

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 !
Panamaxx
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 30 juin 2014 20:20

[Résolu][Base] Maintenir sélection table d'un formulaire

Message par Panamaxx »

Bonjour à tous!
J'ai réalisé un formulaire 'Project' pour naviguer dans ma base.
Je cherche à faire une selection multiple dans une table (tMilestone) pour construire une requète et retourner le résultat dans une autre table du formulaire (tTask).

1) Je perds ma selection en faisant de .next() et des .previous()
je dois donc remettre la selection de l'utilisateur.
J'ai tenté avec la fonction 'select' sur la vue de la table. Cette dernière me fait des difficultés.
J'ai essayé avec les bookmarks, ils déplacent le curseur vert.

Auriez-vous une méthode pour rétablir la selection multiple à l'utilisateur?

Merci d'avance d'avoir pris un peu de temps, ça fait déjà 2 jours que je suis sur ce problème :-)

Code : Tout sélectionner

' fonction appelée sur interruption du subForm tMilestones
' en vue de remplir le formulaire tasks
function form1_MousePressedOntTasks(optional event as object)
dim gridView as object
dim myForm as object
dim grid as object
dim vctrlSelection as variant
dim flag as boolean

	GlobalScope.BasicLibraries.loadLibrary("XrayTool")
	
	gridView = event.Source
	grid = gridView.Model
	myForm = grid.Parent
	vctrlSelection = gridView.Selection
msgbox "Vous êtes entré dans la fonction !"
'	Pourquoi le select ne fonctionne t-il pas ici?
	flag = gridView.select(vctrlSelection)

''Message :
''BASIC runtime error.
''An exception occurred 
''Type: com.sun.star.lang.IllegalArgumentException
''Message: .


' Plein de code ici normalement
' avec des .next() et des .previous(), ma selection devient alors 'null'


' je souhaiterai réafficher les selections de l'utilisateur du subForm tMilestones
'	Comment faire avec une selection nulle et un select qui ne fonctionne pas?
	flag = gridView.select(vctrlSelection)

' J'ai fait des essais avec un RowSet, c'est seulement le pointeur vert qui bouge
'dim rs as object
'dim i as long
'	rs = myForm.createResultSet
'	for i =	lbound(vctrlSelection,1) to lbound(vctrlSelection,2)
'		flag = rs.moveToBookmark(vctrlSelection(i))
'		i = i	
'	next i


end function
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Panamaxx le 02 avr. 2015 11:53, modifié 1 fois.
LibreOffice 4.2 sous Windows 7 / LibreOffice 4.2 sous Ubuntu
C'est en buchant que l'on devient Bucheron !
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Maintenir la selection dans une table d'un formul

Message par Piaf »

Bonsoir
La sélection se fait par l'interface, donc à priori, la récupération de cette sélection se fait à partir de la vue du contrôle.
Comme dans un contrôle de table, l'utilisateur peut ; ne pas sélectionner de ligne, en sélectionner une, plusieurs ou toutes, la valeur de la sélection est un tableau.
Qui peut être vide, ne contenir qu'une entrée ou plusieurs.
Un petit exemple avec ta base un peu modifiée
Selection.png

Code : Tout sélectionner

Option Explicit
Sub Selection(Optional oEv as object)
Dim oDoc As Object, oForm As Object, SubForm as Object,rst as Object
Dim grille As Object, vueGrille As Object, n as Integer
Dim maSelection As Variant, i as Integer, txt as String, message as String, valeur as String
	oDoc = thisComponent
	oForm = oDoc.DrawPage.Forms.getByName("Project")
	SubForm = oForm.getByName("Milestones")
	rst = SubForm.createResultSet
	grille =SubForm.getByName("Milestone Table")
	vueGrille = oDoc.CurrentController.getControl(grille)
	maSelection = vueGrille.Selection
	If UBound(maSelection) < 0 Then
		MsgBox("Aucune ligne n'est sélectionnée")
	Else
		For i = LBound(maSelection) To Ubound(maSelection)
			rst.moveToBookmark(maSelection(i))
			Valeur = rst.getString(4)
			txt = txt & maSelection(i) & " Milestone_Name " & valeur & chr(13)
		Next i
		n = UBound(maSelection)
		Message = UnPlus(n,"La ligne" & chr(13) & txt & "est sélectionnée", _
		"Les lignes" & chr(13) & txt & "sont sélectionnées")
		MsgBox Message
	End If
End Sub
Pour l'affichage du message, voir le suprême de bm92 : [Basic] Afficher élégamment un nombre d'éléments
Après pour la construction de ta requête c'est une autre question.
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
Panamaxx
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 30 juin 2014 20:20

Re: [Base] Maintenir la selection dans une table d'un formul

Message par Panamaxx »

Bonjour Piaf,
Je te remercie d'avoir consacré du temps à ma problèmatique. L'idée du bouton est excellente.
J'ai bien compris le mécanisme mis en place et les quelques inspirations de la page 776.

Le problème reste entier. j'importe les sélections faites et dès que je touche au pointeur de mon subFrom, la sélection disparait.

Code : Tout sélectionner


''~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub Selection(Optional oEv as object)
Dim oDoc As Object, oForm As Object, SubForm as Object,rst as Object
Dim grille As Object, vueGrille As Object, n as Integer
Dim maSelection As Variant, i as Integer, txt as String, message as String, valeur as String
	oDoc = thisComponent
	oForm = oDoc.DrawPage.Forms.getByName("Project")
	SubForm = oForm.getByName("Milestones")
	rst = SubForm.createResultSet
	grille =SubForm.getByName("Milestone Table")
	vueGrille = oDoc.CurrentController.getControl(grille)
	maSelection = vueGrille.Selection
	
'	GlobalScope.BasicLibraries.loadLibrary("XrayTool")
	
	
	If UBound(maSelection) < 0 Then
		MsgBox("Aucune ligne n'est sélectionnée")
	Else
		For i = LBound(maSelection) To Ubound(maSelection)
			rst.moveToBookmark(maSelection(i))
			Valeur = rst.getString(4)
			txt = txt & maSelection(i) & " Milestone_Name " & valeur & chr(13)
		Next i
		n = UBound(maSelection)
		Message = UnPlus(n,"La ligne" & chr(13) & txt & "est sélectionnée", _
		"Les lignes" & chr(13) & txt & "sont sélectionnées")
		MsgBox Message
	End If
	
	' ok Je récupère les positions, je n'avais pas de problèmes.
	' Avec le bout de code suivant je récupère le contenu des selections pour construire une nouvelle requête à destination de task
	' et problème, je perds également la selection multiple de 'Milestone' dès que je fais un previous ou un next. D'ou le fait de sauvegarder la position
	' dans un coin pour la recharger ensuite dès que ma requête est finie
	
	'sauvegarde position initiale
dim vCursorInitialPosition as variant
	vCursorInitialPosition = SubForm.Row

	' Returns pointer to 1
	do while SubForm.Row > 1
		SubForm.previous()
	loop

dim posInSelection as integer
dim incNbOfSelections as long
dim vSelectedData as variant

dim x as long
dim col1 as variant
dim col2 as variant

	redim vSelectedData (1 to 1, 0 to 4)
	' balayage du pointeur sur toutes les lignes
	do while SubForm.Row < SubForm.RowCount
		
		' fonction VloopUp perso qui détecte si le pointeur fait parti de la selection 
		posInSelection = GetvPositionInCol(maSelection, 0,  SubForm.Row)

		' fait parti donc balayage des colonnes et écriture dans vSelectedData
		if (posInSelection <> -1) then
			incNbOfSelections = incNbOfSelections + 1
			redim preserve vSelectedData (1 to incNbOfSelections, 0 to grille.Count - 1)
			On error resume next
			for x = 0 to grille.Count - 1
				col1 = grille(x).Value
				col2 = grille(x).Text
				if not(IsNull(col1) or IsEmpty(col1)) then
					vSelectedData(incNbOfSelections, x) =  col1
					col1 = nothing
				elseif not (IsNull(col2) or IsEmpty(col2)) then
					vSelectedData(incNbOfSelections, x) =  col2
					col2 = nothing
				else
				end if
			next x
			On error goto 0
		end if
		SubForm.next()
	loop
	
	' le contenu de ma selection est dans  'vSelectedData'
	' Mettre un point d'arrêt ici pour vérifier
	vSelectedData = vSelectedData

	' Je remet le pointer à sa position initiale, pointer back to position
	do while SubForm.Row > vCursorInitialPosition
		SubForm.previous()
	loop
	
	' j'aimerai remettre la selection telle qu'elle était.
	' 'vueGrille.Selection' variable read-only, et fonction select inopérante
	' visible avec xray
'	xray vueGrille

'dim flag as boolean
'	flag = vueGrille.Select(maSelection)
	
End Sub


Ce que je cherche à faire, est une mise à jour 'à chaud' de la table 'task' sur un click de bouton de la table 'milestone'. Mes données d'entrées sont la selection multiple de la table Milestone.

Ceci me donne une idée, puis-je dupliquer un contrôle caché ? ça me parait pas très propre. :? :marto: :D
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 4.2 sous Windows 7 / LibreOffice 4.2 sous Ubuntu
C'est en buchant que l'on devient Bucheron !
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Base] Maintenir la selection dans une table d'un formul

Message par Piaf »

Bonjour
Pas forcément tout compris :lol:
Panamaxx a écrit :Ce que je cherche à faire, est une mise à jour 'à chaud' de la table 'task
Tu veux afficher dans le sous-formulaire Tasks les enregistrements correspondants à la ou aux sélections du sous-formulaire Milestone ?
Si c'est le cas teste le formulaire joint.
Selection.png
S'il y a plusieurs lignes sélectionnées dans le sous-formulaire Milestone, il faut cliquer sur le bouton.
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
Panamaxx
NOOuvel adepte
NOOuvel adepte
Messages : 23
Inscription : 30 juin 2014 20:20

Re: [Base] Maintenir la selection dans une table d'un formul

Message par Panamaxx »

Bonjour Piaf,
Exactement ce que je cherche à faire ! Merci ça fonctionne. :super: :D
Évidemment, j'étais sur la piste du 'pourquoi faire simple quand on peut faire compliqué.' :tesfou: :aie:

Je clos le post. :bravo:
LibreOffice 4.2 sous Windows 7 / LibreOffice 4.2 sous Ubuntu
C'est en buchant que l'on devient Bucheron !