Re: TableColonnesTriées

Posté par Asthroth le 15/12/2008 11:59:29
Bon, comme on est jamais mieux servie que par soit meme, j'ai fait un petit bout de code pour gerer ce truc, voici donc:

Déclaration globale de votre fenetre:
sListeColonneTrie est une chaîne //Liste des colonne de trie de la table des entetes

Evénement("Ma_Procedure",Matable..Nom, 1529)


Ma_procedure
PROCEDURE Ma_Procedure()
iIndice est un entier = 1
sChaine est une chaîne
sRecuperationLibelle est une chaîne

//récuperation de l'indice de la colonne
iNumColonne est un entier système = _EVE.wParam

//on remet les libellés des colonnes comme à l'origine, ils seront remis a jour a la fin de la procedure
sChaine = ExtraitChaîne(sListeColonneTrie,iIndice)
TANTQUE sChaine<>EOT _ET_ sListeColonneTrie<>""
     RecuperationLibelle = ExtraitChaîne({Droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé,2,"]")
     {Droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé = 	sRecuperationLibelle //ExtraitChaîne({droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé,2,"[")
	
	iIndice++
	sChaine = ExtraitChaîne(sListeColonneTrie,iIndice)
FIN

//récupération du nom de la colonne
sNomColonne est une chaîne = "TABLE_HEADER."+TableEnumèreColonne(TABLE_HEADER,iNumColonne)

//test si on ajoute un non une nouvelle colonne de trie
SI PAS ToucheEnfoncée(teShift) _ET_ (... 
	(PAS ChaîneOccurrence(sListeColonneTrie,TAB) _ET_ sNomColonne <> sListeColonneTrie) _OU_ ChaîneOccurrence(sListeColonneTrie,TAB)) ALORS
	 sListeColonneTrie = "" //on vide la liste des colonne si on a pas appuyé sur shift //trace("shift enfoncée")
FIN

//ajout du nom de la colonne dans la liste de trie
sListeColonneTrie = Remplace(sListeColonneTrie,"_","è") //a cause de position qui fait n'importe quoi sur les séparateur, pour lui "_" est un caractère de ponctuation!!!!

sNomColonne = Remplace(sNomColonne,"_","è")

iPositionChaine est un entier = Position(sListeColonneTrie,sNomColonne,0, DepuisDébut+MotComplet)

//si on ne l'as pas trouvé, on l'ajoute, sinon on annule le sens de trie
SI iPositionChaine = 0 ALORS
	SI sListeColonneTrie <>"" ALORS
		sListeColonneTrie+=TAB
	FIN
	sListeColonneTrie+="+"+sNomColonne
SINON
	
	//on inverse le signe de trie
	sListeColonneTrie = sListeColonneTrie[[A (iPositionChaine-2)]]+Gp_Viif(sListeColonneTrie[[(iPositionChaine-1) A (iPositionChaine-1)]] = "+", "-", "+")+...
		sListeColonneTrie[[(iPositionChaine) A]]
	
FIN
//on remet la chaine correctement
sListeColonneTrie = Remplace(sListeColonneTrie,"è","_") //a cause de position qui fait n'importe quoi sur les séparateur, pour lui "_" est un caractère de ponctuation!!!!

//mise a jour des libellés des colonnes
iIndice = 1
sChaine = ExtraitChaîne(sListeColonneTrie,iIndice)
TANTQUE sChaine<>EOT
	SI PAS ChaîneOccurrence({Droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé,"]") ALORS
		sRecuperationLibelle = {Droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé
	SINON
		sRecuperationLibelle = ExtraitChaîne({Droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé,2,"]")
	FIN
	
	{Droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé = ...
	"["+Gauche(sChaine,1)+iIndice+"]"+ sRecuperationLibelle //ExtraitChaîne({droite(sChaine,Taille(sChaine)-1),indChamp}[0]..Libellé,2,"[")
	
	iIndice++
	sChaine = ExtraitChaîne(sListeColonneTrie,iIndice)
FIN

TableTrie(sListeColonneTrie)

//on annule le trie automatique vu que c'est nous qui le faisons
RENVOYER Faux


Pour info, il faut remplacer le bout de code GP_VIIF par la syntaxe conditionnelle avec le ? (voir l'aide de windev).
Normalement, ca doit marcher, si vous y trouvé des bugs, faites un retour ici, merci d'avance

PS: Correctif sur la gestion de la touche Shift

Cette contribution était de : http://old.wdforge.org/newbb/viewtopic.php?forum=19&topic_id=6066&post_id=24356