IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Access Discussion :

Modules et formulaires


Sujet :

Access

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut Modules et formulaires
    salut,

    j'aurai aimé savoir si il été possible d'appeler une procédure qui se trouve dans un module à partir d'un formulaire.

    J'ai créé celle ci

    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
    Private Sub trouvernum(ByVal nomtable As String, ByVal nomchamp As String)
    Dim Db As Database
    Dim rs As Recordset
    Dim chainesql As String
    Dim Result As Integer
     
     
    Result = 1
    Set Db = CurrentDb
    chainesql = "select " & nomchamp & " from " & nomtable & ";"
    Set rs = Db.OpenRecordset(chainesql)
     
    Do While rs(nomchamp) = Result
        Result = Result + 1
        rs.MoveNext
    Loop
    If MsgBox("Acceptez vous ce numéro disponible : " & Result & " ?", vbYesNo) = vbYes Then
    Me!numero = Result
    End If
     
    End Sub
    Elle me sert à trouver le prochain numéro qui n'est pas utilisé dans une table et je m'en sert pour plusieurs questionnaires et le problème est que si je fais par exemple call trouvernum("etudiant","num_etudiant") , j'ai un erreur me disant que celle-ci n'existe pas (alors qu'en copiant le code dans le formulaire tout fonctionne lorsque je clique sur le bouton chercher un numero)

    Existe t'il un moyen pour ne pas avoir à reecrire à la chaque fois que je change de formulaire (uniquement l'appeler)


    Merci de vos réponses

  2. #2
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Ecris-la dans un module et declare la en Public.

    En esperant t'aider.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Hehe merci... ca parait tellement evident maintenant

    Mais jai donc maitenant un petit souci,
    En recopiant le code que j'ai mis lors de mon premier message dans le module, il ne reconnait plus ce qui est normal et je ne vois pas comment faire pour avoir le numéro calculé (result) copié dans le champ numero de mon formulaire si l'utilisateur accepte le msgbox

    Pour le moment j'ai donc enlevé mais donc lorsque l'on clique sur oui, il ne se copie plus dans le champ...

  4. #4
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Une solution est de transformer ta procedure en fonction qui renverra la valeur souhaitee, que tu insere alors dans ton controle de formulaire.

    S'il dit oui :
    trouvernum = Resultat
    Sinon
    trouvernum = -1

    Puis dans ton formulaire tu n'affecte la valeur a ton controle que si la valeur est differente de -1 (-1 est un exemple, il faut juste que ce soit une valeur que ne peut pas avoir Resultat)

    En esperant t'aider.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Yep, j'y avais aussi pensé à la fonction mais j'ai un petit souci

    Voici le code du module :

    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
    Public Function trouvernum(ByVal nomtable As String, ByVal nomchamp As String)
    Dim Db As Database
    Dim rs As Recordset
    Dim chainesql As String
    Dim result As Integer
     
    result = 1
    Set Db = CurrentDb
    chainesql = "select " & nomchamp & " from " & nomtable & ";"
    Set rs = Db.OpenRecordset(chainesql)
     
    Do While rs(nomchamp) = result
        result = result + 1
        rs.MoveNext
    Loop
    If MsgBox("Acceptez vous ce numéro disponible : " & result & " ?", vbYesNo) = vbYes Then
    trouvernum = result
    Else
    trouvernum = -1
    End If
     
    End Function

    et ici le code du formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub trouvernumero_Click()
        Dim temp As Integer
        temp = trouvernum("etudiant", "num_e")
        If temp <> -1 Then
            Me!numero = temp
        End If
     
     
    End Sub
    ET lorsque je clique sur le bouton j'ai l'erreur : "Aucun enregistrement en cours"
    avec cette ligne en jaune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Do While rs(nomchamp) = result
    Alors que le nom de champ est bon et que ca fonctionnait avant lorsque j'avais mis ce code dans le formulaire et non dnas le module

  6. #6
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Premiere remarque, ta fonction n'a pas de type. A premiere vue elle devrait etre de type Integer.

    Ensuite, je te conseille d'utiliser les methodes de parcourt de RecordSet proposes dans la FAQ.

    En esperant que ca t'aide.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Encore une erreur bete que d'oublier le type de retour de ma fonction...

    Snino j'ai été lire les FAQ mais je n'y arrive toujours pas j'ai toujours cette erreur

    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
    Option Compare Database
    Option Explicit
     
    Public Function trouvernum(ByVal nomtable As String, ByVal nomchamp As String) As Integer
    Dim Db As Database
    Dim rs As Recordset
    Dim chainesql As String
    Dim result As Integer
     
    result = 1
    Set Db = CurrentDb
    chainesql = "select " & nomchamp & " from " & nomtable & ";"
    Set rs = Db.OpenRecordset(chainesql)
    MsgBox (chainesql)
    rs.MoveFirst
    Do While rs(nomchamp) = result
        result = result + 1
        rs.MoveNext
    Loop
    If MsgBox("Acceptez vous ce numéro disponible : " & result & " ?", vbYesNo) = vbYes Then
    trouvernum = result
    Else
    trouvernum = -1
    End If
     
    End Function
    j'ai ajouté un msgbox pour voir ma requete sql et elle est correcte j'ai bien "select num_e from etudiant;"

    Par contre concernant le recordset j'ai tenté d'ajouter un rs.movefirst comme sur la page des FAQ mais sans succes

    Pourtant ca me semble correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Rst.MoveFirst 
    While Not rst.Eof
        ' code
        rst.MoveNext
    Wend
    Je respecte ce code sauf que ma condition de fin de parcours du recordset est "des qu'une numéro est disponible" sans pour autant aller jusqu'au bout et la maniere dont je l'avais ecrite (sans meme ajouter le rs.movefirst) fonctionnait bien j'avais le résultat (lorsque le code se trouvais dans le formulaire et non dans le module)

    L'erreur ne peut elle pas etre du au fait que le code se situe dans le module et non dans le fomulaire ?

  8. #8
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 116
    Points : 105
    Points
    105
    Par défaut
    salut,
    à tout hasard: mets les deux conditions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do while not (rst.eof and tacondition)
    le message "Aucun enregistrement en cours" arrive qd meme souvent qd rst.eof = true...
    b.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    euh j'ai tenté comme t'as conseillé mais non ca veut pas

    Revoici mon code actuel

    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
    Option Compare Database
    Option Explicit
     
    Public Function trouvernum(ByVal nomtable As String, ByVal nomchamp As String) As Integer
    Dim Db As Database
    Dim rs As Recordset
    Dim chainesql As String
    Dim result As Integer
     
    result = 1
    Set Db = CurrentDb
    chainesql = "select " & nomchamp & " from " & nomtable & ";"
    Set rs = Db.OpenRecordset(chainesql)
    MsgBox (chainesql)
    rs.MoveFirst
    MsgBox ("nomchamp : " & rs(nomchamp))
    MsgBox ("result : " & result)
    Do While Not (rs.EOF And rs(nomchamp) = result)
        result = result + 1
        rs.MoveNext
    Loop
    rs.Close
    If MsgBox("Acceptez vous ce numéro disponible : " & result & " ?", vbYesNo) = vbYes Then
    trouvernum = result
    Else
    trouvernum = -1
    End If
     
    End Function
    Les msg box suivantes :
    MsgBox ("nomchamp : " & rs(nomchamp))
    MsgBox ("result : " & result)

    Me renvoient bien les valeurs 1 et 1 donc je pense que mon recordset n'est pas vide

    Pourtant j'ai toujours "aucun enregistrement en cours"

    Si quelqu'un d'autre est inspiré.....

  10. #10
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 116
    Points : 105
    Points
    105
    Par défaut
    oups...
    1. je me suis trompé, visiblement tu dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    do while ((not rs.eof) and (rs(nomchamp) = result))
    2. on dirait que ce que tu veux c'est le max du champ de cette table?
    pourquoi ne fais tu pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     set rs = db.openRecordset("select max(" & nomchamp & ") from " & nomtable)
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     result = rs.fields(0) +1
    ?
    b.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    hep ! pas bete l'idee du max j'y pensais plus

    Sinon jai pas bien compris le rs.fields(0)+1

    (ta solution fonctionne mais je ne comprend pas pourquoi en mettant rs(numchamp) à la place de rs.fields(0) j'avai une erreur)

    En tout cas merci mon formulaire fonctionne bien

  12. #12
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    Citation Envoyé par borisa
    on dirait que ce que tu veux c'est le max du champ de cette table?
    j'ai plutôt l'impression qu'il cherche le premier "trou"?

    Rs.EOF correspond à l'arrivé en fin de recordset; c'est pas le dernier enregistrement c'est après le dernier enregistrement
    donc à ce moment rs(nomchamp) n'est plus valide
    En plus la condition avec le AND ne me semble pas bonne (j'ai pas analysé en profondeur)

    Garde plutôt uniquement le Not Rs.EOF dans la condition du while et fait un Exit Do à l'intérieur quand tu auras trouvé le "trou"

    Au passage le Select t'assure-t-il un tri correct de ta table?
    un "order by nomchamp" dans la requête serait peut-être le bienvenu?

  13. #13
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 116
    Points : 105
    Points
    105
    Par défaut
    arkham, je crois que tu as raison.
    mais quoi qu'il en soit Elstak, va faire un tour là:http://warin.developpez.com/access/dao/?page=partie_5
    c'est très bien fait et très utile pour comprendre ce que l'on fait sur un recordset...
    b.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Ok merci bien

    euh arkham tu pourais me montrer comment tu ecrirais le code avec ton exit do je comprend pas trop

    sinon quand on cherche le plus grand numero avec max, le traitement n'est pas plus rapide que si l'on cherche le premier trou sur une grande table ?

  15. #15
    Responsable Access

    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Points : 14 526
    Points
    14 526
    Par défaut
    ça devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Do While Not rs.EOF 
        if rs!nomchamp <> result then exit do
        result = result + 1
        rs.MoveNext
    Loop
    tu sors quand ton champ est différent de ton compteur

    sinon le max devrait être plus rapide, mais tu ne boucheras pas les trous et à ce moment là autant utiliser un champ de type numéro auto

    et pis dans tous les cas y a la FAQ dans laquelle il y a une fonction déjà toute faite .... :
    http://access.developpez.com/faq/?pa...elNumAutoHoles

Discussions similaires

  1. [AC-2002] Supprimer module de Formulaire
    Par mr63 dans le forum VBA Access
    Réponses: 7
    Dernier message: 01/06/2009, 16h47
  2. [Joomla!] Modules de formulaires
    Par mme_chelaou dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 26/04/2009, 17h13
  3. Réponses: 7
    Dernier message: 25/04/2008, 09h28
  4. Réponses: 3
    Dernier message: 16/07/2007, 09h20
  5. Variable Globale dans un module de formulaire.
    Par wisiwi dans le forum Access
    Réponses: 5
    Dernier message: 30/03/2006, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo