| 
 
  
	| Заполнение грид из клиент-скрипта 
 
 |  
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Пн Сен 01, 2025 10:54   Заполнение грид из клиент-скрипта |   |  
				| Полезность: Нет оценки 
 |  
				| Добрый день, 
 Подскажите, пожалуйста, каким образом происходит передача значений грид между клиентским и серверным валидатором?
 
 Опытным путем выяснил, что если сумма длин строк одной колонки > 32 000 символов - навигатор выдает ошибку:
 
 "В настоящий момент операция невозможна:
 Слишком длинное значение параметра или переменной.".
 
 В документации описания не нашел.
 
 UPD. В это же время при заполнении грида из валидатора этими же значениями при подъеме формы - при последующей валидации ошибок не возникает. Но если проапдейтить грид на 32к символов - опять ошибка...
 
 Последний раз редактировалось: AlexanderM (Пн Сен 01, 2025 11:08), всего редактировалось 1 раз
 |  |  
		|  |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Пн Сен 01, 2025 10:56    |   |  
				| Полезность: Нет оценки 
 |  
				| Пример тестовой операции - заполняет на указанное количество строк по 100 символов и вызывает серверную валидацию. Если ввести 320 - ошибка, 310 - всё ок
 
 вложения не добавляются..
 
 Текст КС:
 
  	  | Код: |  	  | Public Function Main(LastControl) If LastControl Is Nothing Then
 ' Действия при загрузке формы
 
 Else
 ' Действия при потере фокуса валидируемого контрола LastControl
 
 End If
 Main = True 'Результат валидатора (True, False, NULL)
 End Function
 
 sub btnGo_OnClick
 call Runtime.ServerValidate(Nothing, "DROP")
 
 for i = 1 to nCnt
 Grid1.AddRow
 Grid1.Text(Grid1.Row, 1) = "ТекствстосимволовТекствстосимволовТекствстосимволовТекствстосимволовТекствстосимволовТекствстосимвол"
 Next
 end sub
 
 sub btnValidate_OnClick
 call Runtime.ServerValidate(Nothing, "Validate")
 end sub
 | 
 
 Текст операции
 
  	  | Код: |  	  | class CLIENT; 
 @name('ABR. TEST') /* Свойство операции "Наименование" */
 static method ROS_TEST is
 
 @name('GRID')
 public V_GRID table of [UNIVERS_GRID];
 @name('V_NUM')
 public V_NUM [NUMBER];
 ROS_TEST
 /* Секция параметров операции *
 (
 @name('пример параметра 1')
 P_EXAMPLE1 in [STRING_100],
 @name('пример параметра 2')
 P_EXAMPLE2 in [NUMBER]
 )
 /* Конец секции параметров операции */
 is
 
 validate is
 /* Секция "Проверка" */
 begin
 if P_MESSAGE = 'DEFAULT' then
 null;
 elsif P_MESSAGe = 'VALIDATE' then
 if P_INFO = 'Validate' then
 
 debug_pipe('validator');
 elsif P_INFO = 'DROP' then
 V_GRID.delete;
 end if;
 end if;
 end;
 
 execute is
 /* Секция "Тело" */
 begin
 null;
 end;
 
 end;
 end; /* конeц static method ROS_TEST */
 
 | 
 
 текст формы
 
 
  	  | Код: |  	  | <?xml version="1.0" encoding="UTF-8"?> <MethodPresentation classId="CLIENT" formatVersion="1.2" shortName="ROS_TEST">
 <Properties>
 <Hotkey>Alt+-</Hotkey>
 <UserDriven>true</UserDriven>
 <ValidateOnLoadForm>ServerClient</ValidateOnLoadForm>
 <ValidateOnLostFocus>ServerClient</ValidateOnLostFocus>
 </Properties>
 <Parameters/>
 <Variables/>
 <Controls>
 <Form>
 <Properties>
 <Caption>ABR. TEST</Caption>
 <Height>401</Height>
 <ValidateName>Form1</ValidateName>
 <Width>304</Width>
 </Properties>
 <Controls>
 <Button>
 <Properties>
 <Caption>OK</Caption>
 <Height>24</Height>
 <Left>8</Left>
 <Qualifier>OK</Qualifier>
 <TabIndex>1</TabIndex>
 <Tips>Выполнить операцию</Tips>
 <Top>368</Top>
 <ValidateName>Ok</ValidateName>
 <Width>140</Width>
 </Properties>
 </Button>
 <Button>
 <Properties>
 <Caption>Отмена</Caption>
 <Height>24</Height>
 <Left>156</Left>
 <Qualifier>CANCEL</Qualifier>
 <TabIndex>2</TabIndex>
 <Tips>Отказ от выполнения</Tips>
 <Top>368</Top>
 <ValidateName>Cancel</ValidateName>
 <Width>140</Width>
 </Properties>
 </Button>
 <Grid>
 <Properties>
 <Caption>GRID</Caption>
 <ClassId>UNIVERS_GRID</ClassId>
 <Height>200</Height>
 <Left>8</Left>
 <Qualifier>%VAR%.V_GRID</Qualifier>
 <TabIndex>0</TabIndex>
 <Tips>Грид: GRID</Tips>
 <Top>164</Top>
 <ValidateName>Grid1</ValidateName>
 <Width>284</Width>
 </Properties>
 <Controls>
 <Gridcol>
 <Properties>
 <Caption>Строка</Caption>
 <ClassId>STRING_32000</ClassId>
 <Qualifier>%VAR%.V_GRID.VAL_STR</Qualifier>
 <Tips>Колонка: Строка</Tips>
 <ValidateName>Gridcol1</ValidateName>
 <Width>136</Width>
 </Properties>
 </Gridcol>
 </Controls>
 </Grid>
 <Button>
 <Properties>
 <Caption>go</Caption>
 <Height>24</Height>
 <Left>148</Left>
 <Qualifier>Кнопка1</Qualifier>
 <TabIndex>0</TabIndex>
 <Tips>Кнопка1</Tips>
 <Top>16</Top>
 <ValidateName>btnGo</ValidateName>
 <Width>140</Width>
 </Properties>
 </Button>
 <Number>
 <Properties>
 <Caption>V_NUM</Caption>
 <ClassId>NUMBER</ClassId>
 <Height>24</Height>
 <Left>4</Left>
 <Qualifier>%VAR%.V_NUM</Qualifier>
 <TabIndex>0</TabIndex>
 <Tips>V_NUM</Tips>
 <Top>16</Top>
 <ValidateName>nCnt</ValidateName>
 <Width>140</Width>
 </Properties>
 </Number>
 <Button>
 <Properties>
 <Caption>Validate</Caption>
 <Height>24</Height>
 <Left>36</Left>
 <Qualifier>Кнопка2</Qualifier>
 <TabIndex>0</TabIndex>
 <Tips>Кнопка2</Tips>
 <Top>72</Top>
 <ValidateName>btnValidate</ValidateName>
 <Width>140</Width>
 </Properties>
 </Button>
 </Controls>
 </Form>
 </Controls>
 </MethodPresentation>
 [quote][/quote]
 | 
 |  |  
		|  |  
		| Volod Эксперт
 
 
 Вступление в Клуб: 19.09.2007
 
 | 
			
				|  Пн Сен 01, 2025 13:53    |   |  
				| Полезность: Нет оценки 
 |  
				| @name('Строка')        VAL_STR     [STRING_32000]; |  |  
		|  |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Пн Сен 01, 2025 15:28    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Volod пишет: |  	  | @name('Строка')        VAL_STR     [STRING_32000]; | 
 
 Не понял, причем тут новая переменная? Я про передачу значений грида между Клиент-Сервер.
 |  |  
		|  |  
		| Volod Эксперт
 
 
 Вступление в Клуб: 19.09.2007
 
 | 
			
				|  Пн Сен 01, 2025 15:44    |   |  
				| Полезность: Нет оценки 
 |  
				| посмотрите структуру public V_GRID table of [UNIVERS_GRID]; |  |  
		|  |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Пн Сен 01, 2025 15:46    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Volod пишет: |  	  | посмотрите структуру public V_GRID table of [UNIVERS_GRID]; | 
 
 Так у меня каждая строка грида в 100 символов (размер поля структуры 32000), если строк создано через КС > 320 - падает с ошибкой.
 
 Такое ощущение что все добавления / изменения по строкам одного столбца собираются в одну переменную размерностью 32 000 и передаются Навигатором в серверный валидатор.
 |  |  
		|  |  
		| pabrz Участник со стажем
 
 
 Вступление в Клуб: 27.09.2022
 
 | 
			
				|  Вт Сен 02, 2025 01:29    |   |  
				| Полезность: Нет оценки 
 |  
				| Добрый день. 
 Капец вы конечно сложными путями ходите.
 Если вы просто с данными работаете, вам вообще vbscript не нужен.
 Это сразу в коде делается, и с гридом работаете, как с обычной коллекцией, которым он и является по сути своей.
 Все возможные ограничения грида начинаются с типов данных его структуры, и ими же заканчиваются.
 
 Что до скрипта, то Вам скрипт понадобится только при условии, что вы там раскрасок красивых завезти решите, или что-то типа. Для работы с данными грида он вообще не нужен.
 
 Типовое заполнение грида:
 
 
  	  | Код: |  	  | ТИПА_ОПЕРАЦИЯ (
 @name('Сетка')           ТИПА_ГРИД       in table of [ТИПА_СТРУКТУРА_ДЛЯ_ГРИДА_GR],
 @name('Дата 1')          ДОПУСТИМ_ДАТА in          [DATE],
 @name('Время начала')    ДОПУСТИМ_ВРЕМЯ_1   in          [ТИПА_СТРОКА],
 @name('Время окончания') ДОПУСТИМ_ВРЕМЯ_2   in          [ТИПА_СТРОКА]
 ) is
 
 validate is
 
 procedure generate is
 x number;
 base ref [ТИПА_СТРУКТУРА_ДЛЯ_ГРИДА];
 begin
 ДОПУСТИМ_ДАТА:=trunc(ДОПУСТИМ_ДАТА,'MM');
 ДОПУСТИМ_ВРЕМЯ_1:='083000';
 ДОПУСТИМ_ВРЕМЯ_2:='173000';
 ТИПА_ГРИД.delete;
 for z in 0..(last_day(trunc(ДОПУСТИМ_ДАТА))-trunc(ДОПУСТИМ_ДАТА)) loop
 x:=z+1;
 begin
 base:=this.[PRIV_CORRECTIVE](trunc([ДАТА_1])=trunc(ДОПУСТИМ_ДАТА+z));
 ТИПА_ГРИД(x).[ДАТА_1]:=base.[ДАТА_1];
 ТИПА_ГРИД(x).[ДАТА_2]:=base.[ДАТА_2];
 ТИПА_ГРИД(x).[ТИПА_ВРЕМЯ_1]:=to_char(ТИПА_ГРИД(x).[ДАТА_1],'HH24MISS');
 ТИПА_ГРИД(x).[ТИПА_ВРЕМЯ_2]:=to_char(ТИПА_ГРИД(x).[ДАТА_2],'HH24MISS');
 ТИПА_ГРИД(x).[ДЕНЬ_Д_ЧАС_Ч]:=to_char(ТИПА_ГРИД(x).[ДАТА_1],'DD/MM/YYYY');
 ТИПА_ГРИД(x).[ДОПУСТИМ_СТРОКА]:=nvl(base.[ДОПУСТИМ_СТРОКА],rec_loaded);
 ТИПА_ГРИД(x).[ДОПУСТИМ_КАКОЙ_ТО_РЕКВИЗИТ]:=base.[ДОПУСТИМ_КАКОЙ_ТО_РЕКВИЗИТ];
 ТИПА_ГРИД(x).[ДОПУСТИМ_ЕЩЕ_КАКОЙ_ТО_РЕКВИЗИТ]:=base.[ДОПУСТИМ_ЕЩЕ_КАКОЙ_ТО_РЕКВИЗИТ];
 exception when others then
 ТИПА_ГРИД(x).[ДАТА_1]:=to_date(to_char(ДОПУСТИМ_ДАТА+z,'DD/MM/YYYY')||' '||ДОПУСТИМ_ВРЕМЯ_1,'DD/MM/YYYY HH24:MI:SS');
 ТИПА_ГРИД(x).[ДАТА_2]:=to_date(to_char(ДОПУСТИМ_ДАТА+z,'DD/MM/YYYY')||' '||ДОПУСТИМ_ВРЕМЯ_2,'DD/MM/YYYY HH24:MI:SS');
 ТИПА_ГРИД(x).[ТИПА_ВРЕМЯ_1]:=to_char(ТИПА_ГРИД(x).[ДАТА_1],'HH24MISS');
 ТИПА_ГРИД(x).[ТИПА_ВРЕМЯ_2]:=to_char(ТИПА_ГРИД(x).[ДАТА_2],'HH24MISS');
 ТИПА_ГРИД(x).[ДЕНЬ_Д_ЧАС_Ч]:=to_char(ТИПА_ГРИД(x).[ДАТА_1],'DD/MM/YYYY');
 ТИПА_ГРИД(x).[ДОПУСТИМ_СТРОКА]:=rec_generated;
 ТИПА_ГРИД(x).[ДОПУСТИМ_ЕЩЕ_КАКОЙ_ТО_РЕКВИЗИТ]:=::[RUNTIME].[CALENDAR].Check_Date('HOLIDAYS',trunc(ДОПУСТИМ_ДАТА+z));
 end;
 ТИПА_ГРИД(x).[ДОПУСТИМ_КАЛЕНДАРИК]:=::[RUNTIME].[CALENDAR].Check_Date('HOLIDAYS',trunc(ДОПУСТИМ_ДАТА+z));
 if ТИПА_ГРИД(x).[ДОПУСТИМ_КАЛЕНДАРИК] then
 [CSMD].Command(V_VB, 'grid1.CellBackColor('||x||',0,'||x||',Grid1.Cols-1) = &h00C0C0C0');
 end if;
 if not(ТИПА_ГРИД(x).[ДОПУСТИМ_КАЛЕНДАРИК]) and ТИПА_ГРИД(x).[ДОПУСТИМ_ЕЩЕ_КАКОЙ_ТО_РЕКВИЗИТ] then
 [CSMD].Command(V_VB, 'grid1.CellBackColor('||x||',0,'||x||',Grid1.Cols-1) = &h0080FF80');
 end if;
 if ТИПА_ГРИД(x).[ДОПУСТИМ_КАЛЕНДАРИК] and not(ТИПА_ГРИД(x).[ДОПУСТИМ_ЕЩЕ_КАКОЙ_ТО_РЕКВИЗИТ]) then
 [CSMD].Command(V_VB, 'grid1.CellBackColor('||x||',0,'||x||',Grid1.Cols-1) = &h008080FF');
 end if;
 end loop;
 end;
 
 etc...
 
 | 
 |  |  
		|  |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Вт Сен 02, 2025 09:41    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | pabrz пишет: |  	  | Добрый день. 
 | 
 
 Добрый день,
 Я понимаю как правильно использовать, я не понимаю какие ограничения существуют т.к не могу найти в документации.
 
 У меня задача загрузить с локального диска список файлов (их может быть более 1000 с длинными наименование), проанализировать и дать возможность пользователю в гриде сделать определенные действия по результатам.
 Список файлов с локала берется через КС, затем в нем же заполняется грид и передается в валидатор, где возникает ошибка.
 На данный момент ошибку обошел обрабатывая порционно:
 
 
 [/quote] 	  | Код: |  	  | For Each File In Folder.Files
 V_FILENAME = File.Name
 
 Grid2.AddRow
 Grid2.Text(Grid2.Row, 1) = V_FILENAME
 
 if sum + len(V_FILENAME) > 30000 then
 call Runtime.ServerValidate(Nothing, "ANALYZE")
 sum = 0
 else
 sum = sum + len(V_FILENAME)
 end if
 Next
 
 if sum > 0 then
 call Runtime.ServerValidate(Nothing, "ANALYZE")
 end if
 
 | 
 |  |  
		|  |  
		| Volod Эксперт
 
 
 Вступление в Клуб: 19.09.2007
 
 | 
			
				|  Вт Сен 02, 2025 10:55    |   |  
				| Полезность: Нет оценки 
 |  
				| У меня ошибка не повторяется, заполнил в проверке в одну колонку grid  несколько строк по 30к , в скрипте добавил строку с текстом. Единственная проблема - зависает навигатор с таким заполнением грида. |  |  
		|  |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Вт Сен 02, 2025 11:50    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Volod пишет: |  	  | У меня ошибка не повторяется, заполнил в проверке в одну колонку grid  несколько строк по 30к , в скрипте добавил строку с текстом. Единственная проблема - зависает навигатор с таким заполнением грида. | 
 
 Нужно в скрипте добавить на 30к символов, чтобы передалось из КС в валидатор. В вашем случае всё ок работает, это я тоже протестировал.
 |  |  
		|  |  
		| Volod Эксперт
 
 
 Вступление в Клуб: 19.09.2007
 
 | 
			
				|  Вт Сен 02, 2025 12:19    |   |  
				| Полезность: Нет оценки 
 |  
				| Повторил такую ошибку, т.е. заполнение grid из скрипта с ограничениями 32к на колонку |  |  
		|  |  
		| pabrz Участник со стажем
 
 
 Вступление в Клуб: 27.09.2022
 
 | 
			
				|  Ср Сен 03, 2025 05:47    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | AlexanderM пишет: |  	  | Добрый день. У меня задача загрузить с локального диска список файлов (их может быть более 1000 с длинными наименование), проанализировать и дать возможность пользователю в гриде сделать определенные действия по результатам.
 Список файлов с локала берется через КС, затем в нем же заполняется грид и передается в валидатор, где возникает ошибка.
 На данный момент ошибку обошел обрабатывая порционно:
 
 | 
 
 Не вполне понял. Если из директории читаете, то чем stdio не устроил. Для этого скрипт тоже не нужен.
 |  |  
		|  |  
		| AlexanderM Участник
 
 
 Вступление в Клуб: 30.05.2023
 
 | 
			
				|  Ср Сен 03, 2025 10:55    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | pabrz пишет: |  	  |  	  | AlexanderM пишет: |  	  | Добрый день. У меня задача загрузить с локального диска список файлов (их может быть более 1000 с длинными наименование), проанализировать и дать возможность пользователю в гриде сделать определенные действия по результатам.
 Список файлов с локала берется через КС, затем в нем же заполняется грид и передается в валидатор, где возникает ошибка.
 На данный момент ошибку обошел обрабатывая порционно:
 
 | 
 
 Не вполне понял. Если из директории читаете, то чем stdio не устроил. Для этого скрипт тоже не нужен.
 | 
 Ну, тоже верно, просто изначальная реализация такая. В ходе работы столкнулся с ограничениями и не понял причин, и в документации не нашел какого-либо описания как Навигатор управляет валидаторами, передает переменные и тд.
 |  |  
		|  |  
		| pabrz Участник со стажем
 
 
 Вступление в Клуб: 27.09.2022
 
 | 
			
				|  Чт Сен 04, 2025 03:02    |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | AlexanderM пишет: |  	  | Ну, тоже верно, просто изначальная реализация такая. В ходе работы столкнулся с ограничениями и не понял причин, и в документации не нашел какого-либо описания как Навигатор управляет валидаторами, передает переменные и тд.
 | 
 
 Я немного потерзал нейронку в плане подробной информации (в документации ЦФТ о скриптах такой информации нет).
 Прямого подтверждения нет, но есть отсылка на то, что в, batch-операциях можно наткнуться на ограничения самого компонента грида и его реализации или органичения objectdatasource.
 Т.е. это не ограничение самого vbscript. Есть, например, нечто подобное в activex компоненте vsflexgrid, но прямых указаний на такие ограничения я не увидел.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |