Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странность &Макроподстановок / 25 сообщений из 26, страница 1 из 2
10.07.2013, 13:57
    #38326765
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Есть код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
do while aN<aK
  wh='Dat_pr=aN'
  Count for &wh and a1=1 to v1
  ..............
  Count for &wh and a1=4 to v1
  Scan for &wh
    ..........
    ..........
  Endscan
  Sum Yet for &wh
  ......
  aN=aN+1
enddo


переменные aN и aK даты
так вот этих макроподстановок &wh в этом цикле около 30! всЁ работает.
как только добавляю ещё одну строчку с &wh (Count,Sum,...) код стопорится на строчке Scan for &wh в первой же итерации
пишет Command contains unrecognized phrase/keyword
коментарю любую строку с &wh -все работает.
Кто нибудь, объясните - что за капризы.
...
Рейтинг: 0 / 0
10.07.2013, 14:21
    #38326819
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
обычные проблемы с макроподстановками. За это их и не рекомендуют использовать.
Вышла ошибка - запускай отладчик и смотри что в переменной wh в этот момент. 100% не то что ты ожидаешь.
...
Рейтинг: 0 / 0
10.07.2013, 14:22
    #38326823
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Даже при добавлении любой строчки кода (без &),
даже вне цикла! происходит тот-же стопор !?!
...
Рейтинг: 0 / 0
10.07.2013, 14:28
    #38326831
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Наиболее вероятная причина - переменная wh имеет область видимости PRIVATE или PUBLIC и содержимое меняется где-то в коде вызываемом из этого. Попробуй добавить в начало
Код: sql
1.
LOCAL wh
...
Рейтинг: 0 / 0
10.07.2013, 14:39
    #38326854
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
wh действительно Privat, но переделав на Local результаты теже
конкрето &wh скрывает банальное 'Data_pr=aN'
vartype(aN) = D Пробила через отладчик во время работы кода с ошибкой и без
...
Рейтинг: 0 / 0
10.07.2013, 14:43
    #38326867
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
еще надо что в aN посмотреть. ну и
Код: sql
1.
LOCAL aN
...
Рейтинг: 0 / 0
10.07.2013, 14:45
    #38326872
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Может, всё же вместо макроподстановки использовать EVAL() ?
Попробовать добавить везде алиасы ( wh='table.Dat_pr=m.aN' ) и т.д.?
...
Рейтинг: 0 / 0
10.07.2013, 14:47
    #38326876
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Если не помогло, то надо пример кода с повторением ошибки. Чтобы запустить можно было.
Может правда глюк фокса.
Макроподстановками стараюсь не пользоваться там где можно без них обойтись.
В данном случае вместо макроподстановки можно SET FILTER использовать или сначала выборку в курсор, а потом с курсором работать.
...
Рейтинг: 0 / 0
10.07.2013, 14:50
    #38326881
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
еще перед scan желательно добавить
Код: sql
1.
sele MyTable


а то может где переключилась текущая рабочая область.
...
Рейтинг: 0 / 0
10.07.2013, 14:50
    #38326883
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Local aN тоже пробовала (((
странность в том что первые пару строк с &wh пропускает, а на Scan for &wh - ошибка
и ещё это происходит при добавлении любой строки кода - хоть в цикл, хоть до или после него даже без &wh
...
Рейтинг: 0 / 0
10.07.2013, 15:00
    #38326900
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Работаю с курсором
необходимость работы с &wh вызвана тем, что
'Dat_pr=aN' (конкретный день)
а иногда бывает 'BETW(Dat_pr,aN,GOMO(aN,1)-1)' (это сразу за месяц)
...
Рейтинг: 0 / 0
10.07.2013, 15:13
    #38326925
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
ЛюдмilaРаботаю с курсором
необходимость работы с &wh вызвана тем, что
'Dat_pr=aN' (конкретный день)
а иногда бывает 'BETW(Dat_pr,aN,GOMO(aN,1)-1)' (это сразу за месяц)
что мешает сделать второй курсор?
Код: sql
1.
select * from Cursor1 where Dat_pr=aN into Cursor2


и дальше по Cursor2 без всяких макроподстановок

или хотя бы минимизировать количество макроподстановок
Код: sql
1.
select * from Cursor1 where &wh into Cursor2
...
Рейтинг: 0 / 0
10.07.2013, 15:42
    #38326977
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Dima TВ данном случае вместо макроподстановки можно SET FILTER использовать
Переделала ВСЁ.
В цикле поставила Set Filter To &wh
а со всех СOUNT,SUM... Scan сняла макроподстановки

и всё заработало! даже пошустрее стало.

Но но но - эти непредсказуемые &макроподстановки
на досуге погоняю ещё
...
Рейтинг: 0 / 0
10.07.2013, 16:01
    #38327012
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
По-хорошему в начало ставиться
Код: sql
1.
set step on


и дальше пошагово отладчиком смотреть что происходит.

А "нехорошесть" макроподстановок именно в этом и заключается: как что-нибудь вылезет, так устанешь ошибку искать.
...
Рейтинг: 0 / 0
10.07.2013, 17:22
    #38327139
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
AndreTMМожет, всё же вместо макроподстановки использовать EVAL() ?какой нафиг евал, у неё это часть строки фильтра...
Dima TМакроподстановками стараюсь не пользоваться там где можно без них обойтись.+1
Dima TА "нехорошесть" макроподстановок именно в этом и заключается: как что-нибудь вылезет, так устанешь ошибку искать.+много
ЛюдмilaРаботаю с курсором
необходимость работы с &wh вызвана тем, что
'Dat_pr=aN' (конкретный день)
а иногда бывает 'BETW(Dat_pr,aN,)' (это сразу за месяц)эээ...

Код: sql
1.
2.
dbeg=aN
dend=iif(prevedmedved, aN, GOMO(aN,1)-1)

и потом
Код: sql
1.
BETW(Dat_pr,dbeg,dend) --без всяких там мокропостановок

Не? Или есть ещё некий третий вариант, который в данную схему не впишется?
...
Рейтинг: 0 / 0
10.07.2013, 20:43
    #38327372
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Из хелпа:

Операторы макроподстановки, фигурирующие в командах DO WHILE, FOR и SCAN, вычисляются только в начале цикла и при последующих итерациях не пересчитываются. Любые изменения в переменной памяти или элементе массива, происшедшие за время работы цикла, не распознаются.
...
Рейтинг: 0 / 0
11.07.2013, 02:04
    #38327514
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Странность в том, что всё работало правильно.
wh=iif(Den,'Dat_pr=aN','BETW(Dat_pr,aN,GOMO(aN,1)-1'), в цикле меняется только переменная aN
но про добавлении нескольких строк кода возникала ошибка.
т.е. ~2100 строк (неполенилась-сосчитала) - работает, а при добавлении ещё одной строки (куда угодно), даже типа rr=Recno() уже выдает ошибку. и спотыкается на первом же Scan for &Wh.
Затем убираешь любую - работает.
Данный код выполняет (серьезную) выгрузку данных в EXCEL и вот за 2-3 года разбух до таких размеров, что крышу сносит у компа.
...
Рейтинг: 0 / 0
11.07.2013, 03:40
    #38327526
alextashk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Людмila,

по пробуйте оптимизировать код.
разбить на подпроцедуры
...
Рейтинг: 0 / 0
11.07.2013, 04:46
    #38327533
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Этим и занимаюсь.
Основной код писался года 2-3 назад.
Сейчас с улыбкой правлю свои творения-делитанта
...
Рейтинг: 0 / 0
11.07.2013, 05:22
    #38327537
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Людмila делит антаЛюбите всё удалять? :)
...
Рейтинг: 0 / 0
11.07.2013, 08:22
    #38327582
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
ЛюдмilaСтранность в том, что всё работало правильно.
wh=iif(Den,'Dat_pr=aN','BETW(Dat_pr,aN,GOMO(aN,1)-1'), в цикле меняется только переменная aN
но про добавлении нескольких строк кода возникала ошибка.
т.е. ~2100 строк (неполенилась-сосчитала) - работает, а при добавлении ещё одной строки (куда угодно), даже типа rr=Recno() уже выдает ошибку. и спотыкается на первом же Scan for &Wh.
Затем убираешь любую - работает.
Данный код выполняет (серьезную) выгрузку данных в EXCEL и вот за 2-3 года разбух до таких размеров, что крышу сносит у компа.
Какая у Вас версия FoxPro?

До VFP8 включительно максимальный размер одного скомпилированного программного модуля не может превышать 64Кб. А в версии VFP9 - максимальное количество символов в одном файле не должно превышать 65536 символов

Попробуйте разбить Ваш файл PRG на несколько файлов. Возможно, Вы как раз и вышли на этот предел...
...
Рейтинг: 0 / 0
11.07.2013, 11:05
    #38327817
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
tanglirЛюбите всё удалять? :)
Ну нет! такого за собой не замечала.
А вот оптимизацией занимаюсь частенько. Т.к. время идет - всё меняется. И я стараюсь не отставать. Поэтому код написанный мною ранее кажется мне сейчас "делитанским" - прогрессирую. ;)
==========
Проект написан на FoxPro9.
по поводу ограничений, то всё это "торнадо-безобразие" происходит в событии Form...CommandX.Click
Cлегка оптимизировав код ошибка исчезла. И сам этот модуль меньше не стал! мало того (ради эксперимента) добавила туда с десяток строк - тоже всё работает.

Солидарна с участником Dima_T - использовать макроподстановки с осторожностью (ведь воспользовавшись построчной отладкой ничего выявить не удалось) . И хорошо что выскочила ошибка программы, а еслибы этот глюк приводил к логической ошибке и получали бы мы недостоверные отчеты! типа 2+2=5 и т.д.

а все .prg файлы я тоже проверю они у меня тоже не маленькие.
...
Рейтинг: 0 / 0
11.07.2013, 11:47
    #38327891
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
ЛюдмilatanglirЛюбите всё удалять? :)
Ну нет! такого за собой не замечала.
Это он мягко намекнул на орфографические ошибки. тынц Вроде все браузеры их подчеркивают при наборе текста. Надо просто обращать на это внимание.
Людмilaведь воспользовавшись построчной отладкой ничего выявить не удалось
Вполне возможно вылез какой-то редкий баг в движке фокса. Если так, то только переделать код чтоб работало, MS исправлять не будет.
...
Рейтинг: 0 / 0
11.07.2013, 14:14
    #38328130
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
Dima T

В хелпе же написано, что это не "редкий баг", а так задумано.
Нагнали туману с макроподстановками.
Было же сразу: "код стопорится на строчке Scan for &wh ...".
Внимательнее надо работать с циклами.
...
Рейтинг: 0 / 0
11.07.2013, 16:05
    #38328342
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странность &Макроподстановок
sg12Dima T

В хелпе же написано, что это не "редкий баг", а так задумано.
Нагнали туману с макроподстановками.
Было же сразу: "код стопорится на строчке Scan for &wh ...".
Внимательнее надо работать с циклами.
Вот ты какой-то кусок хэлпа скопипастил, не глядя что он в данном случае вообще ни при чем, а теперь еще чего-то тут доказываешь.
Посмотри на пример из первого поста и перечитай свой копипаст. А потом объясни каким боком он к теме топика относится.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Странность &Макроподстановок / 25 сообщений из 26, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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