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 :

comment faire un test dans une PS ?


Sujet :

SQL Firebird

  1. #1
    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 comment faire un test dans une PS ?
    Salut à tous

    sans trop tarder voici mon 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
    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
    SET TERM ^ ;
     
    CREATE PROCEDURE PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float)
    as
    declare variable nb_p smallint;
    BEGIN
        FOR
        select 
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_sr.nom_sr,
            tb_sr.localisation_sr,
            tb_sr.x_utm,
            tb_sr.y_utm,
           /* nb_p n'est pas reconnu car faisant pas partie de la table */
            ((tb_sr.debit_nominal*(nb_p))*86.4) volume_mj
        from tb_sr
            inner join tb_unite on (tb_sr.code_unite = tb_unite.code_unite)
            inner join tb_commune on (tb_sr.code_commune = tb_commune.code_commune)
        where nom_unite = upper((:n_unite))
     
        INTO    :NOM_UNITE,
                :NOM_COMMUNE,
                :NOM_SR,
                :LOCALISATION_SR,
                :X_UTM,
                :Y_UTM,
                :VOLUME_MJ
        DO
        BEGIN
          /* l'erreur est ici */ 
          nb_p = tb_sr.nbr_pompe-1;
          if (nb_p = 1) then nb_p = 1;
          suspend;
        END
    END^
     
    SET TERM ; ^
    mais ça semble pas fonctionner comme je l'ai fais
    ce que je veux faire est de récupérer la valeur du nombre de pompes si celle-ci vaut 1 alors la variable locale nb_p prend 1 sinon elle prend la valeur trouvé dans la table de données.
    ceci dans le but de calculer le volume moyen journalier dans une SR (station de relevage) comme décrit plus haut
    ((tb_sr.debit_nominal*(nb_p))*86.4) volume_mj
    merci de me guider.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    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
    Bonjour

    nb_p n'est pas déclaré dans le RETURNS, Normal ?

    et dans ta requête, je ne vois pas d'affectation pour la colonne tb_sr.nbr_pompe à une variable.

    Code sql : 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
    SET TERM ^ ;
     
    CREATE PROCEDURE PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float
        Nb_P Smallint)
    AS
     declare variable nbr_pompe smallint
    BEGIN
        FOR
        SELECT 
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_sr.nom_sr,
            tb_sr.localisation_sr,
            tb_sr.x_utm,
            tb_sr.y_utm,
            tb_sr.nbr_pompe,
           /* nb_p n'est pas reconnu car faisant pas partie de la table */
            ((tb_sr.debit_nominal*(nb_p))*86.4) volume_mj
        FROM tb_sr
            INNER JOIN tb_unite ON (tb_sr.code_unite = tb_unite.code_unite)
            INNER JOIN tb_commune ON (tb_sr.code_commune = tb_commune.code_commune)
        WHERE nom_unite = upper((:n_unite))
     
        INTO    :NOM_UNITE,
                :NOM_COMMUNE,
                :NOM_SR,
                :LOCALISATION_SR,
                :X_UTM,
                :Y_UTM,
                :nbr_pompe,
                :VOLUME_MJ
        DO
        BEGIN
          /* l'erreur est ici */ 
          nb_p = nbr_pompe-1;
          IF (nb_p = 1) then nb_p = 1;
          suspend;
        END
    END^
     
    SET TERM ; ^
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    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
    ok mon ami, je vais corriger et faire le retour.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #4
    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
    ok ça marche à merveille mais je voudrais pas faire figurer le nombre de pompe dans ma vue y'a t-il un truc pour le faire ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    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
    Tous les éléments qui doivent "sortir" doivent être inscrites dans la clause RETURNS et le choses qui doivent rester en interne déclares-les juste après cette clause avec "declare variable"

    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
    CREATE PROCEDURE PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (  -- Ce sont les elements qui seront visibles à l'exterieur [si la methode SUSPEND est utilisée ]
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float
        Nb_P Smallint)
    AS
     declare variable nbr_pompe smallint  -- cette variable ne sera utilisé QUE dans la PS et jamais envoyée vers l’extérieur
    BEGIN
       .....
    END
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #6
    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
    oui oui, je comprends bien la structure de la PS, d'ailleurs c'est pour cela que dans mon 1er code j'ai pas mis nbr_pompe comme variable de sortie mais hélas elle restait inconnue !!

    ta proposition marche bien sauf que je veux rendre le nombre de pompe invisible est-il possible tout en gardant le teste évidement ?!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #7
    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
    pas sur de bien saisir ta demande

    cette variable "nombre de pompe"que tu ne veux pas retrouver en sortie est celle nommée Nb_P ?

    si oui, tu la place en variable déclarée :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    declare variable Nb_PP smallint;
    Dans ce cas, les 2 variables déclarées avec cette "procédure" se seront jamais visible à l’extérieur de la PS

    seul, ces variables seront transmises vers l'extérieur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float
    Merci d'ajouter un sur les tags qui vous ont aidé

  8. #8
    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
    très bien vu de ta part mon ami.
    voici le code final :
    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
    CREATE PROCEDURE PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float)
    as
    declare variable nb_p smallint;
    declare variable nbr_pompe smallint;
    BEGIN
        FOR
        select 
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_sr.nom_sr,
            tb_sr.localisation_sr,
            tb_sr.x_utm,
            tb_sr.y_utm,
            ((tb_sr.debit_nominal*(nbr_pompe))*86.4) VOLUME_MJ
        from tb_sr
            inner join tb_unite on (tb_sr.code_unite = tb_unite.code_unite)
            inner join tb_commune on (tb_sr.code_commune = tb_commune.code_commune)
        where nom_unite = upper(:n_unite)
     
        INTO    :NOM_UNITE,
                :NOM_COMMUNE,
                :NOM_SR,
                :LOCALISATION_SR,
                :X_UTM,
                :Y_UTM,
                :VOLUME_MJ
        DO
        BEGIN
          nb_p = nbr_pompe - 1;
          if (nb_p = 1) then nb_p = 1;
          suspend;
        END
    END
    mais une chose m'échappe ! je viens de vérifier les résultats et c'est correct mais comment parvient-il à récupérer le nombre de pompes !!! je ne trouve nul part une affectation du champ nombre de pompe ! alors comment fait-il le fameux FB ?!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #9
    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
    heuuuu es tu sur que cela donne les bons résultats

    Je ne vois pas l'affectation à "nbr_pompe"

    et je dois avouer que je reste dubitatif si ça marche

    je verrais plutôt la chose 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
    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
    CREATE PROCEDURE PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float)
    AS
    declare variable nb_p smallint;
    declare variable nbr_pompe smallint;
    BEGIN
        FOR
        SELECT 
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_sr.nom_sr,
            tb_sr.localisation_sr,
            tb_sr.x_utm,
            tb_sr.y_utm,
            tb_sr.nbr_pompe,
            ((tb_sr.debit_nominal*(nbr_pompe))*86.4) VOLUME_MJ
        FROM tb_sr
            INNER JOIN tb_unite ON (tb_sr.code_unite = tb_unite.code_unite)
            INNER JOIN tb_commune ON (tb_sr.code_commune = tb_commune.code_commune)
        WHERE nom_unite = upper(:n_unite)
     
        INTO    :NOM_UNITE,où 
                :NOM_COMMUNE,
                :NOM_SR,
                :LOCALISATION_SR,
                :X_UTM,
                :Y_UTM,
                :nbr_pompe,
                :VOLUME_MJ
        DO
        BEGIN
          nb_p = :nbr_pompe - 1;
          IF (nb_p = 1) then nb_p = 1;
          suspend;
        END
    END
    Merci d'ajouter un sur les tags qui vous ont aidé

  10. #10
    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
    non non je me suis trop précipité, le résultat est faux.
    ce que je voudrais faire, pour ne pas rester dans mon esprit qui est peut-être sur ce coup tordu.

    j'ai un champ qui renseigne le nombre de pompe dans une station de relevage. je veux calculer le volume journalier à partie du débit nominal. en règle général, une station de relevage est équipée de n+1 pompe, le nombre de pompes en marche et n, le (1) c'est la pompe de secours, donc dans le calcul du volume on doit faire (débit * (nbr_pompe - 1)). mais comme certaine stations de relevage ne sont équipées que d'une seule pompe cette formule renvoi (0) comme résultat. alors, je dois auparavant vérifier si le nombre de pompe est différent de 1 sinon la formule redevient (debit*1) dans ce cas là.

    mon code ne parvient pas à faire ça et je ne trouve pas la bonne manière pour retirer le nombre de pompe, faire le teste puis exécuter la formule selon le cas.

    merci encore.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  11. #11
    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
    et pourquoi ne pas calculer le volume non pas dans la requête, mais dans le corps de la PS ?

    ex :
    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
    CREATE PROCEDURE PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float)
    AS
    declare variable nb_p smallint;
    declare variable nbr_pompe smallint;
    declare variable debit_nominal float;
    BEGIN
        FOR
        SELECT 
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_sr.nom_sr,
            tb_sr.localisation_sr,
            tb_sr.x_utm,
            tb_sr.y_utm,
            tb_sr.nbr_pompe,
            tb_sr.debit_nominal
            ((tb_sr.debit_nominal*(nbr_pompe))*86.4) VOLUME_MJ
        FROM tb_sr
            INNER JOIN tb_unite ON (tb_sr.code_unite = tb_unite.code_unite)
            INNER JOIN tb_commune ON (tb_sr.code_commune = tb_commune.code_commune)
        WHERE nom_unite = upper(:n_unite)
     
        INTO    :NOM_UNITE,où 
                :NOM_COMMUNE,
                :NOM_SR,
                :LOCALISATION_SR,
                :X_UTM,
                :Y_UTM,
                :nbr_pompe,
                :debit_nominal
        DO
        BEGIN
                IF nbr_Pompe > 1 THEN
                   nbr_Pompe = :nbr_Pompe - 1;
                VOLUME_MJ :=  ((tb_sr.debit_nominal*(nbr_pompe))*86.4) ;
          suspend;
        END
    END

    ou dans la requete, en utilisant la fonction IIF de FIREBIRD
    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 PS_ABH_STATION_RELEVAGE (
        n_unite varchar(20))
    returns (
        nom_unite varchar(20),
        nom_commune varchar(30),
        nom_sr varchar(29),
        localisation_sr varchar(30),
        x_utm bigint,
        y_utm bigint,
        volume_mj float)
    AS
    BEGIN
        FOR
        SELECT 
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_sr.nom_sr,
            tb_sr.localisation_sr,
            tb_sr.x_utm,
            tb_sr.y_utm,
            IIF(tb_sr.nbr_pompe = 1, ((tb_sr.debit_nominal*(tb_sr.nbr_pompe ))*86.4),  ((tb_sr.debit_nominal*(tb_sr.nbr_pompe  - 1))*86.4)) AS VOLUME_MJ
        FROM tb_sr
            INNER JOIN tb_unite ON (tb_sr.code_unite = tb_unite.code_unite)
            INNER JOIN tb_commune ON (tb_sr.code_commune = tb_commune.code_commune)
        WHERE nom_unite = upper(:n_unite)
     
        INTO    :NOM_UNITE,où 
                :NOM_COMMUNE,
                :NOM_SR,
                :LOCALISATION_SR,
                :X_UTM,
                :Y_UTM,
                :VOLUME_MJ
        DO
        BEGIN
          suspend;
        END
    END
    Merci d'ajouter un sur les tags qui vous ont aidé

  12. #12
    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
    Re,

    enfin de compte je retiens la seconde solution celle du IIF, elle me semble plus adéquate dans mon cas.

    mon problème est résolu mais tant qu'on y est je pose cette question pour ceux qui ont une bonne expérience en SQL :
    dans quel cas on utilise les requêtes et dans quel cas on utilise les PS ? car il me semble que le problème que j'ai posé peut-être résolu en requête sans passer par une PS.

    merci encore.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  13. #13
    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
    re

    si tu retiens la 2eme solution, l'utilisation d'une PS n'est pas utile.

    Quand à généraliser, je ne suis pas assez théoricien, pour y répondre.
    une réponse simpliste sans doute, serait d'utiliser la PS quand l'opération n peux se résoudre assez une seule requête
    Merci d'ajouter un sur les tags qui vous ont aidé

  14. #14
    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
    ok
    tant qu'on y est. dans une autre PS j'ai dans la clause where une variable type caractère, je voudrais garder le '%' mais la compilation m'indique une erreur et je vois mal comment ajouter ce fameux caractère.

    pour bien comprendre ma demande voici mon 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
    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
    CREATE PROCEDURE PR_ABH_RESEAU_ASSAINISSEMENT (
        unite char(20),
        date_bilan date)
    returns (
        date_curage date,
        nom_unite varchar(20),
        nom_commune varchar(40),
        lin_total float,
        volume_collecte bigint,
        etat_reseau varchar(15))
    as
    BEGIN
      FOR
        select
            tb_curage.date_curage,
            tb_unite.nom_unite,
            tb_commune.nom_commune,
            tb_commune_pop_lin.lineaire_visitable + tb_commune_pop_lin.lineaire_non_visitable lin_total,
            tb_curage.volume_collecte,
            tb_commune_pop_lin.etat_reseau
    
        from tb_curage
         inner join tb_commune on (tb_curage.code_commune = tb_commune.code_commune)
         inner join tb_centre on (tb_commune.code_centre = tb_centre.code_centre)
         inner join tb_unite on (tb_centre.code_unite = tb_unite.code_unite)
         inner join tb_commune_pop_lin on ((tb_curage.code_commune = tb_commune_pop_lin.code_commune) and
                                          Extract(year from tb_curage.date_curage) = tb_commune_pop_lin.annee_de_comparaison)
    
        where 
        (
      /* ce que je voudrais c'est pouvoir écrire ça
    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite+"%"))
    mais le compilateur me déclare une erreur.
    */
          (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite))
        )
    
        INTO :date_curage,
             :nom_unite,
             :nom_commune,
             :lin_total,
             :volume_collecte,
             :etat_reseau
    
      DO
      BEGIN
        SUSPEND;
      END
    END
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  15. #15
    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
    re

    je vois 2 problèmes : le + et le "

    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite+"%"))
    cela devrait être mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite || '%'))
    il se peut qu'il faille mettre 2 apostrophes (mais pas le guillemet)
    Merci d'ajouter un sur les tags qui vous ont aidé

  16. #16
    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
    Re,
    Merci et bien vue une autre fois.
    à la compilation comme à l'exécution aucune erreur n'est signalée mais le résultat est faux.

    je m'explique, en enlevant la partie (|| + '%') j'ai le bon résultat tout avec comme contrainte d'écrire la totalité de ma chaine. mais quand j'ajoute cette portion à la ligne de code ce qui revient à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite || '%'))
    et en entrant une partie de ma chaine (les premières lettres tout naturellement) j'ai un ensemble vide.

    comme je suis ous IBX, celui là me permet de suivre ma variable et à ma surprise l'expression n'est pas évoluée puisque la variable vaut les lettres tapées !!!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  17. #17
    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
    Citation Envoyé par Just-Soft Voir le message
    Re,
    Merci et bien vue une autre fois.
    à la compilation comme à l'exécution aucune erreur n'est signalée mais le résultat est faux.

    je m'explique, en enlevant la partie (|| + '%') j'ai le bon résultat tout avec comme contrainte d'écrire la totalité de ma chaine. mais quand j'ajoute cette portion à la ligne de code ce qui revient à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite || '%'))
    et en entrant une partie de ma chaine (les premières lettres tout naturellement) j'ai un ensemble vide.
    Normal, le "=" n'est pas correct dans ce cas.
    Remplace-le pas LIKE ou mieux STARTING WITH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite LIKE upper(:unite || '%'))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (tb_curage.date_curage =: date_bilan and tb_unite.nom_unite STARTING WITH upper(:unite))
    Merci d'ajouter un sur les tags qui vous ont aidé

  18. #18
    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
    oui c'était une omission de ma part, j'utilise le like mais l'ensemble renvoyé est toujours vide.
    je viens d'essayer avec STARTING with est ensemble vide aussi

    je comprends pas où est le problème !
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  19. #19
    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
    n'y aurait-il un problème de casse ?

    (tb_curage.date_curage =: date_bilan AND Upper(tb_unite.nom_unite) STARTING WITH upper(:unite))
    Merci d'ajouter un sur les tags qui vous ont aidé

  20. #20
    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 dehorter olivier Voir le message
    n'y aurait-il un problème de casse ?

    (tb_curage.date_curage =: date_bilan AND Upper(tb_unite.nom_unite) STARTING WITH upper(:unite))
    non, j'avais envisagé ce cas mais ça vient pas de là car toutes mes données sont rentrées en majuscule lors de la saisie. n'empêche que j'ai essayé avec cette syntaxe mais toujours rien.

    ce qui me tracasse c'est quand j'enlève cette syntaxe et que je mets l'ancienne sans le '%' le résultat et bien exact
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

Discussions similaires

  1. Comment faire 2 sessions dans une application
    Par ZiedCSS dans le forum Windows Forms
    Réponses: 1
    Dernier message: 03/04/2007, 14h36
  2. Réponses: 1
    Dernier message: 28/03/2007, 12h23
  3. Faire des test dans une base de donnée
    Par kj_83 dans le forum C++Builder
    Réponses: 15
    Dernier message: 06/07/2006, 09h54
  4. [VBA-E]Comment faire pour écrire dans une page excel existante ?
    Par pauletta22 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/05/2006, 13h54
  5. Faire un test dans une procédure
    Par PrinceMaster77 dans le forum SQL
    Réponses: 1
    Dernier message: 23/11/2004, 09h55

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