Maintenant que tu le dis, oui c'est évident, merci Robi
Maintenant que tu le dis, oui c'est évident, merci Robi
----
Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher
merci de penser à
Au fait.... je ne réponds pas, moi non plus, aux mp
Bonjour,
Un petit passage entre deux indigestions pour vous dire que ça fonctionne, le code suivant sera donc pratiquement le code final :
Il me reste à gérer le fait qu'il n'y ait qu'un seul doublon ou plusieurs et adapter le message.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Private Sub nomCommercial_BeforeUpdate(Cancel As Integer) Dim txt_sql As String, txt_erreur As String Dim lgNb As Long Dim rs As Recordset txt_sql = "SELECT T_Commerces.idCommerce_PK, T_Commerces.nomCommercial, T_Commerces.codeSiren, T_Commerces.numTiers, T_Commerces.raisonSociale, T_Commerces.numVoirie, T_VOIES.VOI_LIBCOMPFIL " _ & "FROM T_VOIES RIGHT JOIN T_Commerces ON T_VOIES.ID_VOIE = T_Commerces.adresseC1_FK " _ & "WHERE sansAccent(Nz(nomCommercial, 0),True)=sansAccent('" & Forms!F_Commerces!nomCommercial & "',true);" txt_erreur = "" Set rs = CurrentDb.OpenRecordset(txt_sql) If rs.EOF Then lgNb = 0 Else rs.MoveLast lgNb = rs.RecordCount End If If lgNb > 0 Then rs.MoveFirst txt_erreur = "Risque de doublon détecté." & vbCrLf & "Ce nom commercial est déjà enregistré pour " & lgNb & " commerce(s)." & vbCrLf & _ "Souhaitez-vous afficher la liste détaillée de ce(s) commerce(s) ?" & vbCrLf & "Cliquez sur Oui pour afficher la liste, sur Non pour confirmer la saisie." If MsgBox(txt_erreur, vbYesNo + vbExclamation) = vbNo Then Cancel = True Else DoCmd.OpenForm "F_Doublons" Forms!F_Doublons.RecordSource = txt_sql Forms!F_Doublons.OrderBy = "[nomCommercial] ASC" Forms!F_Doublons.OrderByOn = True Exit Sub End If End If rs.Close Set rs = Nothing End Sub
Deux dernières questions, quand on modifie un nom commercial par erreur et qu’on le remet tout de suite, cet enregistrement est détecté comme un doublon potentiel.
Peut-on faire en sorte que si tentative de modification il y a mais rétablissement instantané, ce ne soit pas considéré comme un doublon ?
Je voudrais aussi faire une détection de doublon sur deux champs d'une table. Ça concerne la facturation pour une année associée à un numéro de titre.
L'ensemble (année ET numéro de titre) ne doivent pas se répéter, sauf cas particulier. C'est le cas particulier qui pose problème car sinon j'utiliserais l'index sur deux champs dans le mode création de la table mais comme il empêche purement la simplement la création de doublons ça ne va pas.
Comment spécifier deux champs dans le code ci-dessus ?
Merci encore et tous mes vœux pour 2015
fais attention à une chose,
dans ton code si tu fais un cancel=true, tu n'enregistres rien du tout, en revanche si tu ouvres le deuxième ecran tu enregistres, c'est ce que tu veux ?
----
Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher
merci de penser à
Au fait.... je ne réponds pas, moi non plus, aux mp
Non en effet, c'est une des choses dont je dois m'occuper, pas trop eu le temps ces derniers jours mais ça va être fait !
J'ai continué à jouer les apprentis-sorciers et je pense utiliser ceci comme code final. Je suis passé sur l'évènement apresMAJ plutôt que avantMAJ, du coup je ne peux plus utiliser cancel = true mais ce n'est pas grave. J'ai aussi opté pour un message d'avertissement plus minimaliste :
Je n'ai toujours pas trouvé comment ignorer la modification puis rétablissement du nom commercial qui fait qu'un doublon est détecté, peut-être que ce n'est pas possible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 Private Sub nomCommercial_AfterUpdate() Dim txt_sql As String, db As String Dim lgNb As Long Dim rs As Recordset txt_sql = "SELECT T_Commerces.idCommerce_PK, T_Commerces.nomCommercial, T_Commerces.codeSiren, T_Commerces.numTiers, T_Commerces.raisonSociale, T_Commerces.numVoirie, T_VOIES.VOI_LIBCOMPFIL " _ & "FROM T_VOIES RIGHT JOIN T_Commerces ON T_VOIES.ID_VOIE = T_Commerces.adresseC1_FK " _ & "WHERE sansAccent(Nz(nomCommercial, 0),True)=sansAccent('" & Forms!F_Commerces!nomCommercial & "',true);" Set rs = CurrentDb.OpenRecordset(txt_sql) If rs.EOF Then lgNb = 0 Else rs.MoveLast lgNb = rs.RecordCount End If If lgNb > 0 Then rs.MoveFirst db = IIf(lgNb > 1, "les doublons potentiels", "le doublon potentiel") If MsgBox("Ce nom commercial est déjà enregistré " & lgNb & " fois." & vbCrLf & _ "Souhaitez-vous visualiser " & db & " ?", vbYesNo + vbExclamation) = vbYes Then DoCmd.OpenForm "F_Doublons", , , , , , lgNb Forms!F_Doublons.RecordSource = txt_sql Forms!F_Doublons.OrderBy = "[nomCommercial] ASC" Forms!F_Doublons.OrderByOn = True End If End If rs.Close Set rs = Nothing End Sub
Je viens par contre de voir un autre problème, quand il y a une ' dans le nom commercial il y a une erreur de syntaxe. Je pense qu'il faut doubler les ' mais comment faire ça automatiquement ?
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHERE sansAccent(Nz(nomCommercial, 0),True)=sansAccent('" & Forms!F_Commerces!nomCommercial & "',true)
tu as 2 manières d'indiquer une chaine de caractère, soit le ' comme tu as fait ( mais le problème est justement quand ta rubrique contient le même caractère )Je viens par contre de voir un autre problème, quand il y a une ' dans le nom commercial il y a une erreur de syntaxe. Je pense qu'il faut doubler les ' mais comment faire ça automatiquement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHERE sansAccent(Nz(nomCommercial, 0),True)=sansAccent('" & Forms!F_Commerces!nomCommercial & "',true)
soit le " mais du coup le problème se décale puisque ce caractère est utilisé dans la construction de l'ordre....
tu peux contourner le problème avec l'utilisation de la valeur ascii du caractère " soit chr(34) ton ordre devient alors:
mais toujours pareil si ta rubrique contient " tu vas encore avoir un souci
Code : Sélectionner tout - Visualiser dans une fenêtre à part WHERE sansAccent(Nz(nomCommercial, 0),True)=sansAccent(" & chr(34) & Forms!F_Commerces!nomCommercial & chr(34) & ",true)
----
Il ne s'agit pas de chercher à tout savoir mais de savoir où tout chercher
merci de penser à
Au fait.... je ne réponds pas, moi non plus, aux mp
Merci pyloupylou, ça fonctionne comme ça, en effet le problème est reporté sur les " mais ce n'est pas grave je ferai avec.
Je considère que le problème est résolu, je n'ai pas réussi à faire tout ce que je voulais mais les accents sont bien gérés et c'était la question initiale.
Merci pour votre aide Robi et pyloupylou, à bientôt
Tout a fait vrai ! je gère un dictionnaire, et pour des variantes d'orthographe avec une même racine sans accents, il y a des variantes normales, ex: entêtes, entêtés, et les fautes d'orthographes = d'accents ex: entètes, d'où le besoin vital de cette fonction. Les programmeurs se comportent parfois de façon un peu carrée, malgré que tout n'est pas si évident ... pour eux ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager