Problème de restriction sur requête

Résolu
cs_Famas54 Messages postés 59 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 21 août 2009 - 14 juil. 2008 à 11:16
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 - 17 juil. 2008 à 15:04
Bonjour,

Je cherche sans succès à mettre en place dans une requête SELECT une restriction ou la valeur d'un champs influencerait celle d'un autre champs, je m'explique:

Si valeur.champA = valeur.champB
alors valeur.champC = valeur.champA
Sinon si valeur.champA <> valeur.champB
alors valeur.champC = valeur.champB

voilà grosso modo ce que je veux faire dans ma requête mais le Sql ne semble pas permettre de telles restrictions, si quelqu'un aurait une idée pour établir ce genre de choses dans un code Sql je suis preneur.

10 réponses

LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
15 juil. 2008 à 19:11
Rectif:
Expr1: IIf ([dbo_ID_CLASSENEW]![ACTIVE]=0,
'Liquidé',
IIf([dbo_ID_CLASSENEW]![ACTIVE]=-1,'Actif','Pas Lancé'))

le 'Pas Lancé' est dans le Else du  2° IIF



Si dbo_ID_CLASSENEW]![ACTIVE]<>0
ET
Si dbo_ID_CLASSENEW]![ACTIVE]<>-1
ALORS
'Pas Lancé' 

<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
3
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
14 juil. 2008 à 15:34
Salut,
Si c' est une requete Selection que tu veux,
tu peux faire ceci:
Select ChampA, ChampB, IIf(ChampA=ChampB,ChampA,ChampB)
As ChampC From MaTable;"


Notes bien que dans cette expression le ChampC est une colonne générée c à d que le champC ne fait pas partie de la structure de ta table.


Si c' est une mise à jour du champC qui cette fois fait partie de la table,tu tentes ceci:


"Update MaTable Set ChampC=IIf(ChampA=ChampB,ChampA,ChampB);"
 

PS: la fonction IIF() est l' &quivalent de Si...Sinon





<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
0
cs_Famas54 Messages postés 59 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 21 août 2009 2
15 juil. 2008 à 15:27
J'ai bien compris l'utilisation de la fonction IIF pour ce genre de situations et en fait j'utilise ce code dont j'affecte le résultat à un champs crée de manière temporaire lors de l'exécution de la requête.

En somme ce champs prendre telle ou telle valeur en fonction de celle d'un autre champs qui lui ne sera pas affiché lors de l'exécution de la requête.

Voiçi ma partie de code actuelle (qui ne semble encore pas accepté lorsque je tente de sauvegarder ma requête)

Expr1: IIf (([dbo_ID_CLASSENEW]![ACTIVE]=0,'Liquidé',[dbo_ID_CLASSENEW]![ACTIVE]=-1,'Actif'),'Pas Lancé')
Pour récapituler si le champs ACTIVE de la table dbo_ID_CLASSENEW 0 alors la valeur de Expr1 sera "Liquidé", sinon si ACTIVE -1 alors la valeur sera "Actif", sinon si la valeur n'est ni 0 ni -1 alors Expr1 renvera "Pas Lancé"

Voilà l'idée, j'ai un petit doute concernant la possibilité d'opérer à un tel choix avec la fonction IIF qui me semble vraiment restreinte à un Si/Sinon.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
15 juil. 2008 à 18:31
En fait, dans ton exemple, il faudra imbriqué les IIf
selon le schema:
Si(Cond1,Vrai,Si(Cond2,Vrai,Faux))


Expr1: IIf ([dbo_ID_CLASSENEW]![ACTIVE]=0,
'Liquidé',
IIf([dbo_ID_CLASSENEW]![ACTIVE]=-1,'Actif'))


Testes ta logique avec un test classique :
If


Else
   If
 
   Else
 
   End If
End If





<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Famas54 Messages postés 59 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 21 août 2009 2
16 juil. 2008 à 09:27
Impeccable, j'ai juste du remplacer les virgules par des ";" et le tout fonctionne parfaitement, merci à toi une fois de plus.

Je ne pensais pas qu'il était possible d'imbriquer les IIF dans de genre de code.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 juil. 2008 à 13:39
Salut,


A titre d' info, mon record pzerso est l' imbrication de


6 IIf dans une seule Expression.
Mais là c' était un cas très particulier.
Autrement, je pouvait procèder par étape.
Avec ton exemple, tu pourras faire ceci:

Génèrer la 2° Expr
Expr2:IIf([dbo_ID_CLASSENEW]![ACTIVE]=-1;'Actif';'Pas Lancé'))


Génèrer la 1° (celle qui t' interresse)en fonction de la 2°
Expr1: IIf ([dbo_ID_CLASSENEW]![ACTIVE]=0,
'Liquidé';Expr2)

une autre fois peut être

Bonne continuation.
.





<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
0
cs_Famas54 Messages postés 59 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 21 août 2009 2
16 juil. 2008 à 15:28
J'ai maintenant un nouveau problème lié à une nouvelle restriction comportant un peu plus de critères pour cette fois, voici mon code:

TYPE_NOIND:
IIf([A_qry_Dbo_ID_Classnew]![POOLNOIND]=[A_qry_Dbo_ID_Classnew]![CLASSENOIND];'Poolnoind';

IIf([A_qry_Dbo_ID_Classnew]![POOLNOIND]<>[A_qry_Dbo_ID_Classnew]![CLASSENOIND];'Classenoind');

IIf([A_qry_Dbo_ID_Classnew]![CLASSENOIND]=[Dbo_ID_CSA]![CSA_NOIND];'CSA');'Autres')

Pour récapitulatif:si POOLNOIND CLASSENOIND Alors valeur retournée 'Poolnoind'
sinon si POOLNOIND <> CLASSENOIND Alors valeur retournée = 'Classenoind'sinon si CLASSENOIND CSA_NOIND Alors valeur retournée 'CSA'
sinon Alors valeur retournée = 'Autres'

Au début j'ai plutot pensé à une erreur concernant la structure des parenthèses et crochets mais visiblement il me retourne le problème sur le nombre d'arguments.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 juil. 2008 à 16:30
re-salut,
c' est à mon avis une erreur au niveau de la structuration.
En d' autre terme, tu t' es mélé les pinceaux :-)


IIf([A_qry_Dbo_ID_Classnew]![POOLNOIND]<>[A_qry_Dbo_ID_Classnew]![CLASSENOIND]
est superflux car si on avait qu' un test, ça peut résumer à
If([A_qry_Dbo_ID_Classnew]![POOLNOIND]=[A_qry_Dbo_ID_Classnew]![CLASSENOIND];'Poolnoind';'Classenoind')


Si c' est pas égal c' est que c' est difféeznt


Maintenant tu peux insèrer un 2° IIf dans la partie False de cet IIF


If([A_qry_Dbo_ID_Classnew]![POOLNOIND]=[A_qry_Dbo_ID_Classnew]![CLASSENOIND];'Poolnoind';
IIf([A_qry_Dbo_ID_Classnew]![CLASSENOIND]=[Dbo_ID_CSA]![CSA_NOIND];'CSA';'Autres'))




En règle général chaque IIf doit avoir:
-un argument test
-un argument True
-un argument False

Si tu veux imbriquer un IIf , tu dois le faire soit dans la partie True
soit dans la partie False.Mais doit lui aussi respecter la règle générale.





<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
0
cs_Famas54 Messages postés 59 Date d'inscription mardi 12 septembre 2006 Statut Membre Dernière intervention 21 août 2009 2
17 juil. 2008 à 11:24
J'ai fait évoluer ma bestiole avec quelques résultats un peu plus intéressants mais un problème est apparu malgré les améliorations:

TYPE_NOIND

IIf([A_qry_Dbo_ID_Classnew]![POOLNOIND]=[A_qry_Dbo_ID_Classnew]![CLASSENOIND];'Poolnoind';

IIf([A_qry_Dbo_ID_Classnew]![POOLNOIND]<>[A_qry_Dbo_ID_Classnew]![CLASSENOIND];'Classenoind';

IIf([A_qry_Dbo_ID_Classnew]![CLASSENOIND]=[dbo_ID_CSA]![CSA_NOIND];'CSA';'Autres')))

Il fait la dissociation parfaitement entre Poolnoind et Classenoind mais m'affiche une inputbox venue de nul part pour la valeur CSA

Inputbox = dbo_ID_CSA!CSA_NOIND, donc au final la colonne TYPE_NOIND ne m'affiche que des Poolnoind et des Classenoind sans prendre en compte les conditions du troisième IIF, je ne vois pas pour quelle raison, j'ai veillé a appliqué la structure TEST/TRUE/FALSE à chaque fois.
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
17 juil. 2008 à 15:04
s' il t' affiche unr inputbox, c' est qu' il n' arrive pas
à trouver [dbo_ID_CSA]![CSA_NOIND].
ou bien tu n' as pas référencé la table ou bien le champ
n' existe pas.


D' autre part pour avoir 'CSA' , il faut que
[A_qry_Dbo_ID_Classnew]![POOLNOIND]
<>[A_qry_Dbo_ID_Classnew


Et
A_qry_Dbo_ID_Classnew]![CLASSENOIND]
=[dbo_ID_CSA]![CSA_NOIND]

Est-ce bien le cas pour certaines lignes ?





<hr />... Y'en a même qui disent qu'ils l'ont vu voler.
0
Rejoignez-nous