pokeswell
Messages postés5Date d'inscriptionmercredi 29 mars 2006StatutMembreDernière intervention11 janvier 2008
-
29 mars 2006 à 04:57
pokeswell
Messages postés5Date d'inscriptionmercredi 29 mars 2006StatutMembreDernière intervention11 janvier 2008
-
2 avril 2006 à 00:07
Bonjour à tous. J'ai une base de donnée Access dans laquelle j'ai une table avec des clients et les transactions qui leurs sont associées selon une date de l'année.
Par exemple
NoClient
Transactions
Date
J'aimerais construire un programme en VB6 de maniere à pouvoir importer les nouvelles transactions dans la table à mesure que je les recois...
Voici un exemple du fichier source de donnée:
numéro du client|Transaction|Date
3031123365|44|2/1/2006 12:00:00 AM
puisque mon fichier m'arrive quotidiennement et qu'il contient environ 2000 lignes j'aimerais pouvoir ajouter les lignes du fichier CSV à ma base de données.
La question est donc: Comment faire pour "Appender" à la table Access les lignes provenant du fichier CSV directement sans passer par Excel...(de maniere à pouvoir automatiser totalement le processus)? AIDEZ MOI SVP!!!
cs_jperre
Messages postés268Date d'inscriptionlundi 9 janvier 2006StatutMembreDernière intervention19 janvier 20172 29 mars 2006 à 09:32
Pour importer un fichier csv (ou un autre type de fichier texte), on dispose des fonctions de lecture et écriture de fichier dans VB et VBA (ce sont les mêmes). Pour le cas présent, je suppose que le trait vertical est le séparateur de champs et que les données ne sont pas entourées de doubles cotes.
Sub ImportCSV(sFileCSV As String, sTable As String)
Dim lFileCSV As Long, sLine As String, rsTable As Recordset
Dim sField As String, n As Integer, m As Long
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Set rsTable=CurrenDB.OpenRecordset(sTable, dbOpenTable)
Do
Line Input #lFileCSV, sLine
rsTable.AddNew
For n=1 To Len(sLine)
If Mid(sLine, n, 1)<>"|" Then
sField=sField & Mid(sLine, n, 1)
Else
rsTable(m)=sField
sField=""
m=m+1
End If
If n=Len(sLine) Then
rsTable(m)=sField
sField=""
m=0
End If
Next n
rsTable.Update
Loop Until EOF(lFileCSV)
Close #lFileCSV
rsTable.Close
End Sub
cs_jperre
Messages postés268Date d'inscriptionlundi 9 janvier 2006StatutMembreDernière intervention19 janvier 20172 30 mars 2006 à 08:53
Dans VB6, il faut venir dans le menu Projet, puis References et ajouter la référence à Microsoft DAO 3.51 (Access 97) ou DA0 3.6(Access 2000) qui fait partie de VB6 (DAO 3.6 est dans le service Pack 6 de VB6). Ensuite, les objets de DAO sont accessibles. Il s'agit des Objets :
- Microsoft Jet = DBEngine
- Espace de travail = WorkSpace
- Base de données = Database
- Connexion = Connection
- Structure de table = TableDef
- Requête = QueryDef
- Relation entre tables = Relation
- Champ = Field
- Index = Index
- Feuille de reponse = Recordset
A l'exception de DBEngine, tous ces objets peuvent être utilisés dans des collections d'objets.
Dans ce cas précis, il faudrait :
Sub ImportCSV(sFileCSV As String, sTable As String)
Dim dbTrait As DAO.Database, rsTable As DAO.Recordset
Dim lFileCSV As Long, sLine As String
Dim sField As String, n As Integer, m As Long
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Set dbTrait=DBEngine(0).OpenDatabase("c:\baseDtest.mdb")
Set rsTable=dbTrait.OpenRecordset(sTable,dbOpenTable)
lFileCSV=FreeFile
Open sFileCSV For Input As #lFileCSV
Do
Line Input #lFileCSV, sLine
rsTable.AddNew
For n=1 To Len(sLine)
If Mid(sLine, n, 1)<>"|" Then
sField=sField & Mid(sLine, n, 1)
Else
If m=1 Then
rsTable(m)=Val(sField)
Else
rsTable(m)=sField
End If
sField=""
m=m+1
End If
If n=Len(sLine) Then
rsTable(m)=CDate(sField)
sField=""
m=0
End If
Next n
rsTable.Update
Loop Until EOF(lFileCSV)
Close #lFileCSV
rsTable.Close
dbTrait.Close
End Sub
Voilà, tout est détaillé, j'ai même ajouté une mise en forme des données pour alimenter le deuxième champ au format numérique et le troisième au format date.
pokeswell
Messages postés5Date d'inscriptionmercredi 29 mars 2006StatutMembreDernière intervention11 janvier 2008 30 mars 2006 à 08:27
Merci beaucoup pour ce code!
Dans mon cas, ce code se retrouve à l'intérieur d'une très simple application VB6 et non directement dans ACCESS 2003....
Donc, comment dois-je faire pour spécifier les paramètres de la fonction suivante:
Sub ImportCSV(sFileCSV As String, sTable As String)
d'ouvrir la table "tblTransactions" de la base de données "c:\baseDtest.mdb" pour y ajouter les entrées? C'est-à-dire que je ne pige pas comment spécifier dans le code, comment spécifier la table exacte qui doit être ouverte dans une base de donnée particulière?
pokeswell
Messages postés5Date d'inscriptionmercredi 29 mars 2006StatutMembreDernière intervention11 janvier 2008 2 avril 2006 à 00:07
Puisque dans ma base de données, la table en question ne comprend pas de clé unique, comme un numéro unique... comment puis-je faire pour savoir si une ligne de mon fichier csv a déja été ajouté à la table?