3 votes

Est-il possible d'utiliser les propriétés de colonne dans les expressions dans Powerbuilder?

Dire que j'ai un champ dans une fenêtre de données qui est la valeur d'une colonne de base de données ("Insérer > Colonne). Il a des conditions dans lesquelles il doit être protégé (Propriétés>Général>Protéger).

Je veux que le fond du champ soit gris quand il est protégé. Pour le moment, la seule façon que je peux trouver de le faire est de copier la condition de protection, peu importe sa complexité, en substituant les 1 (protégé) et 0 (non protégé) par des valeurs de couleur.

Y a-t-il une sorte de syntaxe que je peux utiliser dans le champ d'expression pour la couleur de fond de la colonne qui fait référence à la valeur de protection de la colonne? J'ai essayé

si (colonne.protéger=1, Gris, Blanc)

mais il retourne une erreur en disant qu'il attend une condition VRAI/FAUX.

Ce que je cherche est-il impossible, ou est-ce juste une question d'obtenir la bonne syntaxe.

Amicalement.

6voto

John Connell Points 11

Wow. Vous aimez les questions complexes et superposées.

Le premier problème est d'accéder à la valeur, ce qui ne se fait pas aussi directement que vous l'avez décrit. En fait, vous utilisez un Describe() pour obtenir la valeur. Le seul problème avec cela est qu'elle revient sous forme de chaîne dans le format suivant, avec des guillemets autour (notez que nous utilisons la notation de chaîne PowerScript standard où ~t est un onglet)

"~t"

Vous voulez l'expression, donc vous devrez la découper, en supprimant également les guillemets.

Une fois que vous avez l'expression, vous devrez l'évaluer pour la ligne donnée. Cela peut être fait avec un autre appel à Describe(), en particulier :

Describe ("Evaluate('', )")

Le numéro de ligne sur lequel une expression est évaluée peut être obtenu avec la fonction GetRow().

Cela peut sembler nécessiter PowerScript et un stockage de valeur intérimaire, mais tant que vous êtes prêt à effectuer des appels de fonction redondants pour obtenir une valeur donnée plus d'une fois, vous pouvez le faire dans une expression, quelque chose comme (pour une colonne d'exemple b) :

if (Describe("Evaluate (~"" + Mid(Describe("b.protect"), Pos(Describe("b.protect"), "~t")+1, Len(Describe("b.protect")) - Pos(Describe("b.protect"), "~t") - 1) + "~", " + String(GetRow()) + ")")='1', rgb(128, 128, 128), rgb(255,255,255))

Cela semble complexe, mais si vous mettez l'expression Mid() dans un champ calculé pour que vous puissiez voir le résultat, vous verrez que cela extrait simplement l'expression de protection et la place dans la syntaxe Describe(Evaluate()) décrite ci-dessus.

J'ai mis une astuce dans mon code pour la simplicité. J'ai utilisé le fait que je n'avais que des guillemets simples dans mon expression Protect, et ai choisi de mettre la chaîne d'expression Evaluate() entre guillemets doubles. Si j'essayais de le faire de manière générique pour n'importe quelle colonne, et que je ne pouvais pas supposer l'absence de guillemets doubles dans mon expression Protect, j'aurais utilisé une fonction globale pour remplacer tous les guillemets doubles dans l'expression Protect par des guillemets échappés (~"), ce que je crois dans votre code ressemblerait à trois tilde et un guillemet. D'un autre côté, si je devais appeler une fonction globale (notez que les appels de fonction globale dans les expressions peuvent avoir un impact significatif sur les performances s'il y a beaucoup de lignes), je lui passerais simplement le Describe("column.protect") et GetRow() et construirais toute l'expression en PowerScript, ce qui serait plus facile à comprendre et à maintenir.

Bonne chance,

Terry.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X