Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
fmxstyle a écrit:
J'ai un probleme pour la recup de la valeur de la couleur de fond d'une cellule....
For c = 1 to numcols
colname = dw_cash_flow.describe("#" + string(c) + ".name")
col_VISIBLE = dw_cash_flow.describe("#" + string(c) + ".visible")
if integer(col_VISIBLE) = 1 then
For r = 1 to numrows
col_TYPE = dw_cash_flow.describe(colname + ".coltype")
col_BACKCOLOR = dw_cash_flow.describe("Evaluate("+ "'" + colname + ".BackGround.Color, "+ "'" + string(r) + ")" )
xlsub.cells[r,c] = dw_cash_flow.object.data[r,c]
xlsub.cells[r,c].Interior.Color = long(col_BACKCOLOR)
Next
end if
NextQu'est ce qui ne va pas c'est pas COLOR le nom de la propriété pourtant non ?
T'as essayé avec BackGroundColor plutot (sans le point) ?
Hors ligne
carrement et c pareil.... COLOR aussi testé pas mieux....
Il n y a que cette methode (evaluate dans un decribe) pour recupe la valeur d'une propriété d'une cellule de la DW ?
Hors ligne
Essaies ça :
col_BACKCOLOR = dw_cash_flow.describe("Evaluate(" + colname + ".BackGround.Color, " + string(r) + ")" )
Hors ligne
Avec le code suivant :
col_BACKCOLOR = dw_cash_flow.describe("Evaluate(" + colname + ".BackGround.Color, " + string(r) + ")" )
Pas mieux qu'avant car en debug je recupere un "!" dans ma variable de type string col_backcolor... je cherche je cherche mais pas moyen pour le moment
Hors ligne
Il y a effectivement une erreur de syntaxe, il faut ajouter un simple cote après le Evaluate( et un derrière le Color...
col_BACKCOLOR = dw_cash_flow.describe("Evaluate('" + colname + ".BackGround.Color', " + string(r) + ")" )
Tout autre chose, pour ton cas, n'oublie pas également de vérifier le BackGround.Mode pour voir si tu n'es pas en transparent...
Hors ligne
Chrnico a écrit:
Je veux bien aider qui veut à résoudre ses problèmes ou améliorer son code. De là à diffuser le code de la bibliothèque d'objets de N2I que j'améliore depuis pas mal d'années et qui me permet de gagner ma croute via mon métier d'éditeur, il y a un pas que je suis pas certain de vouloir franchir maintenant. J'espère que tu me comprends...
Non seulement je te comprend, mais je t'approuve.
Je voulais juste te chambrer
Hors ligne
Pareil que ce soit avec le nom de la colonne dans une string ou le numero de colonne dans la boucle...
Le message suivant de la DW apparait "expression is not valid"
col_BACKCOLOR = dw_cash_flow.describe("Evaluate('" + colname + ".BackGround.Color', " + string(r) + ")"
Ca commence a me saouler je n'avance plus... il me faut pourtant pouvoir recuperer la couleur de fond de ma cellule !
Une idée ?
Hors ligne
Le truc c'est que on ne peut pas parler aux propriété de la cellule dans la fonction EVALUATE non ? ca me semble faux rien que d'aspect. Si c'est pour evaluer une expression dans ce cas OK
Nouvelle idée dans ce cas : Pourquoi ne pas récupérer l'expression qui ce situe derriere le champ et l'integrer ensuite entre les parenthese de mon EVALUATE, comme cela il reevalue l'expression et me renvoie la bonne valeur non ?
Hors ligne
Comment se fait il qu'il soit si fastidieux d'avoir acces aux proprietés des champs de la datawindow sur une ligne données, je comprends pas qu'il n'est pas améliorer la facon d'y accéder par programmation, il aurait été utile de pouvoir coder dans ce genre :
dw_1.object.fieldname[i].background.color ou encore dw_1.object.fieldname.background.color[i]
c'est vraiment la misere ligne à ligne les champs d'une DW... vraiment !
Hors ligne
fmxstyle a écrit:
col_BACKCOLOR = dw_cash_flow.describe("Evaluate('" + colname + ".BackGround.Color', " + string(r) + ")"
Une idée ?
la doc de pb donne ça comme exemple
ls_data = dw_1.Describe("oval_1.Background.Color")
??
Hors ligne
Ouai mais la tu recuperera la couleur de fond sur la colonne en question pas sur la ligne, on est d'accord ?
Hors ligne
fmxstyle a écrit:
Comment se fait il qu'il soit si fastidieux d'avoir acces aux proprietés des champs de la datawindow sur une ligne données, je comprends pas qu'il n'est pas améliorer la facon d'y accéder par programmation, il aurait été utile de pouvoir coder dans ce genre :
dw_1.object.fieldname[i].background.color ou encore dw_1.object.fieldname.background.color[i]
c'est vraiment la misere ligne à ligne les champs d'une DW... vraiment !
Je suis assez d'accord avec toi sur ce point là.
Hors ligne
ls_data = dw_1.Describe("oval_1.Background.Color")
Effectivement la valeur de la couleur est récupérée mais elle ne change jamais malgré que sur la ligne elle soit rouge ou blanche....
Hors ligne
Bon, le problème vient du fait que la méthode Evaluate ne peut pas acceder aux propriétés de la colonne mais juste à sa valeur.
Je te conseil donc de mettre en place dans ta DW un computed field dans lequel tu récupère la valeur RGB en fonction de la valeur de ton champ. Après tu peux récuperer la couleur via un
dw_cash_flow.describe("Evaluate('moncomputed_field', " + string(r) + ")"
Je continue de chercher pour essayer de trouver un truc moins contraignant mais je te promets rien
Hors ligne
Ragardez un post d'un membre nommé "pautonnier", cela semble répondre à votre problème.
Hors ligne
c'est bien ce que j'avais lu dans l'aide de PB... grrrrrr
De toute facon pour colorer ligne a ligne les cellules de ma datawindow, j'ai du utiliser la technique suivante (tres contraignante selon moi) :
1. Ajouter dans la DW autant de champs couleur (soit la valeur en long de la couleur de fond souhaité pour le champ affiché) que de cellules pour lesquelles je souhaitait controler ligne a ligne la couleur.
2. J'ai affecté dans le background.color expression (dans le painter de la dw) la valeur du nouveau champ couleur ajouté
3. Par programmation je viens changer la valeur entiere du champ qui n'est autre que la valeur de la couleur de ma cellule => ca marche ...
exemple : un champ prix, un autre nommé prix_backcolor (entier) qui devient l'expression du background.color de PRIX
En prog je dit ceci :
for i = 1 to dw1.rowcount()
if dw1.object.prix[i] < 0.00 then
dw1.object.prix_backcolor[i] = rgb(255.0.0)
else
dw1.object.prix_backcolor[i] = rgb(255.255.255)
end if
next
Ca marche mais paye ta gestion de la couleur de fond moi j'aurai aimé pouvoir la changer dynamiquement en accedant directement à la propriete mais sur la ligne .... Du coup la DW devient imbittable a force de rajouter des champs pour gerer tel ou tel propriete sur la ligne....
Dernière modification par fmxstyle (29-08-2007 09:11:05)
Hors ligne
Tu peux le gerer directement dans ta DW ça. Dans les propriétés de ton champ, tu ajoute en expression du backgroundcolor :
if(prix>0,rgb(255,255,255),rbg(255,0,0))
Sinon ta couleur de cellule, si elle ne dépend que du fait que ta valeur soit >0 ou non tu peux le gerer avec ce code :
col_BACKCOLOR = dw_cash_flow.describe("Evaluate('if(" + colname + "<0,rgb(255,0,0),rgb(255,255,255))', " + string(r) + ")" )
Dernière modification par Mr Pink Eyes (29-08-2007 09:22:25)
Hors ligne
Ok pour le tip de Pautonnier...
Resumons la misere dans laquelle je me trouve :
1. Je dois coder un prog. générique permettant en gros l'export d'une DW telle qu'affichée à l'écran vers EXCEL.
2. En gros, récupérer la mise en forme d'un champ d'une DW sur une ligne donnée est une misere pas possible
=> Pour chacuns des champs de la DW, l'acces aux valeurs des proprietés de mise en forme sur une ligne donnée nécessite l'ajout d'un computed field ramenant la valeur souhaitée (via un decribe de cette proprieté).
3. Le prog doit pouvoir gérer different type de datawindow...
En gros faut que je recode à moi seul la librairie que j'avais téléchargé et testé DW2xls. Je sens que je vais debourser 50€ pas tard plutot que de passer une voir deux semaine pour avoir un resultat (moyen au final si cela se trouve)....
Je suis donc dans de beau draps avec ca....
Hors ligne
Ya aucun probleme sur ca Mr Pink Eyes mais encore une fois ce ne sera pas générique puisque dédié.
Moi je veux etre capable au pire de récupérer la proprieté de mise en forme quit à ce que cela passe par l'ajout dynamique d'un ou plusieurs computed field dont j'affecterai dynam. l'expression.
D'ailleurs a votre avis, pourrait on regler le probleme ou est ce qu'il serait possible d'ajouter dyn. un UNIQUE computed_field dont le role serait de me ramener les valeurs des diverses proprietés de mise en forme de ma cellule.
Comment ? Et bien si l'on peut d'une part ajouter un computed field dyn. dans la DW ET que l'on est en mesure de lui changer son expression (dyn. aussi) alors je pourrai avoir acces à toutes mes proprietés, non ? Serai ce possible et en terme de performance qu'est ce que cela donnerai?
Hors ligne
fmxstyle a écrit:
ls_data = dw_1.Describe("oval_1.Background.Color")
Effectivement la valeur de la couleur est récupérée mais elle ne change jamais malgré que sur la ligne elle soit rouge ou blanche....
Question : est-ce bien la couleur de fond de tes colonnes que tu changes à chaque ligne, ou celle du détail avec toutes tes colonnes en background.mode transparent ?
Hors ligne
fmxstyle a écrit:
Ya aucun probleme sur ca Mr Pink Eyes mais encore une fois ce ne sera pas générique puisque dédié.
Moi je veux etre capable au pire de récupérer la proprieté de mise en forme quit à ce que cela passe par l'ajout dynamique d'un ou plusieurs computed field dont j'affecterai dynam. l'expression.
D'ailleurs a votre avis, pourrait on regler le probleme ou est ce qu'il serait possible d'ajouter dyn. un UNIQUE computed_field dont le role serait de me ramener les valeurs des diverses proprietés de mise en forme de ma cellule.
Comment ? Et bien si l'on peut d'une part ajouter un computed field dyn. dans la DW ET que l'on est en mesure de lui changer son expression (dyn. aussi) alors je pourrai avoir acces à toutes mes proprietés, non ? Serai ce possible et en terme de performance qu'est ce que cela donnerai?
Laisse tomber cette usine à gaz
Hors ligne
fmxstyle a écrit:
Le truc c'est que on ne peut pas parler aux propriété de la cellule dans la fonction EVALUATE non ? ca me semble faux rien que d'aspect. Si c'est pour evaluer une expression dans ce cas OK
Nouvelle idée dans ce cas : Pourquoi ne pas récupérer l'expression qui ce situe derriere le champ et l'integrer ensuite entre les parenthese de mon EVALUATE, comme cela il reevalue l'expression et me renvoie la bonne valeur non ?
Oulala je fatigue !
Il faut décomposer l'opération en deux lignes :
ls_bckcolor = dw_1.Describe(ls_colonne + ".Background.Color") if pos(ls_bckcolor,"~t") > 0 then ls_bckcolor = dw_1.describe("Evaluate('"+ls_bckcolor+"', " + string(r) + ")" end if
Ainsi sur les colonnes sans formule, tu récupères la couleur directement, sinon tu interprêtes la formule.
Hors ligne
Ca a résolu ton problème fmx ?
Hors ligne
merci pour le bout de code. Disons que ca avance mais c'est pas encore ca ... je tiens au jus de toute facon...
Hors ligne
Tiens, ces fonctionnalités me disent quelque chose ...
On peut aussi rajouter la création d'onglets quand le rowcount dépasse 65000 lignes, etc.
Hors ligne