是否可以在Powerbuilder中的表达式中使用列属性?

gla*_*snt 3 syntax powerbuilder expression

假设我在数据窗口上有一个字段,它是数据库列的值("插入>列").它具有需要保护的条件("属性">"常规">"保护").

我希望在保护时将场背景变为灰色.目前,我能解决如何做到这一点的唯一方法是复制保护条件,无论多么复杂,用1(保护)和0(不保护)代替颜色值.

我可以在Expression字段中使用某种语法来获取引用列保护值的列的背景颜色吗?我试过了

if(column.protect = 1,Gray,White)

但它返回错误的说它期望一个TRUE/FALSE条件.

是我不可能的,或者只是获得正确的语法问题.

干杯.

Ter*_*rry 6

哇.你喜欢复杂的分层问题.

第一个问题是访问该值,而不是直接按照您的描述完成.事实上,您使用Describe()来获取值.唯一的问题是它以下面的格式返回一个字符串,带有引号(注意我们使用标准的PowerScript字符串表示法,其中〜t是一个制表符)

"<DefaultValue>~t<Expression>"
Run Code Online (Sandbox Code Playgroud)

你想要表达式,所以你必须解析它,同时删除引号.

获得表达式后,您需要为给定的行计算它.这可以通过另一个Describe()调用完成,特别是:

Describe ("Evaluate('<expression>', <rownum>)")
Run Code Online (Sandbox Code Playgroud)

可以使用GetRow()函数获取正在计算表达式的行号.

这可能听起来像需要PowerScript和一些临时值存储,但只要您愿意多次调用函数来获取给定值,您就可以在表达式中执行此操作,例如(对于示例列) 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))
Run Code Online (Sandbox Code Playgroud)

这看起来很复杂,但如果将Mid()表达式放在计算字段中以便可以看到结果,您将看到只是解析Protect表达式并将其置于上述Describe(Evaluate())语法中.

已经把一个骗进我的简单代码.我使用了我在Protect表达式中只有单引号的知识,并选择将Evaluate()表达式字符串放在双引号中.如果我试图对任何列进行一般性操作,并且不能假设我的Protect表达式中没有双引号,我将使用全局函数来使用转义引号替换Protect表达式中的任何双引号(〜"),我相信你的代码看起来像一个三重波形和一个引用.然后再次,如果我必须进行全局函数调用(注意表达式中的全局函数调用可能会产生重大的性能影响,如果有很多行),我只是将Describe("column.protect")和GetRow()传递给它,并在PowerScript中构建整个表达式,这将更容易理解和维护.

祝好运,

特里.