PROBLEME d'incrémentation avec Freefile()

Signaler
Messages postés
18
Date d'inscription
vendredi 19 décembre 2008
Statut
Membre
Dernière intervention
25 décembre 2010
-
Messages postés
14779
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 avril 2021
-
Bonjour à tous, dans la cadre d'une programmation procédurale j'ai développé une appli où l'utilisateur enregistre les informations de cette appli dans un fichier texte.

Le fichier est en accès aléatoire. Le fichier n'est pas lu, il est simplement enregistré.

Par contre la fonction freefille() me renvoie toujours le même numéro pour tous les fichiers, il ne s'incrémente pas !

Voilà mon code concernant la partie intéressante de l'appli et concernent mon problème :

Private
Sub btndevisenr_Click(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles btndevisenr.Click

With SFDdevis

'répertoire sur lequel s'ouvrira la boite.InitialDirectory =

"Mes documents"

'titre de la barre .Title =

"Enregistrer le devis"

'filtre, seules les fichiers spécifiés apparaîtront.Filter =

"Fichiers txt(*.txt)|*.txt"

'enfin on ouvre la boite de dialogue enfin.ShowDialog()

'après la fermeture de la boite de dialogue, le bouton 'annuler' a-t-il été cliqué ?

If Err.Number = 32755
Then
Exit
Sub

'si aucun choix

If Len(.FileName) = 0
Then
Exit
Sub

'nom du fichier choisi(avec extension)devis = .FileName

End
With 

'créer un fichier

Dim No
As
IntegerNo = FreeFile()

 

 

FileOpen(No, devis, OpenMode.Output, OpenAccess.Write)

WriteLine(No,

"Commande du client " & prenom.ToUpper &
" " & nom.ToUpper)WriteLine(No,

"GENERAL : ")Write(No, lblchassisdevis.Text)

Write(No, lblmoteurdevis.Text)

Write(No, lbltransmissiondevis.Text)

Write(No, lblrouesdevis.Text)

WriteLine(No, lblinterieurdevis.Text)

WriteLine(No,

"OPTION (Design) : ")Write(No, lblcompeinturedevis.Text)

Write(No, lblcomcapotdevis.Text)

Write(No, lblcomperiscopesdevis.Text)

WriteLine(No, lblcompassagesrouedevis.Text)

WriteLine(No,

"OPTION (Moteur) : ")Write(No, lblcomhuiledevis.Text)

Write(No, lblcomculbudevis.Text)

Write(No, lblcomradiateurdevis.Text)

WriteLine(No, lblcomkitinjectiondevis.Text)

WriteLine(No,

"DEVIS (Importation) : ")Write(No, lbldevisachat.Text &

" " & txtdevisachat.Text)Write(No, lbldeviscontainer.Text &

" " & txtdeviscontainer.Text)Write(No, lbldevisassurance.Text &

" " & txtdevisassurance.Text)Write(No, lbldeviscif.Text &

" " & txtdeviscif.Text)WriteLine(No, lbldevisdouanes.Text &

" " & txtdevisdouanes.Text)WriteLine(No,

"DEVIS (Frais fixes inclus) : ")Write(No, lbltransterrestre.Text)

Write(No, lbldepotage.Text)

Write(No, lblpeageport.Text)

Write(No, lbldossier.Text)

WriteLine(No, lblcourrierexpress.Text)

WriteLine(No,

"DEVIS (TOTAL) : ")Write(No, lbldevismontantht.Text &

" " & txtdevisht.Text)Write(No, lbldevistva.Text &

" " & txtdevistva.Text)WriteLine(No, lbldevismontantttc.Text &

" " & txtdevisttc.Text)FileClose()

MessageBox.Show(

"Enregistrement de la commande N°" & No &
" terminé")

En espérant que vous pourrez m'aider, je vous remercie d'avance et félicitations pour le site

11 réponses

Messages postés
14779
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 avril 2021
154
Bonjour,

Utilises plutôt :
IO.File.Open(...)
Ensuite utilises le flux obtenu en n'oubliant pas de le fermer.

Ensuite, N'utilises plus Err (On Error Goto, ...) en .NET, utilises Try/catch.
Et pour les boites de dialogues, utilises le retour de la fonction ShowDialog de la boite de dialogue et contrôle si c'est une annulation.

http://nhen0039.chez-alice.fr/index.php
Messages postés
18
Date d'inscription
vendredi 19 décembre 2008
Statut
Membre
Dernière intervention
25 décembre 2010

Merci NHenri

je vais mettre en pratique tes conseils et je te dis quoi
Messages postés
18
Date d'inscription
vendredi 19 décembre 2008
Statut
Membre
Dernière intervention
25 décembre 2010

Au fait pour le "io.file.open" et les flux dont tu parles,

je dois utiliser les classe File et Stream si j'ai bien compris ??

Je demande juste confirmation histoire de ne pas m'engoufrer dans autre chose qui me ferait perdre du temps, merci à toi
Messages postés
14779
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 avril 2021
154
Bonjour,

Tout a fait, tu utilises "Open" de la classe "File" et celle-ci te retourne un "IO.Stream" (éventuellement dérivé, mais là n'est pas la question).

http://nhen0039.chez-alice.fr/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Pour info, il est normal que FreeFile te renvoie toujours la même valeur.

FreeFile le premier n° libre de fichier.
Tu ouvre ton fichier, tu fais tes écritures, puis tu ferme le fichier. Tu libère donc ce n° de fichier.
Donc lorsque tu rapelle FreeFile, si ce n° n'a pas été utilisé entre temps, il te renvoie le même.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
18
Date d'inscription
vendredi 19 décembre 2008
Statut
Membre
Dernière intervention
25 décembre 2010

Merci BEAUCOUP NHenri, ça marche à part une petit chose :
 
en ce qui concerne le fichier texte aucun problème (je déclare un StreamWriter qui reçoit la propriété Createtext de la classe File avec mon nom de fichier en paramètre).

pour le try/catch également, aucun problème, bien que j'ai du mettre à l'intérieur de mon try tout le code qui écrit dans le fichier texte (Writeline,etc....).

sinon j'ai un petit problème avec le retour de Showdialog(), il ne me l'accepte pas dans les cas suivants que j'ai essayé :

1 : Catch ex
As Exception
When ShowDialog.Cancel = Windows.Forms.DialogResult.Cancel

Exit
Sub
2 : Catch ex
As Exception
When ShowDialog.Cancel = True

Exit
Sub
3 : Catch ex
As Exception
When ShowDialog.Cancel = 2

Exit
Sub

Il me souligne comme avertissement à chauqe fois "SHOWDIALOG" en me disant que l'expression qualifiante ne sera pas évaluée....
Messages postés
18
Date d'inscription
vendredi 19 décembre 2008
Statut
Membre
Dernière intervention
25 décembre 2010

Merci pour l'info casy, dans ce cas là perso je ne trouve pas que FreeFile() soit d'un grand intérêt s'il faut laisser ouvert le fichier précédent pour qu'il s'incrémente.

A moins qu'il existe un bidoullage que je ne connait pas mais bon..

Merci pour l'info
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Il n'y a aucun intérêt particulier à ce que le n° de fichier augmente. Le but est d'obtenir un n° de fichier disponible afin de ne pas utiliser un n° déjà occuper et d'aller taper dans un autre fichier que celui que tu as ouvert.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
18
Date d'inscription
vendredi 19 décembre 2008
Statut
Membre
Dernière intervention
25 décembre 2010

Il y a un intérêt pour moi puisque celà était spécifié comme contrainte dans mon énoncé.

Merci
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Dans ce cas il ne faut pas te basé sur FreeFile pour calculer ton incrément de commande. Car d'une part, comme tu as pu le constater, non seulement, FreeFile ne te garantie pas un incrément, mais il ne te garantie pas non plus des numéros successifs. Tu peux même obtenir un n° inférieur au n° précédent si 2 fichiers ont été fermé successivement.

D'ailleurs généralement, comme tu n'ouvre qu'un seul fichier à la fois, FreeFile renvoie la pluspart du temps 1 comme numéro.
 

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
14779
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
3 avril 2021
154
Bonjour,

Pour l'histoire de l'annulation :

if CommonDialog.ShowDialog()=(Quelquechose).Cancel then exit sub
'CommonDialog est ta boite de dialogue
Ensuite, je ne connais pas la syntaxe : Catch Ex as exception When ...

http://nhen0039.chez-alice.fr/index.php