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 16/06/2011, 12h33   #1
Invité régulier
 
florian legrand
Inscription : mai 2010
Messages : 58
Détails du profil
Informations personnelles :
Nom : florian legrand

Informations forums :
Inscription : mai 2010
Messages : 58
Points : 7
Points : 7
Par défaut Problème vba update et erreur 3049

Bonjour à tous,

Alors voilà je vous explique mon problème :
J'ai deux tables Access (qui ont été importées).
Une contient les rues en ZUS avec commune, etc
L'autre table contient des noms et prénoms avec l'adresse.
Il faut que j'indique si la rue des personnes est en ZUS ou non.

Je parcoure donc mes deux tables.
Je vous donne mon code VB :

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
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
Option Compare Database
 
Private Sub Commande17_Click()
 
Dim db As DAO.Database
Dim myrst As DAO.Recordset
Dim myrsf As DAO.Recordset
Dim SQL As String
'tu definis quelle est la BD étudiée, c'est celle qui est courante..
Set db = CurrentDb
 
'nom de ta table
maTable = "ZUS_Officiel"
 
'requete sql
 sSQL = "SELECT Ville, Voie, NomVoie, Numero from " & maTable & ""
 ySQL = "SELECT * from Zus_jeunes"
'tu definis ton recordset qui va contenir le resultat de la requete
 Set myrst = db.OpenRecordset(sSQL)
 Set myrsf = CurrentDb.OpenRecordset(ySQL)
'si le recordset jeunes n'est pas vide
DoCmd.SetWarnings False
 
 If Not myrsf.EOF Then
     ' tant qu'il n'est pas vide
     Do While Not myrsf.EOF
        YNumero = myrsf.Fields("Numero").Value
        YTypeRue = LCase(myrsf.Fields("TypeRue").Value)
        YCommune = LCase(myrsf.Fields("Commune").Value)
        YNomRue = LCase(myrsf.Fields("NomRue").Value)
        YJeune = myrsf.Fields("NomJeune").Value
 
        'Me!zus.Value = "Non"
        If Not myrst.EOF Then
 
            myrst.MoveFirst
         'on ouvre le recordset de la table officielle pour comparer
         If IsNull(DLookup("Zus_Officiel", "Zus_jeunes", "NomJeune = '" & YJeune & "'")) Then
           SQL = "Non"
        Else
           SQL = DLookup("Zus_Officiel", "Zus_jeunes", "NomJeune = '" & YJeune & "'")
        End If
                Do While Not myrst.EOF Or SQL = Oui
                   'SQL = "SELECT Zus_Officiel FROM Zus_jeunes WHERE NomJeune = '" & YJeune & "' "
 
                     'recuperation des valeurs des champs
                        sVille = LCase(myrst.Fields("Ville").Value)
                        sNomvoie = LCase(myrst.Fields("NomVoie").Value)
                        sVoie = LCase(myrst.Fields("Voie").Value)
                        sNumero = myrst.Fields("Numero").Value
 
                            'comparaison
                                'si tout est égal
                                    If YCommune = sVille And YTypeRue = sVoie And YNomRue = sNomvoie Then
 
                                        'alors on passe à l'enregistrement suivant et on coche la case est en ZUS
                                            If IsNull(sNumero) Then
                                               ' reqSQL ="UPDATE Zus_jeunes Set Zus_Officiel='Oui' WHERE NomJeune= '" & YJeune & "' "
                                                DoCmd.RunSQL "UPDATE Zus_jeunes Set Zus_Officiel='Oui' WHERE NomJeune= '" & YJeune & "' "
                                                'SQL = "Oui"
                                                'Me!zus.Value = "Oui"
                                            Else
                                                If sNumero = YNumero Then
                                                     reqSQL = "UPDATE Zus_jeunes Set Zus_Officiel='Oui' WHERE NomJeune= '" & YJeune & "' "
                                                     DoCmd.RunSQL reqSQL
                                                     SQL = "Oui"
                                                    'Me!zus.Value = "Oui"
                                                Else
                                                  myrst.MoveNext
                                                End If
                                            End If
                                    Else
                                       'reqSQL = "UPDATE Zus_jeunes Set Zus_Officiel='Non' WHERE NomJeune= '" & YJeune & "' "
                                        'db.Execute reqSQL
                                        'Set Req = CurrentDb.CreateQueryDef("", reqSQL)
                                        'Req.Execute dbFailOnError
 
 
                                       ' Me!zus.Value = "Non"
                                        myrst.MoveNext
                                    End If
 
                Loop
                myrsf.MoveNext
 
          End If
          'MsgBox myrsf.AbsolutePosition + 1 & " sur " & myrsf.RecordCount
     'tu passes a l'enregistrement suivant
     'myrst.MoveNext
 
    Loop
End If
 
 
' tu fermes/vides tout
myrst.Close
Set myrst = Nothing
db.Close
 
DoCmd.SetWarnings True
MsgBox ("Vérification terminée")
End Sub
Premièrement, il m'indique Oui que sur la première ligne donc je pense qu'il ne parcoure pas tout ma première table.
Deuxièmement, quand j'exécute j'ai cette erreur :
Citation:
Erreur d'exécution '3049'
Impossible d'ouvrir la base de données " ". Ce n'est peut être pas une base de données que votre application reconnaît, ou le fichier est peut être endommagé.
Cette erreur est sur cette ligne :
Code :
DoCmd.RunSQL "UPDATE Zus_jeunes Set Zus_Officiel='Oui' WHERE NomJeune= '" & YJeune & "' "
Je vous remercie tous d'avance.

Cordialement
seyflo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h34   #2
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 549
Points : 7 549
Bonjour, ton code me parait plus compliqué qu'il ne devrait à mon avis l'être.

Voici l'esquisse de solution que je te propose :

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
dim db as dao.database:set db=CurrentDB
dim rJeune as dao.recordset:set rJeune=db.openRecordset("Zus_jeunes", dbOpenDynaset)
dim rZus as dao.recordset:set rZus=db.openRceordset("ZUS_Officiel", dbOpenDynaset)
 
do while not rJeune.eof
 
   'Cherche si le jeune est dans rZus
   rZus.findfisrt("NomJeune =""" & rJeune![NomJeune] & """")
 
   if rZus.NoMatch()
       'Traiter le cas où le jeune n'est pas dans Zus
     else
       'Traiter le cas où le jeune est dans Zus
       'Si c'est une MAj de rJeune le code devrait ressembler à cela :
       rJeune.Edit
       rJeune![NomTonChampMAJ]=rZus![NomTonChampMAJ]
       rJeune.Update
 
   end if
 
   rJeune.MoveNext
loop
 
rZus.close:set rZus=nothing
rJeune.close:set rJeune=nothing
set db=nothing
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 15h59   #3
Invité régulier
 
florian legrand
Inscription : mai 2010
Messages : 58
Détails du profil
Informations personnelles :
Nom : florian legrand

Informations forums :
Inscription : mai 2010
Messages : 58
Points : 7
Points : 7
Tout d'abord merci pour ton message.

Je ne comprends pas ton code. Tu écris si le jeune est dans rZus.
En faite, mes tables sont comme suit :

Zus_jeunes
Nom, Numero_Rue, Type_Rue, Nom_Rue, Commune

Zus_Officiel
Numero_Rue, Type_Rue, Nom_Rue, Commune

Et j'ai ajouté une colonne à la table Zus_jeunes qui indique si oui ou non l'adresse est considérée en Zus ou non.
seyflo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 17h15   #4
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 549
Points : 7 549
Ok, voici un code qui doit être très proche de la solution à ton problème.
Il parcourt toute la table dew jeunes et vérifie si l'adresse du jeune est en ZUS.
Si oui il met Vrai (ou Oui) dans la table Jeune sinon il met Faux (ou Non).

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
dim db as dao.database: set db=CurrentDB
dim rJeune as dao.recordset: set rJeune=db.openRecordset("Zus_jeunes", dbOpenDynaset)
dim rZus as dao.recordset: set rZus=db.openRceordset("ZUS_Officiel", dbOpenDynaset)
 
do while not rJeune.eof
   'Parcours la liste des jeunes
 
   'Cherche si l'adresse du jeune est en Zus
   rZus.findfirst("[Numero_Rue=]" & rJeune![Numero_Rue] & " and [Type_Rue]=""" & rJeune![Type_Rue] & """ and [Nom_Rue]=""" & rJeune![Nom_Rue] & """ and [Commune]=""" & rJeune![Comune] & """")
 
   rJeune.edit
 
   'Si on n'a pas trouvé l'adresse en ZUS c'est que le jeune n'est pas en ZUS
 
   ' NoMatch() retourne Vrai (ou oui) si l'information n'existe pas,
   '  Not(NoMatch()) retourne Vrai (ou oui) si l'information existe
   '  donc tu vas avoir Oui (ou Vrai) dans EstEnZUS si l'adresse du jeune 
   '     est dans la table ZUS.
   '  sinon tu auras Non (ou Faux)
 
   ' J'ai supposé que le champ où tu vas indiquer que le jeune 
   '   est en ZUS s'appèle EstEnZus mais faudra adpater à ta table.
 
   rJeune![EstEnZus]=not(rZus.NoMatch())
 
   rJeune.Update
 
   rJeune.MoveNext
loop
 
rZus.close: set rZus=nothing 'Ferme et libère la mémoire utilisée par l'objet
rJeune.close: set rJeune=nothing 'Ferme et libère la mémoire utilisée par l'objet
set db=nothing
__________________
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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 09h09   #5
Invité régulier
 
florian legrand
Inscription : mai 2010
Messages : 58
Détails du profil
Informations personnelles :
Nom : florian legrand

Informations forums :
Inscription : mai 2010
Messages : 58
Points : 7
Points : 7
Merci. Alors j'ai testé mais sur cette ligne :
Code :
rZus.FindFirst ("[Numero]=" & rJeune![Numero] & " and [Voie]=""" & rJeune![TypeRue] & """ and [NomVoie]=""" & rJeune![NomRue] & """ and [Ville]=""" & rJeune![Commune] & """")
Il indique Type de données incompatible dans l'expression du critère

Et encore un autre problème : dans la table zus officiel, si la rue complète est en ZUS , il n'y a pas de numéro indiqué. Cela peut peut-être causer l'erreur ?
seyflo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 09h35   #6
Invité régulier
 
florian legrand
Inscription : mai 2010
Messages : 58
Détails du profil
Informations personnelles :
Nom : florian legrand

Informations forums :
Inscription : mai 2010
Messages : 58
Points : 7
Points : 7
J'ai réussi à régler cette erreur, il me compare bien mais il met une erreur "opérateur absent" sur la ligne 51... alors que tout est normal.
Pour information, il y a 5834 lignes... Je ne sais pas comment résoudre ça.
seyflo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 09h52   #7
Invité régulier
 
florian legrand
Inscription : mai 2010
Messages : 58
Détails du profil
Informations personnelles :
Nom : florian legrand

Informations forums :
Inscription : mai 2010
Messages : 58
Points : 7
Points : 7
C'est bon tout marche! je te dis un GRAND MERCI!
L'erreur c'était parce que dans les noms de rue il y a avait des guillemets.
Juste une dernière question :
J'obtiens -1 pour oui et 0 pour non, peut-on changer cela?
seyflo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 17h30   #8
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 470
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 470
Points : 7 549
Points : 7 549
Oui et non :o)

Non car c'est la représentation en interne de Vrai/True/Oui/Actif et Faux/False/Non/Inactif (0).

Oui parce que tu peux changer l'affichage dans la table en modifiant le format dans l'onglet Général. Si tu effaces le format tu vois -1/0 sinon tu peux voir Oui/Non ou un autre affichage.

Personnellement je ne fais JAMAIS de comparaison avec -1 et 0 mais TOUJOURS avec True ou False (Vrai ou Faux). Cela évite les embiguités surtout si tu travailles dans plusieurs langages car les conventions ne sont pas les mêmes d'un langage à l'autre (ex : dans MS-SQL Serveur, 1=Vrai, 0=Faux).

Au fait peux-tu reposter le code fonctionnel ? Comme cela si quelqu'un en a besoin il pourra avoir une version oppérationnelle.

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.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web