Utilisateur anonyme
-
3 mai 2011 à 18:53
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 2016
-
4 mai 2011 à 09:14
Alors bonjour à tous, voilà ma structure:
Public Structure Commande
Dim nomPers As String
Dim prenPers As String
Dim Etat As String
Dim numeroChambre As Integer
Dim tabPersonnes() As cmdPersonne
Dim lieu As String
Dim heure As Integer
Dim minute As Integer
Dim total As String
End Structure
Public Structure cmdPersonne
Dim boissonChaude As String
Dim viennoiseries() As String
Dim accomendements() As String
Dim boissonFroide As String
Dim suppléments() As String
End Structure
Public chambres As Commande
Ensuite j'ai une fonction qui crée un fichier binaire ainsi que l'initialise (je dis pas que c'est bien de le remplir comme ça mais apparement c'est une consigne)
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim fn, i As Integer
fn = FreeFile()
FileOpen(fn, "H:\DonneesHotel.ach", OpenMode.Random, OpenAccess.Write, , Len(chambres))
For i = 1 To 96
FilePut(fn, chambres, i)
Next i
FileClose(fn)
End Sub
Et donc à un moment donné, j'attribue ces valeurs là par exemple:
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 3 mai 2011 à 21:29
Salut
Introduction : Cet explicatif est basé sur l'expérience en VB6 (32 bits) et ne s'applique peut-être pas à VB/Net, mais je ne pense pas que les fichiers Random de VB.Net diffèrent beaucoup de leurs prédécesseurs.
Je n'ai pas tout lu, mais un peu de théorie s'impose.
Les fichiers Random permettent d'accéder à l'enregistrement X simplement en calculant l'offset, le décalage des enregistrements entre eux, basé sur la taille de la structure.
Avec un type String, aucune limite de longueur n'est imposée|définie, donc il devient impossible de calculer ce décalage.
Ce n'est pas un problème pour les types Integer ou Long (et autres) puisque leur format est connu (Long en 32 bits 4 octets en VB6/VBA et 64 bits 8 octets en .Net), mais pour les string, aucune limite n'est définie (puisque ce ne sont que des pointeurs vers des zones mémoire).
Il te faut définir le masque de structure avec des String limitées en longueur. Trop court, tes données seront tronquées; trop long, le fichier grossira.
Alors définir un masque de structure avec des tableaux (à dimension variable) de String; c'est, je pense, impensable (amusant, non ?) .
Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Je pense avoir compris ce que tu veux dire, mais tu me conseillerais de changer de structure.. ou tout simplement ne pas faire une boucle "FOR" à la création du fichier?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 4 mai 2011 à 08:53
Oui, il te faut modifier ta structure :
- Si tu veux vraiment utiliser ton fichier en accès Random, il te faut que chaque item ait une taille connue.
- Si tu oublies le Random et que tu gères un simple fichier à accès séquentiel où chaque ligne représentera une donnée, il faudra dimensionner tes tableaux d'une manière fixe ou bien insérer un nouvel Item afin de connaitre le nombre de lignes à suivre lors de la lecture de tes tableaux.
Calade
Messages postés1207Date d'inscriptiondimanche 20 avril 2003StatutMembreDernière intervention 4 juin 201610 4 mai 2011 à 09:14
Bonjour,
Si tu tiens vraiment à ce genre de choses, tu peux ajouter à ta structure, en PREMIER champ, la taille de celle-ci en Integer ou Long et tu stockeras juste avant l'écriture la longueur de ta structure (len(myStructure)).
En lecture, tu connais la longueur de ta structure en lisant les 4/8 premiers octets. Je pense que le principe fonctionne mais je n'ai pas essayé utilisant comme le préconise Jack les SGBD.