Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Tout est dit dans le sujet, est il possible de modifier la couleur d'une ligne particulière dans une datawindow (en la désignant par son numéro)?
Je suis en train de bidouiller pour arriver à mes fins mais si il existe un moyen plus simple je suis preneur
Merci pour vos reponses
Hors ligne
J'avais lu quelque part que c'était facilement faisable.
En fait il s'agit de définir une expression (dans ta datawindow) qui va changer la propriété d'un row (couleur, police, fond, etc.) suivant que l'expression soit validée ou non. Je crois que tu peux definir une expression juste pour une propriété précise en cliquant sur le bouton [...] qui est juste à côté de la propriété, dans le painter de datawindows. Donc ici il faut cliquer ta colonne (ou toutes celles de la ligne), aller dans propriétés, font, background color et cliquer le bouton rouge.
Là il te reste à indiquer ton expression, qui en gros serait un IF sur ton rownumber... je suppose
Je ne l'ai jamais mis en pratique, donc j'aurai du mal à en dire plus...
Dernière modification par Nyphel (28-07-2008 10:48:52)
Hors ligne
Je donne un peu plus d'informations sur mon problème (le script que j'ai developpé permettra peut être de comprendre où je rame) :
//********************************************************************************************** // le 23/07/2008 // Fonction gerer_signe_multienlevement // Paramètres en entrée : // - adw_datawindow_a_modifier : datawindow passée en reference // - as_id_titre : string représentant le nom de la colonne "id_titre" // - as_id_extension_titre : string représentant le nom de la colonne "id_extention_titre" // - as_id_societe_messagerie_titre : string représentant le nom de la colonne "id_id_societe_messagerie_titre" // Paramètre en sortie : // - Integer (0 --> ok, -1 --> erreur) // On parcours toutes les lignes de la datawindow pour verifier si le titre est en multienlevement // Si c'est le cas on modifie la police d'ecriture de la ligne pour la faire apparître en rouge //********************************************************************************************** //****** //*** //** Description des variables //*** //****** Long ll_nombre_lignes Long ll_iterateur String ls_id_titre String ls_id_extension_titre Integer li_id_societe_messagerie_titre String ls_message_erreur Long ll_nombre_enleveur String ls_modify //****** //*** //** Début du script //*** //****** // On calcule le nombre de lignes présentes dans la datawindow ll_nombre_lignes = adw_datawindow_a_modifier.RowCount() // Si la datawindow contient des lignes alors on boucle sur chaque ligne // et on verifie si le titre est en multienlevement If (ll_nombre_lignes > 0) Then For ll_iterateur = 1 To ll_nombre_lignes // On récupère les données du titre ls_id_titre = adw_datawindow_a_modifier.GetItemString(ll_iterateur, as_id_titre) ls_id_extension_titre = adw_datawindow_a_modifier.GetItemString(ll_iterateur, as_id_extension_titre) li_id_societe_messagerie_titre = adw_datawindow_a_modifier.GetItemNumber(ll_iterateur, as_id_societe_messagerie_titre) SQLCA.UP_OBI_TITRE_MULTIENLEVEUR(ls_id_titre, ls_id_extension_titre, li_id_societe_messagerie_titre, ll_nombre_enleveur) If (ll_nombre_enleveur > 1) Then // Le titre est en multienlèvement donc on modifie la police d'ecriture ls_modify = as_id_titre + ".Color = '0~tIf(" + as_id_titre + "='" + ls_id_titre + "', 255, 65280)'" MessageBox("Debug", ls_modify) adw_datawindow_a_modifier.Modify(ls_modify) Else return -1 End If Next End If return 0
Je plante un peu sur la synthaxe que doit avoir mon Modify (ci dessous le résultat de la messagebox)
J'ai essayer de faire un copier coller d'un exemple dans l'aide pb mais ça ne marche pas, est ce que vous voyez l'erreur que j'ai faite?
Autre question aussi, la je n'ai testé qu'un seul titre (lignes de ma datawindow) mais il est quasiment certain qu'au final il y aura plusieurs titres. Est ce que si il y a plusieurs titres différents les modifications antérieures de police d'écriture seront conservées?
En gros est ce que mont titre "toto"sera toujours en police de caractère rouge après que je fasse mon modify sur le titre "titi"?
J'espère ne pas trop vous avoir embrouillé
Hors ligne
pourquoi ne pas inclure le résultat de UP_OBI_TITRE_MULTIENLEVEUR dans ta requête et d'utiliser les expressions conditionnelles de DW ?
http://pbadonf.fr/forum/viewtopic.php?id=248
http://pbadonf.fr/forum/viewtopic.php?id=1270
Hors ligne
Parce que ce serait plusieurs procedures stockées qu'il faudrait modifier et que les procedures stockées font toujours plus de 100 lignes .
"mode flemme de l'informaticien"
Dernière modification par Nephtis (28-07-2008 12:29:29)
Hors ligne
Nephtis a écrit:
Parce que ce serait plusieurs procedures stockées qu'il faudrait modifier.
Hors ligne
c'est quoi cette ligne particuliere ? il y a un signe qui permet de definir cette ligne si particuliere ?
Hors ligne
la ligne particulière correspond au numéro de ligne que je suis en train de tester dans ma boucle --> ll_iterateur
erasorz a écrit:
Nephtis a écrit:
Parce que ce serait plusieurs procedures stockées qu'il faudrait modifier.
J'ai environ une dizaine de datawindows à modifier qui chacune appellent leur propre procédure stockée. Il faudrait que je modifie cette dizaine de procédure stockée en y ajoutant la requete SQL permettant de savoir si un titre est en multienlevement. Cette requete est a executer pour chaque titre et mes dizaines de requetes SQL ne groupent pas forcément sur le titre
Dernière modification par Nephtis (28-07-2008 13:49:37)
Hors ligne
Bon mon problème vient bien du Modify mais je n'arrive pas à voir d'où vient mon erreur
La petite partie de mon script qui bug (je l'ai modifié un peu pour les tests)
// Le titre est en multienlèvement donc on modifie la police d'ecriture ls_modify = "'lib_etat.Color = rgb(0,0,0)'" MessageBox("Debug", ls_modify) ls_message_modify = adw_datawindow_a_modifier.Modify(ls_modify) MessageBox("Debug", "Resultat du modify : " + ls_message_modify)
La messageBox du debug de la string passée au Modify -->
Le message d'erreur récupéré par l'appel de la fonction Modify -->
Je n'arrive pas à voir l'erreur de synthaxe, est ce que vous la voyez? (sachant que je suis certain que la colonne lib_etat existe bien)
Hors ligne
Nephtis a écrit:
Bon mon problème vient bien du Modify mais je n'arrive pas à voir d'où vient mon erreur
La petite partie de mon script qui bug (je l'ai modifié un peu pour les tests)Code: pb
// Le titre est en multienlèvement donc on modifie la police d'ecriture ls_modify = "'lib_etat.Color = rgb(0,0,0)'" MessageBox("Debug", ls_modify) ls_message_modify = adw_datawindow_a_modifier.Modify(ls_modify) MessageBox("Debug", "Resultat du modify : " + ls_message_modify)
La messageBox du debug de la string passée au Modify -->
Le message d'erreur récupéré par l'appel de la fonction Modify -->
Je n'arrive pas à voir l'erreur de synthaxe, est ce que vous la voyez? (sachant que je suis certain que la colonne lib_etat existe bien)
Essaye :
ls_modify = "lib_etat.Color = '"+ String( rgb(0,0,0) ) + "'"
PS: dans PB: New=> Tool => dwSyntax
Hors ligne
foon a écrit:
Essaye :
Code:
ls_modify = "lib_etat.Color = '"+ String( rgb(0,0,0) ) + "'"
Exact foon!!!
Dans le DataWindowSyntax (quel merveilleux outil...), on voit:
<DW Control Name>.Modify("<Columnname>.Color='<a long>'")
Le probleme etait qu'il ne fallait mettre de quotes que pour la valeur de la couleur desiree, pas le reste...
Nephtis a écrit:
Code:
// Le titre est en multienlèvement donc on modifie la police d'ecriture ls_modify = "'lib_etat.Color = rgb(0,0,0)'"
Par contre, attention, si j'ai bien compris ton code Nephtis, j'ai l'impression que tu espere pouvoir mettre ton expression dans differentes lignes, et qu'a chaque fois, le IF tienne compte du titre, qui me semble etre specifique d'une ou n ligne(s). El problemo, cher confrere, c'est que l'expression n'est en fait pas stockee dans une ligne precise, mais au niveau de la colonne. Donc, bien que l'expression soit evaluee pour chaque ligne, si tu y met "0~if(colTitle='toto', 255, 0)" lors de ton passage sur la ligne 1, et qu'a la ligne 2 tu met un truc du style "0~if(colTitle='pbadonf', 65535, 0)", ben tu vas simplement avoir cette derniere expression evaluee sur toutes tes lignes...
C'est d'ailleurs pour ca qu'on ne specifie pas de no de ligne au modify, parce qu'il s'en fout un peu... :sif:
Maintenant, si j'ai bien compris ce que tu veux faire, je te propose quelques pistes:
1/ Si tu peux modifier les colonnes de ta DW:
Ajoute une colonne, qui recevra un flag disant que la ligne courante a un titre en multienlevement. Tu peux alors mettre une expression simple a ta colonne :
as_id_titre + ".Color = '0~tIf(" + as_id_titre + "='colonneDeFlagQuiSertQuaCa', 255, 65280)'"
Et eventuellement, si tu as peur que ca fasse bricolage, tu peux creer une vue ou une stored proc qui servira de source a ta dw, et qui recuperera toutes tes infos + l'appel a la stored proc + le calcul du multienlevement,...
2/ Fais-toi une petite fonction global qui permet de parser une expression "case(...)" et d'y rajouter un "when" avec une expression passee en parametre. Et tu l'appelle au fil de tes differents titres, faisant grandir ton expression "case", dont tu te sert pour ta couleur.
3/ Deso, j'ai oublie ce que je voulais dire...
Voila, et bonne chance!
:lol::lol:
Dernière modification par Cortex (29-07-2008 11:01:33)
Hors ligne
Cortex a écrit:
foon a écrit:
Essaye :
Code:
ls_modify = "lib_etat.Color = '"+ String( rgb(0,0,0) ) + "'"Exact foon!!!
Exactement le problème qui me bloquait pour mon describe
Cortex a écrit:
Dans le DataWindowSyntax (quel merveilleux outil...), on voit:
<DW Control Name>.Modify("<Columnname>.Color='<a long>'")
Ca doit être encore un outil qui n'existait pas chez le dinosaure PB6.5
Cortex a écrit:
Par contre, attention, si j'ai bien compris ton code Nephtis, j'ai l'impression que tu espere pouvoir mettre ton expression dans differentes lignes, et qu'a chaque fois, le IF tienne compte du titre, qui me semble etre specifique d'une ou n ligne(s). El problemo, cher confrere, c'est que l'expression n'est en fait pas stockee dans une ligne precise, mais au niveau de la colonne. Donc, bien que l'expression soit evaluee pour chaque ligne, si tu y met "0~if(colTitle='toto', 255, 0)" lors de ton passage sur la ligne 1, et qu'a la ligne 2 tu met un truc du style "0~if(colTitle='pbadonf', 65535, 0)", ben tu vas simplement avoir cette derniere expression evaluee sur toutes tes lignes...
C'est d'ailleurs pour ca qu'on ne specifie pas de no de ligne au modify, parce qu'il s'en fout un peu...
C'est bien ce que je me disais après quelques reflexions
Cortex a écrit:
Maintenant, si j'ai bien compris ce que tu veux faire, je te propose quelques pistes:
1/ Si tu peux modifier les colonnes de ta DW:
Ajoute une colonne, qui recevra un flag disant que la ligne courante a un titre en multienlevement. Tu peux alors mettre une expression simple a ta colonne :
as_id_titre + ".Color = '0~tIf(" + as_id_titre + "='colonneDeFlagQuiSertQuaCa', 255, 65280)'"
Et eventuellement, si tu as peur que ca fasse bricolage, tu peux creer une vue ou une stored proc qui servira de source a ta dw, et qui recuperera toutes tes infos + l'appel a la stored proc + le calcul du multienlevement,...
2/ Fais-toi une petite fonction global qui permet de parser une expression "case(...)" et d'y rajouter un "when" avec une expression passee en parametre. Et tu l'appelle au fil de tes differents titres, faisant grandir ton expression "case", dont tu te sert pour ta couleur.
3/ Deso, j'ai oublie ce que je voulais dire...
Voila, et bonne chance!
Oui je suis parti pour créer un champ qui recevra la valeur qui correspond au concept de "multienleveur"
Merci pour vos reponses, j'distribue les pépitos et je me remet au boulot
Hors ligne
Nephtis a écrit:
Cortex a écrit:
Dans le DataWindowSyntax (quel merveilleux outil...), on voit:
<DW Control Name>.Modify("<Columnname>.Color='<a long>'")Ca doit être encore un outil qui n'existait pas chez le dinosaure PB6.5
Eeet si, mais il n'était pas intégré dans l'exécutable PB, mais dans un exécutable à part (DWSyntax.exe si je me souviens bien. Si, si, il est sur ton CD PB6.5 )
Hors ligne
Bon j'ai bien avancé sur le sujet mais je suis un peu bloqué sur un point.
Tout d'abord j'ai créé dynamiquement un champ dans la bande de détail :
dw_1.Modify('Create column(band=detail id=15 alignment="1" tabsequence=32766 border="1" color="0" x="169" y="4" height="76" width="521" format="[general]" name=test_multienleveur edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="MS Sans Serif" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912")')
Ensuite je lui affecte la valeur qui correspond au test du multienleveur dans la boucle :
dw_1.Object.test_multienleveur[ll_iterateur] = ll_nombre_enleveur
Et pour finir je lance mon modify pour colorier les lignes en rouge:
dw_1.Modify("lib_etat.Color='255~tIf(test_multienleveur = 10,rgb(255,0,0),200)'")
Par contre je plante déjà à la deuxieme étape car il semblerait que la colonne crée soit de type String, comment faire pour la forcer à être d'un type precis?
J'ai tout de même testé mon script en utilisant la colonne dynamique en tant qu'objet de type String mais je suis resté coincé sur la troisième étape car j'ai toujours un probleme de synthaxe.
Hors ligne
à quelle colonne correspond " id=15 "?
Hors ligne
JCZ a écrit:
à quelle colonne correspond " id=15 "?
Oui je viens de voir aussi que je ne créais pas de colonne mais que j'utilisait la colonne dont l'id est 15 et qui est un char(3).
N'est t'il pas possible de forcer à créer un colonne? Quand je met 36 le modify plante (j'ai 35 colonnes dans mon result set)
Hors ligne
Nephtis a écrit:
JCZ a écrit:
à quelle colonne correspond " id=15 "?
Oui je viens de voir aussi que je ne créais pas de colonne mais que j'utilisait la colonne dont l'id est 15 et qui est un char(3).
N'est t'il pas possible de forcer à créer un colonne? Quand je met 36 le modify plante (j'ai 35 colonnes dans mon result set)
Non, il n'est pas possible de creer une colonne... excepte en alterant la syntaxe de la datawindow: ajouter la definition d'une colonne, et faire un "dw.Create(string syntax)" avec cette syntaxe modifiee.
Pour ajouter une colonne, tu dois definir dans la section "table(...)" de la syntaxe de ta dw, une nouvelle entree "column"... Pour etre plus simple, voici un exemple minimal pour une colonne de type numerique qui devrait s'appeller 'toto':
release 11; datawindow(...) header(...) summary(...) footer(...) detail(...) table( column=(type=long name=toto dbname="toto" ) ... )...
Attention toutefois, le fameux "id=..." qu'a fait remarquer JCZ se refere au numero de la definition de colonne dans la clause 'table()', dans l'ordre d'ecriture! Donc "id=15" se refere a la 15eme colonne...
Hors ligne