[VBA] PB avec fonctions Acess

PB avec fonctions Acess [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 16-04-2004 à 10:06:57    

Selon certains cas, mes appels aux fonctions acess font foirer mon
prg !
Pour inserer une nouvelle ligne je fait
 
Dim rs as DAO.recordset
 
set rs = currentDb.OpenRecordset("TableTemp" )
 
rs.addnew
 
rs("Facture" )=xxxx
'ainsi de suite je rempli toutes les colonnes de ma table et quand j'ai  
'fini je fais :
rs.Update
 
Bon ça marche uniquement quand ma table "TableTemp" est vide, sinon  
ça bugge au niveau de rs.update !
Et j'ai essayé avec des ptites tables bidons, ça marche tt le tps !
Aidez moi SVP j'en ai marre de galérer !

Reply

Marsh Posté le 16-04-2004 à 10:06:57   

Reply

Marsh Posté le 16-04-2004 à 10:16:27    

J'utilise sensiblement le même code :  
 
Dim Rst As Recordset
Set Rst= CurrentDb.OpenRecordset("NomTable", DB_OPEN_TABLE)
Rst.AddNew
Rst("Champs" ) = xxxx
Rst.Update
Rst.Close
 
je ne sais pas si c'est le DAO en moins ou le "DB_OPEN_TABLE" en plus, mais ce code marche pour moi depuis des années sans pbm.
 
quel message d'erreur as-tu ?

Reply

Marsh Posté le 16-04-2004 à 10:35:18    

Non je viens d'essayer mais cela ne marche pas.
Disons que je ne pas le fermer car après je dois envoyer mon
recordset en param à une fonction. De toute façon ce n'est pas ça puisqu'il bloque sur le "rs.update" et  qu'il me quitte ma procédure.
En fait il ne me met pas de message d'erreur mais il me quitte anormalement ma procédure.
Je sens que je vais devoir laisser tomber les fonctions Acess et me rabattre sur du bon vieux SQL.
Si tu peux m'aider je ne dirai pas non.
Merci de me répondre, c'est sympa car je suis à mon premier stage d'info et je galère car je découvre VBA (dans ce domaine j'ai juste des compétence en WinDev)
@+

Reply

Marsh Posté le 16-04-2004 à 10:48:47    

t'as même pas un p'tit pop up avant qu'il quitte ta procédure ?
sinon, peux-tu repréciser ton besoin (les étapes de tes actions, pour voir quelle est la meilleure stratégie)

Reply

Marsh Posté le 16-04-2004 à 10:56:44    

Ben en fait je suis en train de continuer un projet deja commencé.
Sinon je dois faire une procédure qui récupère des données dans un fichier Excel et les écrire dans une table.
Donc si cette table est vide ça marche sinon ça bugge et je comprends absolument pas pourquoi !  
Je vais etre obligé de faire des fonctions d'execution de requetes SQL mais ça va être long et lourd !

Reply

Marsh Posté le 16-04-2004 à 10:59:37    

et tu peux pas simplement importer ton fichier excel en entier ?

Reply

Marsh Posté le 16-04-2004 à 11:02:47    

Comment ça ?  
Si tu veux j'ouvre le fichier et les feuilles qu'il faut et après je prends les valeurs des cellules qui m'intéressent.

Reply

Marsh Posté le 16-04-2004 à 11:17:27    

lol
ok, va dans l'onglet "table" d'access :
- Tu fais "Nouveau", une boite s'ouvre
- tu selectionnes "importer la table", tu fais Ok.
- tu va chercher ton fichier excel
- tu choisis ton onglet et fais suivant
- tu coches si tu veux que la 1ere ligne contienne les entêtes de colonnes ( + suivant)
- tu précise si tu crées une nouvelle table ou si tu veux que tes données s'ajoutent à une table existant (dans ce cas, attention aux formats !) (+suivant)
- là il te montre tous tes champs (si t'avais importé un fichier texte, c'est là que tu aurais choisi le format des champs, mais avec excel, pas de choix) (+ suivant)
- tu indiques si tu veux une clé primaire ou pas (+suivant)
- donnes le nom de table qui sera créée (+ Terminer)
 
et voilà, tout ton fichier excel est dans une jolie table access.  
c'est beau, non ?
 
Ensuite, si ton fichier de départ change toutes les semaines (par ex) et que tu ne veux pas te retapper cette opération d'import à chaque fois, tu peux alors "attacher la table " au lieu de l'importer.  
ainsi, access prendra en compte chaque modif de ton fichier excel.
à toi de voir de l'attache ou de l'import ce qui est le plus pratique pour l'utilisation que tu en fera ensuite...
 
 

Reply

Marsh Posté le 16-04-2004 à 11:33:00    

C'est vrai que ça aurait pu être pas mal et meme 100 fois plus simple.
Mais comme je t'ai dit je reprends un projet déja existant et si je modifie la structure du projet ça va être vraiment très chiant à tout modiifer ensuite.  
De plus je crois que ton système ne peut pas marcher avec mon application. Dans la boite où je suis il faut importer des fichiers execels pour chaque agence et il y en a plusieurs. Le pb c'est qu'il ya plusieurs agence donc je ne peux pas lier un champ à un seul fichier excel. De plus cet appli est destinée à des gars qui savent pas se servir d'access et c'est censé leur simplifier la vie donc je suis oblige de tout passer par le code.
 
Merci mais si vous avez des solutions concernant les rs.update
rs.addnew  
AIDEZ-MOI !

Reply

Marsh Posté le 16-04-2004 à 11:54:51    

Je ne vois pas où est le pbm. Ces données que tu va chercher dans tes fichiers excel, tu les colles biens dans une table ... pourquoi cette table ne pourait pas être ta table d'import ?  
ça ne modifierait en rien la structure de ta base, juste la façon d'alimenter la table existante.
 
Ensuite pour ce qui est de tes multiples fichiers xls : 2 possibilités
 
1 - tu attaches chacun de tes fichiers à ta base access et tu fais une requête ajout pour chacun de tes fichiers (qui ajoute les données du fichier dans une seule et même table, celle qui est déjà existante). Mai s'il y en a vraiment beaucoup, ça risque d'être chiant à faire.
 
2 - le code ci-dessous  va chercher dans un dossier précis tous les fichiers xls, et les importe un par un dans une même table (qui peut aussi être ta table existante)
 
 
Function Search_bis_()
Dim i
Dim j
Application.FileSearch.LookIn = "C:\Chemin\Dossier\"
Application.FileSearch.FileName = "*.xls"
 
    If Application.FileSearch.Execute > 0 Then
        For i = 1 To Application.FileSearch.FoundFiles.Count
            j = import_(Application.FileSearch.FoundFiles(i))
        Next i        
    Else
        MsgBox "Aucun fichier n'a été trouvé !!!"
    End If
End Function
 
 
Public Function import_(Texte As String)
DoCmd.TransferSpreadsheet acImport, 8, "table_import", Texte, True, ""
End Function

Reply

Marsh Posté le 16-04-2004 à 11:54:51   

Reply

Marsh Posté le 16-04-2004 à 12:19:34    

Ca fait quoi ça ?
Pour chacun des fichiers, il me les comptes et les importe ?
Mais j'ai pas bien compri comment je peux exploiter cela ?

Reply

Marsh Posté le 16-04-2004 à 12:55:50    

C'est bon c'est plus la peine de me répondre on m'a aidé et j'ai finalement compri là où était mon pb !
En fait ça ne venait pas des fonctions Acess mais de mes fichiers... qui comportataient des doublons ! On m'a juste fait une gestion des erreurs et j'ai compri tt de suite !
Merci kanmem pumkin

Reply

Marsh Posté le 16-04-2004 à 13:52:22    

coucou  
je suis justement en train de faire exactement ce type de projet :
voici mon code qui marche :  
 
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset 'pour table cli
rs.Open "client_test", cn, adOpenKeyset, adLockOptimistic, adCmdTable
 
 
    With rs
               .AddNew 'créé un nouvel enregistrement
                    ' ajoute les valeurs pour chaque champ de l'enregistrement
                    .Fields("ClientID" ) = Range("A" & r).Value
                    .Fields("ClientNom" ) = Range("B" & r).Value
                    .Fields("ClientPrénom" ) = Range("C" & r).Value
                    .Fields("ClientTel" ) = Range("D" & r).Value
                    .Update 'stocke le nouvel enregistrement
            End With
 
 
une question ? tu arrives à gérer un Update des date ? (update pas insertion) ? car j'ai laissé un post pour demander de l'aide, mais je n'ai pas encore trouvé  :(


Message édité par cleini le 16-04-2004 à 13:53:50
Reply

Marsh Posté le 16-04-2004 à 14:30:34    

J'ai pas tt compri dans ton code...
Déja connais tu la différence entre ADODB.recordset et DAO.recordset ?
Ensuite à quoi servent ttes les options lors de l'ouverture ?
Les range c'est pour excel ? Pour la selection d'une cellule. Je crois qu'on peu le faire aussi avec "Cell"
Merci pour la fonction Field elle me sera bien utile, au moins je pourrai utiliser mon rs avec with et eviter de le reécrire à chq fois....
Sinon pour l'update... Dans le meme cas que ton exemple je l'ai déja fait et ça marche mais un vrai update je l'ai pas encore fait.
Le gars avec qui je suis et qui s'y connait bien m'avait dit qu'il valait mieux faire une requete SQL comme ça en plus quand tu debugge tu peux voir la valeur de ta chaine.
Moi c'est comme ça :
 
dim rs as DAO.recordset
dim valeur as string
 
valeur = "Calimero"
 
set rs = currentDb.OpenRecordset("NomTable" )
sSQL = "update NomTable set Champ = '"& Valeur &"'"
rs.Execute sSQL
 
 
Et ça sa marche je l'ai déja fait  
 
Bonne chance
 
Ah oui toi c'est pour des dates... Ben je crois que c'est pareil, non ? Sinon essaye un truc que j'ai fait en WinDev : soit tu ecris ta date à l'anglaise (20030511) et sans les "/" soit tu la convertit en chaine (avec Cstr) et après si ça marche tu peux essayer d'enever les "/" de cette chaine avec "replace". Tu peux combiner mes solutions.
@+

Reply

Marsh Posté le 16-04-2004 à 14:40:32    

en fait, pour les UPDATE purs, je les fait bien via une requete SQL du type
Dim TSQL as string
TSQL = (" UPDATE client_test SET ClientNom   =  ' " & nomCli & "';" )
cn.Execute TSQL
 
seulement si j'exécute ça sur une date (disons que j'ai une cellule contenant la date dans mon fichier excel ) et bien j'ai message : erreur de syntawe dans commande UPDATE ... 1 semaine que je suis dessus
 
sinon pour répondre à tes questions :
 
DAO : anacronyme de Data Access Object , représente la strucuture de la BD et lse données qu'elle contient.
tu t'en sers pour créer et modifier des tables et des requetes ...
 
ADO:même chose sauf que tu peux te connecter à d'autres trucs que des .mdb, notamment à des bases SQL server
 
Les options lors de l'ouverture servent à déterminer quel type d'acces/manipulations tu vas faire .... là je ne suis pas tres calée, j'ai juste utilisé l'aide pour l'utiliser
 
RAnge : sélection d'une cellule oui mais tu peux avoir plusieurs attributs a Range, d'ou son avantage : comme range.value ou range.formula etc
 
le pb pour ton systeme pour les dates c'est que quoi que je fasse Excel reconvertit TOUJOURS les dates au format 00/00/0000
suffit de le mettre en ce que tu veux et apres d'aller regarder la barre de formule, hop, il me le remet dans ce format ...
a moins que je tente de le forcer dans le code peut etre ...

Reply

Marsh Posté le 16-04-2004 à 15:29:27    

Attends ton update il te sert à modifier table dans une BD locale à Acess ou une BD distante. Si ta BD est distante c'est différent, là suffit que tu me le dise je pourrai ptet t'aider.  
Tu n'essaierai pas de modifier un fichier Excel avec un update quand meme ? Si c'est le cas c'est complètement faux.
Au pire regarde avec le debugger les valeurs de tes variables contenant des dates lors de l'execution peut etre que tu te rendra compte d'une imcompatibilité de type que tu pourra corriger ensuite.
Tiens moi au courant.

Reply

Sujets relatifs:

Leave a Replay

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