Help Client.dat vb6

cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006 - 17 janv. 2006 à 13:21
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 18 janv. 2006 à 16:15
Bonjour,


Voila j'ai un fichier client.dat (pa de bdd) que je peux ouvrir avec bloc notes et en lancant mon prog il ne me trouve aucun client! je dois aussi pouvoir ajouter un champ sans perdre les données des clients mettre le fichier en client.new puis le remmetre en .dat en Je débute dans ce domaine


Quelq'un pourrai m'aider pour me dire qel code mettre ou que faire!!

Merci d'avance

Open "C:\GestClt\Data\CLIENTS.DAT" For Random As #1 Len = Len(FichClient)
Get #1, 1, FichClient If Val(FichClient.Nom) <> 0 Then NbClt Val(FichClient.Nom) Else NbClt 1
End Sub

Sub RechercherClt()
Dim I As Integer
TrouveClt = False
PstClt = 0
I = 1
Do
I = I + 1
Get #1, I, FichClient
If (FichClient.Num = eNumClt.Text) Then
PstClt = I
TrouveClt = True
End If Loop Until (I NbClt) Or (PstClt I)
If (Not TrouveClt) Then
MsgBox "Aucun client ne correspond aux critères de recherche"
PstClt = 0 'La position est remise à ZERO au cas où la fiche trouvée est une fiche supprimée
End If
End Sub

Private Sub bAjouter_Click()
Dim I As Integer
' Initialisation de la recherche
TrouveClt = False
PstClt = 0
I = 1
' Boucle de recherche
Do
I = I + 1
Get #1, I, FichClient
If (FichClient.Num = eNumClt.Text) Then
TrouveClt = True
End If
' On sort de la boucle dès que le client est trouvé ou qu'on atteind la fin du fichier
Loop Until (I = NbClt) Or TrouveClt

If Not TrouveClt Then
NbClt = NbClt + 1
PstClt = NbClt
Call EcrireClt
Call bInitialiser_Click
Else
MsgBox "Ce numéro de client a déjà été utilisé."
eNumClt.SetFocus
End If
End Sub

10 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 janv. 2006 à 18:44
Salut
Après analyse du code :
Toujours utiliser FreeFile pour choisir le n° du fichier.
Si tu gères plusieurs fichiers au sein du même projet, ça te rendra service.
Dans un module, tu dimensionnes une variable qui sera l'image de ce numéro :
Public NoFichierClient As Integer
Quand tu ouvres ton fichier :
NoFichierClient = FreeFile ' VB te fournira le 1er n° disponible
Dans ton Open :
Open "C:\GestClt\Data\CLIENTS.DAT" For Random As #NoFichierClient Len = Len(FichClient)

Dans RechercherClt :
- Tu initiales I à 1 et dans la boucle Do, tu l'incrémentes de suite
Conséquence, tu ne fais jamais la recherche dans la fiche n° 1
- Quand ton test est bon, tu continues à scruter le fichier
A mon avis, c'est inutile (perte de temps)
Ajoute un Exit Do dans ton If
Ce sera plus simple que l'utilisation de PstClt
- Tes structures Do-Loop sont bizarres :
Pourquoi ne pas utiliser le standard ?
Do While Not EOF(1)
...
Loop
Dans bAjouter_Click :
- Avant d'insérer, tu cherches si une fiche identique existe déjà. Ok
Cette recherche est déjà faite dans RechercherClt : Pourquoi ne pas l'utiliser ?
Il te suffit de modifier ta Sub RechercherClt comme ceci :
Function RechercherClt() As Boolean
... ton code actuel
' En fonction du résultat de la recherche :
RechercherClt = True ' si fiche trouvée
RechercherClt = False ' si fiche pas trouvée
' Il faudra aussi surement supprimer ou aménager le MsgBox qui n'est pas nécessaire à l'intérieur
' de RechercherClt mais à la suite de l'appel de RechercherClt
End Function
+ dans bAjouter_Click :
Tu supprimes les lignes de recherche
A la place du If Not TrouveClt Then --> If Not RechercherClt Then

En ce qui concerne l'ajout de nouvelles fiches, il faudra vérifier s'il est nécessaire de compléter ta méthode d'ouverture avec le mot clé Access (pas sûr en Randon) :
Open "C:\GestClt\Data\CLIENTS.DAT" For Random Access Read Write As #NoFichierClient Len = Len(FichClient)
Ensuite, quand tu veux enregistrer une fiche :
Par dessus une fiche existante :
Put #NoFichierClient, NoDeLaFicheAremplacer, FichClient
Pour ajouter une fiche à la fin :
Put #NoFichierClient, NbreDeFiches + 1, FichClient

D'autre part, la lecture et écriture du fichier est buffurisée par le système et par la mémoire cache du disque (qui devient de plus en plus gros avec les techniques).
Donc, en réalité, quand tu travailles avec le fichier, il n'est pas réellement écrit sur le disque mais en mémoire --> Pense à refermer puis réouvrir le fichier après chaque modif pour ne pas avoir de surprises en cas de plantage du programme.

Pour ce qui est de la suppression d'une fiche :
Tu ne pourras pas détruire une fiche en plein milieu du fichier.
Il faudra utiliser une astuce : Il suffira de réenregistrer cette fiche avec, dans le .Nom, un mot clé du style "[Supprimée]"
Comme ça, à la relecture, tu pourras facilement retrouver une fiche précédemment détruite et la réutiliser pour stocker une nouvelle fiche au lieu de l'ajouter à la fin du fichier.

Vala, le roman est terminé.
Jack, 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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 janv. 2006 à 18:56
Encore une petite précision :
Quand tu ouvres un fichier en Random avec une longueur de fiche fixe (obligatoire), il va de soit que la longueur totale de la fiche ne doit pas être modifiée, sinon ton fichier deviendrait inexploitable !
Donc le format des champs de ta fiche doivent être dimensionnés comme ceci :
Public Type TypeFicheClient
Nom As String * 30
Prénom As String * 30
...
End Type
Public FichClient As TypeFicheClient

Une autre possibilité :
Quand tu démarres ton application, charge toutes tes fiches en mémoire dans un tableau :
Public FichClient() As TypeFicheClient
Il faudra, à la lecture des données, redimensionner le tableau en fonction du nombre de fiches contenues dans le fichier :
Calculable avec :
Redim FichClients(0) ' au moins une première fiche
NbrFiches = CLng(FileLength("C:\monFichier.DAT") / Len(FichClient(0)))
Redim FichClients(1 To NbrFiches)
For r = 1 To NbrFiches
Get #NoFichierClient, r, FichClient(r)
Next r

Ensuite, tu pourras jongler avec les données de ton tableau en mémoire.
Ce sera surement plus pratique, mais attention à la taille des fichiers !

Vala
Jack, 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)
0
cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006
17 janv. 2006 à 22:01
Je dois faire sa en deux fiches differentes

et j'avoue que je suis un peu perdu... je ne sais pas quoi mettre deriere quoi

il me met un probleme avec

Open "C:\GestClt\Data\CLIENTS.DAT" For Random As #1 Len = Len(FichClient)
Get #1, 1, FichClient If Val(FichClient.Nom) <> 0 Then NbClt Val(FichClient.Nom) Else NbClt 1
End Sub

Dsl I'm debutant de chez debutant
0
cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006
17 janv. 2006 à 22:09
quand j'entre un numero de fichier il me met qu'il n'y a pas de clients alors qu'il doit s'y trouver 3500 donc 1 a 3500 existe et il ne me dit que non?????
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 janv. 2006 à 23:30
Bon.
Comment as-tu créé ton fichier client ?
A la main ? dans NotePad ?
Le problème vient de là. La structure des fichiers de fiches à longueur fixe, c'est que les données de ces fiches ne séparées par rien, même pas un espace ni un retour chariot.
C'est normal puisque la longueur de chaque champ est connue à l'avance.
Donc, pour continuer, il va falloir dire si ce point là est Ok

Est-ce que la fiche est bien dimensionnée ?
Comment la dimensionnes-tu ?
Est-elle compatible avec tes données ?

Sinon, il faut utiliser le debugger de VB6 :
Tu clique sur la ligne qui suit ton Get et tu clique sur la touche F9 : la ligne change de couleur.
Quand ton programme arrivera là, il aura lu une fiche et s'arrêtera sur la ligne.
Tape Ctrl-G pour faire apparaitre la fenêtre de debug.
Dedans, tape :
? FichClient.Nom
.Nom étant le nom d'une varaible dans la structure de ta FichClient.
Fais de même pour les autres champs et vérifie !
Selon se que tu trouves, il faudra revenir poser des questions.

Ces lignes de code, c'est bien toi qui les a écrites ? donc tu sais à peu près ce qu'elles font (rassure moi)

Vala
Jack, 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)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 janv. 2006 à 23:35
Au fait. Tu dis qu'il ne trouve pas de fiche :
Sous quelle forme est stockée FichClient.Num ?
Sous forme texte (obligatoirement).
Quel est le format de ce texte ? les esapces sont devant ou derrière le chiffre ?
Ton TextBox, mui, n'a pas d'espace, ni devant, ni derrière.
Donc le test If (FichClient.Num = eNumClt.Text) Then ne sera jamais vrai si tu le compares sous forme texte.
Il faut transformer ta chaine en chiffre :
Si ce chiffre est entier de 1 à X, utilise la conversion en type Long :
If CLng(FichClient.Num) = CLng(eNumClt.Text) Then
ou Val(texte) : regarde dans l'aide

Vala
Jack, 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)
0
cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006
17 janv. 2006 à 23:43
Il est avec bloc notes

maintenant il fonctionne mais je dois créer le meme prog dans une autre fiche avec des champs a rajouter

j'ai un module ossi

Public Type tClients
Num As String * 6
Nom As String * 30
RaisonSoc As String * 10
Adresse1 As String * 30
Adresse2 As String * 30
CodePostal As String * 12
Localite As String * 20
Telephone As String * 20
Telecopie As String * 20
End Type
Public FichClient As tClients
Public NbClt, PstClt As Integer
Public TrouveClt As Boolean

et je doit enregistrer les clients sans rien perdre...
0
cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006
17 janv. 2006 à 23:55
il me met un prob a ce niveau

Private Sub bRechercher_Click()
PstClt = 0
If eNumClt.Text > "" Then Call RechercherClt
'Si un client est trouvé, il est affiché
If PstClt > 0 Then AfficheClt Else bInitialiser_Click
End Sub
0
cs_cricri_forever Messages postés 49 Date d'inscription mercredi 28 septembre 2005 Statut Membre Dernière intervention 31 mars 2006
18 janv. 2006 à 00:25
et pour rajouter le champ "gsm" quel code je dois rajouter et ou ?

merci d'avance pour ton aide!!
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
18 janv. 2006 à 16:15
Salut
Normal : le test Chaine > "" ne peut pas fonctionner.
Si tu penses détecter que la chaine n'est pas vide --> Chaine <> ""

Dans ce genre de programme, il faut impérativement définir le contenu des fiches avant de continuer, sinon tu seras confronté au problème de la sauvegarde des données cohérentes.
Personnellement, je trouve que les longueur de tes champs sont fantaisistes :
Num As String * 6 Ok
Nom As String * 30 Ok
RaisonSoc As String * 10 Un peu court
Adresse1 As String * 30 Ok
Adresse2 As String * 30 Ok
CodePostal As String * 12 5 suffirait
Localite As String * 20 J'aurai mis 30
Telephone As String * 20 10 chiifres + 4 points + éventuellement 2 chiffres pour pays = 16
Telecopie As String * 20 Idem

Si ton fichier existe déjà et que tu modifies cette structure (modif longueur des champs, ou quantité de champ), tu ne pourras plus relire ton fichier correctement.
Il faudra prévoir et programmer une moulinette qui transformera le fichier de l'ancien vers le nouveau fichier.
Pour le reste, essaye de bien comprendre chaque ligne de ton programme.
Utilise le mode Debug comme expliqué plus haut pour vérifier ce que ton programme fait.
Je ne peux hélas pas t'aider plus.

Vala
Jack, 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)
0
Rejoignez-nous