Alerte doublon sur champ calculé [Résolu]

Signaler
Messages postés
227
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
22 août 2020
-
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
-
Bonjour,

Access ne permettant pas de créer un index sans doublon sur un champ calculé,
j'ai tenté ceci


Dans mon formulaire de saisie des appels de fonds d'un Syndic,
Il y a un appel de fonds par trimestre
En conséquence dans la table à laquelle est adossé mon formulaire
J'ai créé une liste déroulante Champs "Libellé" Qui contient les valeurs suivantes :
1er Appel de Fonds
2ème Appel de fonds
3ème Appel de fonds
4ème Appel de fonds
Avec ensuite un champ "Date dépenses"qui a pour valeur par défaut Maintenant()

Puis un champ calculé "DetectDoublon" (que je rendrai invisible par la suite)
dont la source de contrôle est la suivante : =[Libellé] & Année([Date dépenses])
J'ai vérifié la concanétation fonctionne correctement

Ensuite j'ai créé cet évènement après la mise à jour du champ Libellé

Private Sub Libellé_AfterUpdate()
If DCount(Me.DetectDoublon <> 0) Then
MsgBox "Cet ajout Ferait un doublon !", vbCritical
Cancel = True
End If
End Sub

Avec ou sans doublon j'obtiens cette message Box

Erreur de compilation
Argument non facultatif

Pouvez-vous m'aider, je tourne en rond !!!!



Configuration: Windows / Firefox 75.0

3 réponses

Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
bonjour, je suppose que DetectDoublon n'est pas un champ d'une table, et est un contrôle dans un formulaire.
as-tu essayé en retirant dcount?
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
peut-être veux-tu faire ceci:
dcount("Libellé","lenomdelatable", "[Libellé] & Année([Date dépenses]='"& Me.DetectDoublon & "'")

ce que tu peux aussi faire sans le contrôle DetectDoublon.
Messages postés
227
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
22 août 2020
1
Votre solution ne fonctionne pas !!!
Messages postés
227
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
22 août 2020
1
Je viens de trouver la solution, ça fonctionne super bien !!!
La voici expliquée en détail

Détecter Doublon sur champ Calculé de ma table Dépenses Charges Syndic

Dans cette table, créer un champs calculé "DetectDoublon" qui concatène certains champs dans leur ordre de saisie :

= Année([Date dépenses])&"-"&[Libellé] & "-" & [Réf A-P Syndic]

Ensuite créer une requête "Doublons pour Dépenses Charges SyndicReq" qui Recherche les doubons sur le champs "DetectDoublon" de cette table :
Code Sql :
SELECT [Dépenses Charges Syndic].DetectDoublon, [Dépenses Charges Syndic].Libellé, [Dépenses Charges Syndic].[Réf A-P Syndic], [Dépenses Charges Syndic].[Date dépenses]
FROM [Dépenses Charges Syndic]
WHERE ((([Dépenses Charges Syndic].DetectDoublon) In (SELECT [DetectDoublon] FROM [Dépenses Charges Syndic] As Tmp GROUP BY [DetectDoublon] HAVING Count(*)>1 )))
ORDER BY [Dépenses Charges Syndic].DetectDoublon;

Ensuite dans le formulaire adossé à la saisie des datas de cette table ;
dans l'évènement Après mise à jour du dernier champs saisi en l'occurence le champ "Réf A-P Syndic"
je rentre ce code VBA :

Private Sub Réf_A_P_Syndic_AfterUpdate()
If DCount("*", "Doublons pour Dépenses Charges SyndicReq", Me.DetectDoublon) > 0 Then
MsgBox "Cet ajout ferait un doublon !", vbCritical
Cancel = True
End If
End Sub

ça fonctionne super bien
Messages postés
12654
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 octobre 2020
702
je me demande si tu ne peux pas simplifier ta requête et ne garder que:
SELECT [DetectDoublon],count(*) 
FROM [Dépenses Charges Syndic]  
GROUP BY [DetectDoublon] 
HAVING Count(*)>1

ou même, sans utiliser le champ calculé, qui ne sert peut-être à rien:
SELECT Année([Date dépenses]), [Libellé], Réf A-P Syndic], count(*) 
FROM [Dépenses Charges Syndic]  
GROUP BY  Année([Date dépenses]), [Libellé], Réf A-P Syndic]
HAVING Count(*)>1

dans les deux cas, supprimer la troisième paramètre de dcount