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

  1. #1
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut Comment adapter le code "RameneNombreEntier" à ma recherche ?

    Salut Membres du forum !
    Je souhaite écrire un code qui me permet d'enregistrer automatiquement des nombres entiers successifs de 1;2;3 etc. dans un champ numérique d'une table.
    Exemple: ce code doit être paramétré selon un critère (mleparent as long, anneescol as string, idecole as long).
    From table where mlepa=" & mleparent....

    Voici la capture de la table dans laquelle voudrais je introduire le code en question:
    Nom : CaptureNombreEntierSelonCriteria.PNG
Affichages : 67
Taille : 67,2 Ko

    et le champ concerné pour introduire les nombres entiers est "Chrono" ayant pour légende "Indice_Modalité" (voir ligne jaune verticale) ,

    le stLinkCriteria selon les champs avec (*)

    Le code me permettra de compter le champ "Chrono" de chaque personne de 1 aux nombres entiers successifs jusqu'à la dernière ligne atteinte selon le stLinkCriteria.

    je sollicite votre aide.
    Cordialement.
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

  2. #2
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut Comment adapter le code suivant à ma recherche ?

    Bonjour membres du forum !
    Comment adapter le code suivant à ma recherche ?
    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
    30
    31
    32
    33
    34
    Public Function RameneNombreEntier(NumParResp As Long, AnSco As String)
     
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String
     
    Dim strSelect As String
    Dim strSqlWhere As String
    Dim strSqlJoin As String
     
    If NewRecord Then
     
    strSelect = "SELECT Max(chrono) FROM PAYEMENTS_Scolairite"
    strSqlWhere = " WHERE "
    strSqlJoin = " AND "
    strSqlWhere = strSqlWhere & "Format(datescol,""yyyy"") = " & Chr(34) & Format(Me.anneeid, "yyyy") & Chr(34)
    strSqlWhere = strSqlWhere & strSqlJoin
    strSqlWhere = strSqlWhere & "NumEnregistreParResponsable = " & NumParResp & "and AnneeScolairePay='" & AnSco & "';"
     
    strSQL = strSelect & strSqlWhere
    'Debug.Print strSql
        Set rst = CurrentDb.OpenRecordset(strSQL)
            With rst
                If Not .EOF Then
                Me![chrono].Value = Nz(.Fields(0).Value, 0) + 1
                Else
                Me![chrono].Value = 1
                End If
                .Close
            End With
    End If
        Me.chronoperso.Value = "Versement N° " & Year([datescol]) & "." & Format([chrono], "00")
     
    End Function
    Message d'erreur:
    Nom : CaptureVariableNonDéfinie.PNG
Affichages : 46
Taille : 36,3 Ko

    Cordialement.
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

  3. #3
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    juin 2012
    Messages
    967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : juin 2012
    Messages : 967
    Points : 1 564
    Points
    1 564

    Par défaut

    Bonjour,

    Il faut sans doute écrire Me.NewRecord, Me étant le formulaire dans lequel se trouve le code de la fonction (la fonction ne doit pas être placée dans un module externe).

    Voir aussi la fonction DMax(), plus simple à employer que le SELECT Max...

    Bonne continuation.

  4. #4
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut

    Bonsoir membres du forum,
    bonsoir EricDgn !
    J'ai déplacé le code le module du formulaire, et ajouté le Me. à l'objet "NewRecord"
    J'ai introduit la fonction DMax() dans mon code mais à l'appel, ça me ramène des "0".

    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
    30
    31
    32
    33
    34
    Public Function RameneNombreEntier(NumParResp As Long, AnSco As String)
     
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim strSQL As String
     
    Dim strSelect As String
    Dim strSqlWhere As String
    Dim strSqlJoin As String
     
    If Me.NewRecord Then
     
    strSelect = "DMax((chrono) FROM PAYEMENTS_Scolairite)"
    strSqlWhere = " WHERE "
    strSqlJoin = " AND "
    strSqlWhere = strSqlWhere & "Format(datescol,""yyyy"") = " & Chr(34) & Format(Me.anneeid, "yyyy") & Chr(34)
    strSqlWhere = strSqlWhere & strSqlJoin
    strSqlWhere = strSqlWhere & "NumEnregistreParResponsable = " & NumParResp & "and AnneeScolairePay='" & AnSco & "';"
     
    strSQL = strSelect & strSqlWhere
    'Debug.Print strSql
        Set rst = CurrentDb.OpenRecordset(strSQL)
            With rst
                If Not .EOF Then
                Me![chrono].Value = Nz(.Fields(0).Value, 0) + 1
                Else
                Me![chrono].Value = 1
                End If
                .Close
            End With
    End If
        Me.chronoperso.Value = "Versement N° " & Year([datescol]) & "." & Format([chrono], "00")
     
    End Function
    Voici comment je le ramène le champ Chrono:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub chrono_GotFocus()
     Me.chrono = RameneNombreEntier(Me.NumEnregistreParResponsable, Me.AnneeScolairePay)
    End Sub
    Nom : CaptureChrono.PNG
Affichages : 35
Taille : 58,5 Ko

    Pourriez me donner un exemple de la fonction DMax() par rapport à mon code ?
    Je suis stoppé à ce niveau.
    Cordialement.
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

  5. #5
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    juin 2012
    Messages
    967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : juin 2012
    Messages : 967
    Points : 1 564
    Points
    1 564

    Par défaut

    Pas vraiment le temps de regarder cela maintenant, mais DMax() s'utilise tout à fait autrement que SELECT ...
    Aussi conserver SELECT ...
    Cordialement.

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 706
    Points : 8 008
    Points
    8 008

    Par défaut

    bonsoir morobaboumar,

    as-tu vraiment besoin d'une telle fonction pour te ramener la dernière valeur d'un champ ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub chrono_GotFocus()
     
    If Me.NewRecord Then
        Me.chrono = RameneProchainChrono(Me.NumEnregistreParResponsable, Me.AnneeScolairePay)
    end if 
     
    Me.chronoperso = "Versement N° " & Year(Me.[datescol]) & "." & Format(Me.[chrono], "00")
     
    End sub
    il faut éviter de mettre à jour des champs d'un formulaire directement dans une fonction, sauf si on ne peut pas faire autrement ou si cela évite de la duplication de code, il vaut mieux le faire dans les évènements du formulaire pour plus de lisibilité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function RameneProchainChrono(NumParResp As Long, AnSco As String) as integer
    dim itDernierChrono as long
     
    ' recherche du dernier chrono
        itDernierChrono = Nz(DMax("chrono","PAYEMENTS_Scolairite","Year(datescol)=" & Me.anneeid & _
        " and NumEnregistreParResponsable = " & NumParResp & " and AnneeScolairePay='" & AnSco & "'"),0)
    ' renvoie le prochain chrono	
        RameneProchainChrono = itDernierChrono + 1
     
    End Function
    pour plus d'information sur l'utilisation de Dmax regarde : ici
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  7. #7
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut

    Bonjour membres du forum,
    bonjour tee_grandbois,
    J'ai essayé le code que vous m'avez suggéré, voilà la suite:
    Nom : CaptureChrono2.PNG
Affichages : 26
Taille : 61,9 Ko

    Piece jointe de la BD.

    Cordialement.
    Fichiers attachés Fichiers attachés
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

  8. #8
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    juin 2012
    Messages
    967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : juin 2012
    Messages : 967
    Points : 1 564
    Points
    1 564

    Par défaut

    Bonjour,

    Cette routine calcule les indices chronologiques pour les enregistrements existants.
    Elle n'est pas à utiliser à l'encodage d'un nouvel enregistrement, là il faudra utiliser un DCount(,,) +1
    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
    30
    31
    32
    33
    34
    Sub chrono()
       '--- à n'utiliser qu'une seule fois:
       '--- crée les numéros pour les enregistrements déjà encodés
       Dim sSQL As String, rst As Recordset
       Dim mlepa As String, idEts As Long, AnSco As String, Chro As Long
       sSQL = "SELECT mlepa_Enreg_ParResp, ID_EtablissFreq, AnneeScolairePay, dateVersement, chrono" & _
              " FROM PAYEMENTS_Scolairite" & _
              " ORDER BY mlepa_Enreg_ParResp, ID_EtablissFreq, AnneeScolairePay, dateVersement;"
       Set rst = CurrentDb.OpenRecordset(sSQL)
       mlepa = ""
       idEts = 0
       AnSco = ""
       Chro = 0
       With rst
          .MoveLast
          .MoveFirst
          While Not .EOF
             If !mlepa_Enreg_ParResp = mlepa And _
                   !ID_EtablissFreq = idEts And _
                   !AnneeScolairePay = AnSco Then
                Chro = Chro + 1
             Else
                mlepa = !mlepa_Enreg_ParResp
                idEts = !ID_EtablissFreq
                AnSco = !AnneeScolairePay
                Chro = 1
             End If
             .Edit
             !chrono = Chro
             .Update
             .MoveNext
          Wend
       End With
    End Sub
    C'est la partie ORDER BY qui décide de l'ordre de comptage.
    Le comptage redémarre à 1 à chaque changement d'année (AnneeScolairePay)

    A noter que dans la table utilisée il n'y a pas de lien avec l'enfant, uniquement avec le parent. Pas de parent avec plusieurs enfants?

    Bonne continuation.

  9. #9
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut remerciements

    Salut membres du forum,
    merci infiniment à vous EricDgn,
    merci infiniment à vous tee_grandbois,
    merci à toute la famille developpez.net.
    Notre discussion est
    infiniment.
    Cordialement.
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

  10. #10
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut

    Citation Envoyé par EricDgn Voir le message
    Bonjour,
    Cette routine calcule les indices chronologiques pour les enregistrements existants.
    Elle n'est pas à utiliser à l'encodage d'un nouvel enregistrement, là il faudra utiliser un DCount(,,) +1
    S'il vous dans la mesure où l'on souhaiterait employer le code pour l'encodage d'un nouvel enregistrement, qu'est ce qui doit y être
    changé.

    A+
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

  11. #11
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    juin 2012
    Messages
    967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : juin 2012
    Messages : 967
    Points : 1 564
    Points
    1 564

    Par défaut

    Voilà, après avoir modifié le formulaire Payements_scolarité pour qu'il accepte l'encodage de nouveaux enregistrements, le calcul de 'chrono' se fait ainsi:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    Private Sub chrono_Enter()
       NumChrono
    End Sub
     
    Private Sub mlepa_Enreg_ParResp_LostFocus()
       NumChrono
    End Sub
     
    Private Sub NumEnregistreParResponsable_Change()
       On Error Resume Next '--- parfois erreur quand entrée avec souris
       Me.NumEnregistreParResponsable.Dropdown
    End Sub
     
    Private Sub NumChrono()
       Dim sWh As String
       If Nz(Me.chrono, 0) = 0 Then
          '--- test données nécessaires exitent
          If Nz(Me.AnneeScolairePay, "") = "" Then
             MsgBox "Il manque AnneeScolairePay"
             Me.AnneeScolairePay.SetFocus
          ElseIf Nz(Me.ID_EtablissFreq, 0) = 0 Then
             MsgBox "Il manque ID_EtablissFreq"
             Me.ID_EtablissFreq.SetFocus
          ElseIf Nz(Me.mlepa_Enreg_ParResp, 0) = 0 Then
             MsgBox "Il manque mlepa_Enreg_ParResp"
             Me.mlepa_Enreg_ParResp.SetFocus
          Else
             '--- détermine n° chrono
             sWh = "mlepa_Enreg_ParResp=" & Me.mlepa_Enreg_ParResp & _
                   " AND ID_EtablissFreq=" & Me.ID_EtablissFreq & _
                   " AND AnneeScolairePay='" & Me.AnneeScolairePay & "'"
             Me.chrono = DCount("Chrono", "PAYEMENTS_Scolairite", sWh) + 1
          End If
       Else
          '--- ne rien faire: un n° chrono a déjà été donné
       End If
    End Sub
    Bonne continuation.
    Fichiers attachés Fichiers attachés

  12. #12
    Membre habitué Avatar de morobaboumar
    Homme Profil pro
    Enseignant
    Inscrit en
    septembre 2009
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : septembre 2009
    Messages : 434
    Points : 139
    Points
    139

    Par défaut

    Bonsoir membres du forum !
    Très heureux.
    Les codes fonctionnent parfaitement.
    Je ne peux que vous souhaiter beaucoup de bonheurs tout le temps.
    Merci infiniment.
    A bientôt.
    Le savoir est la lumière de l'esprit
    Le chemin de la réussite

    Les savants sont les héritiers de la science
    Qui cherche positivement trouve
    Tout ce qui brille n'est pas l'or ou diamant
    Mais l'or et le diamant se trouvent avec sagesse, intelligence et effort

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/09/2017, 15h33
  2. Réponses: 1
    Dernier message: 10/04/2013, 12h51
  3. [Free Pascal] Générer des nombres entiers aléatoires dans un tableau et trier celui-ci
    Par praetis dans le forum Free Pascal
    Réponses: 8
    Dernier message: 15/09/2012, 20h57
  4. Réponses: 3
    Dernier message: 16/09/2010, 12h54
  5. Insérer automatiquement des boutons dans des cellules excel
    Par Oaurelius dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/11/2005, 18h38

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