+ Répondre à la discussion
Page 3 sur 3 PremièrePremière 123
Affichage des résultats 41 à 51 sur 51
  1. #41
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    juin 2003
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : juin 2003
    Messages : 984
    Points : 1 330
    Points
    1 330

    Par défaut

    Ph. B. a parfaitement raison
    Si la requête ne renvoie rien, l'intérieur du BEGIN...END ne sera pas executé.
    S'il y a une volonté de faire quelque chose, il est, par exemple, possible de passer par un EXISTS préliminaire

    Code :
    1
    2
    3
    4
    5
    6
    7
    IF (EXISTS(select ....)) THEN
    Begin
       -- Faire la procédure qui propose des infos
    End ELSE
    Begin
       -- Faire qq chose quand la requête ne sort rien
    END

  2. #42
    Membre Expert
    Homme Profil pro
    Inscrit en
    mai 2008
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 135
    Points : 2 136
    Points
    2 136

    Par défaut

    @Ph. B. : là je comprends mieux je vais recourir à l'alternative proposée par olivier.
    @dehorter olivier : merci pour l'astuce.

    En route pour les corrections
    Bon courage ou Bonne Chance (selon le contexte)

  3. #43
    Membre Expert
    Homme Profil pro
    Inscrit en
    mai 2008
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 135
    Points : 2 136
    Points
    2 136

    Par défaut

    Bonjour Ph. B.

    je viens de tenter ce bout de code mais j'ai eu en retour une erreur à l'exécution :
    Code :
    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
    STEP_ = '';
       NBR_ = 0;
       RATIO_ = -1;
       NUM = 1;
       LIGNE = LIGNE || ascii_char(13) || ascii_char(10);
       LIGNE = LIGNE || 'III - ANALYSE DES DEPASSEMENTS PMA / PMD'
                     || ascii_char(13) || ascii_char(10);
       FOR
        -- je crois pas que c'est le bon emplacement du if car il bloque sur cette ligne
           IF (EXISTS(SELECT NOM_STEP,
                  count(NBR_DEP),
                  max(PMD)
     
           FROM "[8]PS_DEPASS_PMAPMD"(:DATE_DEBUT, :DATE_FIN)
     
           WHERE (NOM_STEP like upper(:N_STEP))
     
           GROUP BY NOM_STEP
     
           INTO :STEP_,
                :NBR_,
                :RATIO_
             )) THEN
       DO BEGIN
            if (NBR_ = 0) then
                LIGNE = LIGNE || LPAD(' ',4, ' ')
                        || 'Cette STEP n''enregistre aucun dépassement de la PMD. ';
            else
            LIGNE = LIGNE || LPAD(' ',4, ' ') || 'PMD (kw): '
                          || coalesce(cast(ratio_ as integer), ' ')
                          || ascii_char(13) || ascii_char(10)
                          || LPAD(' ',4, ' ') || 'Dépassement en PMA '
                          || coalesce(NBR_,'') || ' fois '
                          || 'du ' || :date_debut || ' au ' || :date_fin
                          || ascii_char(13) || ascii_char(10);
       END
    Bon courage ou Bonne Chance (selon le contexte)

  4. #44
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    juin 2003
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : juin 2003
    Messages : 984
    Points : 1 330
    Points
    1 330

    Par défaut

    regardes bien le schéma
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IF (EXISTS(SELECT ....)) THEN
    Begin
       -- Faire la procédure qui propose des infos
        FOR 
           SELECT ....   -- rajouter pour etre plus clair !
        Begin
     
        End   
    End ELSE
    Begin
       -- Faire qq chose quand la requête ne sort rien
    END

  5. #45
    Membre Expert
    Homme Profil pro
    Inscrit en
    mai 2008
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 135
    Points : 2 136
    Points
    2 136

    Par défaut

    Voici le code à quoi il ressemble :
    Code :
    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
    /******* Analyse des dépassements  ***************/
       STEP_ = '';
       NBR_ = 0;
       RATIO_ = -1;
       NUM = 1;
       LIGNE = LIGNE || ascii_char(13) || ascii_char(10);
       LIGNE = LIGNE || 'III - ANALYSE DES DEPASSEMENTS PMA / PMD'
                     || ascii_char(13) || ascii_char(10);
     
       IF (EXISTS(SELECT * FROM
            "[8]PS_ANALYSE_COS_PHI_DRAIDJ"(:DATE_DEBUT, :DATE_FIN))) THEN
     
       BEGIN
         FOR
           SELECT NOM_STEP,
                  count(NBR_DEP),
                  max(PMD)
     
           FROM "[8]PS_DEPASS_PMAPMD"(:DATE_DEBUT, :DATE_FIN)
     
           WHERE (NOM_STEP like upper(:N_STEP))
     
           GROUP BY NOM_STEP
     
           INTO :STEP_,
                :NBR_,
                :RATIO_
     
        DO BEGIN
            LIGNE = LIGNE || LPAD(' ',4, ' ') || 'PMD (kw): '
                          || coalesce(cast(ratio_ as integer), ' ')
                          || ascii_char(13) || ascii_char(10)
                          || LPAD(' ',4, ' ') || 'Dépassement en PMA '
                          || coalesce(NBR_,'') || ' fois '
                          || 'du ' || :date_debut || ' au ' || :date_fin
                          || ascii_char(13) || ascii_char(10);
        END
       END
       ELSE
            LIGNE = LIGNE || LPAD(' ',4, ' ')
                        || 'Cette STEP n''enregistre aucun dépassement de la PMD. ';
    Pour être sûr, j'ai exécuté la PS "[8]PS_DEPASS_PMAPMD" toute seule dont le but de lui passer des arguments qui ne donneront pas de lignes. Mais quand je l'exécute dans ce bout de programme le else n'est jamais parcouru bien que le résultat soit nul !!!

    où peut bien être le problème ?
    Bon courage ou Bonne Chance (selon le contexte)

  6. #46
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    juin 2003
    Messages
    984
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : juin 2003
    Messages : 984
    Points : 1 330
    Points
    1 330

    Par défaut

    il faut que la requête dans le EXISTS doit renvoyer les mêmes infos...
    Donc où est la clause WHERE dans le EXISTS ????

  7. #47
    Membre Expert
    Homme Profil pro
    Inscrit en
    mai 2008
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 135
    Points : 2 136
    Points
    2 136

    Par défaut

    Citation Envoyé par dehorter olivier Voir le message
    il faut que la requête dans le EXISTS doit renvoyer les mêmes infos...
    Donc où est la clause WHERE dans le EXISTS ????
    Merci olivier ... bien vue de votre part je viens de corriger.
    mais coté logique tout ça reste floue ! à quoi bon refaire le même code si on pouvait p.e faire un simple teste dans le begin .. end du do, ce qui a comme conséquence directe d'éliminer une bonne partie du code et un gain de temps appréciable même si les autres diront que les machines d'aujourd'hui sont super puissant !!!

    pour ma part, je vois pas trop pourquoi toute cette gymnastique le mieux aurait été quelque chose du genre :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    BEGIN
         FOR
           SELECT * FROM VotrePS(:arg1, :arg2, ... , :argn)
     
           WHERE (votre_filtre)
     
           GROUP BY votre_champs
     
           INTO :var1,
                :var2,
                :varn
     
        DO BEGIN
          if (nbr_enregistrements <> 0) then 
                     Traitement_1
         else Traitement_2
        END
    merci encore olivier.
    Bon courage ou Bonne Chance (selon le contexte)

  8. #48
    Expert Confirmé

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 317
    Points : 3 566
    Points
    3 566
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  9. #49
    Membre Expert
    Homme Profil pro
    Inscrit en
    mai 2008
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 135
    Points : 2 136
    Points
    2 136

    Par défaut

    Citation Envoyé par makowski Voir le message
    une belle solution mais pas dans mon cas ... hélas
    voilà ce qui es écrit dans l'aide en ligne Firebird.

    Note

    ROW_COUNT cannot be used to determine the number of rows affected by an EXECUTE STATEMENT or EXECUTE PROCEDURE command.
    Bon courage ou Bonne Chance (selon le contexte)

  10. #50
    Expert Confirmé Sénior
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    avril 2002
    Messages
    1 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 367
    Points : 4 056
    Points
    4 056

    Par défaut

    Bonjour,
    Citation Envoyé par Just-Soft Voir le message
    une belle solution mais pas dans mon cas ...
    Relecture de la même doc :
    In a FOR SELECT loop, ROW_COUNT is incremented with every iteration (starting at 0 before the first).
    Implémentation dans votre code (instruction en vert):
    Code sql :
    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
    /******* Analyse des dépassements  ***************/
       STEP_ = '';
       NBR_ = 0;
       RATIO_ = -1;
       NUM = 1;
       LIGNE = LIGNE || ascii_char(13) || ascii_char(10);
       LIGNE = LIGNE || 'III - ANALYSE DES DEPASSEMENTS PMA / PMD'
                     || ascii_char(13) || ascii_char(10);
     
       FOR
         SELECT NOM_STEP,
                count(NBR_DEP),
                max(PMD)
     
         FROM "[8]PS_DEPASS_PMAPMD"(:DATE_DEBUT, :DATE_FIN)
     
         WHERE (NOM_STEP LIKE upper(:N_STEP))
     
         GROUP BY NOM_STEP
     
         INTO :STEP_,
              :NBR_,
              :RATIO_
     
      DO BEGIN
          LIGNE = LIGNE || LPAD(' ',4, ' ') || 'PMD (kw): '
                        || coalesce(cast(ratio_ AS integer), ' ')
                        || ascii_char(13) || ascii_char(10)
                        || LPAD(' ',4, ' ') || 'Dépassement en PMA '
                        || coalesce(NBR_,'') || ' fois '
                        || 'du ' || :date_debut || ' au ' || :date_fin
                        || ascii_char(13) || ascii_char(10);
      END
      IF (ROW_COUNT = 0) THEN
            LIGNE = LIGNE || LPAD(' ',4, ' ')
                        || 'Cette STEP n''enregistre aucun dépassement de la PMD.';
    Philippe.

  11. #51
    Membre Expert
    Homme Profil pro
    Inscrit en
    mai 2008
    Messages
    2 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 135
    Points : 2 136
    Points
    2 136

    Par défaut

    Merci Ph. B. C'est génial, votre solution marche très bien.
    Je ne sais pas pourquoi je veux tout faire dans le begin end du do du select. En tout cas, c'est bien meilleur que le if Exists, merci encore Ph. B.
    Bon courage ou Bonne Chance (selon le contexte)

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •