Dur dur le séquentiel !!!!! Ya toujours un truc qui flanche ....

Résolu
Signaler
Messages postés
37
Date d'inscription
jeudi 10 février 2005
Statut
Membre
Dernière intervention
10 janvier 2008
-
Messages postés
3
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
10 décembre 2005
-
salut tout le monde !



j'éssait d'enregistrer le contenue de plusieur variables d'un Type dans un fichier en accès Random !!




Mais ca marche pas !!!!



à chaque fois, au moment d'enregistrer (Put #...) si toute les variables de mon type contiènnent quelque chose, une erreur se produit !!!



Ereur 59

Longueur d'enregistrement incorect !





Je seche completement si quelqu'un pouvait m'aider ca serrait formidable !!!



Parceque là moi je suis bloqué de cher bloqué et je ne peut plus avancé mon projet !



Merci d'avance ! ;-)




Dans le modul :

Public choix As String

Public nf As Long

Public Type Enreg

nom As String

prenom As String

ddn1 As String

ddn2 As String

ddn3 As String

adem As String

adt As String

tp1 As String

tp2 As String

choix As String

nome As String

fonce As String

tele As String

faxe As String

ade As String

cpe As String

villee As String

adp As String

cpp As String

villep As String

telp As String

faxp As String

pdip As String

ads As String

cps As String

villes As String

tels As String

faxs As String

pdis As String

End Type

Dans la Form :

Dim carnet1 = Enreg

Private Sub Ajouter_Click()

With carnet1

.nom = Ajoutcontact1.Text1.Text

.prenom = Ajoutcontact1.Text2.Text

.ddn1 = Ajoutcontact1.Text3.Text

.ddn2 = Ajoutcontact1.Text4.Text

.ddn3 = Ajoutcontact1.Text5.Text

.adem = Ajoutcontact1.Text6.Text

.adt = Ajoutcontact1.Text7.Text

.tp1 = Ajoutcontact1.Text8.Text

.tp2 = Ajoutcontact1.Text9.Text

.choix = choix

If choix = "" Then

.choix = "aucun"

End If

If choix = "aucun" Then

.nome = ""

.fonce = ""

.tele = ""

.faxe = ""

.ade = ""

.cpe = ""

.villee = ""

End If

If choix = "travail" Then

.nome = Ajoutcontact1.Text10.Text

.fonce = Ajoutcontact1.Text11.Text

.tele = Ajoutcontact1.Text12.Text

.faxe = Ajoutcontact1.Text13.Text

.ade = Ajoutcontact1.Text14.Text

.cpe = Ajoutcontact1.Text15.Text

.villee = Ajoutcontact1.Text16.Text

End If

If choix = "ecole" Then

.nome = Ajoutcontact1.Text17.Text

.fonce = Ajoutcontact1.Text18.Text

.tele = Ajoutcontact1.Text19.Text

.faxe = Ajoutcontact1.Text20.Text

.ade = Ajoutcontact1.Text21.Text

.cpe = Ajoutcontact1.Text22.Text

.villee = Ajoutcontact1.Text23.Text

End If

.adp = Text1.Text

.cpp = Text2.Text

.villep = Text3.Text

.telp = Text4.Text

.faxp = Text5.Text

.pdip = Text6.Text

.ads = Text1.Text

.cps = Text2.Text

.villes = Text3.Text

.tels = Text4.Text

.faxs = Text5.Text

.pdis = Text6.Text

End With

nf = FreeFile

Open App.Path & "\users\" & username & ".rep" For Random As #nf Len = Len(carnet1)

Put #nf, numenreg, carnet1 'C'est ici que ca bloque !!!

Close #nf
<table id="HB_Mail_Container" unselectable="on" border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">

----,

</td>

</td></tr></tbody></table>

7 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
enregistrement de Longueur fixe donc chaînes de longueur fixe


Public Type Enreg

nom As String * 32

prenom As String * 24

etc ...




Daniel
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 109 internautes nous ont dit merci ce mois-ci

Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
Héhé, on le tient notre vrai héros!!!



Comme d'habitude, c'est notre ami Gobillot!!!



Mais NykoKurapika a quand même été gentil de me tenir informé de la
solution... c'est gentil de ta part même si, finalement, contrairement
à ce que je pensais ce n'est pas toi qui a trouvé la solution (tout fini toujours par se savoir!!!)



Mais question Gobillot (parce que moi et le mode Random on est pas très
copain copain), doit-on oblgatoirement remplir les strings du nombre de
caractères indiqué ou alors n'est-ce qu'une question de taille maxi et
de mémoire ???



Autre question : quel service peut bien rendre ce mode ??? Travailler comme une DB ???


Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
L'Accès Random ou Aléatoire,

c'est étrange pourquoi ce nom, ça voudrait dire qu'on lit les
enregistrements au hasard, n'importe comment, au petit bonheur la
chance ?
hé bien non pas du tout, ce serait plutôt exactement le contraire, c'est pourquoi je lui préfère le nom d'Accès Direct.

ça veut dire que l'on peut accèder directement à l'enregistrement que l'on veut par opposition à l'Accès Sequentiel

par exemple si on veut lire l'enregistrement 10000 on n'est pas obligé
de lire les 9999 enregistrements précédents, idem pour l'écrire.

On pourrait faire la même chose avec l'Accès Binaire en faisant
un Seek avant chaque lecture/écriture, mais pour cela il faut que le
fichier ait impérativement été constitué avec des enregistrements de
même longueur, c'est le prix à payer, ce qui oblige à mettre chaque
zone à la longueur maximum pour contenir les données sous peine d'avoir
à refaire le fichier et à recompliler le programme si on s'aperçoit
qu'une zone est trop petite parce qu'un petit malin a un nom a coucher
dehors qui dépasse les 32 caractères.

Bref l'Accès Direct a des inconvénients parce que les tailles peuvent
devenir très grandes à cause des enregistrements de longueur fixes,
mais aussi des avantages parce que les fichiers ne sont pas fait pour
être traités en mémoire mais individuellement enregistrement par
enregistrement et donc on peut traiter des très gros fichiers.

Faut savoir aussi ce qu'on fait et à quoi correspond le 1000e enregistrement, on a seulement accès avec un numéro et non pas avec une clef comme avec le Séquentiel Indexé ou avec les Bases de Données.

C'est au programmeur à le gérer, par exemple faire des fichiers
secondaires de clefs qui donnent la correspondance entre un nom et un
numéro, toute une technique...!

Autre avantage aussi c'est le découpage des zones automatiques, on a
accès directement à chaque zone individuellement sans faire de
manipulation de chaîne, et pour répondre à ta question, si on a mis un
nom sur 32, on est pas tenu a ne traiter que ceux qui on un nom de 32
caractères, il n'y en aurait pas beaucoup !

32 c'est un maximum on ne pourra pas traiter plus, le nom sera complété
par des espaces ça c'est un inconvénient le nom lu fera toujours 32.



Note technique:

les Chaînes de longueur fixe ne sont pas des vrais chaînes, il faut les
considérer comme des tableaux de char et non pas comme les String de Vb
en BSTR.

elles sont pourtant en Unicode alors qu'en entrée et sortie c'est de L'ASCII.

je soupçonne Vb de faire tout le travail par derrière et de s'occuper
du découpage des zones, ceci est totalement transparent pour le
développeur et bizarrement il est totalement impossible de trouver une
quelconque information sur la façon dont sont traitées ces chaînes en
mémoire.

par exemple si VarPtr() renvoit bien un pointeur, ce pointeur renvoit
sur une adresse nulle et si StrPtr() renvoit bien une chaîne en Unicode
ce n'est seulement qu'une copie et pas la chaîne d'origine.





Daniel
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
Eh bien, franchement, un grand merci
pour toutes ces précieuses précisions enrichissantes! C'est désormait beaucoup plus clair pour moi



Concernant la note technique moi je dirais qu'on s'en fout un peu du moment que ça fonctionne et que le VB fait correctement ce pour quoi il a été fait, tout va pour le mieux dans le meilleurs des mondes



Enjoy
<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
31
on s'en fout quand on cherche pas à comprendre mais quand on a un problème on aime bien savoir où ça vient.

si tu veux manipuler des pointeurs, des adresses, passer des paramètres
à une dll, il vaut mieux savoir ce qui se passe à l'intérieur.

pareil pour ton ordi, tu peux l'utiliser comme ça, sans savoir ce qu'il
y a à l'intérieur, mais lorsque tu veux rajouter une nouvelle carte ou
overclocker ta carte mère t'es bien content de pouvoir le faire toi
même.

je suis comme ça, toujours voulu savoir les choses cachées.

c'est utile de savoir, ça permet d'optimiser les programmes, de faire des choses impossibles autrement.



voilà un exemple: comment est rempli la chaine Str ?



Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)



Private Sub Command1_Click()

Dim Str As String * 2

Dim x As Long

x = &H420041

CopyMemory ByVal VarPtr(x) + 4, x, 4

MsgBox Str

End Sub




Daniel
Messages postés
1488
Date d'inscription
mercredi 5 février 2003
Statut
Membre
Dernière intervention
3 décembre 2007
24
Oui, je suis d'accord avec toi mais bon, parfois, faut
pas aller trop loin je pense parce qu'on a vite fait de s'arracher les
cheveux tellement il est difficile de trouver de l'info sur certains
sujets!



Puis personnellement, j'ai un peu abandonné l'idée de chercher à
comprendre comment la structure sous-jascente à été pensée du moment
qu'elle est opérationnelle. Alors bien sûr, parfois, elle ne l'est pas
ce qui rend le déboggage aussi passionnant qu'intéressant! Mais dans
l'ensemble, si un jour je voudrais vraiment me mettre à essayer de
comprendre, je me mettrais à l'électronique, c'est clair!



Ceci dit, perso, j'aime pas trop faire mumuse avec la mémoire et ce
fameux CopyMemory (dont je n'ai toujours pas trouvé l'utilité dans mes
programmes!!!). Quant à VarPtr et les deux autres, m'en passer ne
m'empêche pas de dormir

Mais attention !!! ce n'est pas une invitation à se maintenir dans
l'ignorance comme moi!!! Perso, j'assume entièrement sans inciter les
autres à être aussi "têtu"

Je suis pas tellement pour aller trop loin en VB car je crois que, finalement, le C est fait pour ça (aller plus loin) !


Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse accéptée". )
Messages postés
3
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
10 décembre 2005

Put #nf, numenreg, carnet1 'C'est ici que ca bloque !!!
Il te manque la longueur de ton fichier

Open App.Path & "\users" & username & ".rep" For Random As #nf Len = Len(carnet1)
Put #nf, numenreg,len , carnet1 'C'est ici que ca bloque !!!
Close #nf

Hakim_Ramzi