OVH Cloud OVH Cloud

ambiguité de champs dans un recordset

3 réponses
Avatar
Pierre-Yves
Bonjour,

j'ai un pb d'ambiguité sur un champ. J'ai un champ identique dans deux
tables (table [B50-composants] et table [B52-Nomenclature]). C'est le champ
posteCharge. Je veux afficher le poste de charge de la table
[B50-composants] (le traitement ici n'a pas d'intérêt, c'est juste pour le
principe).
Par conséquent je mets le nom d'alias de la table devant le nom de champ.
En access cela marche très bien, pas sur sqlserver. Si je mets seulement
postecharge et non plus B50.poste charge, ca fonctionne. Comment faire la
distinction?

voici le code:
Public Function test()

Dim rs_db As New ADODB.Recordset
Dim sql As String
Dim prm As Integer
Dim cpt As Integer


sql = "select * from [B50-composants] B50 JOIN [B52-Nomenclature] B52 ON
B50.[T50-2-code comp] = B52.[T52-2-Code composant maitre] "
rs_db.Open sql, bdd_sql, adOpenKeyset, adLockOptimistic
rs_db.MoveFirst


Debug.Print rs_db.Fields(cpt).Name
Debug.Print rs_db("B50.posteCharge").Value

Next cpt

rs_db.Close

End Function

merci pour vos réponses

3 réponses

Avatar
David.V
à priori tu devrais l'afficher comme cela :

Debug.Print rs_db("posteCharge").Value

Sans alias donc. Maintenant, si posteCharge est un champs ne donnant pas le
même type d'info d'une base à une autre, tu devrais revoir la conception car
je trouve pas ça fameux d'avoir des noms qui se recoupent pour des types de
données différents. Au pire, change le requete, met les champs au détail
(plutot que de mettre *) et définit un alias sur le champs litigieux...


"Pierre-Yves" a écrit dans le message de
news:
Bonjour,

j'ai un pb d'ambiguité sur un champ. J'ai un champ identique dans deux
tables (table [B50-composants] et table [B52-Nomenclature]). C'est le


champ
posteCharge. Je veux afficher le poste de charge de la table
[B50-composants] (le traitement ici n'a pas d'intérêt, c'est juste pour le
principe).
Par conséquent je mets le nom d'alias de la table devant le nom de champ.
En access cela marche très bien, pas sur sqlserver. Si je mets seulement
postecharge et non plus B50.poste charge, ca fonctionne. Comment faire la
distinction?

voici le code:
Public Function test()

Dim rs_db As New ADODB.Recordset
Dim sql As String
Dim prm As Integer
Dim cpt As Integer


sql = "select * from [B50-composants] B50 JOIN [B52-Nomenclature] B52 ON
B50.[T50-2-code comp] = B52.[T52-2-Code composant maitre] "
rs_db.Open sql, bdd_sql, adOpenKeyset, adLockOptimistic
rs_db.MoveFirst


Debug.Print rs_db.Fields(cpt).Name
Debug.Print rs_db("B50.posteCharge").Value

Next cpt

rs_db.Close

End Function

merci pour vos réponses




Avatar
Patrice
L'alias sur la table est utilisé par SQL Server uniquement pour lever
l'ambiguïté dans l'exécution de la commande. Il ne change pas du tout le nom
sous lequel est vu le champ dans le jeu de résultat final.

Dans ce cas, il faut utiliser un alias sur la *colonne* qui pose Problème.

Par exemple :

SELECT Société.Nom AS 'Société.Nom',Contact.Nom AS 'Contact.Nom' FROM etc...

Ce qui permettra au niveau du recordset d'utiliser "Société.Nom" ou
"Collaborateur.Nom" selon le nom à obtenir....

Patrice

--

"Pierre-Yves" a écrit dans le message de
news:
Bonjour,

j'ai un pb d'ambiguité sur un champ. J'ai un champ identique dans deux
tables (table [B50-composants] et table [B52-Nomenclature]). C'est le


champ
posteCharge. Je veux afficher le poste de charge de la table
[B50-composants] (le traitement ici n'a pas d'intérêt, c'est juste pour le
principe).
Par conséquent je mets le nom d'alias de la table devant le nom de champ.
En access cela marche très bien, pas sur sqlserver. Si je mets seulement
postecharge et non plus B50.poste charge, ca fonctionne. Comment faire la
distinction?

voici le code:
Public Function test()

Dim rs_db As New ADODB.Recordset
Dim sql As String
Dim prm As Integer
Dim cpt As Integer


sql = "select * from [B50-composants] B50 JOIN [B52-Nomenclature] B52 ON
B50.[T50-2-code comp] = B52.[T52-2-Code composant maitre] "
rs_db.Open sql, bdd_sql, adOpenKeyset, adLockOptimistic
rs_db.MoveFirst


Debug.Print rs_db.Fields(cpt).Name
Debug.Print rs_db("B50.posteCharge").Value

Next cpt

rs_db.Close

End Function

merci pour vos réponses




Avatar
Jean-Nicolas BERGER
On dirait même que d'une manière générale, les select * sont totalement à
banir.
En effet, si ton modèle de données évolue un peu (genre simple changement de
nom d'un champ), tu serais obligé de revoir le code appelant, alors que si
tu a explicitement listé les champs à retourner, tu peux au pire mettre un
alias directement au niveau procédure stockée, et tu ne changes pas le
client...
JN.

"David.V" a écrit dans le message de
news:%23h$
à priori tu devrais l'afficher comme cela :

Debug.Print rs_db("posteCharge").Value

Sans alias donc. Maintenant, si posteCharge est un champs ne donnant pas


le
même type d'info d'une base à une autre, tu devrais revoir la conception


car
je trouve pas ça fameux d'avoir des noms qui se recoupent pour des types


de
données différents. Au pire, change le requete, met les champs au détail
(plutot que de mettre *) et définit un alias sur le champs litigieux...


"Pierre-Yves" a écrit dans le message de
news:
> Bonjour,
>
> j'ai un pb d'ambiguité sur un champ. J'ai un champ identique dans deux
> tables (table [B50-composants] et table [B52-Nomenclature]). C'est le
champ
> posteCharge. Je veux afficher le poste de charge de la table
> [B50-composants] (le traitement ici n'a pas d'intérêt, c'est juste pour


le
> principe).
> Par conséquent je mets le nom d'alias de la table devant le nom de


champ.
> En access cela marche très bien, pas sur sqlserver. Si je mets seulement
> postecharge et non plus B50.poste charge, ca fonctionne. Comment faire


la
> distinction?
>
> voici le code:
> Public Function test()
>
> Dim rs_db As New ADODB.Recordset
> Dim sql As String
> Dim prm As Integer
> Dim cpt As Integer
>
>
> sql = "select * from [B50-composants] B50 JOIN [B52-Nomenclature] B52 ON
> B50.[T50-2-code comp] = B52.[T52-2-Code composant maitre] "
> rs_db.Open sql, bdd_sql, adOpenKeyset, adLockOptimistic
> rs_db.MoveFirst
>
>
> Debug.Print rs_db.Fields(cpt).Name
> Debug.Print rs_db("B50.posteCharge").Value
>
> Next cpt
>
> rs_db.Close
>
> End Function
>
> merci pour vos réponses
>
>