2009-03-05 5 views
3

J'ai une base de données Access Access que j'utilise pour les rapports qui ont des vues de table liées depuis SQL Server 2005. J'ai créé une requête qui récupère les informations d'une table PO et catégorise les élément de campagne en fonction des informations d'une autre table. Je suis relativement certain que la requête s'est bien passée jusqu'à il y a environ un mois quand nous sommes passés du mode de compatibilité 80 à 90 sur le serveur comme requis par notre application primaire (qui crée les données). Je ne peux pas le dire avec une certitude absolue, mais c'est le seul changement majeur qui ait été fait au cours des 90 derniers jours. Nous avons remarqué que soudainement les données n'apparaissaient pas dans la requête, ce qui rendait les rapports bizarres.La requête d'accès renvoie des champs vides en fonction de la façon dont la table est liée.

Ceci est une copie de la requête à défaut:

SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype, 
    dbo_opmaster.shortchar01, 
    dbo_porel.ponum, dbo_porel.poline, dbo_podetail.unitcost 

FROM ((dbo_porel 
LEFT JOIN dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq) 
    AND (dbo_porel.jobseq = dbo_joboper.oprseq) 
    AND (dbo_porel.jobnum = dbo_joboper.jobnum)) 
LEFT JOIN dbo_opmaster ON dbo_joboper.opcode = dbo_opmaster.opcode) 
LEFT JOIN dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline) 
    AND (dbo_porel.ponum = dbo_podetail.ponum) 

WHERE (dbo_porel.jobnum="367000003") 

Il renvoie les éléments suivants:

jobnum opcode jobseqtype shortchar01 ponum poline unitcost 
367000003   S      6624  2  15 


La requête doit normalement afficher une valeur pour opcode et shortchar01. Si je supprime la table liée dbo_podetail, elle affiche correctement les données pour ces champs (bien que je ne possède plus évidemment unitcost). Au début, je pensais que c'était peut-être un problème de données, mais j'ai trouvé que si j'avais imbriqué la requête puis lié la table, cela a bien fonctionné.

Par exemple, le code suivant fonctionne parfaitement:

SELECT qryTest.*, dbo_podetail.unitcost 

FROM (

    SELECT dbo_porel.jobnum, dbo_joboper.opcode, dbo_porel.jobseqtype, 
     dbo_opmaster.shortchar01, dbo_porel.ponum, dbo_porel.poline 

    FROM (dbo_porel 
    LEFT JOIN dbo_joboper ON (dbo_porel.jobnum=dbo_joboper.jobnum) 
     AND (dbo_porel.jobseq=dbo_joboper.oprseq) 
     AND (dbo_porel.assemblyseq=dbo_joboper.assemblyseq)) 
    LEFT JOIN dbo_opmaster ON dbo_joboper.opcode=dbo_opmaster.opcode 

    WHERE (dbo_porel.jobnum="367000003") 

) As qryTest 
LEFT JOIN dbo_podetail ON (qryTest.poline = dbo_podetail.poline) 
    AND (qryTest.ponum = dbo_podetail.ponum) 


Je suis à une perte pour laquelle il travaille dans ce dernier cas et non dans le premier cas. Pire encore, il semble fonctionner par intermittence pour certains enregistrements et pas pour d'autres (il est cohérent avec ceux pour lesquels il fonctionne et ne fonctionne pas).

Certains de vos experts ont-ils des idées?

+0

L'une des colonnes de votre instruction SELECT est-elle le PK de la table principale de votre requête? Deuxièmement, Access fait un meilleur travail d'affichage et d'actualisation des données dans les formulaires liés si vous avez un champ d'horodatage dans votre table et l'inclure dans toutes vos instructions SQL. –

Répondre

1

Vous avez certainement besoin d'utiliser les sous-requêtes pour plusieurs gauche/droite rejoint dans Access.
Je pense que c'est une limitation de l'optimiseur Jet qui devient confus si vous enchaînez simplement les jointures gauche/droite. Vous pouvez see that this is a recurrent problem surface qui souvent.

+0

Si l'optimiseur de requêtes Jet se trompe, utilisez simplement un passthrough, non? –

+0

J'ai fait pas mal de recherches et je ne trouve pas de réponse à cette question. Cela semble être la seule réponse que j'ai à moins que je veux traiter des requêtes passthrough dans VBA. –

0

Je suis toujours confus par l'utilisation des parenthèses dans les jointures. Essayez d'enlever les crochets supplémentaires.

FROM 
    dbo_porel 
LEFT JOIN 
    dbo_joboper ON (dbo_porel.assemblyseq = dbo_joboper.assemblyseq) 
     AND (dbo_porel.jobseq = dbo_joboper.oprseq) 
     AND (dbo_porel.jobnum = dbo_joboper.jobnum) 
LEFT JOIN 
    dbo_opmaster ON (dbo_joboper.opcode = dbo_opmaster.opcode) 
LEFT JOIN 
    dbo_podetail ON (dbo_porel.poline = dbo_podetail.poline) 
     AND (dbo_porel.ponum = dbo_podetail.ponum) 

OK le précède ne fonctionne pas - Désolé, je renoncer à

+0

L'accès favorise la sécurité par rapport à la lisibilité. L'ordre des opérations peut être simplifié à: Parenthèse, puis tout le reste. –

+0

J'ai essayé de supprimer les crochets supplémentaires (selon votre extrait de code) et j'ai refusé de lancer: "Erreur de syntaxe" Opérateur invalide –

Questions connexes