PowerBuilder NULL и пустая переменная - PullRequest
0 голосов
/ 06 марта 2012

Я использую PowerBuilder и у меня проблема с условием if. Я хочу проверить, если переменная не пуста или не пуста.

Итак, сначала я должен выполнить следующее условие, чтобы проверить, является ли переменная нулевой или нет:

IF IsNull(ls_name) THEN
    messagebox("ls_name", "is null")  //true
else
    messagebox("ls_name", "is not null")
end if

Из вышеприведенного условия я знаю, что ls_name имеет значение null. Теперь я проверяю, пусто оно или нет:

if ls_name = "" then
    messagebox ("ls_name", "is empty")
else
    messagebox("ls_name", "is not empty") //true
end if

И я понимаю, что ls_name не пусто.

Теперь, когда я использую условие if, чтобы проверить, не является ли ls_name НУЛЕМ или не пусто, я ставлю следующее условие if:

IF not IsNull(ls_name) or ls_name <> "" THEN
    messagebox("test", "condition true")
else
    messagebox("test", "condition false")  //this becomes true.
end if

Это относится к остальной части условия. Не должна ли часть if стать правдой? Я пишу условие if неправильно?

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Думая о «нулевом» как о «неизвестном», я всегда понимал, как оцениваются выражения.

Итак, когда ls_name имеет значение null,

not IsNull(ls_name) or ls_name <> ""

оценивается как

NOT TRUE OR UNKNOWN

или

FALSE OR UNKNOWN

Ну, для ИЛИ, чтобы оценитьИСТИНА, по крайней мере одно условие должно быть ИСТИНА.Это не относится в этом случае.

Обычно я проверяю это следующим образом:

IF NOT (IsNull (ls_name) OR ls_name = "") THEN

, который, когда ls_name имеет значение null, разрешается в

NOT (TRUE OR UNKNOWN)

затем

NOT (TRUE)

и

FALSE

Другими словами, переменная «пустая».

Удачи,

Терри

1 голос
/ 06 марта 2012

Остерегайтесь манеры PB для тестирования if условий и нулевого поведения:

  • в отличие от языка C, PB не выполняет отложенную оценку, т. Е. Всегда оценивает все части условия и не останавливается на первой ложной или истинной части
  • ноль заразителен, в том смысле, что если часть оператора возвращает ноль, весь оператор становится нулевым
  • нулевое выражение всегда ложно при использовании if

Так что в вашем случае, вероятно, что когда ls_name имеет значение null, not IsNull(ls_name) оценивается как true, но ls_name <> "" становится нулевым, таким образом, true or null становится нулевым, и вы всегда переходите к части else .

Я бы зарегистрировался 2 раза:

if not IsNull(ls_name) then
    if ls_name <> "" then
        //not empty
    else
        //empty
    end if
else
    //null
end if

Если вам нужно обрабатывать один и тот же код для непустых / ненулевых значений, вам придется использовать какой-то логический флаг. Я также начал использовать оператор goto, который удобен при работе с вложенным оператором if.

(Кстати: НЕТ, goto - при осторожном использовании - не зло; o)

0 голосов
/ 07 марта 2012

Лучшая техника, которую я использую для своих программ:

Если IsNull (ls_name), ТО ls_name = ""

IF Len (Trim (ls_name)) = 0 THEN

 ERR  MSG HERE

END IF

я всегда устанавливаю пустые строки на пустые места, затем проверяю, пустые ли строки .. это также зависит от сценария, который вы запускаете

...