Заполнение грид из клиент-скрипта
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 с длинными наименование), проанализировать и дать возможность пользователю в гриде сделать определенные действия по результатам.
Список файлов с локала берется через КС, затем в нем же заполняется грид и передается в валидатор, где возникает ошибка.
На данный момент ошибку обошел обрабатывая порционно:
Код: |
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
| [/quote] |
|
 |
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к на колонку |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|