假设我在数据窗口上有一个字段,它是数据库列的值(“插入>列”)。它具有需要保护的条件(属性>常规>保护)。
我希望在保护时将场背景变为灰色。目前,我能解决如何做到这一点的唯一方法是复制保护条件,无论多么复杂,用1(保护)和0(不保护)代替颜色值。
我可以在Expression字段中使用某种语法来获取引用列保护值的列的背景颜色吗?我试过了
if(column.protect = 1,Gray,White)
但它返回错误的说它期望一个TRUE / FALSE条件。
我不可能完成任务,或者只是获得正确的语法。
干杯。
答案 0 :(得分:6)
哇。你喜欢复杂的,分层的问题。
第一个问题是访问该值,而不是直接按照您的描述完成。事实上,您使用Describe()来获取值。唯一的问题是它以下面的格式返回为字符串,并带有引号(注意我们使用的是标准的PowerScript字符串表示法,其中〜t是一个制表符)
"<DefaultValue>~t<Expression>"
你想要表达式,所以你必须解析它,同时删除引号。
获得表达式后,您需要为给定的行评估它。这可以通过另一个Describe()调用完成,特别是:
Describe ("Evaluate('<expression>', <rownum>)")
可以使用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))
这看起来很复杂,但是如果你将Mid()表达式放在计算字段中以便可以看到结果,你会看到它只是解析出Protect表达式并将其放入Describe(Evaluate())语法中如上所述。
为了简单起见,我已经将一个作弊放入我的代码中。我使用了我在Protect表达式中只有单引号的知识,并选择将Evaluate()表达式字符串放在双引号中。如果我试图对任何列进行一般性操作,并且不能假设我的Protect表达式中没有双引号,我将使用全局函数来使用转义引号替换Protect表达式中的任何双引号(〜“),在我的代码中我相信看起来像是一个三重波形和一个引用。然后,如果我必须进行全局函数调用(请注意如果有很多行,表达式中的全局函数调用会对性能产生重大影响),我只需将Describe(“column.protect”)和GetRow()传递给它,并在PowerScript中构建整个表达式,这将是更容易理解和维护。
祝你好运,特里。