2017-07-20 2 views
0

Est-il possible d'utiliser une requête SQL dans le test logique d'une instruction IIF? J'ai une table du personnel qui contient toutes les informations générales du personnel on s'attendrait. L'un des champs IsManager est un booléen et j'utilise les instructions IIF pour modifier la sortie d'une requête basée sur si quelqu'un a cet ensemble à vrai ou non. Le problème que j'ai est quand j'applique ceci à une table un-à-plusieurs il vérifie si l'enregistrement actuel a la valeur de champ IsManager vrai. Je voudrais qu'il vérifie si la personne actuelle faisant la requête a le champ mis à vrai.SQL Advanced IIF utilisant MS Access

SELECT TB2.ID, IIF(TB1.IsManager, TB1.LastName, 'Restricted'), IIF(TB1.IsManager, TB1.FirstName, 'Restricted') 
FROM TB1 INNER JOIN TB2 ON TB1.EmployeeNumber = TB2.EmployeeNumber 

Cela fonctionne si l'enregistrement que je vérifie a IsManager=True. Je voudrais vérifier l'utilisateur actuel de l'instruction IIF que je fais dans d'autres requêtes en utilisant les éléments suivants

SELECT IsManager 
FROM TB1 
WHERE Username=currentUser 

currentUser est la variable VBA Environ("USERNAME") qui est également enregistrée dans la table des détails du personnel.

Alors puis-je combiner ces derniers et faire une IFF avec la requête ci-dessus, quelque chose comme:

SELECT IIF(SELECT IsManager 
FROM TB1 
WHERE Username=currentuser, TB1.LastName, 'Restricted') FROM .... etc etc 

Dans le cas contraire est-il une autre méthode que je peux utiliser qui est disponible pour MC Access SQL

+0

Modifier votre question et de fournir des exemples de données et les résultats souhaités. –

Répondre

0

vous avez juste besoin de deux jointures comme celui-ci

SELECT 
    TB2.ID, 
    IIF(AM_I_MANAGER.IsManager, TB1.LastName, 'Restricted'), 
    IIF(AM_I_MANAGER.IsManager, TB1.FirstName, 'Restricted') 
FROM TB1 
CROSS JOIN TB1 AS AM_I_MANAGER ON AM_I_MANAGER.Username=currentUser 
JOIN TB2 ON TB1.EmployeeNumber = TB2.EmployeeNumber 

Nous utilisons une jointure croisée ici parce que AM_I_MANAGER.Username=currentUser retournera 1 rang. Nous utilisons ensuite cette ligne pour chaque ligne de la table TB1 (donc la jointure croisée ne fait que "croiser" 1 ligne). Si ce filtre renvoie plus d'une ligne, vous n'obtiendrez pas de bons résultats.

+0

Je reçois l'erreur suivante lors de l'exécution de cette erreur de syntaxe sur la clause FROM. Vérifié la syntaxe trois fois et ne peut pas le voir. – iShaymus

+0

Apparemment, MS Access n'utilise pas CROSS JOIN – iShaymus

+0

@iShaymus - il suffit de retirer le "CROSS" devrait être bien. – Hogan

0

Vous pouvez utiliser RechDom dans votre requête:

PARAMETERS Username Text (255); 
SELECT 
    TB2.ID, 
    IIF(DLookup("IsManager", "TB1", "Username = '" & Username & "')"), TB1.LastName, 'Restricted'), 
    IIF(DLookup("IsManager", "TB1", "Username = '" & Username & "')"), TB1.FirstName, 'Restricted') 
FROM 
    TB1 
INNER JOIN 
    TB2 
    ON TB1.EmployeeNumber = TB2.EmployeeNumber