Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Modélisation
Modélisation Le forum qui vous aide à résoudre vos questions relatives à la modélisation (tables et relations) de votre base de données sous Access. Pour les états et les formulaires, postez dans le forum IHM.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/09/2007, 20h14   #1
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Par défaut Aide Contrainte d'integrité

Bonjour, je suis un noob en access et j'aurai besoin de petits conseils pour gerer les jeux et concours du net.
Sous access 2007, j'ai donc une base Concours qui ne contient qu'une table concours.
Chaque concours est reférecé par un N° concours.
Ce que j'aimerai (en mode feuille) c'est que lorsque j'entre un numéro deja enregistré qu'access m'envoit un message comme quoi j'ai deja participé a ce concours. J'ai tenté des trucs avec la proprieté "Valide si" mais je pense ne pas avoir entrer la contrainte correctement. Donc si quelqun pouvait me donner la syntaxe ou la solution ca serai sympa.
Ensuite, a chaque concours correspond un intitulé, un login et un mot de passe, j'aimerai que lorsque j'entre un intitulé deja existant que les champs login et mot de passe se remplissent automatiquement.
Merci d'avance.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 20h36   #2
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
pour la première question:
dans ta table sur le champ dans le champ "indexé" met à "Oui-Sans doublons"
pour ne pas permettre de doublons.

pour la seconde:
sur l'événement avant maj
tu peux vérifier l'existance de la valeur avec DLookUp
puis activer le filtre sur la valeur saisie si elle existe.

ps:bienvenu sur le forum
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2007, 22h12   #3
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Merci pour la rapidité.
En ce qui concerne les doublons j'ai deja essayé et ca marche mais le message apparait seulement une fois que je passe a l'enregistrement suivant alors qu'avec la proprieté "Valide si" il suffit de passer au champ suivant pour savoir si j'ai deja joué et je peu personnaliser le message.
J'ai essayé avec ceci Valide si "<>", <> "SELECT Concours.[N° Concours] FROM Concours;" , <> [N° Concours] , dans tous les cas je recois mon message mais il considere tout comme erreur.
Pour la seconde cela me parrait une bonne idée mais je ne sais absolument pas comment me servir de cette fonction ni a quel endroit le faire, syntaxe ect... Un peu plus de precision serai sympa, je fais vraiment ca en amateur.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 01h16   #4
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
bon,

sur l'événement avant MAJ de ton champ 'n°concours':
Code :
1
2
3
4
5
if DLookUp("[n° concours]","concours","[n° concours]='" & monchampConcours.text & "'") then
'trouvé
msgbox "il y a déjà un concours"
cancel=true
end if
sur l'événement avant MAJ de ton champ 'intitulé':
Code :
1
2
3
4
5
if DLookUp("[intitulé]","concours","[intitulé]='" & monchampIntitule.text & "' AND [n° concours]='" & monchampConcours & "'") then
'trouvé
monchampLogin=DLookUp("[login]","concours","[intitulé]='" & monchampIntitule.text & "' AND [n° concours]='" & monchampConcours & "'")
monchampMotdePasse=DLookUp("[Mot de passe]","concours","[intitulé]='" & monchampIntitule.text & "' AND [n° concours]='" & monchampConcours & "'"
end if
bon faut revoir l'adaptation à tes références, c'est du brut alors je te laisse vérifier si ca te convient.
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2007, 20h37   #5
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Merci beaucoup pour tout ce que tu a fais. Je teste des que j'ai le temps et je te tiens au courant.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2007, 21h25   #6
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Alors lorsque je procede comme tu dis, lors de l'execution j'ai une fenetre macros qui apparait me demandant un nom pour la macro, je rentre un nom et il crée un module avec ce code:
Sub verif()

End Sub
J'execute la macro et quand je rentre mon n° concours, j'obtiens erreur d'execution 424 objet requis.
Si je ne crée pas la macro et en passant direct sous access pareil.
Les references de ton code sont bonnes si tu parles du nom des champs.
Voila.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2007, 22h49   #7
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
en mode création de ton form,
tu selectionne la zone de texte 'n°concours'
dans les propriétes, événement, tu sélectionnes la propriété Avant MAJ
sur les trois petit points '...' tu choisi générateur de code
tu y mets le code:
Code :
1
2
3
4
5
6
7
Private Sub n°concours_BeforeUpdate(Cancel As Integer)
If DLookup("[n° concours]", "concours", "[n° concours]='" & [n°concours].Text & "'") Then
'trouvé
MsgBox "il y a déjà un concours"
Cancel = True
End If
End Sub
tu procède de même pour 'intitulé'
remplace monchampConcours,monchampIntitule,monchampLogin,monchampMotdePasse par le nom de tes zone de texte.

bon courage
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2007, 01h21   #8
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Alors, la première fonctionne tres bien mais pour la seconde rien ne s'affiche lorsque j'entre un intitulé deja enregistré et il n'y a pas d'erreur.
Voici le code que j'ai entré :

Code :
1
2
3
4
5
6
7
Private Sub Intitulé_BeforeUpdate(Cancel As Integer)
If DLookup("[Intitulé]", "concours", "[Intitulé]='" & [Intitulé].Text & "' AND [n° concours]='" & [n° concours] & "'") Then
'trouvé
Login = DLookup("[Login]", "concours", "[Intitulé]='" & [Intitulé].Text & " 'AND [n° concours]='" & [n° concours] & "'")
[Mot de Passe] = DLookup("[Mot de passe]", "concours", "[Intitulé]='" & [Intitulé].Text & "' AND [n° concours]='" & [n° concours] & "'")
End If
End Sub
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/10/2007, 21h49   #9
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Alors mon probleme est en partie reglé.
Pour ma seconde question j'ai utilisé un recordset et cela fonctionne tres bien.
J'en reviens a la premiere.
Ce code :

Code :
1
2
3
4
5
6
Private Sub N°_Concours_BeforeUpdate(Cancel As Integer)
If DLookup("[n° concours]", "concours", "[n° concours]='" & [n° concours].text & "'") Then
MsgBox "Déja participé !!"
Cancel = True
End If
End Sub
Fonctionne bien si mon champs [n° concours] est de type texte mais si je le passe en numerique cela ne marche plus. J'ai essayé avec .value, pareil.
Si j'ai bien compris les bases je pense qu'il est donc possible d'utiliser un recordset pour cette procedure mais ca devient trop dur pour moi.
Merci d'avance si vous pouvez m'aider.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 01h24   #10
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Plus important que mon precedent post, que j'ai a peu pres reglé en demandant une verification du format de la valeur (mais je suis pas contre une autre explication). J'ai un peu vite parlé en disant que l'affichage automatique du login marchait bien.
Voici le code

Code :
1
2
3
4
5
6
7
8
9
Private Sub Intitulé_BeforeUpdate(Cancel As Integer)
Dim bd As DAO.Database
Dim rst As DAO.Recordset
Set bd = CurrentDb
Dim sql As String
sql = "SELECT * FROM Concours WHERE [Intitulé]= '" & [Intitulé].Text & "';"
Set rst = bd.OpenRecordset(sql)
Login.Value = rst![Login]
End Sub
En fait lorsque j'entre un intitulé existant cela affiche bien le login correspondant mais lorsque j'entre un intitulé non existant j'obtiens une erreur.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2007, 02h03   #11
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
si tu passes par les recordset, ce que je ne te recommande pas bien que cela marche, il faut utiliser les méthodes de celui ci pour vérifier qu'il retourne des enregistrements
soit
l'usuel: .nomatch
après un repositionnement au début ensuite: .eof
soit le plus commun: .RecordCount

pour ce qui est de l'utilisation de valeur numérique cela ne marche pas il faut le transformer en texte avec CStr() ou .text mais il faut pas mettre entre guillement ou apostrophe sinon il considère comme tu texte et ne renverra rien.

càd:
dans le critère d'un dlookup par ex il faut:
"[monchamp]='123'" si monchamp est du texte
"[monchamp]=123" si monchamp est un nombre
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 20h48   #12
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Merci encore pour ton aide Vodiem mais la je galere vraiment avec mon affichage automatique. D'apres ce que j'obtiens avec le code du poste precedent je me dis qu'une partie du code est bonne mais qu'il manque une petite condition. Ma logique me dit que ce code devrait fonctionner :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Intitulé_BeforeUpdate(Cancel As Integer)
Dim bd As DAO.Database
Dim rst As DAO.Recordset 
Set bd = CurrentDb
Dim sql As String
if sql = "SELECT * FROM Concours WHERE [Intitulé]= '" & [Intitulé].Text & "';" then
Set rst = bd.OpenRecordset(sql)
Login.Value = rst![Login]
Else
Login.Value = "xkira"
End If
End Sub
Mais cela provoque une erreur et ne me retourne rien. En cherchant sur le net j'ai pompé different bout de code et j'ai tenté des trucs dans ce style :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Intitulé_BeforeUpdate(Cancel As Integer)
Private Sub Intitulé_BeforeUpdate(Cancel As Integer)
Dim bd As DAO.Database
Dim rst As DAO.Recordset
Set bd = CurrentDb
Dim sql As String
sql = "SELECT * FROM Concours WHERE [Intitulé]= '" & [Intitulé].Text & "';"
Set rst = bd.OpenRecordset(sql)
If (rst.NoMatch) Then
Login.Value = "xkira"
Else
Login.Value = rst![Login]
End If
End Sub
Mais je n'arrive a rien. J'aurai vraiment besoin d'un coup de pouce car je commence a devenir fou alors que j'ai l'impession d'etre pres du but.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 12h40   #13
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
salut,
Code :
if sql = "SELECT * FROM Concours WHERE [Intitulé]= '" & [Intitulé].Text & "';" then
n'a pas de sens "sql" est initialement une variable string vide elle ne peut être égal à "select...".

dans le deuxième code:
Code :
Private Sub Intitulé_BeforeUpdate(Cancel As Integer)
est en double? ca va provoquer une erreur...

sinon c'est correct mais tu vas récupérer le premier intitulé correspondant quelque soit le concours tu es sur que c'est ca que tu veux?
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 16h19   #14
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Le code en double est seulement une erreur de copier/coller dans mon post.
Le code ci dessus me donne bien le login correspondant lorsque j'entre un intitulé deja existant independemment du n° concours (c'est tout ce que je veux). Au cas ou l'intitulé n'existe pas je voudrais le login "xkira" par defaut.
En entrant un intitulé non existant j'obtiens cette erreur "Valeur non valide pour ce champs" sur cette ligne "Login.Value = rst![Login]", donc impossible d'enregistrer un concours avec un nouvel intitulé.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 21h57   #15
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
bon si tu veux bien poster un extrait de ta bd compacté et zippé pour l'on puisse voir ce qui se passe chez toi et te faire les modifs nécessaires, histoire de finir ca avant les fêtes...
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 23h15   #16
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
C'est vrai que ca commence a faire un bail mais ca m'a permis d'apprendre pas mal de choses en fait.
J'apporte alors quelques precisions, mon champs Login est amené a etre une liste deroulante.
La base compactée comporte toutes les sortes d'enregistrements que je suis amené a faire.
Concernant mon N° Concours j'aimerai qu'une fois que le message "Deja participé" apparait qu'il passe a un nouvel enregistrement vierge en appuyant sur "ok".
Cette base a évoluée depuis sa création donc ne vous etonnez pas que des champs soient vides alors qu'ils devraient etre pleins.
Merci d'avance, je pense que c'est la meilleure solution si je veux gagner une voiture pour ma mere avant noel.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 23h32   #17
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
je ne peux pas lire de ".accdb" met le ".mdb"
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 00h42   #18
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Voilà une version mdb access 2002-2003.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 01h04   #19
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 897
Points : 3 897
oui nomatch ne fonctionne pas dans ce cadre là.

en version recordset:
Code :
1
2
3
4
5
6
7
8
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Concours WHERE [Intitulé]= '" & [Intitulé].Text & "';")
 
If rst.RecordCount = 0 Then
    Login = "xkira"
Else
    Login = rst![Login]
End If
là même en version dlookup:
Code :
1
2
3
4
5
6
resultat = DLookup("[login]", "[concours]", "[Intitulé]='" & [Intitulé].Text & "'")
If IsNull(resultat) Then
    Login = "xkira"
Else
    Login = resultat
End If
j'ai pas regardé comment tout ca fonctionne si c'est bien ce que tu attends...
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 03h28   #20
Invité de passage
 
Inscription : septembre 2007
Messages : 17
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 17
Points : 1
Points : 1
Victoire.
Alors ca marche tres bien enfin.
Si tu pouvais juste encore voir pour mon n°concours lorsqu'il y'a une msgbox pour qu'il passe (ou annule) a un nouvel enregistrement vierge apres je te lache promis.
1000 mercis.
xkira est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h54.


 
 
 
 
Partenaires

Hébergement Web