powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Macro подстановка
11 сообщений из 11, страница 1 из 1
Macro подстановка
    #40137058
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше этот кусок кода работал
Код: sql
1.
2.
3.
if lnId != &tcAlias..id
   {some code}
endif


Теперь выдает ошибку:
Код: sql
1.
Variable "IDЙ" is not found!


Есть какие мысли?
...
Рейтинг: 0 / 0
Macro подстановка
    #40137064
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй EVAL()
...
Рейтинг: 0 / 0
Macro подстановка
    #40137065
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И посмотри что в tcAlias
...
Рейтинг: 0 / 0
Macro подстановка
    #40137076
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более приближенный к реальности код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT &tcAlias
SCAN
	IF ldAnalizedDate != &tcAlias..mj_setdate

	     ldAnalizedDate   = &tcAlias..mj_setdate
	     lnAnalizedRamkId = &tcAlias..ramk_id
         ...
         ENDIF
ENDSCAN


Ошибка соответственно:
Код: sql
1.
Variable "MJ_SETDATEЙ" is not found!


Вот этот код с EVAL() работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT &tcAlias
SCAN
	IF ldAnalizedDate != EVAL(tcAlias +".mj_setdate")

		ldAnalizedDate   = &tcAlias..mj_setdate
		lnAnalizedRamkId = &tcAlias..ramk_id
         ...
         ENDIF
ENDSCAN


1) Первый фрагмент кода работал до настоящего времени, вроде бы никаких изменений серьезных не было, что повлияло на его работу - непонятно.
2) В tcAlias - имя курсора.
3) Не понятно, откуда берется символ "Й" .
4) Ошибку вызывает только макроподстановка в конструкции "IF" . Строка " ldAnalizedDate = &tcAlias..mj_setdate ", например, отрабатывает нормально (Второй фрагмент кода с EVAL() работает).

Пока капаю интернет, может что удастся найти ...
...
Рейтинг: 0 / 0
Macro подстановка
    #40137081
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Вот этот код с EVAL() работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT &tcAlias
SCAN
	IF ldAnalizedDate != EVAL(tcAlias +".mj_setdate")

		ldAnalizedDate   = &tcAlias..mj_setdate
		lnAnalizedRamkId = &tcAlias..ramk_id
         ...
         ENDIF
ENDSCAN


Ну и оставь так, выделенные строчки тоже на EVAL() замени. И это
Код: sql
1.
SELECT (tcAlias)
...
Рейтинг: 0 / 0
Macro подстановка
    #40137084
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Более приближенный к реальности код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT &tcAlias
SCAN
	IF ldAnalizedDate != &tcAlias..mj_setdate

	     ldAnalizedDate   = &tcAlias..mj_setdate
	     lnAnalizedRamkId = &tcAlias..ramk_id
         ...
         ENDIF
ENDSCAN


...
1) Первый фрагмент кода работал до настоящего времени, вроде бы никаких изменений серьезных не было, что повлияло на его работу - непонятно.
Какая-то чушь в tcAlias.2) В tcAlias - имя курсора.Очень трудно об этом не догадаться.3) Не понятно, откуда берется символ "Й" .Еще раз - какая-то чушь в tcAlias.4) Ошибку вызывает только макроподстановка в конструкции "IF" . Строка " ldAnalizedDate = &tcAlias..mj_setdate ", например, отрабатывает нормально (Второй фрагмент кода с EVAL() работает).1. Вот и один из недостатков макроподстановки, о чем уж столько лет твердят миру.
2. Тем более что макро тут как зайцу стоп-сигнал.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT (tcAlias)
SCAN
	IF ldAnalizedDate != mj_setdate

	     ldAnalizedDate   = mj_setdate
	     lnAnalizedRamkId = ramk_id
         ...
         ENDIF
ENDSCAN


Пока капаю интернет, может что удастся найти ...Чем кАпаешь? Капельками, что доктор прописал или самолечением занимаешься? :)
...
Рейтинг: 0 / 0
Macro подстановка
    #40137085
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я то переделаю. Просто интересно разобраться, почему так происходит.

Есть подозрение, что это как то связано с областями видимости или типом передачи параметра (по ссылке/значению).
...
Рейтинг: 0 / 0
Macro подстановка
    #40137087
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov,
1) Когда писал, что в tcAlias - имя курсора, имел ввиду, что там лежит имя курсор, а не какой-нибудь мусор или null.
2) "Й" клеется к имени поля, а не курсора.
3) Sergey Sizov2. Тем более что макро тут как зайцу стоп-сигнал.
Тут мне немного не хватает знаний. Внитри скана есть еще выборки "select * from ...". И при очередном скане будет ли браться имено поле из исходной таблицы? Я привык явно прописывать, что откуда брать (нагляднее и надежнее).
...
Рейтинг: 0 / 0
Macro подстановка
    #40137113
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov
Чем кАпаешь? Капельками, что доктор прописал или самолечением занимаешься? :)

Валерьяночку потягиваю, нервишки восстанавливаю ...

Что накапал обнаружил:
У меня есть файл "Reports.prg" с упрощенной структурой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
PARAMETERS reportid
DO CASE 
   CASE reportid = 1
       {make report_1}
   CASE reportid = 2
       {make report_2}
   CASE reportid = 3
       {make report_3}
   ...
ENDCASE


Т.е. в зависимости от переданного параметра формируется нужный отчет, например
Код: sql
1.
do reports with 1


Код, который вызывал ошибку, находится в одном из блоков "CASE".

Все отлично работало до тех пора, пока я не добавил новый отчет (Новый блок "CASE" с реализацией).

Удаляю этот CASE - все работает. Хм... Но этот новый код никак не связан с тем, который вызывает ошибку ...
Вновь добавляю новый отчет, но теперь удаляю другую секцию CASE не связанную ни с новым отчетом, ни с проблемным - все ок!

Выводы:
Получается макро-подстановка каким то образом зависит от размера файла.
При этом если убрать макроподстановку (заменить на тот же EVAL - то все отчеты работают). Тут размер файла не влияет на корректность работы отчетов.
...
Рейтинг: 0 / 0
Macro подстановка
    #40137117
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем похоже на это поведение влияет "компилируемая" часть *.prg файла.
Пробовал добавить в него пустые строки или коменты - не повлияло, отчет работал.
Но если добавить внутрь кода 100 строк messagebox("Hello, World!") - появляется ошибка.

Возможно это не ограничение на файл, а на размер процедуры, хз.
...
Рейтинг: 0 / 0
Macro подстановка
    #40137126
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как уже выше написали макроподстановка это очень опасный инструмент и там где можно обойтись без нее лучше ее не использовать. На самом деле очень мало случаев когда она действительно нужна.

Как следствие ее мало используют и мало кто получал ту проблему, которая возникла у тебя.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Macro подстановка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (11): Yandex Bot, Анонимы (8), Google Bot 1 мин., Bing Bot 3 мин.
x
x
Закрыть


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