powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Непонятки с IIF и макроподстановкой
11 сообщений из 11, страница 1 из 1
Непонятки с IIF и макроподстановкой
    #33831930
Фотография Программизд 01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
CREATE CURSOR cTest (f1 c( 2 ))
lcField = "f1"
? IIF(!EMPTY(lcField),LEN(&lcField), 0 )
---
 2 


Код: plaintext
1.
2.
3.
4.
CREATE CURSOR cTest (f1 c( 2 ))
lcField = ""
? IIF(!EMPTY(lcField),LEN(&lcField), 0 )
---
Too few arguments

Почему так ?
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832011
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?IIF(!EMPTY(lcField),FSIZE(),0)
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832013
DmGr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LEN(&lcField) - после макроподстановки LEN()
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832020
AleksMed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksMed?IIF(!EMPTY(lcField),FSIZE(),0)
?IIF(!EMPTY(lcField),FSIZE(lcField),0)
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832157
Фотография Программизд 01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksMed AleksMed?IIF(!EMPTY(lcField),FSIZE(),0)
?IIF(!EMPTY(lcField),FSIZE(lcField),0)

Это да, работает. Но почему IIF так странно ведет себя ? Ведь по идее если lcField пустое, он должен сразу ноль возвратить, а он почему-то на LEN(&lcField) спотыкается.
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832213
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда, похоже, что есть противоречие с хелпом

авторIf lExpression evaluates to True (.T.), eExpression1 is returned and eExpression2 is not evaluated. If lExpression evaluates to False (.F.) or null (.NULL.), eExpression2 is returned and eExpression1 is not evaluated.

То бишь если надо вернуть "выражение 1", то "выражение 2" не вычисляется, ан нет всё равно вычисляется.
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832222
StasL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программизд 01 AleksMed AleksMed?IIF(!EMPTY(lcField),FSIZE(),0)
?IIF(!EMPTY(lcField),FSIZE(lcField),0)

Это да, работает. Но почему IIF так странно ведет себя ? Ведь по идее если lcField пустое, он должен сразу ноль возвратить, а он почему-то на LEN(&lcField) спотыкается.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE CURSOR cTest (f1 c( 2 ))
INSERT INTO cTest (f1) values ('q')
lcField = "f1"
? &lcField
--
q
? LEN(&lcField)
--
 2 
Дальше сам догадаешься, что такое макроподстановка и почему LEN(&lcField) спотыкается?
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832266
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программизд 01
Это да, работает. Но почему IIF так странно ведет себя ? Ведь по идее если lcField пустое, он должен сразу ноль возвратить, а он почему-то на LEN(&lcField) спотыкается.
Тебе же уже DmGr ответил.

Раскрытие макроподстановки происходит еще ДО собственно выполнения команды. Надо же узнать, что именно требуется выполнить. И, видимо, происходит компиляция команды после раскрытия макроподстановки, но еще ДО выполнения.

Если lcField = "f1", то после макроподстановки получим LEN(f1), а если lcField = "", то после макроподстановки имеем LEN(). Длину ЧЕГО надо определить? Вообще ничего не указано в качестве параметра. Вот Fox и ругается на то, что нет параметра там, где он должен быть.

Если бы ты написал

lcField = [""]

то после макроподстановки было бы LEN(""), вот тогда ошибки не было бы.

Также не будет ошибки, если заменить макроподстановку на скобки или функцию EVALUATE()

Код: plaintext
1.
2.
? IIF(!EMPTY(m.lcField),LEN(EVALUATE(m.lcField)), 0 )
? IIF(!EMPTY(m.lcField),LEN((m.lcField)), 0 ) && здесь двойные скобки

В этом случае нет собственно макроподстановки, а есть некая функция, которая должны быть вычислена для определения параметра команды LEN()
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832306
Фотография Программизд 01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StasLДальше сам догадаешься, что такое макроподстановка и почему LEN(&lcField) спотыкается?


Прочитай еще раз суть вопроса. Внимательно.
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33832313
Фотография Программизд 01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ[quot Программизд 01]

Раскрытие макроподстановки происходит еще ДО собственно выполнения команды. Надо же узнать, что именно требуется выполнить. И, видимо, происходит компиляция команды после раскрытия макроподстановки, но еще ДО выполнения.


Понятно, видимо так и есть.
...
Рейтинг: 0 / 0
Непонятки с IIF и макроподстановкой
    #33833166
AlessV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заменяем & на evaluate() [как и рекомендуется в хелпе] и все хорошо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Непонятки с IIF и макроподстановкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]