Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VB6] Type et enregistrement dans un fichier

9 réponses
Avatar
HD
Bonjour,

Je débute en VB6...

J'ai crée un Type que j'ai déclaré en début de module :

Public Type Enreg
EvTyp As String * 1
EvAn As String * 4
EvMois As String * 2
EvJour As String * 2
EvLib As String * 30
End Type

J'ai déclaré une variable :
Dim NouvEnr As Enreg

J'ai affecté chacune des composantes du type... Mais mon problème est que si
j'essaie d'écrire dans un fichier en Append alors ça plante sur
l'enregistrement de NouvEnr... Ne peut on pas écrire directement NouvEnr
dans le fichier ?

Open FicData For Append As #1
Print #1, NouvEnr
Close #1

Merci d'avance pour votre aide.
--
@+
HD

9 réponses

Avatar
LE TROLL
Bonjour,

Avant, as-tu mis:

1 = FreeFile ' réservation d'un numéro

Heu, sinon, "1" je ne sais pas s'il aime, peux-tu lui donner un nom comme
"p1" par exemple...

In fine, tu donnes une taille fixe à tes variables string "*",
l'inconvénient c'est que si tu as besoin de tester une longueur dans cette
dernière, elle va toujours, non pas te renvoyer la longueur du contenu, mais
sa longueur fixe de la taille fixée par "*", obligeant à un transfert de
variable non délimitée en taille, afin de connaître la longueur du
contenu...


------
Site éditeur MES ROMANS édités
http://www.manuscritdepot.com/a.joseph-attila-pusztay.1.htm
Site de MES LOGICIELS
http://irolog.free.fr
mon adresse EMail
http://irolog.free.fr/ecrire/index.htm
------------------------------------------------------------------------------------
"HD" a écrit dans le message de news:
452d5378$0$19079$
Bonjour,

Je débute en VB6...

J'ai crée un Type que j'ai déclaré en début de module :

Public Type Enreg
EvTyp As String * 1
EvAn As String * 4
EvMois As String * 2
EvJour As String * 2
EvLib As String * 30
End Type

J'ai déclaré une variable :
Dim NouvEnr As Enreg

J'ai affecté chacune des composantes du type... Mais mon problème est que
si j'essaie d'écrire dans un fichier en Append alors ça plante sur
l'enregistrement de NouvEnr... Ne peut on pas écrire directement NouvEnr
dans le fichier ?

Open FicData For Append As #1
Print #1, NouvEnr
Close #1

Merci d'avance pour votre aide.
--
@+
HD



Avatar
Fred
dans : news:452d5378$0$19079$,
HD écrivait :

Bonjour,



Bonsoir,

Je débute en VB6...

J'ai crée un Type que j'ai déclaré en début de module :

Public Type Enreg
EvTyp As String * 1
EvAn As String * 4
EvMois As String * 2
EvJour As String * 2
EvLib As String * 30
End Type

J'ai déclaré une variable :
Dim NouvEnr As Enreg

J'ai affecté chacune des composantes du type... Mais mon problème est
que si j'essaie d'écrire dans un fichier en Append alors ça plante sur
l'enregistrement de NouvEnr... Ne peut on pas écrire directement
NouvEnr dans le fichier ?

Open FicData For Append As #1
Print #1, NouvEnr
Close #1



Utilise le mode Binary pour lire et écrire dans ton fichier.
(Il y a peut-être possibilité d'utiliser random mais je n'ai jamais
essayé)
GET et PUT permettent de lire et d'écrire à la position voulue.
Examine aussi les fonctions LENB, LOC et LOF, et la méthod SEEK qui
permettent la gestion de cette position d'écriture/lecture.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Clive Lumb
"HD" a écrit dans le message de
news:452d5378$0$19079$
Bonjour,

Je débute en VB6...

J'ai crée un Type que j'ai déclaré en début de module :

Public Type Enreg
EvTyp As String * 1
EvAn As String * 4
EvMois As String * 2
EvJour As String * 2
EvLib As String * 30
End Type

J'ai déclaré une variable :
Dim NouvEnr As Enreg

J'ai affecté chacune des composantes du type... Mais mon problème est que


si
j'essaie d'écrire dans un fichier en Append alors ça plante sur
l'enregistrement de NouvEnr... Ne peut on pas écrire directement NouvEnr
dans le fichier ?

Open FicData For Append As #1
Print #1, NouvEnr
Close #1

Merci d'avance pour votre aide.
--
@+
HD



Bonjour,

Lintérêt du "type" pour enregistrer dans un fichier est de pouvoir mélanger
chaines, numériques, dates etc. sans devoir les convertir tous en chaines
avant d'écrire. (et vice vera lors de la lecture). Comme bonus on peut
écrire/lire le variable basé sur un type d'un seul coup.
Mais il faut évidemment prendre soin de dire à VB à quoi s'attendre lors de
la lecture/écriture. Aussi on doit gérer la position d'ecriture/lecture.
Regardes cet exemple

Type Enreg
NumEnreg As Long
EvType As String * 1
EvDate As Date
EvLib As String * 30
End Type

Dim I As Integer
Dim OutEnr As Enreg
Dim InEnr As Enreg
Dim LenEnr As Integer
'Déterminer la longueur d'un enregistrement
LenEnr = Len(OutEnr)

'Ouvrir le fichier pour lecture/écriture
Open "toto.dat" For Random As #1 Len = LenEnr
' regarder la taille actuelle du fichier
Debug.Print LOF(1) & " octets, " & Str$(LOF(1) / LenEnr) & "
Enregistrements"
'Créer des données factices
With OutEnr
.NumEnreg = 1
.EvDate = Date
.EvType = "a"
.EvLib = "Un essai"
End With
'ajouter un enregistrement en première position
'(on vient d'ouvrir le fichier, donc on est sur l'enregistrement 1)
Put #1, , OutEnr
'Voyons à quelle position on est dans le fichier
Debug.Print "Position", Seek(1)
' et un autre (à la suite)
OutEnr.NumEnreg = 2
Put #1, , OutEnr
'Voyons à quelle position on est dans le fichier
Debug.Print "Position", Seek(1)
'regarder combien on a maintenant
Debug.Print LOF(1) & " octets, " & Str$(LOF(1) / LenEnr) & "
Enregistrements"
'Mettons y un paquet
For I = 3 To 100
OutEnr.NumEnreg = I
Put #1, , OutEnr
Next I
'regarder combien on a maintenant
Debug.Print LOF(1) & " octets, " & Str$(LOF(1) / LenEnr) & "
Enregistrements"

'Regardons ce qu'on a dans l'enregistrement N° 50
Get #1, 50, InEnr
Debug.Print InEnr.NumEnreg, InEnr.EvDate

'Changeons la valeur de l'enregistrement N°99
Get #1, 99, InEnr
InEnr.NumEnreg = "1234"
InEnr.EvLib = "Ceci est l'enregistrement N°99"
Put #1, 99, InEnr
'Vérifions
Get #1, 99, InEnr
Debug.Print InEnr.NumEnreg, InEnr.EvLib
'Fermons le fichier
Close #1
Avatar
HD
Un grand MERCI à tous pour toutes ces infos.
Je vais me pencher dessus ce soir ou demain.

--
@+
HD
Avatar
HD
Avec l'accès RANDOM, A't on la possibilité d'effacer directement un
enregistrement (par exemple le n°50) ou d'en ajouter un à la 42ème position
par exemple ?

--
@+
HD
Avatar
Patrice Henrio
Oui

Pour ma part je n'utilise que Binary et je calcule l'index du premier octet
à écrire.


"HD" a écrit dans le message de news:
egvm0k$1hs5$
Avec l'accès RANDOM, A't on la possibilité d'effacer directement un
enregistrement (par exemple le n°50) ou d'en ajouter un à la 42ème
position
par exemple ?

--
@+
HD




Avatar
Clive Lumb
HD wrote:
Avec l'accès RANDOM, A't on la possibilité d'effacer directement un
enregistrement (par exemple le n°50) ou d'en ajouter un à la 42ème
position par exemple ?



Malheureusement non.
Il faut re-écrire tout le fichier de A-Z
C'est pour cela qu'on a inventé la base de données

Beaucoup ajoutent un "champ" DELETED dans leur type utilisateur afain de
sauter les enregistrements "effacés".
Idme un cham N° Enregistrement pour pouvoir faire une "insertion"
Puis une routine de compaction qui transite par un fichier temporaire en les
copiant dans l'ordre et en sautant les "éffacés"

Si tu prévois de gérer beaucoup d'enregistrements, penses à utiliser une
Base de Données - cela te simplifierait énormement la vie.
Avatar
Vincent Guichard
LE TROLL a écrit :
Bonjour,

Avant, as-tu mis:

1 = FreeFile ' réservation d'un numéro

Heu, sinon, "1" je ne sais pas s'il aime, peux-tu lui donner un nom comme
"p1" par exemple...



FreeFile sert à réserver un numéro de fichier libre. Ici, l'OP se charge
de réserver le numéro lui même, et choisit 1 (Je suppose qu'il n'ouvre
pas des tonnes de fichiers, ou qu'il note soigneusement quels fichiers
sont ouverts et lesquels sont fermés.). #1 n'est pas ici un nom de
variable, mais bien un numéro de fichier valide. Donc non, l'OP n'as pas
oublié une ligne 1 = FreeFile

Vincent Guichard
Avatar
HD
> Malheureusement non.
Il faut re-écrire tout le fichier de A-Z
Puis une routine de compaction qui transite
par un fichier temporaire en les copiant
dans l'ordre et en sautant les "éffacés"



Ok... J'ai donc bien fait de déja créer une routine de ce type...

Si tu prévois de gérer beaucoup
d'enregistrements, penses à utiliser
une Base de Données - cela te
simplifierait énormement la vie.


Le fichier ne devrait pas compter beaucoup de ligne... Une centaine au
maximum je pense... Mais lors d'un prochain projet il faudra que je me
penche sur la gestion de bases de données en VB...
--
@+
HD