Форма с гридом и кнопками Добавить Изменить Удалить
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Gogol Участник
Вступление в Клуб: 12.04.2021
|
Пн Янв 27, 2025 16:03  Форма с гридом и кнопками Добавить Изменить Удалить |
|
Полезность: Нет оценки
|
Добрый день!
Сделал форму с гридом и кнопками Добавить Изменить Удалить.
По кнопке запускаю операции через plpcalc операции [NEW_AUTO], [NEW_EDIT] (по факту - [NEW_AUTO]) и [DELETE_AUTO].
Которые физически создают/меняют/удаляют записи в справочнике [MY_SCHED]. После возврата на форму делаю рефреш через заполнение структуры глобальной переменной - грида по записям справочника.
При этом добавление и удаление записей корректно отображаеться после обновления, а изменение нет. Но если закрыть форму грида и заново открыть все изменения отобразятся.
глобальные переменные
Код: |
@name('Таблица графика) public V_SCHED_TBL table of [MY_SCHED];
@name('скрипт') public V_DEST_STR [STRING_32000];
@name('График объект') public V_SCHED [MY_SCHED];
@name('График ссылка') public V_REF_SCHED [MY_SCHED_REF];
|
Обработка кнопок в validate
Код: |
validate is
i integer;
begin
&log('['||&METHOD$CLASS||'].['||&METHOD$NAME||'].validate --->');
if P_MESSAGE = 'DEFAULT' then
[CSMD].Init_Form(V_DEST_STR, &METHOD$CLASS, &METHOD$SNAME); -- Инициализация формы
refresh_grid(this);
elsif P_MESSAGE = 'VALIDATE' then
&log(' P_INFO:'||P_INFO);
if P_INFO = 'Add_ind' then
V_REF_SCHED := null;
V_SCHED := null;
V_SCHED.[DATE_BEGIN_PLAN] := trunc(sysdate);
V_SCHED.[DATE_END] := null;
stdio.put_line_buf('<% PLPCALL
[MY_SCHED].[NEW_AUTO_IT](
P_OBJ=>'''||THIS%id||'''
,P_DATE_BEGIN_PLAN=>%VAR%.V_SCHED.[DATE_BEGIN_PLAN]
,P_DATE_END => %VAR%.V_SCHED.[DATE_END]
) %>'
);
refresh_grid(this);
elsif P_INFO like '_ROW%' then
l_row := to_number(substr(P_INFO, 5));
if V_SCHED_TBL.exists(l_row) then
V_SCHED := V_SCHED_TBL(l_row);
end if;
elsif P_INFO = 'ADD_ROW' then
if V_RESULT = 'OK' then
null;
else
if V_SCHED_TBL.exists(l_row) then
V_SCHED := V_SCHED_TBL(l_row);
refresh_grid(this);
end if;
end if;
elsif P_INFO = 'Edit_ind' then
if l_row >0 then
if not V_SCHED_TBL.exists(l_row) then
l_row := V_SCHED_TBL.next(l_row);
while (not l_row is null) loop
if V_SCHED_TBL.exists(l_row) then
exit;
end if;
l_row := V_SCHED_TBL.next(l_row);
end loop;
end if;
if V_SCHED_TBL.exists(l_row) then
V_SCHED := V_SCHED_TBL(l_row);
V_REF_SCHED := V_SCHED%id;
&log('Редактируем график V_REF_SCHED = "'||V_REF_SCHED||'"');
stdio.put_line_buf('<% PLPCALL %VAR%.V_REF_SCHED.[EDIT_AUTO](P_OBJ =>''' || this%id ||''') %>');
refresh_grid(this);
end if;
end if;
elsif P_INFO = 'EDIT_ROW' then
if V_RESULT = 'OK' then
i := 0;
if i = 0 then
i := V_SCHED_TBL.count+1;
end if;
V_SCHED_TBL(i) := V_SCHED;
&log(' VALIDATE: Изменение');
end if;
elsif P_INFO = 'Del_ind' then
&log(' Del_ind('||l_row||')');
if l_row >0 then
if not V_SCHED_TBL.exists(l_row) then
l_row := V_SCHED_TBL.next(l_row);
while (not l_row is null) loop
if V_SCHED_TBL.exists(l_row) then
exit;
end if;
l_row := V_SCHED_TBL.next(l_row);
end loop;
end if;
if V_SCHED_TBL.exists(l_row) then
V_SCHED := V_SCHED_TBL(l_row);
V_REF_SCHED := V_SCHED%id;
&log('Удаляем график '||l_row||'-"'||V_REF_SCHED||'"');
V_REF_SCHED.[DELETE_AUTO];
refresh_grid(this);
end if;
end if;
elsif P_INFO = 'btRefresh' then
&log(' Refresh');
-- commit;
refresh_grid(this);
end if;
end if;
&log('['||&METHOD$CLASS||'].['||&METHOD$NAME||'].validate ---<');
end;
end;
|
обновление грида
Код: |
procedure refresh_grid(
p_ref_obj ref [MY_OBJ]
)
is
i integer;
begin
&log(' Refresh +');
V_SCHED_TBL.delete;
for (
select msc(msc : msc)
in ::[MY_SCHED]
where msc.[OBJ] = p_ref_obj%id
order by msc.[DATE_BEGIN_PLAN]
)
loop
i := V_SCHED_TBL.count+1;
V_SCHED_TBL(i) := msc.msc; --%rowtype;
end loop;
end;
|
Как добится обновление грида и при изменении? |
|
 |
Volod Эксперт
Вступление в Клуб: 19.09.2007
|
|
 |
Gogol Участник
Вступление в Клуб: 12.04.2021
|
Пн Янв 27, 2025 18:56   |
|
Полезность: Нет оценки
|
Спасибо, помогли |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|