web-dev-qa-db-fra.com

Forme d'accès - Erreur de syntaxe (opérateur manquant) dans l'expression de requête

Je reçois une erreur de syntaxe sous une forme créée lors d'une requête. J'ai créé le formulaire pour limiter l'accès aux modifications des enregistrements. En essayant de définir des filtres sur le formulaire, je reçois des erreurs de syntaxe pour tous les attributs sur lesquels je tente de filtrer. Je pense que cela a quelque chose à voir avec le manque de () autour de la jointure interne dans le code de requête, mais ce qui est étrange pour moi, c'est que je puisse filtrer la requête sans problème. Ci-dessous le code de la requête:

SELECT CUSTOMER.[Product Number], SALESPERSON.[Salesperson Number],
SALESPERSON.[Salesperson Name], SALESPERSON.[Email Address]
FROM SALESPERSON INNER JOIN CUSTOMER ON
SALESPERSON.[Salesperson Number] = CUSTOMER.[Salesperson Number];

Des idées pour lesquelles seul le formulaire générerait l'erreur de syntaxe, ou comment résoudre ce problème?

5
FGLC0983

J'ai pu résoudre ce problème rapidement en accédant à la vue Conception du formulaire et en plaçant [] autour des noms de champs contenant des espaces. Je peux maintenant utiliser les filtres intégrés sans la fenêtre contextuelle gênante sur les problèmes de syntaxe.

9
Dedren

J'ai eu le même problème. Comme le dit Dedren, le problème n'est pas la requête, mais la source de contrôle de l'objet de formulaire. Placez [] autour de chaque objet Control Source. par exemple: Contol Source: [Product number], Control Source: Salesperson.[Salesperson number], etc.

Makita recommande d'aller à la table d'origine que vous référencez dans votre requête et renommez le champ afin qu'il n'y ait pas d'espaces, par exemple: SalesPersonNumber, ProductNumber, etc. Cela résoudra également de nombreux problèmes futurs. Bonne chance!

5
msllarson2

Essayez de rendre les noms de champs légaux en supprimant les espaces. C'est un long plan, mais cela m'a déjà aidé auparavant.

2
Makita

J'ai eu cela sur un formulaire où le Recordsource est dynamique.

Le SQL était bien, la réponse est de piéger l'erreur!

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'    Debug.Print DataErr

    If DataErr = 3075 Then
        Response = acDataErrContinue
    End If

End Sub
0
Reuben Molloy

Les crochets supplémentaires () peuvent créer des problèmes dans if if flow. Cela crée également une erreur de syntaxe (opérateur manquant) dans l'expression de la requête.

0
Robin

Non non Non.

Ces réponses sont toutes fausses. Il y a une absence fondamentale de connaissances dans votre cerveau à laquelle je vais remédier maintenant.

Votre problème majeur ici est votre schéma de nommage. Il est verbeux, contient des caractères indésirables et est horriblement incohérent.

Premier: Une table appelée Salesperson n'a pas besoin de contenir chaque champ de la table appelé Salesperson.Salesperson number, Salesperson.Salesperson email. Vous êtes déjà dans la table Salesperson. Tout dans ce tableau concerne Salesperson. Vous n'êtes pas obligé de continuer à le dire.

Utilisez plutôt ID, Email. N'utilisez pas Number car c'est probablement un mot réservé. Vous efforcez-vous vraiment de taper [] autour de chaque nom de champ pour la durée de vie de votre base de données?

Les clés primaires d'une table appelée Student peuvent être soit ID ou StudentID, mais être cohérentes. Les clés étrangères doivent uniquement être nommées en fonction de la table vers laquelle elles pointent suivies de ID. Par exemple: Student.ID et Appointment.StudentID. ID est toujours en majuscule. Je me fiche de savoir si votre IDE vous dit de ne pas le faire car partout sauf que votre IDE sera ID. Même Access aime ID.

Deuxième: Nommez tous vos champs sans espaces ni caractères spéciaux et maintenez-les aussi brefs que possible. Si ils sont en conflit avec un mot réservé, trouvez-en un autre.

Au lieu de: phone number, utilisez PhoneNumber ou mieux encore, simplement Phone. Si vous choisissez what time user made the withdrawal, vous devrez taper cela à chaque fois.

Troisième: Et celui-ci est le le plus important un: Soyez toujours cohérent quel que soit le schéma de nommage que vous choisissez. Vous devriez pouvoir dire: "J'ai besoin du code postal de cette table; son nom va être PostalCode". Vous devriez le savoir sans même avoir à le vérifier, car vous respectiez les règles de nommage. 

Récapitulatif: laconique, pas prolixe. Gardez les noms courts sans espaces, ne répétez pas le nom de la table, n'utilisez pas de mots réservés et mettez en majuscule chaque mot. Surtout, soyez cohérent. 

J'espère que vous suivez mes conseils. C'est la bonne façon de le faire. Ma réponse est la bonne. Vous devriez être extrêmement pédant avec votre schéma de nommage au point d’obsession absolue pour le reste de votre vie sur cette planète.

Remarque: vous devez réellement modifier le nom du champ dans la vue de conception de la table et dans la requête.

0
Bluebaron

Je l'ai rapidement résolu en allant dans "Vue de conception" de la table principale du même formulaire et en plaçant underline (_) entre tous les noms de champs contenant des espaces. Je peux maintenant utiliser les filtres intégrés sans la fenêtre contextuelle gênante sur les problèmes de syntaxe.

0
Kasra

Placez [] autour des noms de champs contenant des espaces (comme le dit Dreden) et enregistrez votre requête, fermez-la et rouvrez-la.

À l'aide d'Access 2016, le message d'erreur apparaissant sur les nouvelles requêtes après l'avoir ajouté [] autour des noms de champs ... jusqu'à ce que la requête soit enregistrée.

Une fois la requête enregistrée (et visible dans la liste des objets), fermée et rouverte, le message d'erreur disparaît. Cela semble être un bug d'Access.

0
Chris H.