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 :

[Débutant] Module de manipulation de 3 Tables: code déficient


Sujet :

Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 20
    Points : 12
    Points
    12
    Par défaut [Débutant] Module de manipulation de 3 Tables: code déficient
    Salut la francophonie. Étant Québécois, je le dis d'entrée: ALLEZ LES BLEUS TABARNAK!

    J'ai fait une routine Sub DAO_Resultats(). Son but: prendre des enregistrements de la table tblTRI, et selon un filtre de sélection(string TampDie), faire des sommations de valeurs de champs et des calculs subséquents. Les résultats sont ensuite transposés dans les enregistrements de la table tblRES, selon le même filtre. S'il s'agit d'un nouvel enregistrement, et bien ça fait la mise à jour. La routine se situe dans un module de la base de données Gravimétrique.

    PS. La référence Microsoft DAO 3.6 Object Library est activée.

    Voici le code avec commentaires:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    Option Compare Database
    Option Explicit
     
     
     
    Sub DAO_Resultats()
     
    'Initialisation recordset et Tables
    Dim db As DAO.Database
     
    Dim rstTri As DAO.Recordset
    Dim rstDie As DAO.Recordset
    Dim rstRes As DAO.Recordset
     
    'Déclaration variables
     
    Dim DenomFlowreel As Integer: Dim DenomGPI As Integer: Dim DenomVprod As Integer
    Dim Incr As Integer
     
    Dim SommeP As Single: Dim SommeRCP As Single: Dim SommeS2 As Single: Dim SommeGPI As Single
    Dim SommeVprod As Single: Dim SommeFlowreel As Single: Dim SommeVprod As Single
    Dim IndiceMasse As Single: Dim IndiceVitesse As Single: Dim strDie As String
     
     
    Dim TampDie(1 To 7) As String: Dim TampDieFlow(1 To 4) As String:
     
     
    'Assignation base de données == courante
    Set db = CurrentDb()
    On Error Resume Next
     
    'Assignation recordset aux tables de bdd Gravimétrique
    Set rstTri = db.OpenRecordset("tblTRI", dbOpenDynaset)
    Set rstDie = db.OpenRecordset("tblDIE")
    Set rstRes = db.OpenRecordset("tblRES")
     
    DenomFlowreel = 0
    DenomGPI = 0
    DenomVprod = 0
    SommeRCP = 0
    SommeP = 0
    SommeS2 = 0
    SommeGPI = 0
    SommeVprod = 0
     
    rstTri.MoveFirst
     
    'Boucle de parcours de tblTRI pour sommations
    While Not rstTri.EOF
     
    rstRes.MoveFirst
    rstDie.MoveFirst
     
    'reconnaissance bon Die pour entrer valeurs
     
    TampDie = rstTri(5).Value
    strDie = "([tblTRI].[Die] LIKE 'TampDie')"
     
    'Boucle de sommation des valeurs du premier enregistrement de TblTRI et semblables selon Die
     
    rstTri.FindFirst strDie
     
        While Not rstTri.NoMatch
     
            SommeRCP = rstTri(6).Value + SommeRCP
            SommeP = rstTri(7).Value + SommeP
            SommeS2 = rstTri(8).Value + SommeS2
            SommeGPI = rstTri(9).Value + SommeGPI
            SommeVprod = rstTri(12).Value + SommeVprod
            DenomGPI = DenomGPI + 1
            DenomVprod = DenomVprod + 1
     
        'Extraire 4 premiers caractères de TampDie pour calculer Flowreel
        'Certains enreg. TampDie peuvent avoir la forme suivante: 7077_G
        'la table tblDIE(enreg. sans doublons) ne contient que les 4 premiers carac: 7077
        'Les enreg. avec G ont SommeFlowReel comme attribut
                For Incr = 1 To 4
                TampDieFlow(Incr) = TampDie(Incr)
                Next Incr
     
                Select Case TampDieFlow
                Case TampDieFlow <> rstDie(1).Value:
                rstDie.MoveNext
     
                Case TampDieFlow = rstDie(1).Value:
                    If Mid(TampDie, 6, 1) = "G" Then
                    SommeFlowreel = rstTri(13).Value * rstDie(5).Value * 454 / 60
                    DenomFlowreel = DenomFlowreel + 1
                    End If
                End Select
     
        rstTri.FindNext strDie
        Wend
     
        'Recherche dans tblRES pour l'enregistrement correspondant et faire mise à jour
        Select Case TampDie
        Case TampDie <> rstRes(3).Value:
        rstRes.MoveNext
     
        Else
        rstRes.Edit
        rstRes(4).Value = SommeRCP / SommeP
        rstRes(5).Value = SommeS2 / SommeP
        rstRes(6).Value = SommeGPI / DenomGPI
        rstRes(10).Value = rstRes(6).Value / rstDie(4).Value
            If SommeFlowreel = 0 Then
            rstRes(7).Value = SommeVprod / DenomVprod
            Else
            rstRes(7).Value = SommeFlowreel / DenomFlowreel
            End If
     
        End Select
     
        'Ajout d'enregistrement si pas de correspondance
        If rstRes.EOF = True Then
            rstRes.AddNew
            rstRes("Die") = TampDie
            rstRes("RCP/P") = SommeRCP / SommeP
            rstRes("S2/P") = SommeS2 / SommeP
            rstRes("GPI") = SommeGPI / DenomGPI
            rstRes("IndiceMasse") = rstRes("GPI") / rstDie(4).Value
                If SommeFlowreel = 0 Then
                rstRes("Vitesse") = SommeVprod / DenomVprod
                Else
                rstRes("Vitesse") = SommeFlowreel / DenomFlowreel
                End If
                rstRes.Update
        End If
     
    Wend
     
     
    ' Fermeture et libération des objets
    rstTri.Close
    rstDie.Close
    rstRes.Close
     
    Set rstTri = Nothing
    Set rstDie = Nothing
    Set rstRes = Nothing
     
    Set db = Nothing
    End Sub

    Questions:
    1 - Je fais ma première compilation, voici le message affiché:
    'Erreur de compilation: Déclaration existante dans la portée en cours'
    Pourquoi?

    2- Je suis un codeur débutant en VB. Est-ce que la structure de mon code est correcte? Si non, quels ajustements y apporter pour le corriger ou mieux, l'améliorer?

    À DONF!!! Au Québec, c'est: À planche!

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    l'erreur vient du fait que vous avez déclaré 2 fois la même variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    Dim SommeVprod As Single: Dim SommeFlowreel As Single: Dim SommeVprod As Single
    D'autres erreurs en vrac :
    * TampDie = rstTri(5).Value 'tampdie est un tableau => erreur je pense
    * strDie = "([tblTRI].[Die] LIKE 'TampDie')" ' Ecrire je pense : "([tblTRI].[Die] LIKE '" & TampDie & "')"
    * Select Case TampDieFlow 'tampdieflow est un tableau => erreur je pense
    * etc...

    Philippe

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Dim SommeVprod As Single
    est mis 2 fois. Enlève le second.

    Ensuite pour les améliorations

    Evite les références avec des nombres (ou Magic Number), un nombre ça dit rien. Je te conseille de définir une constante voici un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Const ChampRCP As Integer = 6
    rstTri(ChampRCP).

    Evite comme la peste le On Error Resume Next, si une erreur se produit tu ne la verra pas !

    Utilise On Error Goto si tu veux gérer les erreurs ou pas du tout si tu veux que Access les traites.

    Personnelement je ne gére généralement pas les erreurs dans mes fonctions mais seulement au niveau de la procédure appelante. Pour mois, c'est la responsabilité de l'appelant de décider ce qu'il doit faire en cas d'erreur.

    ex :

    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
     
    public sub Test()
      On Error Goto Err_Module
     
      'ici tes instructions
     
    Exit_Test:
      exit sub
     
    Err_Test:
       select case err.num
          case monErreurTraité
             'faire quelque chose
     
          case else
             msgbox Err.num & " " & Err.Description, vbExclamation
             resume Exit_Test
     
       end select
     
    end sub

    Voici MA :-) façon d'indenter du code

    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
     
    select case
       case x
          Instructions
     
       case y
          instruction
    end select
     
    if condition then
         instructions
       else
         instructions
    end if
     
    for x = 1 to n
       instruction
    next x
    Je trouve que cela met plus les blocs de programme en évidence.

    Un TRÉS bon livre sur le sujet est 'Code Complete' édition MicroSoft. Conseillé par un de mes prof à l'ETS (Montréa, Qc ;-) il m'a apprit des choses aprés 15 ans de métiers.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. [débutant] modifier le nom d'une table
    Par banker dans le forum Access
    Réponses: 1
    Dernier message: 08/03/2006, 12h35
  2. [Débutant]Ordre des champs dans une table
    Par goony dans le forum Débuter
    Réponses: 4
    Dernier message: 16/02/2006, 12h05
  3. [Débutant] Parcourir les données de plusieurs tables.
    Par SmokE dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/01/2006, 16h55
  4. Réponses: 3
    Dernier message: 07/12/2005, 14h28
  5. [débutant] conseils sur contraintes et alter table
    Par maysa dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 26/05/2004, 09h03

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