lecture dans un fichier à accès random

lecture dans un fichier à accès random - VB/VBA/VBS - Programmation

Marsh Posté le 05-12-2012 à 12:14:20    

Bonjour à tous j'ai besoin de votre aide,
Je veux faire une lecture de fichier en vba d'un fichier TrameRx_IP.DAT. C'est un fichier à accès random et il contient 500 messages. Après 500 messages il supprime les messages précédents et faire une nouvelle sauvegarde . Moi je veux lire et faire une sauvegarde de tous les messages.  
j'ai essayé avec ce code mais ça ne marche pas quelqu'un pourrait t-il m'aider.  
 

Code :
  1. Function FileTrameInput(mode As Integer, Trame As String) As String
  2. Const NbMesRx = 500
  3. Dim FileNumber As Integer
  4. Dim BufFile As String * 800
  5.    
  6.     FileNumber = FreeFile
  7.     Open App.Path & "\TrameRx_IP.DAT" For Random As FileNumber Len = Len(BufFile)
  8.    
  9.     ' Lecture des pointeurs
  10.     Get #FileNumber, 1, BufFile
  11.     gintPtReTi = Val(Mid(BufFile, 1, 5))
  12.     gintPtWrTi = Val(Mid(BufFile, 6, 10))
  13.         ' Lecture trame
  14.        
  15.             ' Test des limites pointeur lecture
  16.             If gintPtReTi > NbMesRx Or gintPtReTi < 2 Then
  17.                 gintPtReTi = 2
  18.             Else
  19.                 gintPtReTi = gintPtReTi + 1
  20.             End If
  21.             BufFile = Format(gintPtReTi, "00000" ) _
  22.                            & Format(gintPtWrTi, "00000" )
  23.            
  24.             ' Mise à jour Pointeurs
  25.             Put #FileNumber, 1, BufFile
  26.        
  27.             ' Lecture de la trame
  28.             Get #FileNumber, gintPtReTi, BufFile
  29.             FileTrameInput = Trim(BufFile)
  30.            
  31.             ' Effacement de la trame
  32.             BufFile = ""
  33.             Put #FileNumber, gintPtReTi, BufFile
  34.      
  35.     Close #FileNumber
  36. End Function


Amicalement

Reply

Marsh Posté le 05-12-2012 à 12:14:20   

Reply

Marsh Posté le 05-12-2012 à 18:26:08    

 
              Bonjour !   Un fichier à accès random ne veut pas dire grand-chose, quid de la structure de ce fichier ?
              Pas d'aide possible sans structure …
 
              De plus le code indiqué n'est qu'une fonction mal ficelée et pas vraiment en rapport avec ta problématique,
              en es-tu l'auteur ou ne serait encore une fois un mauvais copier/coller ?

Message cité 1 fois
Message édité par Marc L le 05-12-2012 à 18:32:04
Reply

Marsh Posté le 06-12-2012 à 10:25:39    

Bonjour à tous  
Je vous explique : Le transmetteur Vocalys-ip dès qu'il est connecté au serveur crée un fichier TrameRx-IP.DAT et envoie des évènements dans ce fichier. Mais le hic est qu'il efface le contenu du fichier après 500 évènements. Moi je souhaite faire une lecture de ce fichier 'TrameRx-IP.DAT' et faire une sauvegarde de tous les Evènements dans un autre fichier.  
je suis un débutant en VB et j'ai besoin de votre aide
 
COrdialement

Reply

Marsh Posté le 06-12-2012 à 11:50:24    

Marc L a écrit :

[…] Pas d'aide possible sans structure


Reply

Marsh Posté le 06-12-2012 à 12:21:07    

Je suis un debutant en VB et j'ai besoin de votre aide svp
 je vous explique svp: la taille de mon fichier TrameRx-IP.DAT est définie à 500 messages(avant la rotation du pointeur).  
je vous explique par un exple  
j'ai le fichier TrameRx-IP.DAT qui reçoit:  
 
1MSG  
2MSG  
..MSG  
..MSG  
....  
500MSG  
 
Après 500MSG le transmetteur supprime le contenu du fichier TrameRx-IP.DAT c'est à dire supprime les 1MSG....500MSG et faire un nouvel enregistrement de MSG dans le fichier TrameRx-IP.DAT .  
Moi je souhaite lire dans TrameRx-IP.DAT et sauvegarder dans un autre fichier les 1MSG....500MSG et le nouvel enregistrement avant la suppression par le transmetteur

Reply

Marsh Posté le 06-12-2012 à 13:41:31    


             En dehors du fait de l'absence de la structure du fichier je ne pourrais apporter aucune aide,
             il faudrait aussi exposer clairement et précisément le besoin, car là, c'est pas vraiment clair.
 
             Par exemple, on pourrait croire que tu veux juste faire une sauvegarde du fichier,
             une simple copie du fichier dans un dossier de sauvegarde et voilà !
             A quoi bon s'embêter en VBA ?   Quelle en est l'utilité ?  
 

Reply

Marsh Posté le 06-12-2012 à 15:26:55    

-Créer un fichier Backup qui sera relier en permanence au fichier TrameRx_IP.DAT  
 
-Lire le contenu du fichier TrameRx_IP.DAT et le mettre dans notre fichier Backup  
 
- Le fichier Backup doit récupérer tout nouvel enregistrement de message dans TrameRx_IP.DAT de sorte qu'on ne perde pas de données même si le transmetteur efface tous les premiers messages du fichier TrameRx_IP.DAT.  
 
 
Cordialement

Reply

Marsh Posté le 06-12-2012 à 16:20:28    

je viens d'essayer avec ce code après avoir lu quelques cours ça ne marche pas et ma machine se plante
 

Code :
  1. option explicit
  2. Private Sub lire()
  3. Dim intfic As Integer
  4. Dim strligne As String
  5. intfic = FreeFile
  6. Const NbMesrx = 500
  7. Dim gintPtReti As integer
  8. Dim gintPtWrti As integer
  9. Dim FileTrameInput  as string
  10. Dim bufFile As String * 800
  11. Path = App.path & "\TrameRx_IP.DAT"
  12. Open path For Random As intfic len =len(bufFile)
  13. Do while Not EOF (1) = True
  14. Get #intfic, 1, bufFile
  15.     gintPtReti = Val(Mid(bufFile, 1, 5))
  16.     gintPtWrti = Val(Mid(bufFile, 6, 10))
  17.     ' Lecture trame
  18.     ' Test des limites pointeur lecture
  19.             If gintPtReti > NbMesrx Or gintPtReti < 2 Then
  20.                 gintPtReti = 2
  21.             Else
  22.                 gintPtReti = gintPtReti + 1
  23.             End If
  24.             bufFile = Format(gintPtReti, "00000" ) & Format(gintPtWrti, "00000" )
  25.             Get #intfic, gintPtReti, bufFile
  26.             FileTrameInput = Trim(bufFile)
  27.          
  28.       loop
  29.     Close #intfic
  30. End Sub


 
 
Voici un exemple de contenu de mon fichier TrameRx_IP.DAT  
30/11/2012 10:51:3312340000002138008003  
30/11/2012 10:53:1412340000002138008003  
30/11/2012 10:54:5912340000002138008003  
30/11/2012 10:56:4412340000002138008003  
30/11/2012 10:58:3012340000002138008003  
30/11/2012 11:00:1312340000002138008003  
30/11/2012 11:01:5512340000002138008003  
30/11/2012 11:03:3812340000002138008003  
30/11/2012 11:05:2112340000002138008003  
30/11/2012 11:07:0712340000002138008003  
30/11/2012 11:08:5212340000002138008003  
30/11/2012 11:10:3812340000002138008003

Reply

Marsh Posté le 06-12-2012 à 17:10:02    

 
              Pas étonnant, le code est toujours aussi …  "décalé" ...
 
              Toujours pas de fichier en sortie !   Bref …
 
              Le fichier .DAT ne serait qu'un simple fichier texte composé de lignes fixes de n caractères ?   (n à calculer)
              Et quel est le caractère de changement de ligne ?
 
              Un deuxième fichier en sortie devrait être défini, y récupérer la date de la dernière ligne pour éviter les doublons
              puis le réouvrir en mode Append par exemple (voir l'aide en ligne de VBA de l'instruction Open)
              afin d'y ajouter les nouveaux messages, ceux postérieurs à la date récupérée ? …
 

Reply

Marsh Posté le 07-12-2012 à 10:44:15    

Bonjour
 s'il vous plait est-ce que vous pouvez m'aider à compléter mon code
 

Reply

Marsh Posté le 07-12-2012 à 10:44:15   

Reply

Marsh Posté le 08-12-2012 à 09:43:42    

Reply

Marsh Posté le 08-12-2012 à 11:44:07    

 
              Attention, utiliser FSO en VBA peut allonger les temps de traitement et je ne suis pas sûr que ce soit à la portée d'un débutant !
              D'autant que les instructions internes à VBA suffisent amplement pour la problématique en question …
 
              @dadex85 :  oublies le code précédent, je parie qu'il n'est pas de toi sinon tu aurais déjà trouvé par toi-même ‼
 
              Ecris-toi un scénario de ce que tu dois faire pour y arriver (donc en langage courant, pas informatique)
              et consultes l'aide de VBA sur OPEN notamment puis commence à écrire ton code …
 
              Dire "cela ne marche pas" n'est pas suffisant, il faut être précis sur ce qui ne fonctionne pas.
 
              Maintenant pourquoi avoir choisi VBA vu qu'il n'y a pas d'alimentation de données dans une feuille Excel par exemple ?
 
              Ensuite, si l'on te pose des questions, prends  "la peine"  d'y répondre sinon nous ne pourrons t'aider ...
 
              Sur ce, bon week-end ‼


Message édité par Marc L le 08-12-2012 à 11:45:55
Reply

Marsh Posté le 10-12-2012 à 11:14:08    

Bonjour a tous  
J'ai pu trouver une solution à mon problème:  
je mets le code au cas où ça interresserait quelqu'un  
 

Code :
  1. Option Explicit
  2. Dim Arret As Boolean
  3. Sub Depart()
  4.   Application.OnTime Now + TimeValue("00:16:39" ), "LectureFichier"
  5. End Sub
  6. Sub ArretLecture()
  7.   Arret = True
  8. End Sub
  9. Sub LectureFichier()
  10. Dim Nom As String
  11. Dim Canal As Integer
  12. Dim InputData As String
  13. Dim Ligne As Long
  14. Dim J As Long
  15. Dim Indice As Integer
  16.   If Arret = True Then Exit Sub
  17.   Application.ScreenUpdating = False
  18.   Nom = ThisWorkbook.Path & "\TrameRx_IP.DAT"
  19.   ' Création de la feuille
  20.   'Indice = 1
  21.   On Error Resume Next
  22.   Do
  23.     'Err.Clear
  24.     Indice = Indice + 1
  25.     Sheets("Enreg " & Indice).Visible = True
  26.   Loop Until Err.Number > 0
  27.   On Error GoTo 0
  28.   Sheets.Add after:=Sheets(Sheets.Count)
  29.   ActiveSheet.Name = "Enreg " & Indice
  30.   Range("A1" ) = Now
  31.   Ligne = 1
  32.  
  33.   ' Récupération du fichier
  34.   Canal = FreeFile()
  35.   Open Nom For Input As #Canal
  36.   Do While Not EOF(Canal)                   ' Vérifie si la fin du fichier est atteinte.
  37.     Line Input #Canal, InputData            ' Lit les lignes de données (normalement 1 ligne)
  38.     For J = 1 To Len(InputData) Step 800
  39.       Ligne = Ligne + 1
  40.       Range("A" & Ligne) = Trim(Mid(InputData, J, 800))
  41.     Next J
  42.   Loop
  43.   Close #Canal    ' Ferme le fichier.
  44.   Columns("A" ).AutoFit
  45.   ThisWorkbook.Save
  46.   Application.OnTime Now + TimeValue("00:16:39" ), "LectureFichier"
  47. End Sub


 
 
TimeValue("00:16:39" ) est le temps que met le transmetteur pour faire un enregistrement de 500 evenements  
 
Amicalement

Reply

Sujets relatifs:

Leave a Replay

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