PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Mise n couleur cellule d'un TCD selon critères "extérieur"
Mise n couleur cellule d'un TCD selon critères "extérieur"
Débuté par Eric F., 24 juin 2025 12:44 - 11 réponses
Membre enregistré
107 messages
Posté le 24 juin 2025 - 12:44
Bonjour,

j'ai lu les différents posts sur la manipulation des cellules d'un TCD, mais je n'ai pas trouvé de solution.
Voici mon problème :

j'affiche dans un TCD un tableau des prix proposés à une date donnée pour les articles par des fournisseurs, en partance de leurs différents dépôts.
Mon tcd affiche en colonne les produits, et en ligne les couples fournisseurs/dépôts

....................................................|..Article 1.....|..Article 2....|
-------------------------------------------------------------------------------------
Fournisseur 1........................|.........................|.......................|
.................. dépôt 11..............|....prix 111........|...prix 112.......|
.................. dépôt 12..............|...prix 121........|...prix 122.......|
Fournisseur 2........................|.........................|.......................|
.................. dépôt 21..............|...prix 211........|...prix 212.......|

Je voudrais mettre en couleur la case du prix pour laquelle j'ai passé commande ce jour là.
C'est à dire si j'ai commandé au fournisseur 1, sur son dépôt 12, de l'article 2, je veux mettre en vert la case prix 122

Mon problème est que cette info n'est pas affichée. Et la mise en valeur d'une case, je ne sais le faire qu'avec l'événement "en affichage d'une cellule". Je n'ai alors sous le coude que la valeur du prix.

Comment connaître l'article, le fournisseur et le dépôt qui correspondent à la cellule en cours d'affichage ?

TCDPosition part des coordonnées pour avoir la cellule.
Je voudrais l'inverse... depuis la cellule en cours d'affichage, accéder à ses coordonnées.

Si quelqu'un connait l'astuce...

Par avance merci !

Eric
Message modifié, 24 juin 2025 - 13:12
Membre enregistré
1 010 messages
Posté le 24 juin 2025 - 15:26
Bonjour
je ne suis pas utilisateur du TCD donc ma réponse ne correspond peut-être pas, mais qu'entendez-vous par "en cours d'affichage" ?
Si il s'agit d'une cellule sélectionnée, vous avez :

TCDSelect (Fonction)
https://doc.pcsoft.fr/fr-FR/?1000021024

Cdlt
Membre enregistré
1 010 messages
Posté le 24 juin 2025 - 16:49
De retour pour une autre idée, ne serait-ce pas :

TCDListePositionEntête (Fonction)
https://doc.pcsoft.fr/fr-FR/?1000020975

Dans la seconde partie de l'exemple (qui renvoie toutes les villes) :
Col_Ville serait Col_Article2

dans la condition :
SI (dim.Pays ~= "FRANCE") ALORS
dim.pays serait dim.Fournisseur
"FRANCE" serait "dépôt12"

enfin quelque chose comme ça pour vous renvoyer le Tableau de tcdPosition

Aucune certitude de ma part
Cdlt
Membre enregistré
107 messages
Posté le 24 juin 2025 - 22:05
Cédric_34 a écrit :
De retour pour une autre idée, ne serait-ce pas :

TCDListePositionEntête (Fonction)
https://doc.pcsoft.fr/fr-FR/?1000020975

Dans la seconde partie de l'exemple (qui renvoie toutes les villes) :
Col_Ville serait Col_Article2

dans la condition :
SI (dim.Pays ~= "FRANCE") ALORS
dim.pays serait dim.Fournisseur
"FRANCE" serait "dépôt12"

enfin quelque chose comme ça pour vous renvoyer le Tableau de tcdPosition

Aucune certitude de ma part
Cdlt


merci pour votre aide.
je vais investiguer sur la fonction TCDListePositionEntête

En fait, pour mettre à jour la couleur d'une cellule, la doc du wl langage indique d'utiliser l'événement "Affichage d'une cellule"
Ainsi, on peut écrire :
SI VAL_PRIX > 500 ALORS
VAL_PRIX..CouleurFond = VertPastel
FIN
Sauf, que dans ce code, on n'a aucun indice de ligne, ni de colonne.
On est sur une cellule en cours d'affichage, mais on ne peut tester que la valeur de la cellule, on n'a rien pour faire une recherche "ailleurs", par exemple lancer une requête ou cherche dans un tableau mémoire selon l'article, le fournisseur et le dépôt.

Eric
Membre enregistré
107 messages
Posté le 24 juin 2025 - 22:25
Bon, ben, j'essaie par tous mes petits moyens d'utiliser TCDListePositionEntête, et je n'y arrive pas.

tabPos est un tableau de tcdPosition
tabPos = TCDListePositionEntête(TCD_INFO, COL_SFourn)
POUR TOUT dim de tabPos
Trace(dim.COL_SFourn, dim.COL_SCarb, dim.COL_SDepot, dim.val_PrixHT )
FIN


tabPos est toujours vide.
Le débogueur me dit que tabPos est un tableau de 0 TCDPosition

J'ai essayé avec toutes les colonnes possibles, nom des colonnes ou des lignes, rien n'y fait, toujours rien en retour.

Ce code WL langage est dans un bouton et je clique dessus alors que le tcd est affiché et bien rempli.

Quelqu'un saurait m'expliquer comment s'utilise cette fonction ?
Mon code est un quasi copié-collé de l'aide windev.

Eric
Membre enregistré
1 010 messages
Posté le 24 juin 2025 - 22:34
pour la ligne :
tabPos = TCDListePositionEntête(TCD_INFO, COL_SFourn)

Avez-vous essayé avec la colonne "Article 2" de votre post #1 (je ne connais pas son nom) ?

Le but étant de savoir si vous pouvez trouver "Prix 122" dans le tableau des résultats
Message modifié, 24 juin 2025 - 22:36
Membre enregistré
1 010 messages
Posté le 24 juin 2025 - 23:28
Je viens de faire un essai avec l'exemple de Windev : WD TableauCroiséDynamique

j'ai mis ceci sur un bouton (donc effectivement après la fin d'affichage du TCD)

tabPos est un tableau de tcdPosition

tabPos = TCDListePositionEntête(TCD_Statistiques, COL__DateCommande_Trimestre)
POUR TOUT dim de tabPos
Trace(dim.COL__DateCommande_Trimestre)
FIN


J'ai bien un retour au premier essai, et pas un tableau vide.
Voici le résultat du Trace

2010T1
2010T2
2010T3
2010T4
2011T1
2011T2
2011T3
2011T4
2012T1
2012T2
2012T3
2012T4

Vous devez avoir un souci avec les intitulés de colonnes
Mais comme je vous l'ai dit, je n'ai pas d'expérience avec les TCD.
Le retour de Trace que j'obtiens correspond à l'année et au Trimestre, il faudrait approfondir pour cibler le bon nom de colonne.

Cdlt
Message modifié, 24 juin 2025 - 23:30
Membre enregistré
1 010 messages
Posté le 25 juin 2025 - 00:53
Est-ce que ceci va vous permettre de trouver la réponse ?

Suite au résultat précédent (Post #7), je suis retourné sur la documentation de :

tcdPosition (Type de variable)
https://doc.pcsoft.fr/fr-FR/?1000020726

et j'ai utilisé les résultats obtenus post #7 dans le code de la fonction (toujours sur l'exemple "WD TableauCroiséDynamique" de Windev).
J'ai testé avec la première valeur obtenue, soit 2010T1.
Donc pour x, la complétion m'a proposé "COL_DateCommande_Année", j'ai saisi : 2010
Pour le trimestre : "2010T1"
Pour le Mois, j'ai choisi "201002" donc le mois de Février
etc... suivant le code ci-dessous :

x est une tcdPosition de TCD_Statistiques
// Spécifie les valeurs des entêtes de la cellule
x.COL_DateCommande_Année = "2010"
x.COL__DateCommande_Trimestre = "2010T1"
x.COL__DateCommande_Mois = "201002"
x.COL_Pays = "Allemagne"
x.COL_Ville = "Hamburg"
// Afficher le total des ventes de tous les produits en janvier 2020
Trace(TCD_Statistiques.VAL_CA[x])


et le trace m'a renvoyé : 44023.564
Effectivement, quand on Déplie le Trimestre 1 sur le TCD, on trouve bien cette valeur à "Hamburg" pour le mois de Février 2010.

Je pense que vous n'avez plus beaucoup à creuser pour obtenir ce que vous souhaitez.
Cdlt
Membre enregistré
107 messages
Posté le 25 juin 2025 - 11:38
Cédric,

merci pour votre aide !

je suis parti sur cette dernière voie et j'ai trouvé une solution :

Je n'utilise plus l'évènement "affichage d'une cellule".

Après calcul du TCD, je parcours toutes les cellules avec ce code :

TCDCalculeTout(TCD_INFO)

x est un tcdPosition de TCD_INFO

POUR nLig = 1 _À_ TableOccurrence(TABLE)
x.COL_SCarb = TABLE.COL_CARB[nLig]
x.COL_DDate_Jour = TABLE.COL_DATE[nLig]
x.COL_SFourn = TABLE.COL_FOURN[nLig]
x.COL_SDepot = TABLE.COL_DEPOT[nLig]
SI TABLE.COL_CDENUM[nLig] <> "" ALORS
TCD_INFO.VAL_PrixHT[x]..CouleurFond = VertPastel
FIN
FIN


Voilà, je reparcours donc ma source, et non mon TCD !

Je base mon parcours sur la table mémoire qui me sert à remplir le tableau de structure alimentant mon TCD.
Grâce à "x est un tcdPosition de TCD_INFO", lorsque j'écris x., windev me propose les noms des "COLxxx"

Encore une fois merci pour l'indication.

Eric
Membre enregistré
1 010 messages
Posté le 25 juin 2025 - 12:32
Bonjour,
Parfait, il restait effectivement à apporter les valeurs pour la fonction "tcdPosition".
Bonne continuation
Membre enregistré
1 010 messages
Posté le 25 juin 2025 - 14:58
A propos, vous pouvez filtrer la source sur la condition : COL_CDENUM[nLig] <> ""
puis vous parcourez le résultat de ce filtre pour la Variable tcdPosition.
Ainsi, vous n'avez pas à parcourir toute la source, je suppose qu'il ne resterait que quelques valeurs à traiter après filtre.

Cdlt
Membre enregistré
107 messages
Posté le 25 juin 2025 - 19:34
Poser un filtre sur la table mémoire ?

Ce qui est sûr, c'est que je m'aperçois que mon "SI TABLE.COL_CDENUM[nLig] <> "" ALORS" j'aurai dû le mettre avant le remplissage de x !!!!

Par contre, si on fait un tableActivefiltre, un "POUR nLig = 1 _À_ TableOccurrence(TABLE)" ne traite que les lignes filtrées ?
Bon, j'ai au maximum, une centaines de lignes... mais je vais tester!

Merci beaucoup.