2010-09-21 6 views
0

J'ai une construction de formulaire de deux-listbox classique (Déplacez une ligne de cette boîte à cette boîte ...) Je veux que la boîte à gauche contienne toutes les lignes qui ne sont pas dans la boîte sur la droite.Join - NOT (A2007)

Les données sous-jacentes sont dans une relation plusieurs-à-plusieurs. PartNbr - XREF - Source, où une partie peut avoir 0 ou plusieurs sources ... donc j'ai trois tables, Item Master, XREF et Source (alias "TP"). La boîte de droite sélectionne tous les partnbres du Item Master qui ont des enregistrements dans la table XREF, et les affiche dans la boîte de droite.

La boîte de gauche doit montrer toutes les autres parties du maître d'article TP (tierce partie) (parties Sourcable) qui ne sont PAS dans la boîte de droite. Comme c'est une relation plusieurs-à-plusieurs, j'ai utilisé la construction SELECT DISTINCT. Ci-joint les rowsources pour les deux boîtes:

gauche ("From") case:

SELECT DISTINCT tblTPitemMaster.TPItemID, 
    tblTPitemMaster.TPItemVendorID, 
    tblTPitemMaster.TPItemNbr, tblTPitemMaster.TPItemDescription, 
    tblTPitemMaster.TPItemUnitCost, tblXrefItemTPItem.TPXRCPASItemID 
FROM tblTPitemMaster 
LEFT JOIN tblXrefItemTPItem 
    ON tblTPitemMaster.TPItemID = tblXrefItemTPItem.TPXRTPItemID 
WHERE ((TPItemVendorID=590) AND (TPXRCPASItemID <> 10546)) 
ORDER BY tblTPitemMaster.TPItemVendorID 

droit ("A") Box:

SELECT tblXrefItemTPItem.TPXRPreferredVendor AS Rank, 
    tblVendor.[Vendor Name], tblTPitemMaster.TPItemNbr, 
    tblTPitemMaster.TPItemDescription, tblTPitemMaster.TPItemUnitCost, 
    tblXrefItemTPItem.TPXRID 
FROM tblVendor INNER JOIN (tblTPitemMaster 
INNER JOIN tblXrefItemTPItem 
    ON tblTPitemMaster.TPItemID = tblXrefItemTPItem.TPXRTPItemID) 
    ON tblVendor.ID = tblTPitemMaster.TPItemVendorID 
WHERE TPXRCPASItemID=10546 
ORDER BY tblXrefItemTPItem.TPXRPreferredVendor 

Le problème est, je reçois tous les maîtres TPItem enregistrer dans la case de gauche. Doit être quelque chose de simple. Des idées?


Jim

Répondre

0

Tous les articles qui ne sont pas dans la table de jonction?

LEFT JOIN tblXrefItemTPItem 
    ON tblTPitemMaster.TPItemID = tblXrefItemTPItem.TPXRTPItemID 
WHERE tblXrefItemTPItem.TPXRTPItemID Is Null 

BTW la requête serait beaucoup plus facile à lire avec des alias:

SELECT DISTINCT m.TPItemID, 
    m.TPItemVendorID, 
    m.TPItemNbr, m.TPItemDescription, 
    m.TPItemUnitCost, x.TPXRCPASItemID 
FROM tblTPitemMaster m 
LEFT JOIN tblXrefItemTPItem x 
    ON m.TPItemID = x.TPXRTPItemID 
WHERE x.TPXRTPItemID Is Null 
AND TPItemVendorID=590 
ORDER BY m.TPItemVendorID 

Je pense que TPXRCPASItemID vient de la table de jonction et est donc hors de propos.

+0

Bien sûr, j'ai utilisé le moteur de requête d'Access pour produire le SQL, c'est pourquoi la verbosité. Vous avez raison à propos de l'alias. Je vais essayer votre suggestion après une tasse ou deux de café. Je vous remercie! –

+0

OK, le problème est que l'élément doit être soit pas dans la table de jonction OU Dans la table de jonction et non lié à l'ID CPASItemID. Un ID CPASItem peut avoir plusieurs identificateurs TPItemID et un identificateur TPItemID peut avoir plusieurs identificateurs CPASItemID. ET le vendeur doit être 590. –