Besoin d'aide sur une erreur 13 type incompatible

boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012 - 7 mars 2012 à 17:45
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 12 mars 2012 à 13:24
Bonjour à tous

Je me sert d'une base Access développée par un ancien collègue. Lorsque je lance un programme, je me retrouve avec une erreur 13 "type incompatible".
voici la partie du programme qui pose problème:

CurrentDb.Execute "SELECT ilots1.Code, ilots1.X, ilots1.Y, parcelles_prop.Commun INTO ilots2 FROM ilots1 INNER JOIN parcelles_prop ON ilots1.Code=parcelles_prop.code;"
CurrentDb.Execute "ALTER TABLE ilots2 ADD COLUMN id_ilot INTEGER;"

Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots2 ORDER BY ilots2.Commun, ilots2.X DESC;")

ilo = 1
Do Until bs.EOF
'Debug.Print bs(1)
Set cs CurrentDb.OpenRecordset("SELECT * FROM ilots2 WHERE ilots2.Commun '" & bs(3) & "' AND ((ilots2.X = '" & bs(1) & "' AND ilots2.Y = '" & bs(2) & "') OR ilots2.Code = '" & bs(0) & "') AND ilots2.id_ilot <> NULL;") If cs.EOF Then
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & ilo & " WHERE ilots2.Code = '" & bs(0) & "';"
ilo = ilo + 1
Else
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & cs(4) & " WHERE ilots2.Code = '" & bs(0) & "';"
End If

bs.MoveNext
Loop

CurrentDb.Execute "CREATE TABLE ilots5 (Code VARCHAR(50) PRIMARY KEY ,Commun VARCHAR(200), id_ilot INTEGER)"
CurrentDb.Execute "INSERT INTO ilots5 SELECT ilots2.Code, ilots2.Commun, ilots2.id_ilot FROM ilots2;"

CurrentDb.Execute "SELECT ilots5.Commun, ilots5.id_ilot, Count(ilots5.id_ilot) AS NBparcelle INTO ilots6 FROM ilots5 GROUP BY ilots5.Commun, ilots5.id_ilot;"

Quelqu'un pourrait-il m'aider à résoudre ce problème c'est urgent
merci d'avance

17 réponses

Utilisateur anonyme
7 mars 2012 à 20:44
Bonjour,

et avec un <ENTER> ou, au pire, un ":" juste avant le

If cs.EOF Then


cela donne quoi ?

Peut-être un peu moins de panique
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
8 mars 2012 à 08:29
merci cmarcotte pour ta remarque, il y a bien un <ENTER>
la mise en page à été déformée en copiant-collant
Le re-voici en respectant les <ENTER>

CurrentDb.Execute "SELECT ilots1.Code, ilots1.X, ilots1.Y, parcelles_prop.Commun INTO ilots2 FROM ilots1 INNER JOIN parcelles_prop ON ilots1.Code=parcelles_prop.code;"
CurrentDb.Execute "ALTER TABLE ilots2 ADD COLUMN id_ilot INTEGER;"

Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots2 ORDER BY ilots2.Commun, ilots2.X DESC;")

ilo = 1
Do Until bs.EOF
'Debug.Print bs(1)

Set cs CurrentDb.OpenRecordset("SELECT * FROM ilots2 WHERE ilots2.Commun '" & bs(3) & "' AND ((ilots2.X = '" & bs(1) & "' AND ilots2.Y = '" & bs(2) & "') OR ilots2.Code = '" & bs(0) & "') AND ilots2.id_ilot <> NULL;"):

If cs.EOF Then
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & ilo & " WHERE ilots2.Code = '" & bs(0) & "';"
ilo = ilo + 1
Else
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & cs(4) & " WHERE ilots2.Code = '" & bs(0) & "';"
End If

bs.MoveNext
Loop

CurrentDb.Execute "CREATE TABLE ilots5 (Code VARCHAR(50) PRIMARY KEY ,Commun VARCHAR(200), id_ilot INTEGER)"
CurrentDb.Execute "INSERT INTO ilots5 SELECT ilots2.Code, ilots2.Commun, ilots2.id_ilot FROM ilots2;"

CurrentDb.Execute "SELECT ilots5.Commun, ilots5.id_ilot, Count(ilots5.id_ilot) AS NBparcelle INTO ilots6 FROM ilots5 GROUP BY ilots5.Commun, ilots5.id_ilot;"
0
Utilisateur anonyme
8 mars 2012 à 17:21
Bonjour,

Je n'ai jamais programmé Acces et je n'ai plus Access. Ce que je pourrais en dire c'est que c'est qu'il doit manquer quelque chose dans la requête SQL.

1) Mets un espion aur ta variable et assure-toi qu'il ne manque rien dans ta requête, surtout les astérisques, les guillemets, les apostrophes et les espaces.

2) Si mes souvenirs sont exacts, il y a moyen d'essayer une requête SQL directement dans Acces sans la composer dans l'éditeur de requêtes d'Access, mais là c'est trop vague dans mon esprit.
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
9 mars 2012 à 07:48
Exact j'ai essayé la requête SQL directement dans la base Access en modifiant les *, ' " () et les espaces mais rien n'y fait
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 mars 2012 à 12:47
Salut

Comment et où est dimensionnée ta variable "cs" ?

Pour pouvoir faire un "Set", il faut que la variable ne soit pas encore instanciée. Or, dans ta boucle, le deuxième passage posera problème : Ajoute un
Set cs = Nothing
avant le Set actuel

De quels types (dans ta table) sont tes champs "commun", "X", ...
Apparemment, ce serait tous des champs de type Texte ?

Le contenu de tes variables "bs()" a t-il été vérifié ?
Il ne faudrait pas qu'il renferme une apostrophe, par exemple.
Veille à ce que les chiffres aient un point en guise de séparateur décimal, pas de virgule.

ilots2.id_ilot <> NULL
peut être remplacé par
Not ilots2.id_ilot is null

Astuce pour lisibilité :
Dans la mesure où tu ne t'adresses qu'à une seule table, il n'est pas nécessaire de répéter le nom de cette unique table devant les noms des champs.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
9 mars 2012 à 13:34
Jack
je ne sais pas où est dimensionnée ma variable "cs"

Les champs "commun" "X" "Y" sont des types textes

je vais vérifier les variables "bs()"

j'ai essayé
d'ajouter Set cs = Nothing avant
de remplacer ilots2.id_ilot <> NULL par Not ilots2.id_ilot is null
et j'ai toujours le même problème
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
10 mars 2012 à 01:16
Ta question est postée dans la catégorie VB6, mais je pense, ma boule de cristal (*) et moi, que tu travailles dans le VBA de Access; au vu de cette syntaxe que VB6 ne connait pas : CurrentDb

Dimensionnement de "cs"
Bien que ce ne soit pas obligatoire, je te conseille fortement de rendre obligatoire la déclaration de chacune des variables que tu utilises.
Pour ce faire :
- Dans les options de l'éditeur de VBA, il doit y avoir une case à cocher que ressemble à "déclaration obligatoire des variables". Dans les futures pages de code, l'instruction "Option Explicit" apparaitra en haut.
- Dans les pages de code déjà existantes, il te faut ajouter cette instruction à la main, en haut de chaque page de code, dans la partie "Déclarations"

Avantages :
- Plus de risque de faire une erreur de syntaxe dans le nom des variables puisque tu seras averti en cas d'anomalie
- Cela va t'obliger à réfléchir au type de la variable et ainsi mieux appréhender les nuances
- Cela va t'obliger à réfléchir à l'endroit où il faut déclarer cette variable, donc à réfléchir à la durée de vie des données que chaque variable renferme :
Si tu places la déclaration de ta variable :
* Dans la procédure en cours : La variable n'existera et ne sera visible que de l'intérieur de cette procédure
* En "Private" dans la partie "Declarations" de ta page de code : La variable existe tout le temps, mais ne sera visible que depuis les procédures présentes dans cette page de code.
* En "Public" dans la partie "Declarations" de la page de code d'un "Module" : La variable existe tout le temps et sera visible de partout.

Inconvénients :
Cela parait chiant au début d'être obligé de déclarer chaque variable, mais on s'y fait vite et c'est mineur à côté des énormes avantages que cela procure.

Quant au type de ta variable "cs" : Puisque tu comptes lui entrer un RecordSet, il te faut la déclarer comme tel.
A mon avis, une déclaration au sein de la procédure suffira puisqu'elle n'est qu'une variable temporaire de ton code.

(...)

En relisant ton code, je me demande si tu as désigner la bonne partie de code qui pose problème :
Dans le code colorisé en bleu, rien ne semble anormal.
Par contre, le code presque identique du dessus doit poser problème :
CurrentDb.Execute "SELECT ilots1.Code, ilots1.X, ilots1.Y, ...
On ne peut pas donner un Select à manger à un Execute.
Execute ne sert qu'aux requêtes du type "Insert Into", "Delete" ou autre comme "Alter Database" / Table
Select nécessite forcement une variable pour recevoir les données, donc un RecordSet.

(*) Champion du monde de boule de cristal 2005 et 2006
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
10 mars 2012 à 09:59
Oui Jack, c'est bien le VBA de Access, je me suis trompé
Ma variable "cd" est bien RecordSet
Je te mets toute la procédure




Option Compare Database


Private Sub table_poly_Click()

Set fso = CreateObject("Scripting.FileSystemObject")

FileName = OuvrirUnFichier(Me.Hwnd, "Parcourir", 1, "Fichier Word", "doc")
Set ts = fso.OpenTextFile(FileName)

CurrentDb.Execute "CREATE TABLE ilots1(Code VARCHAR(10),X VARCHAR(10),Y VARCHAR(11))"

Do While Not ts.AtEndOfStream

tvar = ts.ReadLine

If Left(tvar, 9) = "Polyligne" Then
n = RTrim(Mid(tvar, 13, 10))

ElseIf Mid(tvar, 1, 1) = "0" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "1" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "2" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "3" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "4" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"
ElseIf Mid(tvar, 1, 1) = "5" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "6" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "7" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "8" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

ElseIf Mid(tvar, 1, 1) = "9" Then
x = Mid(tvar, 1, 10)
y = Mid(tvar, 31, 11)
CurrentDb.Execute "INSERT INTO ilots1(Code,X,Y) VALUES ('" & n & "', '" & x & "', '" & y & "')"

End If

Loop
ts.Close
Set ts = Nothing
MsgBox "OK"
End Sub

Private Sub polylignes_Click()

Dim ilo As Integer
Dim bs, cs As Recordset
Set Db = CurrentDb


'CurrentDb.Execute "SELECT ilots1.Code, ilots1.X, ilots1.Y, parcelles_1commune.Commun, parcelles_1commune.Commune INTO ilots2 FROM ilots1 INNER JOIN parcelles_1commune ON ilots1.Code=parcelles_1commune.code;"
'CurrentDb.Execute "ALTER TABLE ilots21 ADD COLUMN id_ilot INTEGER;"

' Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots21 ORDER BY ilots21.Commun, ilots21.X DESC;")

' ilo = 1
' Do Until bs.EOF
'Debug.Print bs(1)
' Set cs CurrentDb.OpenRecordset("SELECT * FROM ilots21 WHERE ilots21.Commun '" & bs(3) & "' AND ((ilots21.X = '" & bs(1) & "' AND ilots21.Y = '" & bs(2) & "') OR ilots21.Code = '" & bs(0) & "') AND ilots21.id_ilot <> NULL;")
'Set cs CurrentDb.OpenRecordset("SELECT * FROM ilots2 WHERE ilots2.Commun '" & bs(3) & "' AND ((ilots2.X = '" & bs(1) & "' AND ilots2.Y = '" & bs(2) & "') OR ilots2.Code = '" & bs(0) & "') AND ilots2.id_ilot <> NULL;")
'If cs.EOF Then
' CurrentDb.Execute "UPDATE ilots21 SET ilots21.id_ilot=" & ilo & " WHERE ilots21.Code = '" & bs(0) & "';"
' ilo = ilo + 1
' Else
' CurrentDb.Execute "UPDATE ilots21 SET ilots21.id_ilot=" & cs(5) & " WHERE ilots21.Code = '" & bs(0) & "';"
' End If

' bs.MoveNext
' Loop

'CurrentDb.Execute "CREATE TABLE ilots51 (Code VARCHAR(50) PRIMARY KEY ,Commun VARCHAR(200), id_ilot INTEGER, Commune INTEGER)"
'CurrentDb.Execute "INSERT INTO ilots51 SELECT ilots21.Code, ilots21.Commun, ilots21.id_ilot, ilots21.Commune FROM ilots21;"

'CurrentDb.Execute "SELECT ilots51.Commun, ilots51.id_ilot, ilots51.Commune, Count(ilots51.id_ilot) AS NBparcelle INTO ilots61 FROM ilots51 GROUP BY ilots51.Commun, ilots51.id_ilot, ilots51.Commune;"


' bs.Close
' cs.Close

' Set bs = Nothing
' Set cs = Nothing
'MsgBox "OK"

CurrentDb.Execute "SELECT ilots1.Code, ilots1.X, ilots1.Y, parcelles_prop.Commun INTO ilots2 FROM ilots1 INNER JOIN parcelles_prop ON ilots1.Code=parcelles_prop.code;"
CurrentDb.Execute "ALTER TABLE ilots2 ADD COLUMN id_ilot INTEGER;"

Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots2 ORDER BY ilots2.Commun, ilots2.X DESC;")

ilo = 1
Do Until bs.EOF
'Debug.Print bs(1)
Set cs CurrentDb.OpenRecordset("SELECT * FROM ilots2 WHERE ilots2.Commun '" & bs(3) & "' AND ((ilots2.X = '" & bs(1) & "' AND ilots2.Y = '" & bs(2) & "') OR ilots2.Code = '" & bs(0) & "') AND ilots2.id_ilot <> NULL;")
If cs.EOF Then
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & ilo & " WHERE ilots2.Code = '" & bs(0) & "';"
ilo = ilo + 1
Else
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & cs(4) & " WHERE ilots2.Code = '" & bs(0) & "';"
End If

bs.MoveNext
Loop

CurrentDb.Execute "CREATE TABLE ilots5 (Code VARCHAR(50) PRIMARY KEY ,Commun VARCHAR(200), id_ilot INTEGER)"
CurrentDb.Execute "INSERT INTO ilots5 SELECT ilots2.Code, ilots2.Commun, ilots2.id_ilot FROM ilots2;"

CurrentDb.Execute "SELECT ilots5.Commun, ilots5.id_ilot, Count(ilots5.id_ilot) AS NBparcelle INTO ilots6 FROM ilots5 GROUP BY ilots5.Commun, ilots5.id_ilot;"


bs.Close
cs.Close

Set bs = Nothing
Set cs = Nothing
MsgBox "OK"

End Sub

Private Sub mono_ilot_Click()


CurrentDb.Execute "SELECT ilots6.Commun, Sum(ilots6.NBparcelle) AS NBparcelle,Count(ilots6.Commun) AS NBilot INTO monotout FROM ilots6 GROUP BY ilots6.Commun HAVING (((Count(ilots6.Commun))=1));"
CurrentDb.Execute "SELECT ilots6.Commun, Sum(ilots6.NBparcelle) AS NBparcelle,Count(ilots6.Commun) AS NBilot INTO autre_ilot FROM ilots6 GROUP BY ilots6.Commun HAVING (((Count(ilots6.Commun))>1));"

CurrentDb.Execute "SELECT monotout.Commun, monotout.NBparcelle, monotout.NBilot INTO monoilot FROM monotout WHERE (((monotout.NBparcelle)>1));"
CurrentDb.Execute "ALTER TABLE monoilot ADD COLUMN id_prop2 AUTOINCREMENT"

CurrentDb.Execute "SELECT monoilot.Commun, monoilot.NBparcelle, monoilot.NBilot, monoilot.id_prop2, Sum(parcelles_prop.Surface) AS Surface INTO monoilot_surface FROM monoilot INNER JOIN parcelles_prop ON monoilot.Commun = parcelles_prop.Commun GROUP BY monoilot.Commun, monoilot.NBparcelle, monoilot.NBilot, monoilot.id_prop2;"
CurrentDb.Execute "ALTER TABLE monoilot_surface ADD COLUMN occ VARCHAR"
CurrentDb.Execute "SELECT autre_ilot.Commun, autre_ilot.NBparcelle, autre_ilot.NBilot, Sum(parcelles_prop.Surface) AS Surface INTO autreilot_surface FROM autre_ilot INNER JOIN parcelles_prop ON autre_ilot.Commun = parcelles_prop.Commun GROUP BY autre_ilot.Commun, autre_ilot.NBparcelle, autre_ilot.NBilot;"
CurrentDb.Execute "ALTER TABLE autreilot_surface ADD COLUMN teinte INTEGER"

CurrentDb.Execute "SELECT monoilot_surface.Commun, monoilot_surface.NBparcelle, monoilot_surface.NBilot, monoilot_surface.id_prop2, monoilot_surface.Surface, monoilot_surface.occ, compte_propriete.Commune INTO monoilot_com FROM monoilot_surface, compte_propriete WHERE (((monoilot_surface.Commun)=[compte_propriete].[Commun]));"

CurrentDb.Execute "SELECT compte_propriete_PEAF.* INTO autre_compte FROM compte_propriete_PEAF;"
CurrentDb.Execute "ALTER TABLE autre_compte ADD COLUMN Calque VARCHAR(20), Couleur INTEGER, Style INTEGER, Motif VARCHAR(50), Echelle INTEGER, Rotation INTEGER, Fonds VARCHAR(50)"
CurrentDb.Execute "DELETE autre_compte.* FROM autre_compte, monoilot WHERE (((autre_compte.Commun)=[monoilot].[Commun]));"
CurrentDb.Execute "DELETE autre_compte.* FROM autre_compte, monoparcelle WHERE (((autre_compte.Commun)=[monoparcelle].[Commun]));"

CurrentDb.Execute "SELECT parcelles_prop.code,parcelles_prop.X,parcelles_prop.Y, parcelles_prop.Commune, parcelles_prop.Surface, parcelles_prop.Commun, monoilot.id_prop2 INTO monoilot_parc FROM parcelles_prop INNER JOIN monoilot ON parcelles_prop.Commun = monoilot.Commun WHERE (((parcelles_prop.Commun)=[monoilot].[Commun]));"


MsgBox "OK"

End Sub

Private Sub ilot_expl_Click()

Dim ilo As Integer
Dim bs, cs As Recordset
Set Db = CurrentDb


CurrentDb.Execute "SELECT ilots1.Code, ilots1.X, ilots1.Y, parcelle_expl.nom, parcelle_expl.Commune INTO ilots2_expl FROM ilots1 INNER JOIN parcelle_expl ON ilots1.Code=parcelle_expl.code;"
CurrentDb.Execute "SELECT X,Y,nom,Commune INTO ilots3_expl FROM ilots2_expl GROUP BY X,Y,nom,Commune HAVING Count(*)>1;"
CurrentDb.Execute "SELECT ilots2_expl.Code, ilots2_expl.X, ilots2_expl.Y, ilots2_expl.nom, ilots2_expl.Commune INTO ilots4_expl FROM ilots3_expl INNER JOIN ilots2_expl ON (ilots3_expl.X=ilots2_expl.X) AND (ilots3_expl.Y=ilots2_expl.Y) AND (ilots3_expl.nom=ilots2_expl.nom) ORDER BY ilots2_expl.nom,ilots2_expl.X DESC;"
CurrentDb.Execute "ALTER TABLE ilots4_expl ADD COLUMN id_ilot INTEGER;"

Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots4_expl ORDER BY ilots4_expl.nom,ilots4_expl.X DESC;")

ilo = 1
Do Until bs.EOF
'Debug.Print bs(1)
Set cs CurrentDb.OpenRecordset("SELECT * FROM ilots4_expl WHERE ilots4_expl.nom '" & bs(3) & "' AND (ilots4_expl.X = '" & bs(1) & "' OR ilots4_expl.Code = '" & bs(0) & "') AND ilots4_expl.id_ilot <> NULL;")
If cs.EOF Then
CurrentDb.Execute "UPDATE ilots4_expl SET ilots4_expl.id_ilot=" & ilo & " WHERE ilots4_expl.Code = '" & bs(0) & "';"
ilo = ilo + 1
Else
CurrentDb.Execute "UPDATE ilots4_expl SET ilots4_expl.id_ilot=" & cs(5) & " WHERE ilots4_expl.Code = '" & bs(0) & "';"
End If

bs.MoveNext
Loop

CurrentDb.Execute "CREATE TABLE ilots5_expl (Code VARCHAR(50) PRIMARY KEY, Nom VARCHAR(200), id_ilot INTEGER, Commune INTEGER, Surface INTEGER)"
CurrentDb.Execute "INSERT INTO ilots5_expl SELECT ilots4_expl.Code, ilots4_expl.nom, ilots4_expl.id_ilot, ilots4_expl.Commune, parcelle_expl.Surface FROM ilots4_expl INNER JOIN parcelle_expl ON ilots4_expl.Code = parcelle_expl.code;"

CurrentDb.Execute "SELECT Count(ilots5_expl.id_ilot) AS Nombre_parcelle, Sum(ilots5_expl.Surface) AS SommeDeSurface, ilots5_expl.id_ilot, ilots5_expl.Nom, ilots5_expl.Commune INTO ilots6_expl FROM ilots5_expl GROUP BY ilots5_expl.id_ilot, ilots5_expl.Nom, ilots5_expl.Commune;"

CurrentDb.Execute "SELECT parcelle_expl.code, parcelle_expl.Commune, parcelle_expl.Surface, parcelle_expl.id_exp, parcelle_expl.nom, ilots5_expl.id_ilot INTO ilots7_expl FROM ilots5_expl RIGHT JOIN parcelle_expl ON ilots5_expl.Code = parcelle_expl.code;"


bs.Close
cs.Close

Set bs = Nothing
Set cs = Nothing
MsgBox "OK"

End Sub

Private Sub ilots_Click()

Dim bs, cs As Recordset
Set Db = CurrentDb

Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots7_expl;")
Set cs = CurrentDb.OpenRecordset("SELECT Max(ilots7_expl.id_ilot) AS MaxDeid_ilot FROM ilots7_expl;")

n = cs(0) + 1
Do Until bs.EOF

If IsNull(bs(5)) Then
CurrentDb.Execute "UPDATE ilots7_expl SET ilots7_expl.id_ilot=" & n & " WHERE ilots7_expl.code='" & bs(0) & "';"
n = n + 1
End If

bs.MoveNext
Loop

CurrentDb.Execute "SELECT ilots7_expl.id_ilot, Sum(ilots7_expl.Surface) AS SommeDeSurface, ilots7_expl.nom INTO ilots8_expl FROM ilots7_expl GROUP BY ilots7_expl.id_ilot, ilots7_expl.nom;"

CurrentDb.Execute "SELECT ilots8_expl.nom, Count(ilots8_expl.id_ilot) AS CompteDeid_ilot, Sum(ilots8_expl.SommeDeSurface) AS SommeDeSurface INTO ilots9_expl FROM ilots8_expl GROUP BY ilots8_expl.nom;"


bs.Close
cs.Close
Set bs = Nothing
Set cs = Nothing
MsgBox "OK"
End Sub
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mars 2012 à 03:12
Désolé, je ne vais pas me lancer dans le décryptage de ton code.
Pense à utiliser la coloration syntaxique quand tu postes un code = 3ème icone à droite.

Et que dit ton problème ?
Tu as avancé ?
C'est surtout ça qui nous intéresse.

As-tu supprimé le ":" qui suit, sans raison, ta ligne de code ?

Décompose ta syntaxe :
A la place de
Set cs = CurrentDb.OpenRecordset("SELECT * FROM ...
fais ceci :
Dim sTemp As String
sTemp = "SELECT * FROM ..."
Set cs = CurrentDb.OpenRecordset(sTemp)
et dis-nous sur quelle ligne apparait maintenant l'erreur.

Ensuite, copie colle le contenu de sTemp ici, qu'on voit à quoi ressemble ta requète AVEC les paramètres insérés.
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
11 mars 2012 à 11:18
j'ai décomposé la syntaxe comme suit:

'Debug.Print bs(1)
Dim sTemp As String
sTemp ("SELECT * FROM ilots2 WHERE ilots2.Commun '" & bs(3) & "' AND ((ilots2.X = '" & bs(1) & "' AND ilots2.Y = '" & bs(2) & "') OR ilots2.Code = '" & bs(0) & "') AND ilots2.id_ilot <> NULL;")
Set cs = CurrentDb.OpenRecordset(sTemp)
If cs.EOF Then
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & ilo & " WHERE ilots2.Code = '" & bs(0) & "';"
ilo = ilo + 1
Else
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & cs(4) & " WHERE ilots2.Code = '" & bs(0) & "';"
End If


L'erreur (en bleu) est toujours la même:
Erreur d'éxécution '13':
Incompatibilité de type
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mars 2012 à 12:43
Même question : Qu'y a t-il dans sTemp au moment de l'erreur

Essaye en changeant de variable
Dim xxxx As RecordSet
Set xxxx = CurrentDb.OpenRecordset(sTemp) 
Si l'erreur n'apparait pas sur cette nouvelle syntaxe, c'est que tu as un problème de variable du nom de "cs", par exemple une procédure que tu aurais pu appeler comme ça et qui rentrerait en conflit avec la variable.

Vérifie que OpenRecordset ne nécessite pas plus de paramètres

Pense à rendre plus claire tes syntaxes :
- avec l'utilisation de _ en fin de ligne
- en tenant compte des remarques qu'on a déjà faites (suppression du nom de la table unique manipulée ici)
sTemp = "SELECT * " & _
        "  FROM ilots2 " & _
        " WHERE Commun = '" & bs(3) & "' " & _
        "   AND (   (    X = '" & bs(1) & "' " & _
        "            AND Y = '" & bs(2) & "') " & _
        "        OR Code = '" & bs(0) & "') " & _
        "   AND id_ilot <> NULL"
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
11 mars 2012 à 18:33
Je ne vois pas comment intégrer cette syntaxe, par quoi dois-je remplacer les xxxx?
Dim xxxx As RecordSet
Set xxxx = CurrentDb.OpenRecordset(sTemp)
merci de m'éclairer car là je suis complétement largué

par contre j'ai rendu plus clair ma syntaxe comme tu me l'à proposé
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 mars 2012 à 18:39
xxxx est le nom de la variable, c'est juste pour faire un essai.
Si l'erreur n'apparait plus sur cette ligne là, c'est que le problème vient de la variable, il te faudra alors rechercher si une autre variable ou fonction s'appelle aussi comme ça, "cs".

Est-ce que, d'après la doc, la méthode CurrentDb.OpenRecordset renvoie bien un objet Recordset ?

As-tu, ailleurs dans ton code, une syntaxe presque identique et qui fonctionne ?
0
Utilisateur anonyme
11 mars 2012 à 18:58
Bonjour,

Je suppose que tu as bien vérifié que tu n'es pas en train de mêler des commandes ADO et une connexion DAO, ou l'inverse ? Ce genre de combinaison est incompatible.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 mars 2012 à 00:21
Oui, Clément a raison.
Essaye de dimensionner "cs" comme ceci à la place :
Dim cs As ADODB.RecordSet

Si l'intellisence ne te propose rien quand tu commences à taper ADO, c'est que cette référence n'est pas utilisée - oublie.
Par contre, il est possible que cela solutionne ton problème.

On ne connait même pas la version de ton Access.
0
boulaone3000 Messages postés 8 Date d'inscription mercredi 7 mars 2012 Statut Membre Dernière intervention 12 mars 2012
12 mars 2012 à 09:11
Je travaille sur access 2007 et microsoft Visual Basic 6.3

A quel endroit dois-je placer Dim cs As ADODB.RecordSet ?

Set bs = CurrentDb.OpenRecordset("SELECT * FROM ilots2 ORDER BY ilots2.Commun, ilots2.X DESC;")
ilo = 1
Do Until bs.EOF
'Debug.Print bs(1)
Dim sTemp As String
sTemp = "SELECT * " & _
" FROM ilots2 " & _
" WHERE Commun = '" & bs(3) & "' " & _
" AND ( ( X = '" & bs(1) & "' " & _
" AND Y = '" & bs(2) & "') " & _
" OR Code = '" & bs(0) & "') " & _
" AND id_ilot <> NULL"

Set cs = CurrentDb.OpenRecordset(sTemp)
If cs.EOF Then
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & ilo & " WHERE ilots2.Code = '" & bs(0) & "';"
ilo = ilo + 1
Else
CurrentDb.Execute "UPDATE ilots2 SET ilots2.id_ilot=" & cs(4) & " WHERE ilots2.Code = '" & bs(0) & "';"
End If

bs.MoveNext
Loop
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 mars 2012 à 13:24
Là, tu commences à être un peu lourd, quand même.

Puisqu'il s'agit de savoir de quel type est le RecordSet que tu dois déclarer, et bien cet essai de ADODB doit remplacer la déclaration existante.
Je l'ai repérée en tête de Private Sub polylignes_Click()

Je viens d'ouvrir l'aide de VBA dans Access 2007 et il est clairement dit que ces objets sont de type DAO.
Est-ce que tu ne pouvais pas le vérifier toi même ?
Donc, la syntaxe complète du Dim serait
Dim cs As DAO.RecordSet

Depuis que l'on discute, je t'ai demandé (2 fois) de nous montrer le contenu de sTemp au moment de l'erreur.
J'attends toujours.


Rappel :
en VB6 ou VBA, cette syntaxe
Dim bs, cs As Recordset
ne signifie pas que bs et cs seront du type Recordset.
Seul cs le sera.
bs sera du type Variant.
Pour déclarer des variables, il faut répéter le type pour chacune d'elle.


Vieil adage
[i]Si tu viens vers moi avec un problème et que tu ne fais pas partie de la solution, c'est que peut être tu fais partie du problème.
/i
0
Rejoignez-nous