Jump to content
Sign in to follow this  
lem alpha

T.e. : Couleurs Alternées "avancées"

Recommended Posts

Hello,

je poste ça car à l'époque j'avais cherché ici et rien trouvé... (ou mal cherché)

Donc c'est sûrement un truc connu de beaucoup d'entre vous, mais ça peut servir... ;)

(et encore désolé si ça figure déjà qque part)

Le but est d'alterner les couleurs des rangées dans une table externe, mais en fonction de la valeur d'une rubrique sur laquelle est triée la TE

(par ex. une date, et alterner les couleurs selon les jours)

J'utilise une variable déclarée dans une Martine, et les FP suivantes :

UniqueList ( nécessite CustomList )

ListIndex ( ou GetIndex )

et juste pour simplifier le code :

EstPair ( _nombre )

Definir (nb = ObtenirNombre ( _nombre );Cas ( EstVide ( nb ); 0; Mod ( nb; 2 )  = 0; 1; 0 ))

Le formatage conditionnel (donc v9 minimum !) est fait sur une bête étiquette texte avec juste un espace, et redimensionnée à souhait.

Voir ce post pour la v3 sans aucune FP

Une capture du résultat :

screen_portal_3.gif

CouleurRangeeTE_v2.fp7

screen_portal_3.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

post-384-1235920983.gif

CouleurRangeeTE_v2.fp7

Share this post


Link to post
Share on other sites

Hello Laurent,

...pas encore chargé le document; mais pour effondrer le taux de cholestérol du code, un simple:

not Mod ( ObtenirNombre ( _nombre ); 2) & décocher "ne pas évaluer..." devrait amplement faire l'affaire.

le 'not' étant bien entendu optionnel en fonction de la logique employée.

Share this post


Link to post
Share on other sites

Attention, fichier modifié, il y avait une erreur de "reproduction" :

c'est le lien qui doit être trié, pas la TE !

sorry

Share this post


Link to post
Share on other sites
Hello Laurent,

...pas encore chargé le document; mais pour effondrer le taux de cholestérol du code, un simple:

not Mod ( ObtenirNombre ( _nombre ); 2) & décocher "ne pas évaluer..." devrait amplement faire l'affaire.

le 'not' étant bien entendu optionnel en fonction de la logique employée.

Oui, mais j'avais rajouté le 1er test du Cas (...) car si _nombre n'est pas numérique du tout, ça renvoie que c'est pair...

Et je voulais que ça renvoie alors 0.

Par contre on peut en effet mettre

Definir (nb = ObtenirNombre ( _nombre );Cas ( EstVide ( nb ); 0; not Mod ( ObtenirNombre ( nb); 2) ))

Share this post


Link to post
Share on other sites

je me permet d'insister, le code global peut se limiter à un spartiate...

not Mod ( ObtenirNombre ( _nombre ); 2)

Share this post


Link to post
Share on other sites

OK, Dr...

Je dois pas être en super forme, je ne sais pas si c'est un lupus ou le Santenay 1er cru d'hier soir :D

En fait ma FP EstPair existant déjà et étant utilisée dans je ne sais plus quel cas où j'avais une rubrique qui pouvait éventuellement ne contenir aucun chiffre, je ne voulais pas avoir EstPair = 1 dans ce cas

(car not Mod ( ObtenirNombre ( "abcde" ); 2) = 1 )

Mais forcément ici, _nombre ne sera que numérique, tu as donc farpaitement raison d'insister. ;)

Share this post


Link to post
Share on other sites

Coucou,

Chargé ! merci !!

Mais :)

Pourquoi ne veux tu pas utiiser ElémentListeDevaleurs ? ici ça me semble approprié pourtant puisque tu fais un tri dans ton lien non ?

elle dédoublonnerait plus vite je crois.

et dans ton formatage, te resterais juste à coller

Definir ([ // maliste, triée via le lien, et dédoublonnée  LT = ElementsListeValeurs ( Obtenir ( NomFichier ); "Value" );   // donne la position de la valeur dans la liste obtenue   Pos = DecompteValeurs ( Debut ( ¶ & LT & ¶; Position ( ¶ & LT & ¶; ¶ & TableLiée::Categorie & ¶; 1; 1 ) ) )   ];   // Si la position est paire, c'est formaté   Cas ( Mod ( Pos; 2 ) = 0; 1 )   )

ça éviterai FP, variable et WebViewer, me semble juste moins usine gaz,

mais je n'ai peut être pas tout suivit et tu as peut être intérêt à avoir cette variable déclaré par le WV.

et ça n'enlève rien au fait que je trouve ça extra de pouvoir effectivement le faire

Merci à Toi et bon Dimanche

Agnès

Share this post


Link to post
Share on other sites

marrant, j'avais ça ;)

Let ( [v =  ValueListItems ( Get ( FileName ); "mylist" );pos = Position ( ¶ & v& ¶; ¶ & TableLiée::Categorie & ¶; 1; 1 );vc = ValueCount ( Left ( v; pos ) ) ];not Mod ( GetAsNumber ( vc ); 2 ))

Seule obligation, c'est une liste de valeur liée, pour n'avoir que les catégories utilisées sur ce lien là.

Mais c'est vrai que c'est génial qu'on puisse faire ça avec Filemaker :)

Share this post


Link to post
Share on other sites

ah tiens, c'est curieux ça :)

Seule obligation, une occurrence supplémentaire pour alimenter cette liste pour n'avoir que les catégories utilisées sur ce lien là.
la liste de valeur branchée* sur la TE ne suffit pas ?
Mais c'est vrai que c'est génial qu'on puisse faire ça avec Filemaker :)
marrant, je te sens moqueur pour ma pomme :rolleyes:

* option uniquement les enregistrements liés cochée

Share this post


Link to post
Share on other sites
la liste de valeur branchée* sur la TE ne suffit pas ?

* option uniquement les enregistrements liées cochée

Ben alors, t'avais pas vu que j'avais édité ? :P

marrant, je te sens moqueur pour ma pomme

Meuh non, moi aussi je l'adore ce formatage conditionnel de la 9 !

Share this post


Link to post
Share on other sites

RÔooooohhhhhh !!!!!!

Ben alors, t'avais pas vu que j'avais édité ? :P
Quand on a demandé de faire ta Agnès c'était qu'une seule fois !!!!!

[pardon Laurent :rolleyes: je sors !]

Share this post


Link to post
Share on other sites

Bon alors oui mais :

- toujours à cause du Santenay sûrement, (ptèt' aussi un peu à cause du saké qui a suivi), cet aprèm je n'arrivais pas à trouver un calcul pour calculer la position d'une valeur dans la liste... :rolleyes: y a des jours !

Donc je suis allé voir ce qui existait comme FP

- passer par une liste de valeurs j'y avais pensé, (car je me demandais si on pouvait le faire pour une version non adv) mais le truc, c'est qu'on est du coup limité au tri alphabétique croissant

Alors que là, le lien peut être trié n'importe comment (croissant, décroissant, d'après une liste pour le nom des mois ou jours par ex.), ça va marcher. ;)

Share this post


Link to post
Share on other sites

Bon, alors oui

Mais puisqu'une table Externe, c'est plus dépendant du modèle que du contexte, l'appel aux attributs d'objets de modèles me parait une autre option aussi, ne nécessitant alors que CustomList sans doute

Share this post


Link to post
Share on other sites

Ok, je vais continuer à faire ma fille douée ;)

Nommes la rubrique sur laquelle tu veux faire ton tri "obj"

Puis regardes dans ton data-viewer le résultat de ce calcul

CustomList ( 1; Count ( TableLiée::k1 ); "Let ( [$v= GetLayoutObjectAttribute ( \"obj\"; \"content\"; 1; [n] );$append[ [n] ] = $v;$verif = Case ( isEmpty ( $append[ [n]-1] )  = $append[ [n] ]; $append[ [n] ];  $append[ [n] ] <> $append[ [n]-1]; $append[ [n] ] ) ];$verif )")

Le but est donc qu'on stocke dans une variable multivaluée qui n'a plus de secret pour toi, la valeur de chaque rangée, et qu'on la compare chaque valeur à celle de la rangée précédente. Si elle est différente, ou si la rangée précédente est nulle, on la conservera. C'est très largement suffisant ici pour ne conserver que les valeurs uniques puisque ta liste est déjà triée.

Dès lors, voilà ta liste et tu appliquer le calcul d'Agnès plus haut pour substituer la liste de valeurs.

Juste avec CustomList donc, sans appel à FilterList ni FieldIndex. C'est un test, le $v devrai être déclaré plus haut, mais le principe est là.

Share this post


Link to post
Share on other sites

alala ! je me doutais bien que tu allais nous sortir une histoire de tri !!

Si tu veux garder la sensibilité à la casse, tu peux mettre UniqueList ( MaTable::Liee) à la place de ElementListeDevaleusr ()

je viens de tester un calcul un peu plus "gonflé" mais qui fonctionne qu'avec du natif (je me méfie du formatage qui fait ralentir sensiblement s'il est trop complexe ) et si tu vas avoir beaucoup de fiches liées et triées, CustomList comme les autres FP avec GetNthRecord sont très longues à s'exécuter )

bref, le calcul osé :

Definir ([	LT = ElementsListeValeurs ( Obtenir ( NomFichier ); "Value" );	L = Liste ( TableLiée::Categorie );	M = Debut ( ¶ & L & ¶; Position ( ¶ & L & ¶; ¶ & TableLiée::Categorie & ¶; 1; 1 ) );	Ordre = ValeursFiltre ( LT; M );	Pos = DecompteValeurs ( Ordre ) + 1	];	case ( Mod ( Pos; 2 ) = 0; 1 )	)

sans FP mais une utilisation de deux listes donc

à tester, mais ça suivra forcément le tri de ton lien.

En fait, il suffit juste de savoir combien il y a de valeurs avant ta valeur, soit re-dédoublonner la liste d'avant ta valeur :rolleyes:

Share this post


Link to post
Share on other sites

Oui, c'est très joli même.

Imposer l'ordre de la liste de valeurs par le trichement de la liste liée. Mais quid si le lien n'est pas trié dans le graphe ou si le tri défini dans la Table externe diffère ?

Share this post


Link to post
Share on other sites

tu peux le refaire ?

si la TE n'est pas triée, c'est comme Laurent :) ça marche plus ! ou si, ça mettra bien B D et F en couleur mais dispachée partout dans la TE et ça me parait normal non ? il faut de toute façon un tri pour associer les catégories ensemble non ?

Share this post


Link to post
Share on other sites

C'est pourquoi je préconisais d'utiliser l'objet, pour s'affranchir du tri dans le lien qu'on sait naturellement pénalisant. S'agissant d'une table externe, d'un formatage conditionnel, on est centré sur le modèle, c'est donc la place naturelle des objets à mes yeux.

Share this post


Link to post
Share on other sites

Bon, ouais ça a l'air top, tout ça, je vais étudier ça (mais plus ce soir ;) )

Pour Agnès : bien vu le coup des listes...

Pour Ugo : le fait de connaître les valeurs pour chaque ligne peut même permettre plus de trucs, genre ne faire apparaître le contenu de "catégorie" que pour les premières lignes de chaque "regroupement", ... , non ?

Problème que je me suis aussi posé l'une ou l'autre fois...

En fait je n'ai jamais osé chercher (j'ai même pas dit trouver) du côté de récupérer les valeurs de chaque ligne et les comparer, car je me disais que ça ralentirait trop... (base utilisée à distance)

Vous me confirmez que ce serait (potentiellement) moins rapide avec ma méthode ?

Share this post


Link to post
Share on other sites

Salut Laurent,

Le formatage conditionnel est par nature de type "non mémorisé", il a donc besoin de se rafraîchir, et ces ré-évaluations constituent donc un facteur aggravant, à distance.

Lorsque les conditions sont musclées, comme c'est le cas ici dans ta solution ( CustomList puis FilterList, puis une vraie récursive ), ce sera incontestablement plus long.

La solution d'Agnès, quand bien-même elle n'utilise que des calculs natifs, fait appel aux index ( Liste de Valeurs et Liste ) et son évaluation s'effectuera bien évidemment pour chaque rangée de la Table externe. Celle que je propose n'est pas bien meilleure, la liste filtrée étant construite en faisant appel à CustomList, comme toi.

La solution idéale serait que la liste soit déclarée en variable, ailleurs. Cette variable ne sera par conséquent plus réévaluée et le premier calcul, fourni par Agnès pour déterminer la position d'une valeur dans une liste, sera alors le plus rapide bien entendu.

L'appel aux variables, de surcroît, est fortement recommandé à distance.

Une rubrique sur le modèle pourrait se charger de déclarer cette variable, un web-viewer également, mais il est toujours difficile de mesurer quelle variable est déclarée en premier et quand elle est initialisée, puis réévaluée. Si la navigation est scriptée dans ta solution, si la création ou la modification d'éléments dans cette TE est aussi scripté, c'est un jeu d'enfant alors que d'utiliser l'une des trois méthodes pour déclarer cette variable.

Pour ce qui me concerne, je suis particulièrement séduit par l'exploitation des noms d'objets, dans ce contexte particulier, pour cet objectif particulier.

Pour ce qui concerne ton dernier point ( ne conserver qu'une seule rubrique à l'affichage par groupe ), c'est aussi effectivement faisable. Mais là, ça m'impose de te demander pourquoi tu veux faire cela dans une table externe...

Edit : c'est bien le week-end, on se fatigue pas :wacko: je viens de voir ta déclaration de variable dans un web-viewer ! !

Si tant est que tu parviens à limiter le raffraichissement de ce web-viewer, son éxécution intempestive ou sa ré-évaluation, c'est comme je le disais précédemment la solution la plus adaptée à mes yeux ( la variable déclarée )

Share this post


Link to post
Share on other sites

J'espère que tu as fini d'éditer... tant pis je réponds ! :lol:;)

Edit : c'est bien le week-end, on se fatigue pas :wacko: je viens de voir ta déclaration de variable dans un web-viewer ! !

Si tant est que tu parviens à limiter le raffraichissement de ce web-viewer, son éxécution intempestive ou sa ré-évaluation, c'est comme je le disais précédemment la solution la plus adaptée à mes yeux ( la variable déclarée )

En fait j'ai fait ça comme ça (wv) dans cet exemple, pour déclarer la variable... dans mon appli la navigation est bien scriptée, donc pas de problème.

Merci pour tous ces éclaircissements, tout est limpide.

En effet, je demandais confirmation car je déclare la variable 1 fois à l'affichage du modèle, et là j'utilise bien UniqueList (basée sur CustomList), mais pas FilterList, et dans le formatage je n'utilise que "ListIndex" qui ne fait que trouver la position d'une valeur dans la liste, somme toute très proche de ce que vous proposiez.

D'où mon interrogation sur la vitesse de ceci vs. ta déclaration et comparaison de n variables ;)

Pour ce qui concerne ton dernier point ( ne conserver qu'une seule rubrique à l'affichage par groupe ), c'est aussi effectivement faisable. Mais là, ça m'impose de te demander pourquoi tu veux faire cela dans une table externe...

Boaf, ça c'est juste une idée en l'air, comme ça... :)

J'ai l'une ou l'autre TE avec untel formatage sur le fond des lignes, et je me disais que ça faciliterait encore un peu la lecture de n'avoir que les premières instances de chaque valeur de la rubrique de tri...

Illustration ci-dessous, où j'ai simulé le résultat souhaité en retouchant la capture :

screen_portal_4.gif

screen_portal_4.gif

post-384-1235948154.gif

post-384-1235948154.gif

post-384-1235948154.gif

post-384-1235948154.gif

post-384-1235948154.gif

post-384-1235948154.gif

post-384-1235948154.gif

post-384-1235948154.gif

Share this post


Link to post
Share on other sites
je n'utilise que "ListIndex" qui ne fait que trouver la position d'une valeur dans la liste, somme toute très proche de ce que vous proposiez.

ListIndex est visiblement une fonction personnalisée qui produit le même résultat que l'orchestration de fonctions natives proposées par Agnès. Donc à choisir, même si la lectures semble plus complexe, les résultats seront meilleurs avec la seconde méthode.

Share this post


Link to post
Share on other sites
La solution d'Agnès, quand bien-même elle n'utilise que des calculs natifs, fait appel aux index ( Liste de Valeurs et Liste ) et son évaluation s'effectuera bien évidemment pour chaque rangée de la Table externe.
oui, il faut sortir les listes bien sur, le calcul me plaisait bien en tout cas :) merci à Toi
J'ai l'une ou l'autre TE avec untel formatage sur le fond des lignes, et je me disais que ça faciliterait encore un peu la lecture de n'avoir que les premières instances de chaque valeur de la rubrique de tri...
ça veut dire uniquement en couleur la première occurrences de chaque valeurs ?

ça, me semble que c'est plus simple, mais demande une rubrique en plus avec le calcul non mémorisé

ObtenirEniemeEnreg ( Categorie ; Obtenir ( NuméroEnreg ) - 1 ) <> ObtenirEniemeEnreg ( Categorie ; Obtenir ( NuméroEnreg ) )

et dans ton formatage, juste le nom de cette cette rubrique

l'avantage c'est que le formatage fonctionnera aussi sur la table en mode liste

Merci pour ton Exo !

Bonne nuit

Agnès

Share this post


Link to post
Share on other sites

Adjugé-vendu, donc :

Déclaration de la variable 1 fois, soit avec UniqueList si on veut pas créer une liste de valeurs supplémentaires, soit avec la 1e partie du calcul d'Agnès,

formatage avec la détermination de position par la 2e partie du calcul d'Agnès.

Merci à tous les deux (et au Herr Doktor) pour vos précieux conseils !

Et maintenant au lit ! C'est dimanche, que diable ! :D

Même Michel n'est plus au bar !

-- edit --

t'ai pas vu passer...

ou c'est vrai c'est simple, j'aurais pas pensé à cette formulation dans une TE... :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...