CftClub.ru
Клуб специалистов ЦФТ-Банк

Заполнение грид из клиент-скрипта

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
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к на колонку
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах