PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → 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"
Iniciado por Eric F., jun., 24 2025 12:44 PM - 11 respostas
Membro registado
107 mensagems
Publicado em junho, 24 2025 - 12:44 PM
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
Mensagem modificada, junho, 24 2025 - 1:12 PM
Membro registado
1.010 mensagems
Publicado em junho, 24 2025 - 3:26 PM
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
Membro registado
1.010 mensagems
Publicado em junho, 24 2025 - 4:49 PM
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
Membro registado
107 mensagems
Publicado em junho, 24 2025 - 10:05 PM
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
Membro registado
107 mensagems
Publicado em junho, 24 2025 - 10:25 PM
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
Membro registado
1.010 mensagems
Publicado em junho, 24 2025 - 10:34 PM
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
Mensagem modificada, junho, 24 2025 - 10:36 PM
Membro registado
1.010 mensagems
Publicado em junho, 24 2025 - 11:28 PM
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
Mensagem modificada, junho, 24 2025 - 11:30 PM
Membro registado
1.010 mensagems
Publicado em junho, 25 2025 - 12:53 AM
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
Membro registado
107 mensagems
Publicado em junho, 25 2025 - 11:38 AM
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
Membro registado
1.010 mensagems
Publicado em junho, 25 2025 - 12:32 PM
Bonjour,
Parfait, il restait effectivement à apporter les valeurs pour la fonction "tcdPosition".
Bonne continuation
Membro registado
1.010 mensagems
Publicado em junho, 25 2025 - 2:58 PM
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
Membro registado
107 mensagems
Publicado em junho, 25 2025 - 7:34 PM
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.