Précédent   Forum du club des développeurs et IT Pro > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/12/2012, 17h43   #41
dehorter olivier
Membre Expert
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 921
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 921
Points : 1 241
Points : 1 241
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 08h23   #42
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
@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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 08h30   #43
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 08h37   #44
dehorter olivier
Membre Expert
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 921
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 921
Points : 1 241
Points : 1 241
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 15h13   #45
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 15h19   #46
dehorter olivier
Membre Expert
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 921
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 921
Points : 1 241
Points : 1 241
il faut que la requête dans le EXISTS doit renvoyer les mêmes infos...
Donc où est la clause WHERE dans le EXISTS ????
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 15h32   #47
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 16h52   #48
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 259
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 50
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 259
Points : 3 580
Points : 3 580
qq chose avec ROW_COUNT alors :
http://www.firebirdsql.org/refdocs/l...row_count.html
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 12h15   #49
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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.

Citation:
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 14h45   #50
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 032
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 1 032
Points : 2 660
Points : 2 660
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
Bonjour,
Citation:
Envoyé par Just-Soft Voir le message
une belle solution mais pas dans mon cas ...
Relecture de la même doc :
Citation:
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 15h06   #51
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h22.


 
 
 
 
Partenaires

Hébergement Web