Aide sur ADO

Résolu
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008 - 15 sept. 2008 à 21:51
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 16 sept. 2008 à 17:09
Bonjour à tous ^^,
je vous explique mon problème!
Je suis débutant sur ADO ... Dans un projet je dois parcourir un recordset et faire une reherche voila comment g procédé: g crée une fonction dans le module pour pouvoir l'appeler dans tout le projet comme suit:

records est le recordset et x l'élément recherché

Public Function rechmat(records, x) As Boolean

records.MoveFirst
rechmat = False
While records.EOF = False
If Trim(x) = Trim(records!Matricule) Then
rechmat = True
Exit Function
Else
records.MoveNext
End If
Wend

End Function


cela marche tres bien cependant je voudrais faire une fonction qui puisse me servir pour n'importe quel element, po seulement "Matricule"!!!! g essayé ceci mais ca ne marche po :

Public Function rechmat(records, x, elmt) As Boolean
records.MoveFirst
rechmat = False
While records.EOF = False
If Trim(x) = Trim(records!elmt) Then
rechmat = True
Exit Function
Else
records.MoveNext
End If
'Wend

End Function

Si quelqu'un a une petite idée ^^ merci d'avance.

45 réponses

harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 02:26
^^ Je vienderais plus souvent vous casser la tete avec mes problèmes alors loool
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 02:34
N' oublies pas de valider si la réponse est accèptée
A+
<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 02:37
euuh j'ai appuyé tout à lheur sur réponse acceptée... c ca?
0
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 02:47
Au fait je viens d'essayer un truc ^^ parceque je sentais que le problème etait au niveau du recodset alors dans la déclaration  de la fonction g supprimé le "as recodset" comme ceci:

Public Function rechmat(rs, x As Variant, y As String) As Boolean


   rs.MoveFirst
    rechmat = False
    Do While rs.EOF = False
        If x = rs.Fields(y) Then
            rechmat = True
            Exit Function
        Else
            rs.MoveNext
        End If
    Loop
   
End Function

et dans la déclaration:

Private Sub mat_Change()
Dim x As Variant
 x = mat.Text
    If rechmat(rse, x, "Matricule") = True Then
        nom.Text = rse!nom
    End If
End Sub

et ca a marché !!! comme ca dans ma form une fois que je quitte le champ matricule le nom s'affiche !!!!
merci encore :) j'y serai jamais arrivé sans toi
0

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

Posez votre question
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 03:14
Oui c' est parceque' un recordset doit être passé ByVal et pas par Ref.
Le ByVal étant par défaut, ça marche juste avec: rs, x As Variant, y As String

Encore deux ou trois plus trucs..
1° Evites l' événement Change()
 Pourquoi ?
 Parceque ta fonction se déclenchera dès que tu tapes un caractère.
 Elle se déclenchera aussi si tu supprimes le contenu de la textbox
 pour saisir autre chose.
 Utilises un ButtonCommand pour lancer la recherche.
 
2°Pour faire une fonction générale, fais ta recherche avec un recordset local en passant en paramètre le nom de la table dans laquelle tu veux effectuer la recherche.
 Exemple:


 Public Function rechmat(xTable As String, x As Variant, y As String) As Boolean
   Dim rs As RecordSet
Set rs=CurrentDB.OpenRecordSet(xTable,dbOpenSnapshot)
    If rs.Eof And rs.Bof Then
      MsgBox "Table vide!"
      Exit Function
    End If
   
    rs.MoveFirst
    rechmat = False
    Do While rs.EOF = False
        If x = rs.Fields(y) Then
            rechmat = True
            Exit Function
        Else
            rs.MoveNext
        End If
    Loop
   
End Function


Lors de l' appel tu fais comme ceci par exemple
If rechmat("Employés",xValeur,"Matricule")=True Then
...

NB: CurrentDB désigne ta bas de donnée ouverte.
Tu peux utiliser une variable(xDb par exemple)


Et dernière chose, nommes la d'un nom général.


Cette fonction te servira pour toutes tes applications.


 








 





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 03:25
Encore merciii :) c'est vraiment trop gentil de votre part!!!!! Vous etes les meilleurs ^^ je posterai plus souvent!!!! lol Vous l'avez cherché
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 03:42
A notre tour de te faire travailler !
Enoncé de l' exercice:
1° Faire la recherche avec FindFirst.
   a) Valeur exacte
      Rechercher "Mohamed"
   b) valeur partielle
      Rechercher tous les noms commençant par "Mo"

Si tu veux être l' un des meilleure..

Top Chrono !

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 sept. 2008 à 03:54
VB6 => ByRef par défaut :)
0
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 03:58
hehehe c po vraiment le moment pour reflechir tu c loool 1h50 du mat + la periode du ramadan loool
mais je dirai:
a- "nom de la base de données".Recordset.FindFirst [Nom] ="Mohamed" nn?
b-  Euuuuh je jette un coup d'oeil sur google lol
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 03:59
Oui PCPT, je m' en doutais
car en fait n son rs étant publique et étant donné qu' il le oasse comme tel
c à d en y faisant REFERENCE, le As RecordSet était de trop.

S' il a fait par exemple xRs là il fallaut ajouter As RecorSet.
Enfin je crois
Je n' ose plus être catégorique

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 sept. 2008 à 04:23
harmedevil
mettait :
        If x = records.Fields(y) Then

libre_max tu as mis :
     If x = rse.Fields(xChp) Then

youhou çà marche...

ah bon?

beh ouai, l'erreur de type était un BYREF de Type RECORDSET attendu, mais pas d'erreur pour le non RSE inconnu?

réponse : soit le RS (peu importe le nom) est déclaré en public NOM_RS (donc implicitement "as variant"), soit il n'est même pas déclaré....

byval ou byref, recordset pour un variant, VB n'aime pas trop ^^
<hr size="2" width="100%" />Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 05:19
De retour chez moi.
Bien installé et surtout bien éclairé

-beh ouai, l'erreur de type était un BYREF de Type RECORDSET attendu,
Exact !




-mais pas d'erreur pour le non RSE inconnu?



Son tour viendera après qu' il eut passé la première erreur.


Erreur ;"Objet ou bloc with non défini"






réponse : soit le RS (peu importe le nom) est déclaré en public NOM_RS (donc implicitement "as variant")



S' il est déclaré, tout laisse à croire que c' est ainsi:
Public rs As RecordSet


> As Recordset et implicitement As RecordSet.
Que vient faire le Variant là dedans ?
 




, soit il n'est même pas déclaré...



l' erreur se rèfèrera à rse: Erreur ;"Objet ou bloc with non défini"
Car le rs sera considéré comme argument et non une variable.
Et on est pas obligé de déclarer les arguments.


Rappel : ce qui maechait pour lui c' était:




il a écrit:
Au fait je viens d'essayer un truc ^^ parceque je sentais que le problème etait au niveau du recodset alors dans la déclaration  de la fonction g supprimé le "as recodset" comme ceci:





Public Function rechmat(rs, x As Variant, y As String) As Boolean





   rs.MoveFirst
    rechmat = False
    Do While rs.EOF = False
        If x = rs.Fields(y) Then
            rechmat = True
            Exit Function
        Else
            rs.MoveNext
        End If
    Loop
   
End Function



Pour moi ça auraut été une erreur s' il avait mis
Public Function rechmat(rs As RecordSet, x As Variant, y As String) As Bool


étant donné qu' il se rèfère à rs variable public.

Enfin , je crois toujours ..

De toute façon pour les déclarations, je comptais bien sur lui pour réctifier.
J' avais prévenu pour les erreur




       
<hr />



[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 05:26
en plus le coeur de la fonction, c' était du copier/coller..
Avec tout ce que ça engendre..
On rectifie parfois et on oublie souvent.

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
16 sept. 2008 à 06:02
j'te laisse voir le but de cet exemple.... :



Option Explicit




Public 

As Byte






Private Sub 
Form_Load()



    
    p = 256 'à supprimer après un premier
test
        
    Call test(800)

End Sub

Sub test(p As Long)
    p = 256 'pas d'erreur
End Sub







<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 06:05
oÔ ce n'etait pas du copier coller ma fonction :'(
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 06:18
Option Explicit


Public  p  As Byte




Private Sub  Form_Load()
   
    p = 256 'à supprimer après un premier test
       
    Call test(800)


End Sub
Bien !




Sub test(p As Long)
    p = 256 'pas d'erreur
End Sub
Pas Bien !


là tu te réfère à un autre p (type différent)


Après
Sub test(p As Long)
    p = 256 'pas d'erreur
End Sub


Fais un MsgBox p
Il te renvera 0


Maintenant fais
Sub test(p)
    p = 256 ''erreur parce que Byte.Il se refère à p variale publique
End Sub




---






Si on se refère à l' exemple du rs,
Soit:
Public rs As RecordSet
Public Function rechmat(rs, x As Variant, y As String) As Boolean


   rs.MoveFirst
    rechmat = False
    Do While rs.EOF = False
        If x = rs.Fields(y) Then
            rechmat = True
            Exit Function
        Else
            rs.MoveNext
        End If
    Loop
   
End Function


If rechmat(rs, xValeur, "Matricule )=True Then


Déconseillé parce que la fonction se doit d' être générale


---
Soit:
Public rse As RecordSet
Public Function rechmat(rs As RecordSet, x As Variant, y As String) As Boolean


   rs.MoveFirst
    rechmat = False
    Do While rs.EOF = False
        If x = rs.Fields(y) Then
            rechmat = True
            Exit Function
        Else
            rs.MoveNext
        End If
    Loop
   
End Function


If rechmat(rse, xValeur,"Matricule )=True Then




Méthode très appréciée.

PS:
harmedevil
je parlais du copier/Coller que je faisais moi pour poster mes réponses !






<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
harmedevil Messages postés 16 Date d'inscription samedi 16 octobre 2004 Statut Membre Dernière intervention 16 septembre 2008
16 sept. 2008 à 06:22
 chui po con au final alors? lol
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 06:30
harmedevil:


je confirme

PCPT:
Option Explicit
Dim p As Byte
Sub test(p)
  p = 38
End Sub


Function test2(p As Long) As Long
  p = 256  'pas d' erreur
End Function


Private Sub Form_Load()
  test p
  MsgBox p 'pas d' erreur et résultat 38
  MsgBox test2(p)  'résultat 0
End Sub





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 06:41
Ah non ! j' ai parlé tropvite !

Option Explicit
Dim p As Byte




Function test2(p As Long) As Long
  p = 256  'pas d' erreur
  test2 = p
End Function


Private Sub Form_Load()
  MsgBox test2(p)  'erreur type d' arfument ByRef incompatible
                           .
End Sub

A vrai dire je ne sais trop quoi ppensé
T' as peut être (ou sûtement raison) PCPT.





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
16 sept. 2008 à 06:49
Allez ! On laisse ça pour demain ,ou plutôt aujourd' hui.
J' ai pas encore dormi de la buit !
Dieu sait à quelle heure je vaIs me lever pour le boulot !!?

<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
Rejoignez-nous