cs_cricri_forever
Messages postés49Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention31 mars 2006
-
17 janv. 2006 à 13:21
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_cricri_forever
Messages postés49Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention31 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
cs_cricri_forever
Messages postés49Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention31 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?????
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_cricri_forever
Messages postés49Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention31 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...
cs_cricri_forever
Messages postés49Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention31 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)