PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 28-07-2008 10:21:35

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Changer la couleur d'une ligne ...

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


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#2 28-07-2008 10:47:00

Nyphel  
Membre Power Geek
Lieu: Grenoble
Date d'inscription: 06-05-2008
Messages: 253
Pépites: 12
Banque: 529,705,333,097,693

Re: Changer la couleur d'une 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

 

#3 28-07-2008 12:13:09

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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) :

Code: pb

//**********************************************************************************************
// 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)

http://img120.imageshack.us/img120/7266/modifyfk8.jpg

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é


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#4 28-07-2008 12:17:22

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Changer la couleur d'une 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


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 28-07-2008 12:28:52

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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)


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#6 28-07-2008 12:30:38

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Changer la couleur d'une ligne ...

Nephtis a écrit:

Parce que ce serait plusieurs procedures stockées qu'il faudrait modifier.


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#7 28-07-2008 12:37:12

pick ouic  
La bourse ou la vie ^^
Award: gearotter
Lieu: Massy-Verrières
Date d'inscription: 29-05-2006
Messages: 4655
Pépites: 933
Banque: 2,147,483,647
Site web

Re: Changer la couleur d'une ligne ...


Connaitre son ignorance est une grande part de la connaissance.
http://animegifs.free.fr/anime/mazinger/mazinger.gif

Hors ligne

 

#8 28-07-2008 13:21:18

pick ouic  
La bourse ou la vie ^^
Award: gearotter
Lieu: Massy-Verrières
Date d'inscription: 29-05-2006
Messages: 4655
Pépites: 933
Banque: 2,147,483,647
Site web

Re: Changer la couleur d'une ligne ...

c'est quoi cette ligne particuliere ? il y a un signe qui permet de definir cette ligne si particuliere ?


Connaitre son ignorance est une grande part de la connaissance.
http://animegifs.free.fr/anime/mazinger/mazinger.gif

Hors ligne

 

#9 28-07-2008 13:45:39

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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)


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#10 29-07-2008 09:37:27

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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)

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 --> Cliquez pour agrandir

Le message d'erreur récupéré par l'appel de la fonction Modify --> Cliquez pour agrandir

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)


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#11 29-07-2008 09:46:20

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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 --> Cliquez pour agrandir

Le message d'erreur récupéré par l'appel de la fonction Modify --> Cliquez pour agrandir

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 :

Code: pb

ls_modify = "lib_etat.Color = '"+ String( rgb(0,0,0) ) + "'"


PS: dans PB: New=> Tool => dwSyntax


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#12 29-07-2008 10:59:45

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Changer la couleur d'une 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

 

#13 29-07-2008 13:01:25

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#14 29-07-2008 13:08:05

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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 )


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#15 30-07-2008 09:17:47

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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 :

Code: pb

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 :

Code: pb

dw_1.Object.test_multienleveur[ll_iterateur] = ll_nombre_enleveur


Et pour finir je lance mon modify pour colorier les lignes en rouge:

Code: pb

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.


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#16 30-07-2008 11:56:58

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une ligne ...

à quelle colonne correspond " id=15 "?


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#17 30-07-2008 12:20:38

Nephtis  
Bienfaiteur du site
Award: bf
Lieu: Longjumeau
Date d'inscription: 29-06-2007
Messages: 665
Pépites: 17,189,873,958
Banque: 9,223,372,036,854,776,000

Re: Changer la couleur d'une 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)


Qui sème des problèmes, récolte des réponses.
PB 6.5 || ASE 12.5.4 || XP SP3

Hors ligne

 

#18 30-07-2008 13:27:34

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: Changer la couleur d'une 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':

Code: pb

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

 

Pied de page des forums

Propulsé par FluxBB 1.2.22