sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 novembre 2010
-
6 nov. 2010 à 12:54
sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 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
A voir également:
Comment controler une saisie d'un utilisateur dans une base access
mulder69
Messages postés36Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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..)
mulder69
Messages postés36Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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.
sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 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
mulder69
Messages postés36Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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.
mulder69
Messages postés36Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention10 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
sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 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
sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 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
sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 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).
sanndr
Messages postés37Date d'inscriptionjeudi 21 octobre 2004StatutMembreDernière intervention13 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 !!!