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

MS SQL Server Discussion :

[select dans case] reconnaitre un champ d une table liée


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut [select dans case] reconnaitre un champ d une table liée
    bonjour,
    j'ai développé la requete suivant (la structure de la base est vraiment pourrie mais c est un progiciel deja existant depuis plusieurs années et donc je ne peux pas en changer la structure)
    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
    select distinct(ac.AC_categorie),ct.CT_INTITULE,
    		PRIXVEN=
    			case
    			when ac.ac_prixven != 0 then convert(varchar(15),ac.ac_prixven)
    			when ac.ac_coef!=0 then convert(varchar(15),a.ar_prixach * ac.ac_coef)
    			when ac.ac_devise != 0 then ' '
    			when (select top 1 tg2.TG_Prix from f_tarifgam tg2 where ar_ref = 'GAMM' and tg2.TG_RefCF=tg.TG_RefCF) is not null then 'Gamme'
    			else
    			  convert(varchar(15),a.ar_prixven)
    			end,
     
    		COEF=
    			case
    			when ac.ac_coef!=0 then convert(varchar(15),ac.ac_coef)
    			when ac.ac_devise != 0 then ' '
    			else
    			  convert(varchar(15),a.ar_coef)
    			end,
    		ac_prixttc,
     
    		REMISE=
    			case
    			when ac.ac_qtemont =0 then convert(varchar(15),ac.AC_Remise)
    			else
    			  'Gamme'
    			end,
    		ac.ac_arrondi,ac.ac_qtemont
    		from f_artclient ac
    		left join p_cattarif ct on ct.cbindice=ac.AC_categorie
    		left outer join F_ARTICLE a on a.ar_ref=ac.ar_ref
    		left outer join F_TARIFGAM tg on tg.ar_ref=ac.ar_ref and substring(tg.TG_RefCF,2,2)= ac.AC_categorie
    		WHERE ac.ar_ref = 'GAMM' and AC_categorie = 2
    		ORDER BY AC_categorie
    et j ai une erreur sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    when (select top 1 tg2.TG_Prix from f_tarifgam tg2 where ar_ref = 'GAMM' and tg2.TG_RefCF=tg.TG_RefCF) is not null
    avec le message suivant:
    Serveur : Msg 245, Niveau 16, État 1, Ligne 1
    Erreur de syntaxe lors de la conversion de la valeur varchar 'AR' vers une colonne de type de données smallint.
    par contre qd je remplace la valeur de tg.refcf par sa valeur dans la table ma requète passe nikel a savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    when (select top 1 tg2.TG_Prix from f_tarifgam tg2 where ar_ref = 'GAMM' and tg2.TG_RefCF='a02') is not null
    j' ai beau faire des recherches et je comprens pas vraiment quel est le probleme dans cette requête et donc je ne vois pas trop comment le resoudre ....
    merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    C'est vrai que c'est bizarre, surtout le type "smallINT".

    Quelle colonne est de type SMALLINT ?

    on dirait que la colonne PRIX de tg2 est en smallINT et que dans TG tu as des prix non int...

    Enfin c'est dur de t'aider si on a pas les structures des tables.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    alors tg_refcf et ar_ref sont de types chaines et tg_prix est de type numérique: réel double

  4. #4
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    en ce qui concerne la structure l idée c est de tester l existence d un prix d un article selon des caractéristiques spécifiques (les gammes) dans la table f_tarifgam s il y a un prix je met 'Gamme' dans le champs( car le prix sera different en fonction de ses gammes et je ferait une selection plus tard) sinon il n y a pas de prix spécifique et donc je met le prix générique de l article car c est le meme quelque soit ses spécificités et je fait ca pour differentes catégorie taérifaire (grossiste, detaillants ..) d ou la nécessité de reconnaitre mon champ tg.tg_prix du left outer join dans mon select plutot que de lui donner la chaine a la main.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    je persiste / quel champ dans tes tables est de type SMALLINT ?

  6. #6
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    en smallint j'ai:
    ac.AC_categorie, ac.ac_coef,ac.ac_devise,ac_prixttc,,ac.ac_qtemont,ac.ac_arrondi,ct.cbindice
    les autres numeriques sont de types doubles:
    ac_prixven,ac_prixach
    et le reste sont de type chaine..

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par the_edge
    en smallint j'ai:
    ac.AC_categorie, ac.ac_coef,ac.ac_devise,ac_prixttc,,ac.ac_qtemont,ac.ac_arrondi,ct.cbindice
    les autres numeriques sont de types doubles:
    ac_prixven,ac_prixach
    et le reste sont de type chaine..
    Est-ce que tu peux (par pure vérif) faire un select convert(smallint,XXX) où XXX représente tous les champs sus listés ?

  8. #8
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    mmmm ca y est je crois que j ai trouvé !!!
    en fait ca viens d'ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    left outer join F_TARIFGAM tg on tg.ar_ref=ac.ar_ref and substring(tg.TG_RefCF,2,2)= ac.AC_categorie
    car des fois j ai des a01 a02 dans ce champs comme des fois j ai des noms de fournisseurs et donc la fonction substring ne retourne pas qqch qui soit convertible en int
    sachant que le progiciel lui prens comem base que les reference des catégories commentcent par a (a01, a02..) et la je sais pas trop comment le gerer parce que je suis pas non plus super fort en SQL

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par the_edge
    sachant que le progiciel lui prens comem base que les reference des catégories commentcent par a (a01, a02..) et la je sais pas trop comment le gerer parce que je suis pas non plus super fort en SQL
    On va y arriver :

    1- Ajoute une conditiov dans ta clause where du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     WHERE ac.ar_ref = 'GAMM' and AC_categorie = 2 
    AND ISNUMERIC(substring(tg.TG_RefCF,2,2)) = 1  --- condition ajoutee
    ca te permet de ne plus avoir d'erreur.
    Mais en faisant cela,évidemment tu ne prendras pas en compte les TG_REF qui ne sont pas sous le bon format aNN.

    Pour ce type de valeur, que veux tu faire ?

  10. #10
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    mm je vais essayer ca justement les autres valeurs je ne veux pas les traiter donc c est sool
    enfin bon avant de me rejouir v voir si ton truc marche

  11. #11
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    ca marche pas ...
    Serveur : Msg 245, Niveau 16, État 1, Ligne 1
    Erreur de syntaxe lors de la conversion de la valeur varchar 'AR' vers une colonne de type de données smallint.
    comme si il prenait pas en compte la nouvelle condition dans le where ....

  12. #12
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Essaie d'integrer la condition proposée par ZERS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND ISNUMERIC(substring(tg.TG_RefCF,2,2)) = 1
    au niveau du left outer comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    left outer join F_TARIFGAM tg
    on tg.ar_ref=ac.ar_ref 
    and substring(tg.TG_RefCF,2,2)= ac.AC_categorie
    AND ISNUMERIC(substring(tg.TG_RefCF,2,2)) = 1
    A+

  13. #13
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    ca ne change rien a l erreur....

  14. #14
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Pour être sur que l'erreur vient de là, converti categorie en varchar.
    Peut être on est sur un fausse piste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    and substring(tg.TG_RefCF,2,2)= convert(varchar(2),ac.AC_categorie)
    A+

  15. #15
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 59
    Points : 44
    Points
    44
    Par défaut
    en fait je viens de toruver une solution en changeant complement de technique d approche:
    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
    	select distinct(ac.AC_categorie),ct.CT_INTITULE,
    		PRIXVEN='Gamme',
     
    		COEF=
    			case
    			when ac.ac_coef!=0 then convert(varchar(15),ac.ac_coef)
    			when ac.ac_devise != 0 then ' '
    			else
    			  convert(varchar(15),a.ar_coef)
    			end,
    		ac_prixttc,
     
    		REMISE=
    			case
    			when ac.ac_qtemont =0 then convert(varchar(15),ac.AC_Remise)
    			else
    			  'Gamme'
    			end,
    		ac.ac_arrondi,ac.ac_qtemont
    	from f_artclient ac
    	left join p_cattarif ct on ct.cbindice=ac.AC_categorie
    	left outer join F_ARTICLE a on a.ar_ref=ac.ar_ref
    	left outer join F_TARIFGAM tg on tg.ar_ref=ac.ar_ref 
    	WHERE ac.ar_ref = 'BAAR01' and AC_categorie > 0 and ISNUMERIC(substring(tg.TG_RefCF,2,2))=1 and substring(tg.TG_RefCF,2,2)=ac.AC_categorie
     
    UNION
     
    	select distinct(ac.AC_categorie),ct.CT_INTITULE,
    		PRIXVEN=
    			case
    			when ac.ac_prixven != 0 then convert(varchar(15),ac.ac_prixven)
    			when ac.ac_coef!=0 then convert(varchar(15),a.ar_prixach * ac.ac_coef)
    			when ac.ac_devise != 0 then ' '
    			else
    			  convert(varchar(15),a.ar_prixven)
    			end,	
     
    		COEF=
    			case
    			when ac.ac_coef!=0 then convert(varchar(15),ac.ac_coef)
    			when ac.ac_devise != 0 then ' '
    			else
    			  convert(varchar(15),a.ar_coef)
    			end,
    		ac_prixttc,
     
    		REMISE=
    			case
    			when ac.ac_qtemont =0 then convert(varchar(15),ac.AC_Remise)
    			else
    			  'Gamme'
    			end,
    		ac.ac_arrondi,ac.ac_qtemont
    	from f_artclient ac
    	left join p_cattarif ct on ct.cbindice=ac.AC_categorie
    	left outer join F_ARTICLE a on a.ar_ref=ac.ar_ref
     
    	WHERE ac.ar_ref = 'BAAR01' and AC_categorie > 0 
    		and ac.AC_categorie not in (select substring(tg2.TG_RefCF,2,2)from f_tarifgam tg2 
    		where ISNUMERIC(substring(tg2.TG_RefCF,2,2))=1 and tg2.ar_ref = ac.ar_ref)
    order by AC_categorie
    Mais merci beaucoup pour votre aide et j essaierais ta solution si j ai un peu de temps et que j y repense MAMMAR

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Extraire la valeur d'un champ d'une table liée dans un formulaire
    Par breweryfr dans le forum IHM
    Réponses: 8
    Dernier message: 07/11/2014, 17h33
  2. Réponses: 3
    Dernier message: 25/05/2012, 16h53
  3. select distinct sur le premier champ d'une table
    Par alexkickstand dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/08/2008, 16h03
  4. Vérifer dans un formulaire, plusieurs champs d'une table simultanément
    Par ludovicparis dans le forum Requêtes et SQL.
    Réponses: 13
    Dernier message: 25/04/2007, 15h22
  5. Réponses: 11
    Dernier message: 17/03/2006, 13h20

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