Bonjour, j'ai des procédures stockées dans la base dont je fais appel dans des écrans forms en passant les arguments d'entrés. Je souhaite suivre en l'acomplissement de la tâche de la procèdure en mettant une barre de progression. J'ai trouvé cette procédure de test qu'on stock dans la base pour tester le code forms.

Voici la procèdure test qui a été faite:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
create or replace procedure Progress_Bar 
As
   rindex pls_integer := -1;
   slno   pls_integer;
Begin
  -----------------------------------------------------
  --  procedure that does nothing else than waiting  --
  --  to illustrate the ProgressBar Forms sample     --
  -----------------------------------------------------
   dbms_application_info.set_session_longops(
     RINDEX      => rindex
    ,SLNO        => slno
    ,OP_NAME     => 'PROGRESS_BAR'
    ,SOFAR       => 0
    ,TOTALWORK   => 100
   );
   --  simulating the task progress  --
   For i IN 1..100 loop
     DBMS_LOCK.SLEEP(.3);
     dbms_application_info.set_session_longops(
       RINDEX      => rindex
      ,SLNO        => slno
      ,OP_NAME     => 'PROGRESS_BAR'
      ,SOFAR       => i
      ,TOTALWORK   => 100
     );
   End loop;
End;
Voici le code forms qui fait appel à cette procédure stocké ci-dessus.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Declare
  v_jobname  Varchar2(30) := 'PROGRESS_BAR_JOB' ;
  v_jobid    Number := 12345 ;
  v_percent  Number :=  0 ;
  v_end      Exception ;
  v_version  Number := 9 ;
  v_nb       Pls_integer ;
  v_pass     Pls_integer := 0 ;	
begin 
  -- Lancement de la procédure par le package dbms_job pour la version 9i --
  If v_version = 9 Then
    dbms_job.isubmit(v_jobid,'Progress_Bar;',sysdate,null);
    forms_ddl('commit') ;
  Else
  -- Lancement de la procédure par le package dbms_scheduler pour la version 10g --
  dbms_scheduler.create_job(
    job_name   => v_jobname
   ,job_type   => 'stored_procedure'
   ,job_action => 'Progress_Bar'
   ,start_date => SYSDATE
   ,enabled    => TRUE
  );
  End if ;
 
  -- le job tourne ? --
  Loop 
     If v_version = 9 Then
       Select count(job)
       Into   v_nb 
       From   user_jobs
       Where  job= v_jobid 
       And    total_time!=0;
     Else
       Select count(*) 
       Into   v_nb 
       From   USER_SCHEDULER_JOBS 
       Where  JOB_NAME = v_jobname;
     End if ;
 
     v_pass := v_pass + 1 ;
     If v_pass > 100 Then
     	  -- le job ne se lance pas --
     	  message('Problème de lancement du job',acknowledge);
     	  Raise Form_Trigger_Failure ;
     End if ;
     exit when v_nb > 0  ;
     dbms_lock.sleep(.2);
  End loop ;
 
  set_item_property('blo_progress.progressbar', width, 0);
  v_percent :=0;
 
  -- pour suivre la progression de l'éxecution de procedure --
  Loop    
 
      Exit when v_percent >= 100;
      Select  (sofar / totalwork) * 100
      Into    v_percent
      From    v$session_longops
      Where   opname = 'PROGRESS_BAR' and sofar < totalwork;
 
      :blo_progress.progressbar:= v_percent||'%';
      set_item_property('blo_progress.progressbar',width, round( v_percent*2,2));
      synchronize;
 
  End loop;
 
  raise v_end ;
 
Exception
   When NO_DATA_FOUND then
      set_item_property('blo_progress.progressbar', width, 200);
      :blo_progress.progressbar:= '100%';
      raise v_end ;
   When TOO_MANY_ROWS then
      raise v_end ;
   When v_end then
      If v_version = 10 Then
        DBMS_SCHEDULER.drop_job (job_name => v_jobname,FORCE=> true) ;   
      End if ;
   When Others then
      If v_version = 10 Then
        DBMS_SCHEDULER.drop_job (job_name => v_jobname,FORCE=> true) ;   
      End if ;
End;
Je fais apppel à ma procédure stocké à partir de forms comme ci-dessous en passant mes paramètres.

Est ce que vous pouvez me dire comment exploiter le job du code ci-dessous pour afficher la barre, et comment passer les paramètres, merci de votre aide


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 proc_traitement(
	  				v_nb				=>		tmp_nb,
	  				v_ok				=>   tmp_ok,
	  				v_ko				=>    tmp_ko,
	  				v_err				=>    nb_err,
						po_typ		=>  	V_typ,
						po_nug		=>	V_nug,
						po_res	=>	V_res);