Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Непонятки с IIF и макроподстановкой / 11 сообщений из 11, страница 1 из 1
05.07.2006, 10:31
    #33831930
Программизд 01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
Код: 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
05.07.2006, 10:51
    #33832011
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
?IIF(!EMPTY(lcField),FSIZE(),0)
...
Рейтинг: 0 / 0
05.07.2006, 10:52
    #33832013
DmGr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
LEN(&lcField) - после макроподстановки LEN()
...
Рейтинг: 0 / 0
05.07.2006, 10:55
    #33832020
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
AleksMed?IIF(!EMPTY(lcField),FSIZE(),0)
?IIF(!EMPTY(lcField),FSIZE(lcField),0)
...
Рейтинг: 0 / 0
05.07.2006, 11:25
    #33832157
Программизд 01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
AleksMed AleksMed?IIF(!EMPTY(lcField),FSIZE(),0)
?IIF(!EMPTY(lcField),FSIZE(lcField),0)

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

автор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
05.07.2006, 11:39
    #33832222
StasL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
Программизд 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
05.07.2006, 11:49
    #33832266
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
Программизд 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
05.07.2006, 11:57
    #33832306
Программизд 01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятки с IIF и макроподстановкой
StasLДальше сам догадаешься, что такое макроподстановка и почему LEN(&lcField) спотыкается?


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

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


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


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