Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/07/2011, 08h39   #1
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Par défaut comment faire un test dans une PS ?

Salut à tous

sans trop tarder voici mon code :
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
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
Citation:
((tb_sr.debit_nominal*(nb_p))*86.4) volume_mj
merci de me guider.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 09h23   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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 :
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 ; ^
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 09h25   #3
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
ok mon ami, je vais corriger et faire le retour.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 15h03   #4
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 15h12   #5
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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 :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 15h20   #6
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 15h39   #7
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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 :
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 :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 16h24   #8
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
très bien vu de ta part mon ami.
voici le code final :
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
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 17h20   #9
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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 :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 17h22   #10
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 17h39   #11
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
et pourquoi ne pas calculer le volume non pas dans la requête, mais dans le corps de la PS ?

ex :
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
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 :
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2011, 21h38   #12
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 09h06   #13
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 12h59   #14
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 13h23   #15
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
re

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

Citation:
(tb_curage.date_curage =: date_bilan and tb_unite.nom_unite = upper(:unite+"%"))
cela devrait être mieux
Code :
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)
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 14h00   #16
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
(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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 14h23   #17
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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 :
(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 :
(tb_curage.date_curage =: date_bilan AND tb_unite.nom_unite LIKE upper(:unite || '%'))
ou
Code :
(tb_curage.date_curage =: date_bilan AND tb_unite.nom_unite STARTING WITH upper(:unite))
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 15h28   #18
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 15h51   #19
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
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 : 697
Points : 837
Points : 837
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))
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2011, 15h55   #20
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h17.


 
 
 
 
Partenaires

Hébergement Web