PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV (versões anteriores) → WD18 - Table : Position de la ligne en cours après tri sur entête de colonne
WD18 - Table : Position de la ligne en cours après tri sur entête de colonne
Iniciado por CHAEF, jan., 20 2025 6:01 AM - 14 respostas
Membro registado
7 mensagems
Publicado em janeiro, 20 2025 - 6:01 AM
Bonjour,
Le titre résume je pense mon petit problème, je suis sûr de passer à côté d'un truc tout simple...
Après un clic sur un entête de colonne d'une table rempli par une requête, la ligne en cours disparait au fin fond de la table...
Un monté/descendre avec les flèches fait réapparaitre la ligne en cours, mais bon, ça doit bien être automatique mais je tourne en rond et ne trouve pas...

--
Vieux développeur avec un vieux WD18...
Membro registado
792 mensagems
Publicado em janeiro, 20 2025 - 11:18 AM
Bonjour,
Essayez un "TableAffiche" (avec les constantes "taCourantBandeau", taCourantPremier")
Cdlt
Publicado em janeiro, 20 2025 - 3:42 PM
CHAEF a écrit :
> Bonjour,

Bonjour

Je vois votre problème, vous souhaitez avoir une table sans bug lors s'un clique sur une colonne, j'ai deux solutions pour vous

1. Soit vous devrez vérifier la syntaxe TableAffiche() comme @Cédric_34 à écrit, ensuite vous devrez mettre dans l'initialisation de la fenêtre ou dans un clique de bouton dans une procédure si serait possible
2. Soit vous devrez écrire sur la syntaxe HExécuteRequêteSQL

Voilà un programme dont vous pouvez utiliser
// EDD (01/25) : créer une nouvelle bouton pour lister les informations de la base de données
LOCAL
cFichier_Ligne is ClFichier_Ligne
ctbFichier_Ligne is tableau of ClFichier_Ligne
ctbFichier_Ligne = cFichier_Ligne:Liste()
// EDD (01/25) : créer une nouvelle classe ClFichier_Ligne
ClFichier_Ligne est une Classe
m_sRubrique_A is string
m_sRubrique_B is string
m_sRubrique_C is string
FIN

// EDD (01/25) : créer une nouvelle méthode dans la classe ClFichier_Ligne
PROCÉDURE Liste()
LOCAL
cRub is ClRub_Fichier_Ligne; ctbFichier_Ligne is tableau of ClFichier_Ligne
eEntier is entier
sdDonnées is Source de Données
sString is string = "Select " + cRub:Rub_A() + ", " + ...
cRub:Rub_B() + ", " + cRub:Rub_C() + " from FIC_Table"
IF HExécuteRequêteSQL(sdDonnées, hRequêteDéfaut, "sRequête") = False THEN
Info(ErreurInfo(errComplet))
EndProgram()
ELSE
HLitPremier(sdDonnées)
TANTQUE NOT HEnDehors(sdDonnées)
eEntier = TableAjouteLigne(ctbFichier_Ligne)
ctbFichier_Ligne[eEntier]:m_sRubrique_A = {"sdDonnées." + cRub:Rub_A(), indVariable}
ctbFichier_Ligne[eEntier]:m_sRubrique_B = {"sdDonnées." + cRub:Rub_B(), indVariable}
ctbFichier_Ligne[eEntier]:m_sRubrique_C = {"sdDonnées." + cRub:Rub_C(), indVariable}
HLitSuivant(sdDonnées)
FIN
END
RENVOYER ctbFichier_Ligne

// EDD (01/25) : créer une nouvelle classe ClRub_Fichier_Ligne
ClRub_Fichier_Ligne est une Classe
FIN

// EDD (01/25) : créer trois méthodes dans la classe ClRub_Fichier_Ligne
PROCÉDURE Rub_A()
RENVOYER "Rubrique_A"

PROCÉDURE Rub_B()
RENVOYER "Rubrique_B"

PROCÉDURE Rub_C()
RENVOYER "Rubrique_C"

NB : Attention l'emplacement du fichier HFSQL, il faut mettre dans une répertoire et utiliser HDéclareExterne() et HAnnuleDéclaration("FIC_Fichier)

Cordialement
Mr.RATSIMANDRESY
Niry Aina Eddy
Publicado em janeiro, 24 2025 - 10:02 AM
Cédric_34 a écrit :
Bonjour,
Essayez un "TableAffiche" (avec les constantes "taCourantBandeau", taCourantPremier")
Cdlt


Bonjour Cédric,

Déja merci d'avoir pris un peu de temps pour me répondre.
Je tourne en rond.... rien de bien grave, mais je trouve ça pénible et je pense que c'est moi qui merdouille...
J'ai essayé avec
TableAffiche(ta1_liste,taRéExecuteRequete+taCourantBandeau)
..... , mais wd ne veux pas de taCourantBandeau...
Je peux bien sûr bidouiller en simulant un monté/descente via les flèches, mais ça reste de la bidouille ! grrr

Une autre piste peut-être ?
Membro registado
7 mensagems
Publicado em janeiro, 24 2025 - 10:08 AM
Bonjour,
Merci pour ce retour d'info, mais vous n'avez pas dû bien comprendre ma demande.
Sur une table de quelques centaines de ligne, lorsqu'on clic sur l'entête d'une colonne, la ligne sélectionné peut être positionnée en dehors des lignes affichées à l'écran, c'est ce que je cherche à éviter. On la retrouve facilement en faisant un aller/retour avec les flèches haut et bas au clavier (ce qui peut être simulé facilement avec wd, mais c'est pas "propre"...

--
Vieux développeur avec un vieux WD18...
Membro registado
7 mensagems
Publicado em janeiro, 24 2025 - 10:09 AM
Cédric_34 a écrit :
Bonjour,
Essayez un "TableAffiche" (avec les constantes "taCourantBandeau", taCourantPremier")
Cdlt


Bonjour Cédric,

Déja merci d'avoir pris un peu de temps pour me répondre.
Je tourne en rond.... rien de bien grave, mais je trouve ça pénible et je pense que c'est moi qui merdouille...
J'ai essayé avec
TableAffiche(ta1_liste,taRéExecuteRequete+taCourantBandeau)
..... , mais wd ne veux pas de taCourantBandeau...
Je peux bien sûr bidouiller en simulant un monté/descente via les flèches, mais ça reste de la bidouille ! grrr

Une autre piste peut-être ?

--
Vieux développeur avec un vieux WD18...
Membro registado
792 mensagems
Publicado em janeiro, 24 2025 - 12:23 PM
Bonjour,
Que se passe t-il si vous relancez un TableAffiche sans le taRéExecuteRequete ?

TableAffiche(ta1_liste,taCourantBandeau)
ou
TableAffiche(ta1_liste)

Cdlt
Membro registado
7 mensagems
Publicado em janeiro, 24 2025 - 3:40 PM
Cédric_34 a écrit :
Bonjour,
Que se passe t-il si vous relancez un TableAffiche sans le taRéExecuteRequete ?

TableAffiche(ta1_liste,taCourantBandeau)
ou
TableAffiche(ta1_liste)

Cdlt


Je m'explique mal certainement...
Mon souci est très c... , ce n'est pas un bug.
Les entête de colonne, quand on clic dessus, la table se trie automatiquement sans rien coder, et avec CTRL on peut en sélectionner plusieurs pour affiner le tri (table mémoire ou sur une requête, en table fichier il faut que les données des colonnes soit indexées).
C'est là, lors du tri automatique de la table, que l'on perd la ligne en cours, qui selon le tri "sort" de la visualisation.
Pour la récupérer, soit on défile la table avec l'ascenseur, soit on provoque un changement de ligne avec les touches haut/bas, ce qui fait réapparaitre la ligne. C'est précisement cette étape que je cherche à éviter.
J'espère arriver à me faire comprendre... ?

--
Vieux développeur avec un vieux WD18...
Membro registado
792 mensagems
Publicado em janeiro, 24 2025 - 7:17 PM
Bonsoir,
Vous ne vous exprimez pas mal, c'est juste que je vous propose des choses à tester mais je n'ai pas essayé.

Ceci devrait fonctionner (j'espère :D )
on récupère l'indice en cours et on le sélectionne à nouveau

nIndice est un entier = MaTable
TableSelectPlus(MaTable, nIndice)


ou

TableSelectPlus(MaTable, MaTable)


Cdlt
Mensagem modificada, janeiro, 24 2025 - 7:20 PM
Membro registado
7 mensagems
Publicado em janeiro, 26 2025 - 7:14 AM
Cédric_34 a écrit :
Bonsoir,
Vous ne vous exprimez pas mal, c'est juste que je vous propose des choses à tester mais je n'ai pas essayé.

Ceci devrait fonctionner (j'espère :D )
on récupère l'indice en cours et on le sélectionne à nouveau

nIndice est un entier = MaTable
TableSelectPlus(MaTable, nIndice)


ou

TableSelectPlus(MaTable, MaTable)


Cdlt



Oui, mais il faut exécuter du code, et il n'est pas prévu de pouvoir coder directement le clic dans l'entête de colonne.
C'est là le truc...
Vous n'êtes pas confronté à ce problème ?

--
Vieux développeur avec un vieux WD18...
Membro registado
7 mensagems
Publicado em janeiro, 26 2025 - 7:15 AM
Cédric_34 a écrit :
Bonsoir,
Vous ne vous exprimez pas mal, c'est juste que je vous propose des choses à tester mais je n'ai pas essayé.

Ceci devrait fonctionner (j'espère :D )
on récupère l'indice en cours et on le sélectionne à nouveau

nIndice est un entier = MaTable
TableSelectPlus(MaTable, nIndice)


ou

TableSelectPlus(MaTable, MaTable)


Cdlt



Oui, mais il faut exécuter du code, et il n'est pas prévu de pouvoir coder directement le clic dans l'entête de colonne.
C'est là le truc...
Vous n'êtes pas confronté à ce problème ?

--
Vieux développeur avec un vieux WD18...
Publicado em janeiro, 26 2025 - 7:57 PM
Bonjour,
Non testé.
As tu tenté d'intercepter l'état de la ligne (sélectionné ou non) dans la partie "Affichage d'une ligne" et d'agir en conséquence.
Publicado em janeiro, 26 2025 - 8:25 PM
CHAEF a écrit :
Oui, mais il faut exécuter du code, et il n'est pas prévu de pouvoir coder directement le clic dans l'entête de colonne.

Tu peux aussi intercepter la position de la souris via un événement "fenêtre". Si la souris se trouve sur le bandeau, tu peux alors exécuter le code désiré.
Membro registado
7 mensagems
Publicado em janeiro, 27 2025 - 10:27 AM
Bonjour à tous,

J'arrive à intercepter le clic sur l'entête de colonne; :merci:
J'ai mis dans le code d'initialisation de la table :
Evénement("pl_clic_entete_colonne","ta1_liste", 1529)
et une procédure avec de quoi tester;
Bip()

Bon, ça, c'est déjà pas mal. J'ai mon bip à chaque fois qu'on trie une colonne (non, non, ce n'est pas le but :D
Sauf que...
Le code est excuté AVANT le tri, et pour me repositionner il doit être exécuter APRES le tri ! }:(

Enfin, pour tester le repositionnement après avoir cliqué sur un entête de colonne triable et retrouver visuellement la ligne en cours, j'ai mis un bouton avec le code basique suivant :
TablePosition(ta1_liste,TableSelect(ta1_liste))

Une idée pour que le code soit exécuté APRES le tri ?

--
Vieux développeur avec un vieux WD18...
Mensagem modificada, janeiro, 27 2025 - 10:28 AM
Publicado em janeiro, 27 2025 - 11:52 AM
On peut mêler mes deux solutions dans l'affichage d'une ligne
SI ClicSurEnTete ET DernièreLigne
Traiter AffichageBandeau
FSI


ClicSurEnTete est un booléen mis à vrai en cas de clic sur l'entête