Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
Pour rendre plus lisible la lecture de tableaux (dw), j'alterne classiquement la couleur de la bande Detail avec une expression conditionnelle du genre :
if(mod(getrow(),2) = 0, rgb( valR1, valG1, valB1), rgb( valR2, valG2, valB2))
Mais voilà que je bute sur une DW possédant un Group dans laquelle la bande Detail est vide et Height=0, et dans laquelle les données visibles sont la bande Trailer Group Toto
Du coup, si j'utilise la même expression conditionnelle pour la couleur de fond de cette bande, le GetRow() renvoyant le n° de ligne dans le tableau et non pas le n° de ligne du Trailer, j'obtiens un résultat incohérent.
Quelqu'un aurait-il déjà rencontré ce problème et trouvé une solution ?
Merci :-)
Dernière modification par General Protection Fault (26-08-2010 14:51:18)
Hors ligne
Bonjour, effectivement le getrow() est relatif aux lignes de detail.
Mais quel est l'intérêt de faire un groupe s'il n'y a rien dans le detail ?
NB :
Hors ligne
Et bien c'est une DW contenant des statistiques. Les lignes en elles-même ne m'intéressent pas et dans la bande Trailer Group, j'affiche différents agrégats.
Dernière modification par General Protection Fault (26-08-2010 13:06:10)
Hors ligne
Bonjour,
Je rejoins erasorz, et pour compléter ne peut tu faire tes aggrégats dans ta requête. ( L'avantage est de ne faire transiter sur le réseau que les lignes d'aggrégats , utilisation de la puissance de ton serveur de données etc.. ).
Pour moi je ne connais pas de moyen ( en utilisant les propriétés dynamiques ) pour jouer sur les band Trailer et header : ex connaitre la premère ligne de trailer etc.. )
j'ai été confronté à ce problème mais j'avais des données qui était affiché ( y compris le détail mais on pouvait synthétiser la visu en ne voyant que les différents cumuls. Alors j'ai procédé de la manière suivante :
- Création d'une datawindow externe ne comprenant que des champs devant recevoir les cumuls : ( les champs étant dans la zone de détail )
- Copie des données de cumul vers cette datawindow externe
- Rendre visible cette datawindow
Je l'avoue celà fait vraiment bidouille.
Hors ligne
OK.
Et avec un compute du genre : cumulativesum(if ( col1 = col1[-1], 0, 1 ) for all)
Sinon par script ça devrait être possible avec FindGroupChange()
Hors ligne
Désolé erasorz autant pour moi ( je l'ai mis en rouge pour indiquer que ceci est une erreur ( j'en garde la paternité )
Non pour ce qui concerne la valeur contenue dans les champs tu ne peut controler que les valeurs de la ligne courante.
ne tenez pas compte de cette remarque voir réponse suivante
Complémént:
L'utilisation de fonction dans les computeField à pour effet de réeffectuer le calcul complet.
Je m'explique :
Si tu créé un compute field que tu poses dans la zone de trailer et que en expression tu mettes 1 ( le chiffre) Nom du champs = COMP1
Si tu créé un autre computeField et que en expression tu mettes CumulativeSum ( COMP1 for group 1 ) pb considère que ce champ est sur chaque ligne de détail et tu obtient la sum de toutes les lignes faisant partie de ton group. donc on ne peut pas s'en sortir avec les compute.
Même la fonction FindGroupChange je ne vois pas comment l'utiliser.
Je préférerais ajouter une colonne à mon resultset et ensuite c'est moi qui met une valeur qui s'incrémente de 1 en 1 à ce champs chaque fois que je change de groupe.
après je n'ai plus qu'à tester dans mes trailer la valeur de ce champs ( pair ou impair )
Hors ligne
En fait, je ramène toutes les lignes sur le client parce qu'elles sont généralement ... déjà sur le client ;-) dans une base ASA locale, memê si ce n'est pas toujours le cas. Mais ce code (des stats) étant exécuté avec une fréquence faible, j'ai préféré avoir un code plus simple et laisser faire les agrégations à la DW.
Erasorz m'a aiguillé sur la bonne voie :-) et je suis arrivé au résultat attendu. Yanis, il est en effet possible dans une expression de la ligne N de faire référence à la valeur d'un colonne de la ligne N-1 (ou N-z). Dans mon cas, n'ayant pas d'identifiant unique, je dois me baser sur 2 colonnes pour être m'assurer du changement de groupe
cumulativesum(if ( (code_grg_identifiant = code_grg_identifiant[-1]) AND (periode = periode[-1]), 0, 1 ) for all)
Cette expression dans un computedField posé dans mon Trailer me permet de compter mes occurrences de Trailers et de jouer ensuite avec un modulo 2 pour alterner deux couleurs de lignes.
Merci à tous :-)
Hors ligne