Можно ли использовать свойства столбца в выражениях в Powerbuilder? - PullRequest
3 голосов
/ 29 января 2010

Скажем, у меня есть поле в окне данных, которое является значением столбца базы данных ("Вставить> Столбец). В нем есть условия, в которых его необходимо защитить (Свойства> Общие> Защита).

Я хочу иметь серый фон поля, когда он защищен. На данный момент единственный способ понять, как это сделать, - скопировать условное выражение защиты, независимо от того, насколько оно сложное, подставив значения цвета 1 (защита) и 0 (не защита).

Есть ли какой-то синтаксис, который я могу использовать в поле «Выражение» для цвета фона столбца, который ссылается на значение защиты столбца? Я пытался

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

но возвращает ошибку, говоря, что ожидает условие ИСТИНА / ЛОЖЬ.

Это то, что я после невозможного, или это просто вопрос правильного синтаксиса.

Приветствие.

1 Ответ

6 голосов
/ 29 января 2010

Ничего себе. Вам нравятся сложные, многоуровневые вопросы.

Первая проблема - это доступ к значению, которое не выполняется так, как вы описали. Фактически, вы используете Describe () для получения значения. Единственная проблема заключается в том, что он возвращается в виде строки в следующем формате с кавычками (обратите внимание, что мы используем стандартную запись строки PowerScript, где ~ t - это вкладка)

"<DefaultValue>~t<Expression>"

Вы хотите выражение, поэтому вам придется разобрать его, отбросив также кавычки.

Как только вы получите выражение, вам нужно будет оценить его для данной строки. Это можно сделать с помощью другого вызова Describe (), в частности:

Describe ("Evaluate('<expression>', <rownum>)")

Номер строки, по которой вычисляется выражение, можно получить с помощью функции GetRow ().

Это может звучать так, как будто он нуждается в PowerScript и некотором временном хранилище значений, но если вы готовы выполнять избыточные вызовы функций для получения заданного значения более одного раза, вы можете сделать это в выражении, что-то вроде (для пример столбца б):

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, что было бы проще понимать и поддерживать.

Удачи,

Терри.

...