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

SQL Firebird Discussion :

"N" procédures stockées exécutées dans un seul code


Sujet :

SQL Firebird

  1. #21
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Bonjour !

    pour les valeurs nulles, le count(monchamp) me renvoie 0 comme résultat comment le forcer à me donner le nombre de lignes retournant null.

    voici le code (sans pj Serge)

    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
    BEGIN
       LIGNE = 'PERIODE DU : '  ||Extract(DAY FROM  date_debut)||'/'
                ||Extract(MONTH FROM date_debut)||'/'
                ||Extract(YEAR FROM date_debut)|| ' AU : '
                ||Extract(DAY FROM date_fin)||'/'
                ||Extract(MONTH FROM date_fin)||'/'
                ||Extract(YEAR FROM date_fin);
       SUSPEND;
     
       LIGNE = '';
       SUSPEND;
       /******* Indice de boue ***************/
       LIGNE = 'CALCUL DE L''INDICE_BOUE';
       SUSPEND;
       FOR 
           SELECT  coalesce(nom_step, 'Pas de nom de STEP'),
                   coalesce(count(ib),0),
                   coalesce(avg(ib),0),
                   coalesce(interpretation_ib,' ')
           FROM "[10]PS_INDICE_BOUE"(:date_debut, :date_fin, :step, :code_point_prlv)
     
           GROUP BY nom_step, interpretation_ib
     
           ORDER BY count(ib) descending
     
           INTO :nom_step,
                :IB,
                :nbr_ib,
                :Interpretation_ib
     
       DO BEGIN
                LIGNE = 'STEP : ' || nom_Step || ' -- ' ||
                        'Fréq. IB : ' || nbr_ib || ' -- ' ||
                        'Val. IB : ' || IB || ' -- ' ||
                        'Interp. : ' || Interpretation_ib;
          SUSPEND;
       END
     
       LIGNE = '';
       SUSPEND;
       /******* Ratio DCO / DBO5 ***************/
       LIGNE = 'CALCUL DU RATIO DCO / DBO5';
       SUSPEND;
       FOR 
           SELECT  coalesce(nom_step, 'Pas de nom de STEP'),
                   coalesce(count(ratio_dco_dbo5),0),
                   coalesce(avg(ratio_dco_dbo5),0),
                   coalesce(effluent, ' ')
     
           FROM "[10]PS_RATIO_DCO_DBO5"(:date_debut, :date_fin)
     
           WHERE (nom_step like upper(:nom_step) ||'%')
     
           GROUP BY nom_step, effluent
     
           ORDER BY count(ratio_dco_dbo5) descending
     
           INTO :nom_step,
                :nbr_,
                :dco_dbo5,
                :effluent
     
       DO BEGIN
                LIGNE = 'STEP :  ' || nom_Step || ' -- ' ||
                        'Fréq. Rx : ' || nbr_ || ' -- ' ||
                        'Val. Rx DCO/DBO5 : ' || cast(dco_dbo5 as decimal(15,2)) || ' -- ' ||
                        'Nat. : ' || effluent ;
          SUSPEND;
       END
     
       LIGNE = '';
       SUSPEND;
       /******* Production de boue ***************/
       LIGNE = 'PRODUCION DE BOUE';
       SUSPEND;
       FOR
           SELECT  coalesce(nom_step, 'Pas de nom de STEP'),
                   coalesce(count(ratio_boue),0),
                   coalesce(avg(ratio_boue),0),
                   coalesce(consigne_boue, ' ')
     
           FROM "[10]_PS_RATIO_BOUE"(:date_debut, :date_fin)
     
           WHERE (nom_step like upper(:nom_step) ||'%')
     
           GROUP BY nom_step, consigne_boue
     
           ORDER BY count(ratio_boue) descending
     
           INTO :nom_step,
                :nbr_,
                :ratio_boue,
                :extration
     
       DO BEGIN
                LIGNE = 'STEP : ' || nom_Step || ' -- ' ||
                        'Fréq. Rx Boue : ' || nbr_ || ' -- ' ||
                        'Val. Rx Boue  : ' || cast(ratio_boue as decimal(15,2)) || ' -- ' ||
                        'Extraction : ' || extration ;
          SUSPEND;
       END
    END
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #22
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    tu parles de la variable ligne ?

    si oui, met un compteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    nb_Ligne_Null = 0;
     
    FOR 1ere procedure
        blabla
       DO 
       Begin
          LIGNE = 'STEP : ' || nom_Step || ' -- ' ||
                        'Fréq. IB : ' || nbr_ib || ' -- ' ||
                        'Val. IB : ' || IB || ' -- ' ||
                        'Interp. : ' || Interpretation_ib;
          IF (Ligne is NULL) THEN
              Nb_Ligne_Null = Nb_Ligne_Null + 1;
          SUSPEND;
       END
    et ainsi de suite...

    mais je ne vois pas où pourrait apparaitre de Ligne NULL !
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #23
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    merci dehorter olivier mais non je parle du count(monchamp) à l'intérieur de chaque procédure. comme vous devez le voir, j'ai des group by (champ_interpretation) et les résultats nulls sont traités comme un sous-ensemble mais j'ai pas le nombre de lignes exact à la sortir j'ai un 0 tandisque pour les autres sous-ensemble j'ai le bon compte.

    voici un extrait du résultat d'exécution :
    PERIODE DU : 30/4/2011 AU : 31/10/2012

    CALCUL DE L'INDICE_BOUE
    STEP : CHLEF -- Fréq. IB : 124 -- Val. IB : 19 -- Interp. : Condition acceptables de décantation des boues
    STEP : CHLEF -- Fréq. IB : 60 -- Val. IB : 11 -- Interp. : Hors gamme
    STEP : CHLEF -- Fréq. IB : 92 -- Val. IB : 4 -- Interp. : Les boues sont bien minéralisées et sédimentent facilement
    STEP : CHLEF -- Fréq. IB : 46 -- Val. IB : 1 -- Interp. : Mauvaise décantation des boues, les flocs ne sont pas assez concentrés
    STEP : CHLEF -- Fréq. IB : 156 -- Val. IB : 1 -- Interp. : Difficultés de décantation liées à un foisonement de bactéries filamenteuses "bulking"

    CALCUL DU RATIO DCO / DBO5
    STEP : CHLEF -- Fréq. Rx : 9 -- Val. Rx DCO/DBO5 : 1.89 -- Nat. : Effluent Industrie Agro-alimentaire
    STEP : CHLEF -- Fréq. Rx : 7 -- Val. Rx DCO/DBO5 : 2.31 -- Nat. : Effluent Domestique
    STEP : CHLEF -- Fréq. Rx : 0 -- Val. Rx DCO/DBO5 : 0.00 -- Nat. : /

    PRODUCION DE BOUE
    STEP : CHLEF -- Fréq. Rx Boue : 12 -- Val. Rx Boue : 1.92 -- Extraction : Sur extraction
    STEP : CHLEF -- Fréq. Rx Boue : 3 -- Val. Rx Boue : 0.94 -- Extraction : Sous extraction
    STEP : CHLEF -- Fréq. Rx Boue : 0 -- Val. Rx Boue : 0.00 -- Extraction : /
    je parle des lignes en rouge, la fréquence qui est résultante de l'application du count(monchamp) est 0 alors qu'il existe au moins une ligne qui a provoqué le nulle donc j'aurais dû avoir 1 pas 0.

    j'espère que je me suis fais comprendre cette fois-ci
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #24
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 033
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    ben non , je comprend pas où est ce count ?
    [edit] finalement si je le vois mais je comprends pas
    je reprend une de tes procédures après l'avoir (encore ) chargée
    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
     
    CREATE PROCEDURE "[10]PS_RATIO_DCO_DBO5" (
        date_debut date,
        date_fin date)
    returns (
        nom_step varchar(20),
        effluent varchar(35),
        ratio_dco_dbo5 float)
    as
    BEGIN
      /* test sur la date */
      IF (:date_debut > :date_fin) THEN EXCEPTION ERREUR_DATE;
      FOR
        a.nom_step,
        avg(b.dco_entree/b.dbo5_entree) ratio_dco_dbo5,
     
        case
          when (avg(b.dco_entree/b.dbo5_entree) between 1.5 and 2) then 'éffluent industrie agro-alimentaire'
          when (avg(b.dco_entree/b.dbo5_entree) between 2 and 3) then 'éffluent domestique'
          when (avg(b.dco_entree/b.dbo5_entree) > 3) then 'éffluent industriel'
          else 'hors gamme'
        end Effluent
     
        from tb_process b
            inner join tb_step a on (a.code_step = b.code_step)
     
        where (b.date_bilan between :date_debut and :date_fin)
     
        group by a.nom_step
     
        INTO :NOM_STEP,
             :Ratio_dco_dbo5,
             :Effluent
      DO
      BEGIN
        SUSPEND;
      END
    END
    1- je ne vois aucun count

    2- par contre je vois des trucs qui peuvent planter :
    dbo5_entree=0 donnera un division par Zéro (pas bon ça)
    et je ne suis pas sur que la Jointure soit bonne ?
    apparemment cette jointure est pour obtenir le nom du Step ? j'aurais plutôt fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        from tb_Step a 
            left join tb_process b on (a.code_step = b.code_step)
    et j'aurais fait un Group sur a.Code_step
    [edit]

    si je lis bien , je vais avoir un résultat par code_step donc , je comprends pas bien le Avg (on récupère déjà une moyenne) et le Count demandé et le résultat montré me parais donc bizarre

    Quant à la valeur 0 du count , il vient certainement de
    mettre coalesce(count(ib),1) et le tour est joué
    par contre la cohérence des résultats
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #25
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Pour les coalescesur les variables numériques, met quelque d'incohérent coalesce(count(ib),-1),.

    Je ne vois pas de pb dans cette PS, mais la PS "source" renvoi des NULLs
    peux tu fournir son écriture ("[10]PS_RATIO_DCO_DBO5") ?
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #26
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Comme à l'accoutume je me suis mal exprimé. Bon je parlais de la procédure EXECUTE_TOUT, je prends comme exemple ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT  coalesce(nom_step, 'Pas de nom de STEP'),
                   coalesce(count(ib),0),
                   coalesce(avg(ib),0),
                   coalesce(interpretation_ib,' ')
           FROM "[10]PS_INDICE_BOUE"(:date_debut, :date_fin, :step, :code_point_prlv)
    
           GROUP BY nom_step, interpretation_ib
    
           ORDER BY count(ib) descending
    
           INTO :nom_step,
                :IB,
                :nbr_,
                :Interpretation_ib
    je parlais de la ligne en rouge .... hein que suis-je bête, je le forçais à retourner ce fameux 0.

    En supprimant le coalesce j'ai cru que le count allait me donné le bon compte mais hélas j'obtiens toujours pas le nombre de lignes avec des nulles.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #27
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 033
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Et , comme à l'accoutumé, tu ne fais pas attention la procédure que tu nous indiques dans ce dernier post est la seule qui dans ton résultat test n'a pas d'erreurs

    je te suggère une nouvelle fois de lire la doc sur les valeurs NULL ainsi que
    CECI

    d'où je tire ceci :
    Citation Envoyé par Aggregate fonctions
    There is one exception to this rule: COUNT(*) returns the count of all rows, even rows whose fields are all NULL. But COUNT(FieldName) behaves like the other aggregate functions in that it only counts rows where the specified field is not NULL.

    Another thing worth knowing is that COUNT(*) and COUNT(FieldName) never return NULL
    donc, déjà : corriger le count(ib) en count(*)
    enlever le coalesce inutile puisque ne retourne JAMAIS Null
    idem pour AVG d'ailleurs

    Remettre en question les procédures "[10]PS_RATIO_DCO_DBO5" et "[10]_PS_RATIO_BOUE"

    nb. corriger les fautes d'orthographe aussi
    ligne 74 : LIGNE = 'PRODUCTION DE BOUE';
    effluent , n'a jamais pris d'accent

    en plus nous donner le code à jour je remarque (en indiquant la faute sur effluent) que dans ton résultat on retrouve Effluent ! j'ai téléchargé la pièce jointe pour rien !?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #28
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Et , comme à l'accoutumé, tu ne fais pas attention la procédure que tu nous indiques dans ce dernier post est la seule qui dans ton résultat test n'a pas d'erreurs
    car j'avais corriger le source suite à vos différentes suggestions donc rien d'étonnant de ne pas avoir trouver les anciennes erreurs

    Citation Envoyé par SergioMaster Voir le message
    je te suggère une nouvelle fois de lire la doc sur les valeurs NULL ainsi que
    CECI

    d'où je tire ceci :


    donc, déjà : corriger le count(ib) en count(*)
    ok maitre je ferais

    Citation Envoyé par SergioMaster Voir le message
    enlever le coalesce inutile puisque ne retourne JAMAIS Null
    idem pour AVG d'ailleurs
    ça était déjà fait

    Citation Envoyé par SergioMaster Voir le message
    Remettre en question les procédures "[10]PS_RATIO_DCO_DBO5" et "[10]_PS_RATIO_BOUE"
    c'était un extrait pour me faire comprendre

    Citation Envoyé par SergioMaster Voir le message
    nb. corriger les fautes d'orthographe aussi
    ligne 74 : LIGNE = 'PRODUCTION DE BOUE';
    effluent , n'a jamais pris d'accent
    exact, je suis nul mais j'avais corrigé éffluent mais pas "producion"

    Citation Envoyé par SergioMaster Voir le message
    en plus nous donner le code à jour je remarque (en indiquant la faute sur effluent) que dans ton résultat on retrouve Effluent ! j'ai téléchargé la pièce jointe pour rien !?
    voilà voilà
    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
    BEGIN
       LIGNE = 'PERIODE DU '  ||Extract(DAY FROM  date_debut)||'/'
                ||Extract(MONTH FROM date_debut)||'/'
                ||Extract(YEAR FROM date_debut)|| ' AU '
                ||Extract(DAY FROM date_fin)||'/'
                ||Extract(MONTH FROM date_fin)||'/'
                ||Extract(YEAR FROM date_fin);
       SUSPEND;
     
       LIGNE = '';
       SUSPEND;
       /******* Indice de boue ***************/
       LIGNE = 'CALCUL DE L''INDICE_BOUE';
       SUSPEND;
       FOR 
           SELECT  nom_step,
                   count(*),
                   avg(ib),
                   interpretation_ib
           FROM "[10]PS_INDICE_BOUE"(:date_debut, :date_fin, :step, :code_point_prlv)
     
           GROUP BY nom_step, interpretation_ib
     
           ORDER BY count(ib) descending
     
           INTO :nom_step,
                :IB,
                :nbr_,
                :Interpretation_ib
     
       DO BEGIN
                LIGNE = 'STEP : ' || coalesce(nom_Step, 'Pas de nom de STEP') || ' -- ' ||
                        'Fréq. IB : ' || nbr_ || ' -- ' ||
                        'Val. IB : ' || coalesce(IB,-1) || ' -- ' ||
                        'Interp. : ' || coalesce(Interpretation_ib,' ');
          SUSPEND;
       END
     
       LIGNE = '';
       SUSPEND;
       /******* Ratio DCO / DBO5 ***************/
       LIGNE = 'CALCUL DU RATIO DCO / DBO5';
       SUSPEND;
       FOR 
           SELECT  nom_step,
                   count(*),
                   avg(ratio_dco_dbo5),
                   effluent
     
           FROM "[10]PS_RATIO_DCO_DBO5"(:date_debut, :date_fin)
     
           WHERE (nom_step like upper(:nom_step) ||'%')
     
           GROUP BY nom_step, effluent
     
           ORDER BY count(ratio_dco_dbo5) descending
     
           INTO :nom_step,
                :nbr_,
                :dco_dbo5,
                :effluent
     
       DO BEGIN
                LIGNE = 'STEP :  ' || coalesce(nom_Step, 'Pas de nom de STEP') || ' -- ' ||
                        'Fréq. Rx : ' || nbr_ || ' -- ' ||
                        'Val. Rx DCO/DBO5 : ' || cast(coalesce(dco_dbo5,-1) as decimal(15,2)) || ' -- ' ||
                        'Nat. : ' || coalesce(effluent, ' ') ;
          SUSPEND;
       END
     
       LIGNE = '';
       SUSPEND;
       /******* Production de boue ***************/
       LIGNE = 'PRODUCTION DE BOUE';
       SUSPEND;
       FOR
           SELECT  nom_step,
                   count(*),
                   avg(ratio_boue),
                   consigne_boue
     
           FROM "[10]_PS_RATIO_BOUE"(:date_debut, :date_fin)
     
           WHERE (nom_step like upper(:nom_step) ||'%')
     
           GROUP BY nom_step, consigne_boue
     
           ORDER BY count(ratio_boue) descending
     
           INTO :nom_step,
                :nbr_,
                :ratio_boue,
                :extration
     
       DO BEGIN
                LIGNE = 'STEP : ' || coalesce(nom_Step, 'Pas de nom de STEP') || ' -- ' ||
                        'Fréq. Rx Boue : ' || nbr_ || ' -- ' ||
                        'Val. Rx Boue  : ' || cast(coalesce(ratio_boue ,-1) as decimal(15,2)) || ' -- ' ||
                        'Extraction : ' || coalesce(extration,' ') ;
          SUSPEND;
       END
    END
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #29
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 033
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    je parlais des procédures 'appelées' "[10]PS_RATIO_DCO_DBO5" et "[10]_PS_RATIO_BOUE"
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #30
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Gestion des exceptions avec messages clairs
    Salut

    je voudrais en ce moment gérer les exceptions, la plus fréquente et le cas de non renseignement des paramètres d'entrée (date_debut, date_fin, step, code_point_prlv). Les deux premiers paramètres sont prépondérant, l'absence d'un deux doit arrêter l'exécution de la procédure toute entière et sortir avec un message genre
    (Ligne = 'Aucune exécution, veuillez renseigner la date début et la date fin)
    La seconde exception est relative au thème dont on traite; s'agissant du code de la 1ière procédure, les 4 paramètres sont indispensables, pour les deux autres restants seul la date début et la date fin sont à renseigner obligatoirement.

    J'ai tenté ce bout de code au début de la procédure :
    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
    BEGIN
       if ( (:date_debut is null) or (:date_fin is null)
                or (:step is null) or (:code_point_prlv is null)
           ) then
       begin
         exception erreur_champ_vide;
         leave;
       end
     
       LIGNE = 'PERIODE DU '  ||Extract(DAY FROM  date_debut)||'/'
                ||Extract(MONTH FROM date_debut)||'/'
                ||Extract(YEAR FROM date_debut)|| ' AU '
                ||Extract(DAY FROM date_fin)||'/'
                ||Extract(MONTH FROM date_fin)||'/'
                ||Extract(YEAR FROM date_fin);
       SUSPEND;
    mais, parait-il que leave ou break ne sont acceptés que dans des boucles, comment s'en sortir avec des messages clairs pour l'utilisateur ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  11. #31
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Changement de varchar en blob
    Salut !
    puisque la finalité de mon travail était un résultat sous forme de texte alors j'ai changé le type de LIGNE en blob :
    ligne blob sub_type 1 segment size 80 character set unicode_fss
    Qui est mieux adapté à ce genre de situation.

    Je laisse ce post ouvert car j'ai pas trouvé, jusqu'à maintenant, comment faire exécuter la suite du code suite à une erreur d'exécution en amont ? car même si les bouts de codes sont dans le même source mais elles n'ont pas une dépendance entre elles.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  12. #32
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 033
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Je ne comprends pas

    - La "gestion des exceptions" , il est toujours possible de de faire un IF THEN ELSE ( ce n'est pas LEAVE ou BREAK mais EXIT qu'il fallait utiliser)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN
      IF ( (:date_debut IS NULL) OR (:date_fin IS NULL)
                OR (:step IS NULL) OR (:code_point_prlv IS NULL)
           ) then
       begin
         Ligne = 'Aucune exécution, veuillez renseigner la date début et la date fin';
         SUSPEND;
       end
    ELSE BEGIN  --- Traitement "normal" 
    ---
    END
    ou encore utiliser un gestionnaire d'exception
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    when any do
    begin
      Ligne = 'Aucune exécution';
      SUSPEND;
      EXIT;
    end
    - l'utilisation de blob , à mon avis inutile dans ce contexte , de toute façon le blob sera traité comme un VARCHAR

    -le fait que l'utilisateur utilise directement le SQL il n'y a pas d'interface IHM (Delphi,C++ ....) qui permet de contrôler la saisie des paramètres et qui fait un joli petit état (rave,fastreport ....) ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #33
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je ne comprends pas

    - La "gestion des exceptions" , il est toujours possible de de faire un IF THEN ELSE ( ce n'est pas LEAVE ou BREAK mais EXIT qu'il fallait utiliser)
    Exact, j'ai corrigé mais ça n'aboutit pas à tout les coups en plus "Exit" me fait sortir de la PS alors que dans mon cas je voudrais retrouver la trace de l'échoue de cette exécution, p.e :
    Indice de boue :
    Echoue de l'exécution du traitement de l'indice de boue
    Production de boue
    Résultats
    Ration DCO/DBO5
    etc..
    Citation Envoyé par SergioMaster Voir le message
    le fait que l'utilisateur utilise directement le SQL il n'y a pas d'interface IHM (Delphi,C++ ....) qui permet de contrôler la saisie des paramètres et qui fait un joli petit état (rave,fastreport ....) ?
    je suis sous IB et ça permet justement de réaliser les états en format FR ce qui me fera gagner un temps appréciable sous delphi c'est pourquoi j'essaye de réaliser le maximum de choses en mode SQL
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  14. #34
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Que retourne Firebird quand le nbr d'enregistremenst est null ?!
    Salut
    à priori la réponse est nulle ! peut-être que j'ai pas su exploiter le résultat
    bref, j'ai une PS qui retourne bien ce que je veux ... à un moment donné les paramètres d'entrée fournissent un résultat nul, dans tout les cas de figures je teste sur le nombre de lignes retournées pour afficher un message mais je me suis aperçu que pour nul le teste n'exécute jamais la portion du code qui lui est destinée.

    pour mieux comprendre voici le bout de programme qui teste le résultat retourné de la PS :
    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
    /******* 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
            if (NBR_ = 0) then -- j'ai aussi testé avec NBR_ is null mais ça passe pas ... cette ligne n'est jamais exécutée 
                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
    en simple, je veux exploiter le résultat fourni par la PS, si le nombre de lignes est différent de 0 il m'affiche un message sinon c'est un autre message qui est affiché.

    Merci par avance pour tout éclaircissement.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  15. #35
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Just-Soft Voir le message
    à un moment donné les paramètres d'entrée fournissent un résultat nul
    Dans ce cas, le bloc de code dans la boucle FOR ne sera jamais exécuté, de même que le test que vous vouliez contrôler.
    Pour le vérifier, mettez un compteur d'itération à 0 à l'extérieur de la boucle FOR, incrémentez le dans le bloc BEGIN END pour chaque itération et renvoyez le résultat. Vous verrez qu'il vaudra 0...
    Philippe.

  16. #36
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,
    Dans ce cas, le bloc de code dans la boucle FOR ne sera jamais exécuté, de même que le test que vous vouliez contrôler.
    Pour le vérifier, mettez un compteur d'itération à 0 à l'extérieur de la boucle FOR, incrémentez le dans le bloc BEGIN END pour chaque itération et renvoyez le résultat. Vous verrez qu'il vaudra 0...
    Merci mais c'est ce que j'ai fais avec la variable NBR_ qui est initialisé à 0 mais quand je teste sur cette variable rien n'est fait comme si le résultat retourné force la PS a ne pas exécuter le bloc de code !!!!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  17. #37
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    Merci mais c'est ce que j'ai fais avec la variable NBR_ qui est initialisé à 0 mais quand je teste sur cette variable rien n'est fait comme si le résultat retourné force la PS a ne pas exécuter le bloc de code !!!!
    Vous n'avez absolument pas compris ce que j'ai dit !!! relisez moi !
    Le select de la boucle for ne renvoyant aucun résultat, aucune instruction du bloc begin ... end de cette boucle for ne sera exécuté, donc votre test if (nbr_ = 0) then ... else ne le sera pas non plus !
    Ce dont je parle :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ITERATION = 0;
    FOR SELECT ...
    DO
    BEGIN
      ITERATION = ITERATION + 1;
      -- Votre instruction
    END
    -- si ITERATION = 0, alors le code dans le BEGIN END n'a jamais été exécuté !
    -- ce qui se produit si le select fournit un résultat nul comme vous le dites !
    LIGNE = ITERATION || ' itération(s)  '  || LIGNE;
    Philippe.

  18. #38
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Vous n'avez absolument pas compris ce que j'ai dit !!! relisez moi !
    Re,

    je crains fort que c'est vous qui ne lisez pas bien !!!
    car mon NBR_ est initialisé avant le Select mais malgré ça j'ai ce petit problème qui me dépasse hélas
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  19. #39
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Vous parlez du BEGIN END final !!! non, je ne crois pas que se soit la bonne solution car j'exécute plusieurs PS au sein du cette PS globale.. donc le mieux serait de gérer ça au niveau du BEGIN END de la dite PS.

    Je suis d'accord avec vous sur le faite que si le select ne parvient pas à retourner de valeur alors la variable reste à 0 mais pourquoi le BEGIN END ne s'exécute pas dans ce cas ça me parait pas normal sauf si les concepteurs ont décidé ainsi.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  20. #40
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    Vous parlez du BEGIN END final !!! non, je ne crois pas que se soit la bonne solution car j'exécute plusieurs PS au sein du cette PS globale.. donc le mieux serait de gérer ça au niveau du BEGIN END de la dite PS.
    Ce que vous appelez le begin end final est celui que j'associe depuis le début à la boucle for !
    Citation Envoyé par Just-Soft Voir le message
    Je suis d'accord avec vous sur le faite que si le select ne parvient pas à retourner de valeur alors la variable reste à 0 mais pourquoi le BEGIN END ne s'exécute pas dans ce cas ça me parait pas normal sauf si les concepteurs ont décidé ainsi.
    Je vous rappelle qu'avec SQL on raisonne en terme d'ensemble. L'ensemble résultant du select de la boucle for étant vide, il n'y a aucune raison d'exécuter le code du bloc begin end associé. C'est donc le traitement normal et attendu...
    Philippe.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/09/2016, 08h50
  2. Procédure stockée, concaténation dans requête
    Par sbeu dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/08/2005, 12h03
  3. procédure stockée Oracle dans delphi 6
    Par UPNE387 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2004, 09h47

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