Divers problèmes...

davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009 - 10 mai 2006 à 21:16
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009 - 10 mai 2006 à 23:28
Mesdames, messieurs les jurés... ;)

Bon déjà je m'excuse pour mon titre peu explicite...

C'est mon trois ou quatrième post concernant le même projet, mais là, ce sont les bugs finaux :)

1ER PROBLEME
Premièrement, sur mon formulaire j'ai une partie qui permet de saisir des données relatives à des élèves, tous définis par un numéro unique. Sur ce même formulaire, j'ai une autre partie dans laquelle l'utilisateur peut CONSULTER les données liées aux élèves, uniquement en mettant le NUMERO. Tout cela se fait grace au bout de code suivant:

Private Sub TxtNumEleve_Change()
If RemplissageCases = True Then
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)
i = 0
While Not EOF(1) 'not eof= non fin de fichier
i = i + 1
Get 1, i, SaveEleve
If SaveEleve.numeroeleve = TxtNumEleve.Text Then
TxtNomEleve.Text = SaveEleve.nomeleve
TxtPrenomEleve = SaveEleve.prenomeleve
TxtClasseEleve = SaveEleve.classeeleve
End If
Wend
Close 1
End If
End Sub

Dans lequel TxtNumEleve est la zone de saisie du numéro de l'élève.
Tout fonctionne à merveille, à l'exception du moment où je ne mets rien dans la zone de saisie. Si je vide complètement ce champ, j'ai une erreur qui apparait: "Type incompatible"... Donc je cherche une solution pour que, par exemple ( et surtout au pire lol), il me mette la valeur à 0 si jamais l'utilisateur décide de vider cette zone. Au mieux, ça serait de pouvoir mettre la zone vide, et qu'il n'y ai plus de message d'erreur :)

DEUXIEME PROBLEME
Une autre erreur, un peu en rapport avec le bout de code ci-dessus d'ailleurs. Lorsque l'utilisateur veut supprimer un élève, il saisi uniquement le numéro de l'élève et les données correspondant à l'élève s'affichent. Après il n'a plus qu'à cliquer sur OK. Cependant, la suppression entraine une ouverture du fichier Eleve.txt, une suppression des données, puis une fermeture. Le problème c'est que j'ai une erreur qui se créée, m'indiquant que Eleve.txt est déjà ouvert. En effet, il a été ouvert par le code que j'ai écrit ci dessus... que faire? Sachant que mon bout de code correspondant à la suppression est le suivant :

Private Sub BtnOkSuppEleve_Click()
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)
SaveEleve.numeroeleve = 0
SaveEleve.nomeleve = ""
SaveEleve.prenomeleve = ""
SaveEleve.classeeleve = ""
Put 1, TxtNumEleve, SaveEleve
TxtNumEleve.Text = ""
TxtNomEleve.Text = ""
TxtPrenomEleve.Text = ""
TxtClasseEleve.Text = ""
Close 1
End Sub

TROISIEME PROBLEME
Dans une autre partie de mon programme, l'utilisateur peut saisir des notes, selon le numéro de l'élève. Mais lorsque je valide, j'ai le message d'erreur suivant:
Opération Get ou Put impossible sur une variable référence d'objet ou une variable de type défini par l'utilisateur contenant une référence d'objet (ouf!)

Lorsque je clique sur OK, j'ai la première ligne qui est surlignée en jaune et le mot "saveNote" qui est surligné en bleu.
Je vous donne donc le code correspondant à la saisie d'une note:

Private Sub BtnOkAjoutNote_Click()If TxtNumEleve.Text "" Or TxtNomEleve.Text "" Or TxtNumExam.Text = "" Or TxtNomMatiere.Text = "" Or TxtNomExam.Text = "" Or TxtNomMatiere.Text = "" Or TxtNomExam.Text = "" Or TxtNumSalle.Text = "" Then
MsgBox ("Vous n'avez pas saisi tous les champs"), vbCritical
Exit Sub
End If

Open "C:\note.txt" For Random As 2 Len = Len(SaveNote)
SaveNote.numeroeleve = TxtNumEleve.Text
SaveNote.numeronote = TxtNomNote.Text
SaveNote.numexam = TxtNumExam.Text
SaveNote.nommatiere = TxtNomMatiere.Text
SaveNote.nomexam = TxtNomExam.Text
'SaveNote.dateexam = TxtDateExam.Value
SaveNote.numsalle = TxtNumSalle.Text
Put 2, TxtNumEleve, SaveNote
TxtNumEleve.Text = ""
TxtNomNote.Text = ""
Close 2
End Sub

Et je pense qu'il est utile que je vous livre ma définition du type lié aux notes (qui est dans un module):
Public Type NOTE
numeroeleve As Integer
nomeleve As String * 50
prenomeleve As String * 50
classeeleve As String * 10
numeronote As Integer
numexam As Integer
nommatiere As String * 50
nomexam As String * 50
dateexam As DTPicker
numsalle As String * 50
End Type

Je me demande bien si ça ne vient pas de la date tout ça.... (type dtpicker)

Bon voilà, j'arrête de vous embêter là. Je me suis permis de mettre ces trois questions dans un même topic puisque finalement ils sont tous un peu liés, et ça m'évite de redéfinir mon problème à chaque fois :)

Merci beaucoup pour votre aide qui me fait toujours autant plaisir :)

David

4 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 mai 2006 à 22:11
Salut,

1)

passe par une zone intermédiaire en Integer



Dim NumEleve As Integer



NumEleve = Val(TxtNumEleve.Text )

if NumEleve = 0 then Exit Sub



nombre d'enregistrement du fichier = Filelen("C:\eleve.txt") \ Len(SaveEleve)



if NumEleve > nombre d'enregistrement du fichier then Exit Sub


qu'est ce que c'est que cette Recherche alors qu'il y a accès direct ??????

j'aime pas trop While Not EOF(1) sur un fichier Random


Get 1, NumEleve, SaveEleve



2)

suppression impossible sur un fichier Random.



met un code de suppression dans l'enregistrement, 0=actif, 1=supprimé par exemple, qui sera testé à la lecture,

à la place du numéro d'élève qui fait double emploi, donc inutile ...



3)

pas trop compris, met la Date en String



dateexam As String







Daniel
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 mai 2006 à 22:35
Oula m'en veux pas, mais je débute en VB... Et à chaque fois qu'on me propose une manière bien différente de celle que j'ai un peu l'habitude d'itiliser, je suis perdu...

Pour ta première solution :

Dim NumEleve As Integer

NumEleve = Val(TxtNumEleve.Text )
if NumEleve = 0 then Exit Sub

Je ne comprend pas vu que NumEleve est déclaré dans mon module (non?)
Et je ne vois pas trop où mettre les deux lignes suivantes...............
Je peux juste confirmer que je peux enlever le while et que ça ne change rien

Deuxième solution: Promis, pas de mauvaise fois... je ne vois pas où je dois faire cela... Je ne comprend pas vu que je ne sais pas où l'intégrer...

Troisième solution: J'ai la possibilité de mettre ça en Integer c'est sur mais on m'a montré un outil un peu plus joli qui développe un calendrier ( et pour avoir ce composant il faut "l'importer, il s'apelle Microsoft Windows Common Controls 2 6.0 ou la version 3 6.0). Donc DTPicker est le nom du composant mais aussi le nom de la déclaration que la date doit prendre.... d'après ce que j'ai compris... Mais bon, je l'ai peut être mal fait ...

Merci beaucoup de prendre du temps pour moi ;)

David
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 mai 2006 à 23:14
Salut,

je vais essayer d'expliquer un peu plus, t'inquiètes pas c'est pas trop dur





TxtNumEleve.Text, je suppose que c'est un TextBox, donc une String, et quand c'est pas numérique, forcément ça plante.

il faudrait mieux tester la saisie, pour être sùur qu'on a bien du numérique, voir TextBox Numérique ...

il reste le cas où TxtNumeleve.Text = ""

on peut le tester avec If TxtNumeleve.Text = "" Then ...

NumEleve est un numérique, il peut être déclaré dans un module si utilisé plusieur foisNumEleve Val(TxtNumEleve.Text ) va donner zéro si TxtNumeleve.Text "", ou même si TxtNumeleve.Text

n'est pas numérique, donc pas de plantage ...



après l'open tu peux savoir le nombre d'enregistrements

Open "C:\eleve.txt" For Random As #1 Len = Len(SaveEleve)

NombreEnregistrement = Lof(1) \ Len(SaveEleve)

ce qui permet de savoir que NumEleve ne dépasse pas le nombre d'enregistrements.

à partir de là, on sait que l'enregistrement existe, entre 1 et NomberEnregistrement,

il peut être encore supprimé (code suppression = 1)



comme le numéro d'éleve est la clef, on a accès direct:

Get #1, NumEleve , SaveEleve

et tester si CodeSuppression = 1 Then ... Elève n'existe pas ...

la boucle While/Wend est donc bien inutile, sinon quel est l'avantage d'avoir un accès Random ?



autre chose:

mettre le code dans la Sub TxtNumEleve_Change, c'est pas une très
bonne idée, soit il faut mettre un bouton, ou alors tester la touche
Enter, sinon à chaque changement, relecture du fichier, etc ...

vaut mieux attendre la fin de la saisie non ?



c'est DTPicker qui n'est pas accepté, parce que c'est pas un type de donnée

il reste le choix entre String, Date ou Double

l'avantage du String c'est que ce sera lisible, par contre Date et Double seront en binaire

dateexam As String*10

dateexam = DTPicker.Value






Daniel
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 mai 2006 à 23:28
Merci pour ta réponse. Je vais travailler ta réponse demain avec un copain.
De toute façon il faut que je termine ce projet rapidement donc ta réponse ne restera pas... sans réponse :)

Merci encore et bonne nuit :)

David
0
Rejoignez-nous