Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков КРЭКЕРСТВО + ПРОГРАММИРОВАНИЕ 2017
(актуальность: апрель 2017)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Как при выполнении долгой операции в Oracle показать прогресс бар


Автор: Philip A. Milovanov

Погода выполнила недопустимую операцию и завалила Африку снегом...

Ниже приведен пример, как это сделать при помощи Direct Oracle Access, надеюсь этот кусок кода несложно запустить в отдельном процессе, а в другом можно запустить перемесчатель прогресс бара. Есть готовая компонента, могу поделиться.


 //на создании потока вставим то, что будет выбирать необходимую информацию
 
 Self.fods.SQL.Text:='SELECT SOFAR FROM V$SESSION_LONGOPS WHERE CONTEXT=:FK_ID';
 Self.fods.DeclareVariable('FK_ID',otInteger);
 Self.fods.SetVariable('FK_ID',ID);
 
 //На выполнение потока вешаем открытие/закрытие TOracleDataSet
 while (Terminated = false) do
 begin
   Self.fods.Close;
   Self.fods.Open;
   Self.fpb.Progress:=Self.fods.FieldByName('SOFAR').AsInteger;
   //^^^^Эта строчка как раз и устанавливает нужный прогрессбар в нужную позицию...
 end;
 

Ну и соответсвенно перед выполнением всего этого дела необходимо выставить максимальное число (100%):


 procedure SETMaxValue(nVal in NUMBER);
 

Минимальное:


 procedure SETMinValue(nVal in NUMBER);
 

Значение шага:


 procedure SetStepValue(nValue in NUMBER);
 

Вышеприведенный кусок кода - клиентская часть, но есть и "подводный камень" - серверная часть... Данный метотод подкодит только для функций, процедур и пактеов, в которых вы можете написать вставить следущую строчку:


 PROGRESS_BAR.STEPIT;
 

Код пакета PROGRESS_BAR приведен ниже:


 create or replace package PROGRESS_BAR
 is
   -- Wrote by Philip A. Milovanov
   nMaxValue NUMBER:=0;
   nMinValue NUMBER:=0;
   nCurrentValue NUMBER:=0;
   nStepValue NUMBER:=1;
   nID PLS_INTEGER;
   slno PLS_INTEGER;
   target PLS_INTEGER;
   procedure SETMaxValue(nVal in NUMBER);
   procedure SETMinValue(nVal in NUMBER);
   function INIT RETURN NUMBER;
   procedure StepIt;
   procedure SetStepValue(nValue in NUMBER);
   procedure StepIt(C in NUMBER);
 end; -- package Specification PROGRESS_BAR
 
 --Сам пакет:
 Create or Replace package Body PROGRESS_BAR
 is
   -- Wrote by Philip A. Milovanov
   procedure SETMaxValue(nVal in NUMBER) is
   begin
     if nVal<nMinValue then
       RAISE_APPLICATION_ERROR(-20001,'...:'||nMinValue||' ,...:'||nVal);
     end if;
     nMaxValue:=nVal;
   end;
 
   procedure SETMinValue(nVal in NUMBER) is
   begin
     if nVal>nMaxValue then
       RAISE_APPLICATION_ERROR(-20001,'...:'||nVal||' ,...:'||nMaxValue);
     end if;
     nMinValue:=nVal;
   end;
 
   function INIT RETURN NUMBER is
   CURSOR c is SELECT OBJECT_ID FROM ALL_OBJECTS WHERE OBJECT_NAME='PROGRESS_BAR';
   i NUMBER;
   begin
     OPEN c;
     FETCH c INTO target;
     CLOSE c;
     SELECT SEQ_TPROCESS_BAR.NEXTVAL INTO i FROM DUAL;
     nCurrentValue:=nMinValue;
     nID:=DBMS_APPLICATION_INFO.set_session_longops_nohint;
     DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS(nID,slno,
     'CALCULATING REPORT',target,i,nCurrentValue,nMaxValue,'PROGRESS BAR INFO',NULL);
     RETURN i;
   end;
 
   procedure StepIt is
   begin
     nCurrentValue:=nCurrentValue+nStepValue;
     DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS(nID,slno, 'CALCULATING REPORT',
     target,nMinValue,nCurrentValue,nMaxValue,'PROGRESS BAR INFO',NULL);
   end;
 
   procedure SetStepValue(nValue in NUMBER) is
   begin
     nStepValue:=nValue;
   end;
 
   procedure StepIt(C in NUMBER) is
   begin
     nCurrentValue:=nCurrentValue+c;
     DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS (nID,slno,'CALCULATING REPORT',
     target,nMinValue,nCurrentValue,nMaxValue,'PROGRESS BAR INFO',NULL);
   end;
 
 end;
 
 ...
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS