IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Forms Oracle Discussion :

Afficher une barre de progression d'une proc stock dans la base appelée par forms


Sujet :

Forms Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut Afficher une barre de progression d'une proc stock dans la base appelée par forms
    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);

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Tout est indiqué dans ce tutoriel.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Merci de votre réponse,

    J'ai mis en place ceci pour tester la procèdure de test mis à diposition dans mon écran forms, ça marché, mais je n'ai pas pu la faire marcher avec ma procèdure qui fait des traitement dml.

    comment je pourrai l appeller dans le code forms tel qu'indiquer dans le tuto

    Citation Envoyé par SheikYerbouti Voir le message
    Tout est indiqué dans ce tutoriel.

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    C'est votre procédure stockée qui gère le pourcentage d'avancement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dbms_application_info.set_session_longops(
           RINDEX      => rindex
          ,SLNO        => slno
          ,OP_NAME     => 'PROGRESS_BAR'
          ,SOFAR       => i
          ,TOTALWORK   => 100
         );
    L'appli Forms lance le job qui exécute cette procédure de façon asynchrone. Donc la forme n'est pas bloquée pendant l'exécution.
    Ensuite, dans la forme, vous interrogez la vue v$session_longops pour connaitre le pourcentage et l'afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- 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;

  5. #5
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    J'ai testé mais je n'arrive pas, ma procèdure je l'appelle comme ceci dans forms, j'ai fait comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Go_item('BLO_PROGRESS.P_TRAITEMENT');
    			curseur_norm;
    				centrer_fen('WINDOWS1');
    				execute_trigger('When-Button-pressed');
    --dans ce trigger j'ai mis le nom de procèdure dans le job comme dans le tuto
     
     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);
    Mais la barre s'affiche à cent pour cent à la fin sans qu'on voit l'état d'avancement.
    Merci de votre aide.



    Citation Envoyé par SheikYerbouti Voir le message
    C'est votre procédure stockée qui gère le pourcentage d'avancement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dbms_application_info.set_session_longops(
           RINDEX      => rindex
          ,SLNO        => slno
          ,OP_NAME     => 'PROGRESS_BAR'
          ,SOFAR       => i
          ,TOTALWORK   => 100
         );
    L'appli Forms lance le job qui exécute cette procédure de façon asynchrone. Donc la forme n'est pas bloquée pendant l'exécution.
    Ensuite, dans la forme, vous interrogez la vue v$session_longops pour connaitre le pourcentage et l'afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- 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;

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Avez-vous seulement testé l'exemple fourni avec l'article ?

    Le pourcentage d'avancement doit être positionné dans la procédure stockée et votre forme doit boucler, comme dans l'exemple, en lisant la variable de session (je ne vois aucune boucle dans votre exemple).
    Tant que vous ne comprendrez pas l'exemple fourni, vous ne parviendrez pas à mettre au point votre propre logique.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Dans mon traitement, dans forms je fais appel à ma procèdure stocké en passant des arguments.
    la procèdure s'appelle : proc_traitement
    dans forms pour appller la procèdure et faire la barre j'ai fais comme ceci et dans le trigger when_button_pressed , c'est là où il y a le traitement d'avancement de la barre, je fais appel à lui comme ça avec la procèdure qui doit être traiter

    le code que j'ai mit dans When-Button-pressed de l'item P_TRAITEMENT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Go_item('BLO_PROGRESS.P_TRAITEMENT');
    			curseur_norm;
    				centrer_fen('WINDOws1');
    				execute_trigger('When-Button-pressed');
     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);
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    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     => ' proc_traitement'
        ,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     => ' proc_traitement'
          ,SOFAR       => i
          ,TOTALWORK   => 100
         );
       End loop;
    End; 
     
    La boucle permet de simuler une procédure d' une minute.
    L'index (SOFAR) est mis à jour environ chaque seconde. 
     
     
    Remarque: Le droit d'exécution du package dbms_lock est attribué par SYS
    sql > grant execute on dbms_lock to nom_user; 
     
     
     
    3. Le code Forms
    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,' proc_traitement',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 => ' proc_traitement'
       ,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 = ' proc_traitement' 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 n'arrive pas à saisir. est ce que je fais appel à la procèdure en mm temps que la barre et comment, le passage des arguments que j'ai dans mon forms dont ma procèdure a besoin pour travailler.

    Merci encore,

    Citation Envoyé par SheikYerbouti Voir le message
    Avez-vous seulement testé l'exemple fourni avec l'article ?

    Le pourcentage d'avancement doit être positionné dans la procédure stockée et votre forme doit boucler, comme dans l'exemple, en lisant la variable de session (je ne vois aucune boucle dans votre exemple).
    Tant que vous ne comprendrez pas l'exemple fourni, vous ne parviendrez pas à mettre au point votre propre logique.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Dans le triger when_button_pressed j'ai mis ceci, j'ai posté le code avec les comm du tuto, ce n'est pas ça mais plutot ça

    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,' proc_traitement',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 => ' proc_traitement'
       ,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 = ' proc_traitement' 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;
    Citation Envoyé par hichcasa Voir le message
    Dans mon traitement, dans forms je fais appel à ma procèdure stocké en passant des arguments.
    la procèdure s'appelle : proc_traitement
    dans forms pour appller la procèdure et faire la barre j'ai fais comme ceci et dans le trigger when_button_pressed , c'est là où il y a le traitement d'avancement de la barre, je fais appel à lui comme ça avec la procèdure qui doit être traiter

    le code que j'ai mit dans When-Button-pressed de l'item P_TRAITEMENT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Go_item('BLO_PROGRESS.P_TRAITEMENT');
    			curseur_norm;
    				centrer_fen('WINDOws1');
    				execute_trigger('When-Button-pressed');
     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);
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    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     => ' proc_traitement'
        ,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     => ' proc_traitement'
          ,SOFAR       => i
          ,TOTALWORK   => 100
         );
       End loop;
    End; 
     
    La boucle permet de simuler une procédure d' une minute.
    L'index (SOFAR) est mis à jour environ chaque seconde. 
     
     
    Remarque: Le droit d'exécution du package dbms_lock est attribué par SYS
    sql > grant execute on dbms_lock to nom_user; 
     
     
     
    3. Le code Forms
    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,' proc_traitement',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 => ' proc_traitement'
       ,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 = ' proc_traitement' 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 n'arrive pas à saisir. est ce que je fais appel à la procèdure en mm temps que la barre et comment, le passage des arguments que j'ai dans mon forms dont ma procèdure a besoin pour travailler.

    Merci encore,

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    la procédure doit être lancée depuis un job, comme indiqué dans l'article. Lisez bien tout.

  10. #10
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    Merci encore, et comme je passe les paramètres avec lesquells la procèdures à besoin. Ces paramètres je les récupère dans des traitement avant dans forms et par la suite je lance la procèdure.
    Les params sont: tmp_nb, tmp_ok,tmp_ko, nb_err,V_typ,V_nug, V_res
    ET avant je lancçais simplement ma procèdure comme ceci:
    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);
    Comment envoyer ces param dans le job en entrée ça je ne sais pas et j'ai jamais fait.
    Merci encore.

    Citation Envoyé par SheikYerbouti Voir le message
    la procédure doit être lancée depuis un job, comme indiqué dans l'article. Lisez bien tout.

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il faut la construire dans une chaîne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Declare
      param1   varchar2(100) ;
      param2   number ;
      v_params varchar2(1000);
    Begin  
      v_params := 'begin ma_procedure(''' || param1 || ''',' || param2 || '); end;' ;
      DBMS_JOB.SUBMIT (v_jobid, v_params);
    End;

  12. #12
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 46
    Points
    46
    Par défaut
    AH ok, et donc je l'appelle plus depuis forms comme ceci:

    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);
    et donc plutot comme vous venez de m'expliquer .Je vais voir ceci

    Citation Envoyé par SheikYerbouti Voir le message
    Il faut la construire dans une chaîne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Declare
      param1   varchar2(100) ;
      param2   number ;
      v_params varchar2(1000);
    Begin  
      v_params := 'begin ma_procedure(''' || param1 || ''',' || param2 || '); end;' ;
      DBMS_JOB.SUBMIT (v_jobid, v_params);
    End;

Discussions similaires

  1. afficher une barre de progression pendant une commande
    Par aaaaadrien dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 26/05/2014, 11h15
  2. Réponses: 3
    Dernier message: 10/10/2013, 11h11
  3. Afficher une partie de texte qui est préalablement stockée dans la base
    Par sooprano dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/02/2010, 20h55
  4. Réponses: 8
    Dernier message: 13/07/2007, 12h19
  5. [VBA-A]paramétrer une barre de progression sur une requête
    Par jeronimo dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/02/2006, 20h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo