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

VBA Access Discussion :

Problème d'update dans un recordset.


Sujet :

VBA Access

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut Problème d'update dans un recordset.
    Bonjour à tous,

    Alors je ne vais pas vous exposer tout mon code, car il est assez long.
    Mon problème est que lors du lancement de mon code des enregistrements ne se font pas correctement.
    Voici déjà la partie que je pense déconne :

    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
    If Left(Fichier, 4) = "NAV_" Then
            TableExiste = True
            
            Set oRS = New ADODB.Recordset
            oRS.Open "Select * from HISTO_FUND", oConn, adOpenKeyset, adLockOptimistic
            
            Set oCat = New ADOX.Catalog
            Set oCat.ActiveConnection = Cn
            
            Fich = Right(Fich, Len(Fich) - 4)
            
            For Each Feuille In oCat.Tables
                FeuilName = Feuille.Name
                
                If FeuilName <> "Ident$" Then
                'requête pour extraire les données de la Feuil1
                    oProdRS.Open "SELECT * FROM [" & FeuilName & "] ", Cn, adOpenStatic
                
                    FeuilNames = Left(FeuilName, Len(FeuilName) - 2)
                    FeuilNames = Right(FeuilNames, Len(FeuilNames) - 1)
                ' --- Transfert des données dans la base ---
                    Do While Not (oProdRS.EOF)
                    
                        For j = 1 To oProdRS.Fields.Count - 1
                        
                            ColName = oProdRS.Fields(j).Name
                            
                        ' Si le SC_ID du nom de la colonne n'existe pas, on le crée, et on stocke ce nouveau SC_ID dans LOV_FUND
                            If IsNull(DLookup("[SC_ID]", "LOV_FUND", "[Share_Class] = '" & ColName & "' ")) Then
                                IdColName = DLookup("Max([SC_ID])", "LOV_FUND")
                                IdColName = IdColName + 1
                                RepIdColName = IdColName
                                
                            'On ajoute une nouvelle share_class à LOV_FUND ou bien nouveau sous-fonds
                                oProdRSS.Open "SELECT * FROM [Ident$] WHERE [Share_Class] = '" & ColName & "'", Cn, adOpenStatic
                                Set oPS = New ADODB.Recordset
                                oPS.Open "Select * from LOV_FUND", oConn, adOpenKeyset, adLockOptimistic
                                oPS.AddNew
                                oPS.Fields(0) = IdColName
                                oPS.Fields(1) = Fich
                                oPS.Fields(2) = FeuilNames
                                oPS.Fields(3) = ColName
                                oPS.Fields(4) = oProdRSS.Fields(2)
                                oPS.Fields(5) = IdColName
                                oPS.Fields(6) = oProdRSS.Fields(4)
                                oPS.Fields(7) = oProdRSS.Fields(5)
                                oPS.Fields(8) = oProdRSS.Fields(6)
                                oPS.Fields(13) = True
                                oPS.Update
                                oPS.Close
                                oProdRSS.Close                        Else
                                IdColName = DLookup("[SC_ID]", "LOV_FUND", "[Share_Class] = '" & ColName & "' ")
                                RepIdColName = DLookup("[Representative_SC_ID]", "LOV_FUND", "[Share_Class] = '" & ColName & "' ")
                            End If
                            
                            If IdColName = RepIdColName Then
                                oRS.AddNew
                                oRS.Fields(0) = IdColName
                                oRS.Fields(1) = oProdRS.Fields(0).Value
                                oRS.Fields(2) = oProdRS.Fields(j).Value
                                oRS.Update
                            End If
                            
                        Next j
                        
                        oProdRS.MoveNext
                    Loop
        
                oProdRS.Close
                End If
            Next Feuille
            oRS.Close
    J'ai mis en rouge là où je pense qu'il doit y avoir un problème.
    En fait, le code fonctionne parfaitement bien, il remplie tous les champs qu'il faut dans ma table LOV_FUND sauf pour le 1er enregistrement.
    Mon 1er enregistrement n'est remplie que pour les champs n'utilisant pas la feuille excel (oProdRSS). Pourtant, lorsque je débugge progressivement pour voir les étapes, les oProdRSS.fields(*) prennent bien les bonnes valeurs.
    Alors, soit c'est mon update qui ne marche pas à cet endroit, soit c'est ma feuille excel, soit c'est ma table qui ne s'ouvre pas...

    Toute aide et proposition sera la bienvenue.(et questions pour plus de détails)

    Merci d'avance pour vos réponses.

    Cordialement,

    Quentin.

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bon en fait, j'ai plus l'impression que lors du premier passage dans la boucle for, il ne m'ouvre pas correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oProdRSS.Open "SELECT * FROM [Ident$] WHERE [Share_Class] = '" & ColName & "'", Cn, adOpenStatic
    Car il met les oProdRSS.Fields(*) à Null...

    Et encore plus étrange, lorsque j'ai lancé mon code une fois, je remets mes tables à jour (en enlevant les lignes ajoutées avec mon code), et je relance mon code sans avoir fermé Access et là tout fonctionne normalement, il met les bonnes valeurs même pour le 1er enregistrement.

  3. #3
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bon, j'ai trouvé une "solution" pas très rigoureuse, c'est d'ouvrir 2 fois le mm recordset... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oProdRSS.Open "SELECT * FROM [Ident$] WHERE [Share_Class] = '" & ColName & "'", Cn, adOpenStatic
    oProdRSS.Open "SELECT * FROM [Ident$] WHERE [Share_Class] = '" & ColName & "'", Cn, adOpenStatic
    Cela fonctionne mais bon...
    Si quelqu'un a une autre solution, je suis preneur !

    Merci

  4. #4
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Bonjour,
    Que donnerait un simple DoEvents après oProdRSS.Open "SELECT ...

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    Je ne connais pas cette procédure mais je viens de la tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    oProdRSS.Open "SELECT * FROM [Ident$] WHERE [Share_Class] = '" & ColName & "'", Cn, adOpenStatic
    DoEvents
    Malheureusement, j'ai encore le même problème que lorsque je ne met qu'une fois le oProdRSS.Open "...

  6. #6
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    DoEvents est sensé attendre que la fonction précédente soit terminée pour lancer la suivante. Elle ne semble pas agir dans ton cas. Est-ce un problème de tempo ? Essayer une pause de quelques secondes sinon je n'ai pas de solution

  7. #7
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Ok, j'ai cherché un peu une fonction qui fait une pause, mais ça m'a l'air plus compliqué que de simplement ouvrir 2 fois le recordset...
    Et surtout j'aurais une perte de performance étant donné que je devrais faire attendre mon programme à cet endroit. Et vu qu'il est susceptible de passer de nombreuses fois par cette boucle, je pense que cette méthode est à proscrire ^^. (et oui quelques secondes supplémentaires c'est trop long ^^)

    Je vais encore attendre un peu avant de mettre ce post en résolu.(sachant que j'ai déjà trouvé une solution...)

    En tout cas, merci pour vos propositions helas.

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

Discussions similaires

  1. Problème d'update dans un ObjectDataSource
    Par Colbix dans le forum C#
    Réponses: 0
    Dernier message: 07/12/2010, 10h14
  2. Problème d'update dans Eclipse
    Par cdoctora dans le forum Eclipse
    Réponses: 0
    Dernier message: 18/05/2010, 13h59
  3. [ASA]problème d'update dans une base embarquée ultralight
    Par j-Christo dans le forum SQL Anywhere
    Réponses: 1
    Dernier message: 26/10/2007, 12h20
  4. problème avec update dans h:datatable
    Par rarrou dans le forum JSF
    Réponses: 1
    Dernier message: 03/11/2006, 15h22
  5. problème d'update dans une fonction trigger (before)
    Par ctobini dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/09/2006, 17h08

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