Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/05/2011, 11h54   #1
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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.
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h28   #2
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

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

Code :
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.
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 13h43   #3
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

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

Code :
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
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h51   #4
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonjour,
Que donnerait un simple DoEvents après oProdRSS.Open "SELECT ...
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h59   #5
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
Bonjour,

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

Code :
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 "...
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 16h03   #6
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
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
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 16h21   #7
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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.
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h07.


 
 
 
 
Partenaires

Hébergement Web