![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE. |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Invité de passage
![]() Date d'inscription: juillet 2008
Messages: 7
|
bonjour, je travailles à la mise en place d'un Back Up Service avec des fichiers d'entré txt sans délimitateur.
l'explication sur le lien suivant fonctionne parfaitement. http://access.developpez.com/sources...#FichierDirect le problème est que lorsqu'il manque une donnée dans le fichier source cela plante. Est il possible de remplacer une valeur nulle ou manquante par une donnée type comptatible dans le code et d'aller ensuite chercher cette données temporaire pour la mettre en anomalie. ci dessous le contenu de lien. Importer des données depuis un fichier texte qui ne possède pas de délimiteur [haut] Cet exemple de code permet d'importer des données depuis un fichier texte. La caractéristique de ce fichier texte est que les enregistrements sont mis les uns à la suite des autres sans séparateur. Nous ne connaissons que la taille des différents champs. Un exemple de fichier texte : 0001WARIN Christophe0002BALTAZARD Marie 0004DUPONT Jacques 0005PIERRE Louis 0006HUGUES Hugo 0007PARQ Patrice Pour importer un tel fichier, nous allons créer une table correspondante avec les mêmes champs, à savoir : • Un champ Numero de type entier. • Un champ Nom de type texte. • Un champ Prénom de type texte Puis dans un module, nous allons créer un type Enregistrement qui correspondra à une occurence dans notre fichier texte. Private Type enregistrement Num As String * 4 'Numero sur 4 caractères Nom As String * 10 'Nom sur 10 caractères Prenom As String * 10 'prenom sur 10 caractères End Type Puis une procédure pour lire le fichier en accés direct : Public Sub lireFichier(chemin As String) On Error GoTo err Dim Fichier As Integer, numenr As Long Dim Client As enregistrement Dim NbErreur As Long Dim Stopper as boolean stopper = False 'recupere un numero de fichier libre Fichier = FreeFile 'Ouvre le fichier Open chemin For Random As Fichier Len = Len(Client) numenr = 1 'parcours le fichier While Not EOF(Fichier) And Not stopper Get 1, numenr, Client 'si l'enregistrement n'est pas vide With Client If .Nom <> "" Then 'inserer dans la table NbErreur = NbErreur + Insererdanstable(CLng(.Num), _ .Nom, .Prenom, stopper) End If End With 'augmente le numero de l'enregistrement à lire numenr = numenr + 1 Wend 'Affiche le resume MsgBox "Insertion terminée avec : " & _ NbErreur & " erreur(s)", vbInformation, _ "Insertion..." GoTo fin err: 'si erreur avertit l'utilisateur MsgBox "Echec" & vbCrLf & vbCrLf & _ err.Description, vbCritical, "Insertion..." fin: 'Ferme le fichier Close Fichier End Sub L'ouverture se fait en mode direct grâce à l'instruction Open for random. Ensuite, il faut passer à la même instruction la longueur en octet d'un enregistrement. Cela correspond à la longueur de la variable Client. Enfin, il faut lire chaque enregistrement grâce à l'instruction Get en passant le numéro de l'enregsitrement en question (NumEnr), jusqu'à atteindre la fin du fichier (fonction EOF). Dans l'instruction Get, le premier paramètre correspond à l'octet de l'enregistrement concerné à lire. En général, on s'interresse à la globalité des données. La lecture commence donc à l'octet 1. Le second est, comme nous l'avons dit plus haut, le numéro de l'enregistrement. Enfin le troisième est une variable qui va recevoir les données. Il faut ensuite rajouter une procédure qui enregistrera les données dans notre base de données : Private Function Insererdanstable(VNumero As Long, _ VNom As String, VPrenom As String,ByRef Stopper as Boolean ) As Long On Error GoTo err Dim SQL As String 'Créer la requête d'insertion SQL = "INSERT INTO Tbl_Client (Numero,nom,prenom) VALUES " & _ "(" & VNumero & "," & AjouterQuote(VNom) & "," & _ AjouterQuote(VPrenom) & ")" CurrentDb.Execute SQL Exit Function err: Insererdanstable = 1 MsgBox "impossible d'insérer : " & vbcrl & _ VNumero & vbCrLf & _ VNom & vbCrLf & _ VPrenom & vbCrLf & vbCrLf & _ err.Description, vbCritical, "Insertion" If MsgBox("voulez vous continuer ?", vbQuestion + vbYesNo, _ "Insertion") = vbNo Then stopper = True End Function Private Function AjouterQuote(Chaine As String) As String 'enleve les caractère nuls Chaine = Replace(Chaine, Chr(0), "") 'Ajoute " de chaque coté de la chaine et 'double les guillemets à l'intérieur de 'la chaine et elimine les espaces AjouterQuote = Chr(34) & Trim$(Replace(Chaine, Chr(34), _ Chr(34) & Chr(34))) & Chr(34) End Function En cas d'erreur d'insertion, un message demande à l'utilisateur s'il veut continuer. Si il répond Non, le booléen Stopper est fixé à true ce qui aura pour effet de faire sortir le programme de la boucle de lecture ici : While Not EOF(Fichier) And Not stopper Pour comprendre d'avantage le fonctionnement, je vous invite à télecharger le fichier zip qui contient l'ensemble de l'application. |
|
|
|
|
![]() |
![]() |
||
Import des données depuis un fichier texte sans délimiteur et gestion des zones vides
|
||
| Outils de la discussion | |
|
|