[RESOLU]Modifier table Access en Visual Basic

Modifier table Access en Visual Basic [RESOLU] - VB/VBA/VBS - Programmation

Marsh Posté le 26-08-2010 à 12:13:31    

Bonjour à tous, je suis débutant en Visual Basic et je suis déjà confronté a un problème :
J´ai crée une table dans Access que je souhaite remplir grâce a un code Visual Basic :
 

Code :
  1. Private Sub Form_Current()
  2. Dim strConnect, strsql As String
  3. strConnect = "DSN=MyDSN"
  4. Set objConn = New ADODB.Connection
  5. objConn.Open strConnect
  6. strsql = "INSERT INTO T_TEST(REF, DESIGN) VALUES(´ &  F_ARTICLE.AR_REF & ´, ´ & F_ARTICLE.AR_DESIGN & ´ ) ¨
  7. MsgBox ¨Fin¨
  8. End Sub


 
Le problème, c´est qu´à l´exécution, j´ai une erreur d´exécution ´-214721865 (80040e37´ :
[Simba][SimbaEngine ODBC DRIVER][DRM File Library]No such table or object.
 
Ce qui signifierait que ma table ¨T_TEST¨ n´existe pas ?
Si c´est le cas, comment puis-je corriger le problème svp ?
 
J'ai aussi une autre methode, celle de creer la table directement dans la fonction :
 

Code :
  1. Private Sub Form_Current()
  2. Dim strConnect, strsql As String
  3. Dim dbs As Database
  4. tbl As TableDef
  5. fld As Field
  6. strConnect = "DSN=MyDSN"
  7. 'strConnect = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Demo\toto.accdb;"
  8. Set objConn = New ADODB.Connection
  9. objConn.Open strConnect
  10. tbl = dbs.CreateTableDef("T_TEST" )
  11. Set fld = tbl.CreateField("REF", dbText)
  12. Set fld = tbl.CreateField("DESIGN", dbText)
  13. strsql = "INSERT INTO T_TEST(REF,DESIGN) VALUES(' & F_ARTICLE.AR_REF & ',' & F_ARTICLE.AR_DESIGN & ')"
  14. objConn.Execute strsql
  15. MsgBox "fin"
  16. End Sub


 
mais je tombe sur une nouvelle erreur :
 
Erreur de compilation:
instruction incorrecte à l'extérieur d'un bloc de type
 
Si une bonne ame voulait bien m'aider svp  :ange:


Message édité par greg360 le 31-08-2010 à 16:24:44

---------------
Greg
Reply

Marsh Posté le 26-08-2010 à 12:13:31   

Reply

Marsh Posté le 26-08-2010 à 14:07:31    

Bon je me suis dit que ca venait sans doutes de la base T_TEST, access va la chercher dans la base de donnee connectee via ADODB et non pas en local.
Alors j'ai modifie mon code pour donner ca :
 

Code :
  1. Private Sub Form_Current()
  2. Dim strConnect, strsql As String
  3. Dim dbs As Database
  4. strConnect = "DSN=MyDSN"
  5. Set objConn = New ADODB.Connection
  6. Set dbs = CurrentDb()
  7. Set rst = dbs.OpenRecordset("T_TEST" )
  8. strsql = "INSERT INTO T_TEST(REF, DESIGN) VALUES(" & F_ARTICLE.AR_REF & ", " & F_ARTICLE.DESIGN & " )"
  9. objConn.Execute strsql
  10. MsgBox "fin"
  11. End Sub


 
Sauf que je retombe sur une erreur 424, objet requis ...
 
 
help svp !


---------------
Greg
Reply

Marsh Posté le 26-08-2010 à 14:45:28    

Salut,
 
 

Code :
  1. Set dbs = CurrentDb()
  2.     If dbs Is Nothing Then
  3.         MsgBox "Bd non ouverte"
  4.         Exit Sub
  5.     End If


Pour voir si la database est bien connectée.
 
 
Après, moi j'utilise DAO. C'est bien plus simple.
 

Code :
  1. Dim dbs As DAO.Database
  2. Dim objRs As DAO.Recordset
  3. Dim objRs As DAO.Recordset
  4.         Set dbs = OpenDatabase("chemin\database.mdb" )
  5.        
  6.     If dbs Is Nothing Then
  7.         MsgBox "Bd non ouverte"
  8.         Exit Sub
  9.     End If
  10.    Set objReq = dbs.CreateQueryDef("", "Text de ma requete SQL" )
  11.    Set objRs = objReq.OpenRecordset


 
L'objet recordset contient le resultat de la requete (requete SELECT par ex.).
 

Reply

Marsh Posté le 26-08-2010 à 15:00:30    

Merci pour ta réponse,  
je ne rentre pas dans la condition de test de dbs, donc elle est bien connectée, mais j'ai un message d'erreur au niveau de la requete sql (erreur 242 objet requis)


---------------
Greg
Reply

Marsh Posté le 26-08-2010 à 15:46:16    

Dans la doc MSDN:

Code :
  1. 'Définit le nom de la source de données de type fichier
  2.   strDSN = "FILEDSN=MyDatabase.dsn"
  3.   'Crée l'instance de l'objet Connection et ouvre une connexion à une base de données
  4.   Set cn = Server.CreateObject("ADODB.Connection" )
  5.   cn.Open strDSN
  6.   'Définit l'instruction SQL, SELECT
  7.   strSQL = "INSERT INTO Customers (FirstName, LastName) VALUES ('Jose','Lugo')" 
  8.   'Utilise la méthode Execute pour envoyer une requête SQL à la base de données
  9.   cn.Execute(strSQL)


 
Il doit te manquer l'ouverture de ta connexion.
 

Reply

Marsh Posté le 27-08-2010 à 10:51:54    

Salut, je crois avoir résolu le problème de la connexion, mon maître de stage ne veut pas que je passe par le DSN, dont j'utilise OLEDB..
 
Le code qui suit est fonctionnel pour l'instant, mais comment je peux le tester pour savoir si la connexion s'est bien effectuée ?
 

Code :
  1. Private Sub From_Current()
  2. Dim strConnect As String
  3. strConnect = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Demo\toto.accdb"
  4. objConn.Open strConnect
  5. MsgBox "fin"
  6. End Sub



---------------
Greg
Reply

Marsh Posté le 27-08-2010 à 13:39:27    


objCom est un objet. Suffit de voir s'il est valide:
 
    If objConn Is Nothing Then
        MsgBox "Raté!"
        Exit Sub
    End If
 
 
 

Reply

Marsh Posté le 27-08-2010 à 13:50:15    

Merci !


---------------
Greg
Reply

Marsh Posté le 27-08-2010 à 15:05:24    

Donc je teste la valeur de objConn et je ne rentre pas dans la condition, donc c'est bon, mais l'erreur 424 objet requis est toujours présente a cette ligne ci :
 

Code :
  1. Private Sub From_Current()
  2. Dim strConnect As String
  3. strConnect = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Demo\toto.accdb"
  4. objConn.Open strConnect
  5. If objConn Is Nothing Then
  6. MsgBox "fail"
  7. End If
  8. strsql  = "INSERT INTO T_TEST(REF,DESIGN) VALUES(" & F_ARTICLE.AR_REF & "," & F_ARTICLE.AR_DESIGN & " )"
  9. objConn.Execute (strsql)
  10. MsgBox "fin"
  11. End Sub


---------------
Greg
Reply

Marsh Posté le 27-08-2010 à 15:46:49    

Code :
  1. strsql  = "INSERT INTO T_TEST (REF,DESIGN) VALUES (" & F_ARTICLE.AR_REF & "," & F_ARTICLE.AR_DESIGN & " )"


 
Essaie avec cette synthaxe ci-dessus.
 
Sinon, passa ta requête en dur, sans variable, pour être sûr de la synthaxe.

Reply

Marsh Posté le 27-08-2010 à 15:46:49   

Reply

Marsh Posté le 27-08-2010 à 15:55:11    

Ça fonctionne avec des valeurs en dur, c'est donc un problème de syntaxe de la requête SQL. F_ARTICLE est une table ODBC attache. Si je remplace "F_ARTICLE" par "[Liste articles]" qui est la table qui est remplie avec F_ARTICLE,j'ai une nouvelle erreur : "2465 NomDuDSN ne trouve pas le champ "|" auquel il est fait référence dans votre expression"  
Je suis sur que c'est une erreur complètement nulle, mais en tout est nouveau pour moi (je passe de programmation C# sous emacs a access ...)


---------------
Greg
Reply

Marsh Posté le 27-08-2010 à 16:17:12    

Je crois que la synthaxe, c'est [Table!Champ] (point d'exclamation en séparateur, pas un pipe).

Reply

Marsh Posté le 27-08-2010 à 16:24:32    

Voire [Table]![Champ] si je me souviens bien [:petrus dei]

Reply

Marsh Posté le 27-08-2010 à 16:57:41    

Oui c’était bien ça le problème, une erreur de syntaxe dans la requête. Mais maintenant j'ai une erreur au moment de l’exécution de cette requête :
 
"aucune valeur donnée pour un ou plusieurs des paramètres requis"


---------------
Greg
Reply

Marsh Posté le 31-08-2010 à 09:10:07    

Après avoir bien réfléchi ce week-end, j'ai trouve le problème, et c'est un problème complètement stupide...
 
La table F_ARTICLE est sur le DSN et je m'y connecte via ADO, mais la table T_TEST est une table que j'ai créé dans Access, donc je dois m'y connecter avec une autre strConnect.
 
Mais je ne sais pas comment je peux faire pour me connecter a 2 sources différentes .. Et surtout comment faire pour faire un execute(strsql) en utilisant 2 variables de connexion ?
 

Code :
  1. Private Sub Form_Current()
  2. Dim strConnect, strConnect2, strsql As String
  3. Dim dbCPTA As ADODB.Connection
  4. strConnect = "DSN=MyDSN"
  5. strConnect2 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Demo\toto.accdb"
  6. Set dbCPTA = New ADODB.Connection
  7. dbCPTA.Open = strConnect
  8. strsql = "INSERT INTO T_TEST (REF,DESIGN) VALUES (F_ARTICLE.AR_REF,F_ARTICLE.AR_DESIGN)"
  9. dbCPTA.Execute (strsql)
  10. dbCPTA.Close
  11. Set dbCPTA = Nothing
  12. MsgBox "Fin"
  13. End Sub


 
 
J'ai teste la syntaxe ci dessus dans un SELECT avec 1 seule source et c'est celle ci qui fonctionne. La question que je me pose, c'est, comment je peux faire pour faire un open de strConnect2 ? Refaire un Set dbCPTA = New ADODB.Connection ?


---------------
Greg
Reply

Marsh Posté le 31-08-2010 à 10:04:18    

Je pense avoir trouvé un moyen de me connecter au DSN et a ma base access :
 

Code :
  1. Private Sub Form_Current()
  2. Dim strConnect, strConnect2 As String
  3. Dim strsql As String
  4. Dim dbCPTA As ADODB.Connection
  5. Dim dbCPTA2 As ADODB.Connection
  6. Dim var_ref As String
  7. Dim var_design As String
  8. strConnect2 = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Demo\toto.accdb;"
  9. strConnect = "DSN=MyDSN"
  10. Set dbCPTA = New ADODB.Connection
  11. Set dbCPTA2 = New ADODB.Connection
  12. dbCPTA.Open strConnect
  13. dbCPTA2.Open strConnect2
  14. strsql = "SELECT F_ARTICLE.AR_REF AS var_ref, F_ARTICLE.AR_DESIGN AS var_design FROM F_ARTICLE"
  15. dbCPTA.Execute (strsql)
  16. MsgBox var_ref
  17. MsgBox var_design
  18. strsql = "INSERT INTO T_TEST (REF,DESIGN) VALUES (F_ARTICLE.AR_REF,F_ARTICLE.AR_DESIGN)"
  19. dbCPTA.Execute (strsql)
  20. dbCPTA.Close
  21. Set dbCPTA = Nothing
  22. dbCPTA2.Close
  23. Set dbCPTA2 = Nothing
  24. MsgBox "fin"
  25. End Sub


 
Le seul problème pour l'instant, c'est que je ne peux pas voir les valeurs de var_ref et var_design, les msgbox sont vides..
Comment faire pour checker leur valeur ?


---------------
Greg
Reply

Marsh Posté le 31-08-2010 à 15:07:11    

Problème résolu, en parfait noobie, je ne connaissait pas l'existence des recordset ;)
 
Je ne met pas encore la bannière "[RESOLU]" car j'aurais encore qqes questions plus tard !


---------------
Greg
Reply

Marsh Posté le 31-08-2010 à 16:00:42    

Le problème de modification de table via code vb est résolu :) merci a tous de m'avoir aidé
 
Edit : je joins quand meme le code résolu :p
 

Code :
  1. 1.Private Sub Form_Current()
  2. 2.
  3. 3.Dim strConnect, strConnect2 As String
  4. 4.Dim strsql As String
  5. 5.Dim dbCPTA As adodb.Connection
  6. 6.Dim dbCPTA2 As adodb.Connection
  7. 7.
  8. 8.'declaration des recordsets
  9. 9.Dim rst As New adodb.Recordset
  10. 10.Dim rst2 As New adodb.Recordset
  11. 11.
  12. 12.'ouverture + connection au DSN "MyDSN"
  13. 13.strConnect = "DSN=MyDSN"
  14. 14.Set dbCPTA = New adodb.Connection
  15. 15.dbCPTA.Open strConnect
  16. 16.
  17. 17.'ouverture + connection à la BDD
  18. 18.Set dbCPTA2 = New adodb.Connection
  19. 19.strConnect2 = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Demo\toto.accdb;"
  20. 20.dbCPTA2.Open strConnect2
  21. 21.
  22. 22.'reset de la table T_TEST
  23. 23.DoCmd.SetWarnings False
  24. 24.DoCmd.RunSQL "DELETE * FROM T_TEST"
  25. 25.DoCmd.SetWarnings True
  26. 26.
  27. 27.'récupération des champs necessaires dans le recordset
  28. 28.rst.Open "SELECT F_ARTICLE.AR_REF ,F_ARTICLE.AR_DESIGN  FROM F_ARTICLE", dbCPTA
  29. 29.rst.MoveFirst
  30. 30.
  31. 31.'boucle d'insertion des valeurs du recordset dans la table vide T_TEST
  32. 32.While Not (rst.EOF)
  33. 33.    strsql = "INSERT INTO T_TEST (REF,DESIGN) VALUES ('" & rst(0) & "', '" & rst(1) & "')"
  34. 34.    dbCPTA2.Execute (strsql)
  35. 35.    rst.MoveNext
  36. 36.Wend
  37. 37.
  38. 38.'récupération des champs de T_TEST dans un autre recordset
  39. 39.rst2.Open "SELECT T_TEST.REF,T_TEST.DESIGN FROM T_TEST", dbCPTA2
  40. 40.rst2.MoveFirst
  41. 41.
  42. 42.'boucle d'affichage et de test de la table T_TEST
  43. 43.While Not (rst2.EOF)
  44. 44.    MsgBox "REF : " & rst2(0) & " DESIGN :" & rst2(1) & "."
  45. 45.    rst.MoveNext
  46. 46.Wend
  47. 47.
  48. 48.'fermeture du recordset
  49. 49.rst.Close
  50. 50.'fermeture de la connexion au DSN
  51. 51.dbCPTA.Close
  52. 52.'suppression de l'objet dbCPTA
  53. 53.Set dbCPTA = Nothing
  54. 54.
  55. 55.'fermeture du recordset
  56. 56.rst2.Close
  57. 57.'fermeture de la connexion à la BDD
  58. 58.dbCPTA2.Close
  59. 59.'suppression de l'objet dbCPTA2
  60. 60.Set dbCPTA2 = Nothing
  61. 61.
  62. 62.
  63. 63.MsgBox "fin"
  64. 64.
  65. 65.End Sub


Message édité par greg360 le 31-08-2010 à 16:33:49

---------------
Greg
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed