for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Лисоводы   всех   стран,  объединяйтесь !!!  

Список Форумов  :: Visual Foxpro, Foxpro for DOS
  

как работает Execscript ?
AngelOKES

Сообщений: 797
Дата: 30.09.20 10:34:31
Не могу понять почему данная функция выдаёт ошибку на длинной строке, ведь ограничений нет, виде даже примеры, где очень большие куски коды вставляют и всё работает.
Теперь опишу где и как я её использую.
Есть выборка данных в курсоре, назвал я его 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 символов, то я получаю ошибку, то ли это какое-то ограничение о котором нигде не сказано, либо что-то другое, не могу понять куда копать, не хотелось отказыватся от такого подхода и описывать каждое поле отдельно



Исправлено: AngelOKES, 30.09.20 10:41
Ratings: 0 negative/0 positive

Re: как работает Execscript ?
of63

Сообщений: 19939
Откуда: Н.Новгород
Дата: 30.09.20 10:44:32
Нельзя задавать:
x = 'более_ок_250_символов'
Ratings: 0 negative/0 positive

Re: как работает Execscript ?
AngelOKES

Сообщений: 797
Дата: 30.09.20 10:51:35
Про ограничения вообще нигде ничего не сказано, да и вот пример, где там более 1000 сомволов кидают: fox.wikis.com
Ratings: 0 negative/0 positive

Re: как работает Execscript ?
of63

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

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



Исправлено: of63, 30.09.20 11:08
Ratings: 0 negative/0 positive

Re: как работает Execscript ?
Владимир Максимов

Сообщений: 13866
Откуда: Москва
Дата: 30.09.20 11:12:02
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



Исправлено: Владимир Максимов, 30.09.20 11:32
Ratings: 0 negative/1 positive

Re: как работает Execscript ?
AngelOKES

Сообщений: 797
Дата: 30.09.20 12:20:18
Спасибо за ссылки, понял что мне особо Execscript и не нужен (в конкретном случае) и решил использовать макроподстановку, которая у меня всегда работала и работает замечательно и понял для чего нужен именно Execscript, у меня необходимости в его использовании нет
Ratings: 0 negative/0 positive

Re: как работает Execscript ?
akvvohinc
Автор

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

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

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

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

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

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

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



Исправлено: akvvohinc, 30.09.20 16:53
Ratings: 0 negative/0 positive

Re: как работает Execscript ?
akvvohinc
Автор

Сообщений: 3062
Откуда: Москва
Дата: 30.09.20 17:04:36
Владимир Максимов
Как вариант решения

  
  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



Исправлено: akvvohinc, 01.10.20 08:30
Ratings: 0 negative/0 positive



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

On-line: 6 (Гостей: 6)

30.11.2020 22:30:14 exec: 0.1
Mem: 1.208 Mb

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