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

Форма с гридом и кнопками Добавить Изменить Удалить

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
СообщениеПн Янв 27, 2025 17:43    Ответить с цитатой
Полезность: 1
http://cftclub.ru/viewtopic.php?t=4106&highlight=refresh
Gogol
Участник


Вступление в Клуб: 12.04.2021
СообщениеПн Янв 27, 2025 18:56    Ответить с цитатой
Полезность: Нет оценки
Спасибо, помогли
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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