Comment controler une saisie d'un utilisateur dans une base access

Résolu
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010 - 6 nov. 2010 à 12:54
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010 - 13 nov. 2010 à 10:37
Bonjour !

Je suis un débutant en VB6 et access et je cherche à controler la saisie d'un utilisateur ( zone de saisie) pour savoir si elle n'existe pas déjà dans ma base access.
Je suppose qu'il faut imbriquer une boucle avant d'effectuer l'enregistrement, mais je ne sais pas ou , ni comment !!!

Public rs As Recordset
Public sql As String
Dim outil As String
Dim datesysteme As Date
Dim rep As Integer

sql = "select * from outillages 'on selection tous les champs de la table"
Set db = OpenDatabase("D:\nestor\programme VB\emprunt1.mdb")
Set rs = db.OpenRecordset(sql, dbOpenDynaset)

datesysteme = Date
outil = UCase(txt_nom_outil) 'récupére le nom de la cellule et passe en Majuscule avec la fonction " Ucase "

If outil <> "" Then
'demande de confirmation de l'utilisateur
reponse = MsgBox("Voulez-vous confirmer votre enregistrer :" & outil, 292, "Confirmation") 'test de la reponse
If reponse = 6 Then
'pour enregistrer une saisie dans la table

rs.AddNew ' on va ajouter un enregistrement au recordset
rs.Fields("date création") = datesysteme
rs.Fields("nom outil") = txt_nom_outil ' on ajoute les données dans le champ de la table
rs.Update ' une fois les valeurs définies, on met à jour notre Recodset
rs.Close
ReINDEX
Else
Unload Me

Set rs = Nothing 'Libération de la mémoire allouée
End If
Else
rep = MsgBox("Vous-devez saisir un outil !!! ", 16, "Erreur")
End If

Voila ! Je vous remercie pour votre aide !




nesnes

25 réponses

mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
6 nov. 2010 à 15:27
Bonjour Snndr,

Pourquoi ne crée-tu pas un requête en LIKE avant l'ajout de ton nouvel outil pour vérifier si celui-ci n'existe pas déjà? (enfin, si j'ai bien compris ce que tu désirais faire..)

@ Bientôt
3
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
6 nov. 2010 à 15:45
ok je vais faire un test
je te tiens au courant

merci

nesnes
3
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
6 nov. 2010 à 15:53
Attention tout de même avec ton algo puisque pour un LIKE "scie", "scie égoïne" et" scie circulaire", c'est la même chose..
3
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
6 nov. 2010 à 16:35
ok j'arrive a passer ma requete, mais je ne sais pas comment recupérer le résutat pour faire un test!
cela doit être un rs. quelque chose !!!

nesnes
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
6 nov. 2010 à 18:32
Après avoir exécuté ta requête en LIKE, utilise rs.recordcount
Si rs.recordcount = 0 alors il n'y a pas dans ta base de donnée des éléments qui se rapprochent de celui entré par l'utilisateur.

Attention, je dis bien "se rapprochent" par ce que avec le LIKE, si ton utilisateur entre "scie egoine" et qu'il y a dans ta base "scie circulaire", ton recordset.recordcount sera égal à 1 et donc tu ne pourra pas savoir si c'est "scie égoïne" ou "scie circulaire" qui a précédemment été rentré en base.

dans ce cas là, remplace le LIKE par un SELECT * FROM MaTable WHERE NomOutil "Scie égoïne"

Attention toujours a la l'écriture, "SCIE CIRCULAIRE" et "scie circulaire" sont 2 éléments différents pour la requête.

Voila
3
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
7 nov. 2010 à 14:19
Houla, beaucoup de code pour pas grand chose.. et pas mal d'erreur aussi, c'est pour cela que ton recordset semble vide.

je reviens plus tard pour t'aider à corriger cela

@+
3
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
7 nov. 2010 à 14:27
Juste une question, tu programme en quoi?
3
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
7 nov. 2010 à 17:56
en VB6

nesnes
3
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
7 nov. 2010 à 18:05
J'ai changer mes connections et maintenant ça passe, mais quand j'arrive à ma boucle, j'ai un message d'erreur qui me dis :BOF ou EOF est à true ou l'enregistrement actuel à étè supprimer !!!
j'ai beau faire un Movefirst aprés mon .open cela ne change rien ! tu vois le probléme ?
regarde plutot ce que j'ai écris

'Déclaration de la variable de connexion
Dim cnx As ADODB.Connection
Set cnx = New ADODB.Connection
'Définition du pilote de connexion
cnx.Provider = "Microsoft.Jet.Oledb.4.0"
'Définition de la chaîne de connexion
cnx.ConnectionString = "D:\nestor\programme VB\emprunt1.mdb"
'Ouverture de la base de données
cnx.Open
'rst.MoveLast
'rst.MoveFirst

datesysteme = Date
outil = txt_nom_outil 'récupére le nom de la cellule et passe en Majuscule avec la fonction " Ucase "

'sql "Select * From outillages where 'nom_outil' '" & outil & "'"
'sql = "select * from outillages 'on selection tous les champs de la table"
Set rst = New ADODB.Recordset
rst.Open "Select * From outillages where 'nom_outil' = '" & outil & "'", cnx
resultat = MsgBox(" le champs est : " & rst.Fields("nom_outil"))

If outil <> "" Then
'demande de confirmation de l'utilisateur
reponse = MsgBox("Voulez-vous confirmer votre enregistrer :" & outil, 292, "Confirmation") 'test de la reponse
If reponse = 6 Then
'rst.MoveFirst
Do Until Not rst.EOF

If rst.Fields("nom_outil") = outil Then
rep = MsgBox("existe déjà !!!", 16, "Erreur")
Else

rs.AddNew ' on va ajouter un enregistrement au recordset
rs.Fields("date création") = datesysteme
rs.Fields("nom_outil") = txt_nom_outil ' on ajoute les données dans le champ de la table
rs.Update ' une fois les valeurs définies, on met à jour notre Recodset
'rs.Close
ReINDEX
End If
rst.MoveNext
Loop
nesnes
3
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
8 nov. 2010 à 14:09
Bonjour Nesnes,

Tu te complique bcp trop la vie.
Si je comprends bien ce que tu veux, tu souhaite pouvoir ajouter dans une base de données (dans un champs "outils") des nom d'outil avec une date d'entrée, après avoir vérifier que ces derniers n'avaient pas déjà été enregistrés dans la base.

Pour ce faire, il faut aller au plus court:

- déclaration des variables nécessaire
- saisie à l'écran de l'outil à enregistrer (dans un textbox par exemple)
- création de ta requête
- ouverture de la BDD
- Exécution de la requête servant à vérifier si ton outil est déjà en base
- Ajout de l'outil ou sortie vers un message stipulant que l'outil est déjà en base

Ce qui donne en code (à peaufiner selon tes besoin; j'ai supposé que sur ta form, tu as un textbox pour entrée l'outil et un bouton valider pour enregistrer, c'est plus simple pour commencer. libre a toi après d'arranger ton code pour que la validation s'effectue avec une touche spéciale ou autre)

Private Sub BoutonAjout_Click()

Dim CN As New ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:BDD.mdb" 'ouverture et chemin de la BDD"

Set RS = New ADODB.Recordset

SQL "SELECT * FROM CLIENT WHERE 'outil' " & textOutil.Text 'requête qui cherche dans la bdd tout les outils identique à celui saisi pour l'utilisateur

RS.Open SQL, CN, adOpenDynamic, adLockOptimistic 'on exécute la requête et on charge les résultat dans le recordset

If RS.recordercount > 0 Then 'on demande au recordset de renvoyer le nombre total de résultat (juste la somme totale) et on verifie si ce nombre est superieur ou pas à 0. si c'est le cas on suppose qu'il existe déjà un outil similaire dans la BDD

MsgBox("existe déjà !!!")

Else ' si le résultat n'est pas supérieur à 0, il est donc égal à 0, il n'existe donc aucun outil similaire à la saisie faite par l'utilisateur

RS.AddNew 'on passe le recordset en mode ajout
RS!Nom_Outils = UCase(textOutil.Text) 'on ajoute l'outil mis en majuscule
RS!Date_Création = Date 'on rajoute directement la date, sans la précharger dans une variable
RS.Update 'on valide l'ajout
Set RS = Nothing 'on libere
End if 'fin de la boucle
End Sub

Voila, tu vois c'est simple, bien évidement, a toi de peaufiner cela pour que cela colle exactement a ton projet.

Tiens moi au jus

@+
3
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
8 nov. 2010 à 16:06
En me relisant, j'ai aperçu une petite erreur:

Si tu compare l'outil saisi aux outils dans la BDD de donnée, ton resultat sera toujours zero puisque tout les outils de la BDD sont en majuscules. ils faut donc les passer en MAJ avant que la requete soit executée




Private Sub BoutonAjout_Click()

Dim CN As New ADODB.Connection
Dim RS As ADODB.Recordset
Dim SQL As String
Dim Outil as String

Outil = Ucase(textOutil.text)

CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:BDD.mdb" 'ouverture et chemin de la BDD"

Set RS = New ADODB.Recordset

SQL "SELECT * FROM CLIENT WHERE 'outil' " & tOutil 'requête qui cherche dans la bdd tout les outils identique à celui saisi pour l'utilisateur

RS.Open SQL, CN, adOpenDynamic, adLockOptimistic 'on exécute la requête et on charge les résultat dans le recordset

If RS.recordercount > 0 Then 'on demande au recordset de renvoyer le nombre total de résultat (juste la somme totale) et on verifie si ce nombre est superieur ou pas à 0. si c'est le cas on suppose qu'il existe déjà un outil similaire dans la BDD

MsgBox("existe déjà !!!")

Else ' si le résultat n'est pas supérieur à 0, il est donc égal à 0, il n'existe donc aucun outil similaire à la saisie faite par l'utilisateur

RS.AddNew 'on passe le recordset en mode ajout
RS!Nom_Outils = Outil 'on ajoute l'outil
RS!Date_Création = Date 'on rajoute directement la date, sans la précharger dans une variable
RS.Update 'on valide l'ajout
Set RS = Nothing 'on libere
End if 'fin de la boucle
End Sub

@+
3
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
8 nov. 2010 à 17:02
Ah oui, j'avais eu le même souci aussi récemment.
quelqu'un du forum m'avait dépatouillé (NHenry)

rajoute la ligne

RS.CursorLocation = adUseClient

juste apres la ligne
Set RS = New ADODB.Recordset

essaie et dis moi si tu a le bon résultat dans ton RS
3
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
13 nov. 2010 à 10:37
bonjour mulder69

J'ai donc reconvertie ma base et maintenant je n'ai plus de probléme, j'ai réussi a faire tous les tests que je voulais !
Je te remercie donc pour ton aide !
@+
nesnes
3
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
6 nov. 2010 à 19:44
J'ai l'impression qu'il ne trouve aucun enregistrement dans ma base, alors qu'elles sont bien présentes !
Quand il passe dans le " If Not rs.EOF " , le résultat est VRAI, donc pas d'enregistrement !
voici le code que j'ai écrit .
dis moi si tu vois des erreurs !
pour info ! j'ai convertis ma base access 2006 en 2000, la est peut être le probléme !!!


Dim outil As String
Dim reponse As Integer
Dim datesysteme As Date
Dim rep As Integer
Dim resultat As String
Dim sql As String


datesysteme = Date
outil = UCase(txt_nom_outil) 'récupére le nom de la cellule et passe en Majuscule avec la fonction " Ucase "

sql "Select * From outillages where 'nom_outil' '" & outil & "'"
'sql = "select * from outillages 'on selection tous les champs de la table"
Set rs = db.OpenRecordset(sql)


If outil <> "" Then
'demande de confirmation de l'utilisateur
reponse = MsgBox("Voulez-vous confirmer votre enregistrer :" & outil, 292, "Confirmation") 'test de la reponse
If reponse = 6 Then
'pour enregistrer une saisie dans la table
If Not rs.EOF Then
While Not rs.EOF
'rs.MoveFirst
If IsNull(rs.Fields("nom_outil").Value) = False Then
resultat = rs.Fields("nom_outil").Value
Else
resultat = ""
End If
rs.MoveNext
Wend
If resultat = outil Then
rep = MsgBox("existe déjà !!!", 16, "Erreur")


Else
rs.AddNew ' on va ajouter un enregistrement au recordset
rs.Fields("date création") = datesysteme
rs.Fields("nom_outil") = txt_nom_outil ' on ajoute les données dans le champ de la table
rs.Update ' une fois les valeurs définies, on met à jour notre Recodset
rs.Close
ReINDEX
End If
Else
Unload Me
End If
rs.Close 'Fermer le recordset
Set rs = Nothing 'Libération de la mémoire allouée
Else
rep = MsgBox("Vous-devez saisir un outil !!! ", 16, "Erreur")
End If
End If


nesnes
0
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
8 nov. 2010 à 15:48
Bonjour mulder69 !

Effectivement, je vois que j'ai fais plutôt compliqué comparer a ton code.
Je vais donc utilisé ton code et faire des tests, je te tiens au courant quand j'ai terminer (probablement demain).

Merci
@+

nesnes
0
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
8 nov. 2010 à 16:36
effectivement, j'avais bien vu. mais j'ai quand même un souci avec le recordcount,il affiche -1 donc dans tout les cas il fait un update !
quand je regarde dans MSDN, il me dit que le BOF du recordset est à true, donc placer avant le premier enregistrement.
La je ne vois pas ce qu'il faut faire !!!

nesnes
0
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
8 nov. 2010 à 18:18
Il y a 0 en permanence dans le recordcount, il fait donc des updates !!!

nesnes
0
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
8 nov. 2010 à 18:47
On a déjà plus -1 dans le rs.recordcount, ce qui est bon signe.

Ta base Access se remplie t'elle malgré tout? (je veux dire se remplir réellement)

Si tu tapes 2 fois le même outil (avec exactement la même écriture) que se passe t'il? sont-ils en doublons dans ta base?
0
sanndr Messages postés 37 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 13 novembre 2010
8 nov. 2010 à 19:00
oui il écrit le même outil sans aucun probléme !

nesnes
0
mulder69 Messages postés 36 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 10 novembre 2010
8 nov. 2010 à 19:24
Met un point d' arrêt a la ligne
Rs!date création = date

Et dis moi ce qu il y a dans la variable outil
0
Rejoignez-nous
A voir également