:: Visual Foxpro, Foxpro for DOS
как работает Execscript ?
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Не могу понять почему данная функция выдаёт ошибку на длинной строке, ведь ограничений нет, виде даже примеры, где очень большие куски коды вставляют и всё работает.
Теперь опишу где и как я её использую.
Есть выборка данных в курсоре, назвал я его DS2020, в нём есть поля и все они строковые и есть на форме TextBox и EditBox.

With Thisform
For ii=1 To 100
mZn=Allt(Eval(Field(ii,'DS2020')))
Execscript(".t"+Field(ii,'DS2020')+".Value='"+mZn+"'")
Endfor
Endwith

и если значение поля будет более 250 символов, то я получаю ошибку, то ли это какое-то ограничение о котором нигде не сказано, либо что-то другое, не могу понять куда копать, не хотелось отказыватся от такого подхода и описывать каждое поле отдельно



Исправлено 1 раз(а). Последнее : AngelOKES, 30.09.20 10:41
Ratings: 0 negative/0 positive
Re: как работает Execscript ?
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Нельзя задавать:
x = 'более_ок_250_символов'
Ratings: 0 negative/0 positive
Re: как работает Execscript ?
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Про ограничения вообще нигде ничего не сказано, да и вот пример, где там более 1000 сомволов кидают: fox.wikis.com
Ratings: 0 negative/0 positive
Re: как работает Execscript ?
of63

Сообщений: 25254
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Попробуй в командном окне создать строку длиной 300 в одних кавычках - будет "синтакс еррор"
Длинную строку (1000 и более, в разумных пределах) можно задать как сумму строк, каждая длиной менее 250.
Пример по ссылке не читал, там что-то много всего...

Да и .Value может не сьесть длинную строку, смотря чего Value



Исправлено 1 раз(а). Последнее : of63, 30.09.20 11:08
Ratings: 0 negative/0 positive
Re: как работает Execscript ?
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
1. ExecScript() следует воспринимать как запуск независимой процедуры вида do MyProc.prg.

Ну, т.е. вот все то, что указано внутри копируется в отдельный файл PRG, который компилируется, а затем запускается на выполнение. При таком подходе многие вопросы ее использования становятся понятными

2. Ошибка "Слишком много символов..." может быть следствием логической или синтаксической ошибки в сформированной строке. Очень распространенная ошибка при формировании Select-SQL и их выполнении через макроподстановку.

Проверь, какое значение у тебя получилось и можно ли это значение скомпилировать если просто скопировать в PRG?

Возможно, вместо ".t" надо нормально написать "thisform.t" + ...

3. ExecScript() - значительно более "тяжелая" для FoxPro команда, чем "простая" макроподстановка через &. Если здесь формируется только одна команда, а не набор команд, то лучше использовать простую макроподстановку

Если речь идет об операции присвоения, то есть и другие решения

Макроподстановка. Функция GetPem()
Макроподстановка. Формирование команды

PS: Кстати, а значение поля символы кавычки не содержит? Может, в этом проблема?


Как вариант решения

With Thisform
For ii=1 To 100
mZn=Allt(Eval(Field(ii,'DS2020')))
lcName = ".t"+Field(ii,'DS2020')
ThisForm.&lcName..Value= m.mZn
Endfor
Endwith



Исправлено 3 раз(а). Последнее : Владимир Максимов, 30.09.20 11:32
Ratings: 0 negative/1 positive
Re: как работает Execscript ?
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
Спасибо за ссылки, понял что мне особо Execscript и не нужен (в конкретном случае) и решил использовать макроподстановку, которая у меня всегда работала и работает замечательно и понял для чего нужен именно Execscript, у меня необходимости в его использовании нет
Ratings: 0 negative/0 positive
Re: как работает Execscript ?
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
и если значение поля будет более 250 символов, то я получаю ошибку, то ли это какое-то ограничение о котором нигде не сказано

Значение поля подставляется в команду, в которой оно становится строковым литералом, на длину которого есть ограничение в 255 символов.
Можно разделить его на части, не превышающие этого ограничения и сложить их в выражении:
'['+SUBSTR(mZn,1,255)+']+['+SUBSTR(mZn,256)+']'

Но в любом варианте при таком подходе надо гарантировать, чтобы в значении поля не содержались разделители, используемые в команде, будь то одинарные или двойные кавычки, или квадратные скобки.

AngelOKES
Про ограничения вообще нигде ничего не сказано, да и вот пример, где там более 1000 символов кидают: fox.wikis.com

Есть ограничение на размер строковой константы
Maximum length of a string literal - 255

А там, где кидают больше, кидают с помощью выражений, каждая составная часть которых не нарушает озвученное ограничение.

PS
Правда, мне не удалось понять, почему значение value надо получать именно через строковую константу, а не через обычную переменную, для которой такого ограничения нет.



Исправлено 5 раз(а). Последнее : akvvohinc, 30.09.20 16:53
Ratings: 0 negative/0 positive
Re: как работает Execscript ?
akvvohinc
Автор

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Владимир Максимов
Как вариант решения

With Thisform
For ii=1 To 100
mZn=Allt(Eval(Field(ii,'DS2020')))
lcName = ".t"+Field(ii,'DS2020')
ThisForm.&lcName..Value= m.mZn
Endfor
Endwith

Такие выражения вообще не требуют макро, так как для присваивания существует команда STORE:
With Thisform
For ii=1 To 100
fldname = Field(ii,'DS2020')
STORE Allt(Eval(m.fldname)) TO ('.t'+m.fldname+'.Value')
Endfor
Endwith



Исправлено 2 раз(а). Последнее : akvvohinc, 01.10.20 08:30
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 23 Burn  (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика