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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    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 confirmé
    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
    Par défaut
    Tout est indiqué dans ce tutoriel.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    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 confirmé
    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
    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 confirmé
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    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 confirmé
    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
    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.

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