Erreur: type Incompatible...

Résolu
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009 - 5 mai 2006 à 23:11
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009 - 10 mai 2006 à 10:31
B'jour!

Me (re)voilà avec un poblème avec le programme que je développe. Je vais essayer d'être clair et concis:

_Je débute en VB ;)
_Je fais un logiciel qui contient en fait 3 modules: Un qui permet de s'occuper d'ajouter, supprimer et consulter des élèves; Un qui permet de s'occuper d'ajouter, supprimer et consulter des notes qu'auront eu les élèves et Un qui permet de s'occuper d'ajouter, supprimer et consulter des Examens qu'ont subis les élèves.
_Les Elèves, Notes, Examens et leurs caractéristiques attenantes sont enregistrés dans 3 fichiers différents.
_Mon bug ne se produit pas sur le module concernant les élèves, celui que j'ai créé en premier et qui m'a servi de référence pour les deux autres modules. J'ai procédé à quelques copier/coller depuis celui ci vers les autres mais de manière, me semble-t-il, prudente.

Donc il se trouve que quand je veux ajouter (ou consulter ou supprimer) une note ou un examen j'ai, à chaque fois le message d'erreur "Erreur d'excution 13 Type Incompatible".

Je ne comprends pas l'erreur. Mais voici peut-être quelques pistes d'erreur possible, que je ne sais pas résoudre:

_Les données liées aux élèves sont enregistrés par un bout de code dont voici les lignes:
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)
SaveEleve.numeroeleve = TxtNumEleve
SaveEleve.nomeleve = TxtNomEleve
SaveEleve.prenomeleve = TxtPrenomEleve
SaveEleve.classeeleve = TxtClasseEleve
Put 1, TxtNumEleve, SaveEleve
Close 1

_ Et celles liées aux Notes (par exemple) sont enregistrées grâce à ça:

Open "C:\note.txt" For Random As 2 Len = Len(SaveNote)
SaveNote.numeroeleve = TxtNumEleve
SaveNote.numexam = TxtNumExam
SaveNote.nommatiere = TxtNomMatiere
SaveNote.numeronote = TxtNumNote
Put 2, TxtNumEleve, SaveNote
Close 2

Je me demande donc si le problème ne vient pas des numéros (1 et 2) qui caractérisent les fichiers... ? Je ne sais pas trop m'en servir de ces numéros...

En réfléchissant vraiment au message d'erreur, je me suis demandé si l'erreur ne vient pas de mon "module" dans lequel sont définis quelques types publiques. Mais je n'y vois pas d'erreur.

Voilà, je vous laisse avec cela, et n'hésitez pas si vous avez des questions pour vous aider à résoudre mon problème, j'essaierai d'y répondre avec le plus de précision ;)

Bonne soirée à tous et merci de votre aide!

David

18 réponses

davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
10 mai 2006 à 10:31
Youpi un copain vient de me trouver la solution.

Vous ne pouviez pas trouver la solution vu le code que je vous avais donné. Je vous donne un bout de code plus conséquent:

Private Sub BtnOkAjoutExamen_Click()
Open "C:\examen.txt" For Random As 3 Len = Len(SaveExam)
SaveExam.numeroexam = TxtNumExam
SaveExam.nomexam = TxtNomExam
SaveExam.dateexam = TxtDateExam
SaveExam.moyexam = TxtMoyExam
SaveExam.numsalle = TxtNumSalle
SaveExam.nommatiere = TxtNomMatiere
SaveExam.numeroeleve = TxtNumEleve
SaveExam.nomeleve = TxtNomEleve
Put 3, TxtNumEleve, SaveExamen
SaveExam.numeroexam = ""
SaveExam.nomexam = ""
SaveExam.dateexam = ""
SaveExam.moyexam = ""
SaveExam.numsalle = ""
SaveExam.nommatiere = ""
SaveExam.numeroeleve = ""
SaveExam.nomeleve = ""
Close 3
End Sub

L'erreur.... vous l'avez peut-être trouvée maintenant. Une fois que le Put 3 a été effectué, je voulais que les champs de texte soient effacés pour permettre une autre saisie. Mon pote m'a donc trouvé qu'il ne faut pas réinitialiser la variable (exemple: SaveExam.nomexam) mais uniquement la zone de texte. Donc le type d'exemple pour effacer une ligne est :
TxtNomExam=""

Il m'a d'ailleurs conseillé d'ajouter ".Text" après chaque nom de champ texte afin que tout soit bien défini.

Ensuite, ce monsieur m'a appris à ajouter une condition SI qui me permet de vérifier que certains champs ont bien été remplis ;)

Donc voilà, ma situation est débloqué :)

Merci à vous tous de vous être penchés sur mon problème, ça fait vraiment plaisir de voir que l'on n'est pas seul en cas de pépin en développement :)

Bonne journée à tous!

David
3
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
5 mai 2006 à 23:16
erf... J'ai bien l'impression que finalement tout mon programme bug avec cette même erreur... Ca sera peut-être plus simple pour résoudre le problème...

Je me relance dans mes recherches, en espérant que vous sachiez précisément ce que cette erreur signifie ;)

A tout de suite :P

David
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 mai 2006 à 23:32
Moi je diaris plutot que ton erreur vient des instructions Put.
L'instruction Put attent en second paramètre un nombre de type long, et toi tu lui passe une chaine de caractère (j'imagine que TxtNumEleve est une chaine de caractère).

Normalement quand tu execute ton programme depuis VB et que tu obtient une erreur, la ligne ou se produit l'erreur est surlignée de jaune, ça peut aider pour trouver l'erreur.

0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 mai 2006 à 23:34
Et pour les nombres 1 et 2 tu peux regarder du coté de la fonction FreeFile aussi. Elle te renvoie le premier numéro de fichier libre.
Personellement, je préfère ça que d'imposer arbritrairement un numéro.

0

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

Posez votre question
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
6 mai 2006 à 00:06
Ben en fait non, c'est un Integer :D Mais celui ci se saisi dans une case de texte, d'où le nom que j'ai choisi...

Pour les fichiers, on m'a appris à faire comme ça et vu que je suis un mouton... lol Nan mais j'aimerai, pour ce programme, utiliser ce type d'écriture.

Je ne trouve pas la solution du problème... Il me met et surbrillance cette ligne là (dans le module élève):
SaveEleve.numeroeleve = TxtNumEleve

SaveEleve étant en rapport avec mon type public ELEVE défini dans le module lié...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 mai 2006 à 09:54
Regarde les définitions de tes différentes variables dans ton type ELEVE
numeroeleve doit etre du même type que TxtNumEleve, etc....

Ton type ELEVE s'il est défini dans un autre module, il ne doit pas etre défini avec le mot clé Private, idem pour la variable SaveEleve.

Question : Utilise-tu l'option explicit ? Si ce n'est pas le cas, ajoute systématiquement sur la toute première ligne de code de tous les modules et de toute les feuilles la ligne suivante : Option Explicit
Cela va t'obliger à déclarer explicitement chaque variable que tu utilise. C'est un peu moins souple au niveau codage (c'est une habitude à prendre), mais ça va t'éviter certains bugs très difficiles à trouver quand ils portent sur le type de variable.

Considère cette option comme une option ABSOLUMENT OBLIGATOIRE pour ce programme et tous tes programmes à venir.

0
asecher Messages postés 262 Date d'inscription lundi 20 octobre 2003 Statut Membre Dernière intervention 27 avril 2007 1
6 mai 2006 à 15:48
Casy a casiment raison....

L'erreur de type 13 survient souvent quand on passe un str vers un numérique. De plus, il faut faire attention (ce ne doit pas être le cas pour toi car tu travaille sur des entiers) au séparateur décimal, qui, selon le paramétrage "International" est le point ou la virgule.

Des petites fonctions de conversion (cint, par exemple) ou de verification (IsInteger) selon le langage utilisé (mais qui ne sont pas très compliquées à développer) aident bien...

Cordialement,

Alain 31
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
6 mai 2006 à 15:59
D'accord, merci pour vos réponses. Je vais m'occuper de ça ce week-end ou en début de semaine ;) Je vous tiens au courant :)
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 mai 2006 à 16:15
Salutation à tous,

Je souhaiterai savoir une petite chose : ton module s'appelle "SaveEleve" ?


Si c'est le cas dans
Open "C:\note.txt" For Random As 2 Len = Len(SaveNote)


c'est pas bon car la fonction Len renvoi le nombre de caractères d'une variable de type string.


Par contre si SaveNote n'est pas ton module mais belle et bien une variable de type string, ben alors j'ai rien dit..

@ ++

Mortalino
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
6 mai 2006 à 16:29
Je ne vois pas ce que tu appelles module. J'ai "ajouté un module" et y ai déclaré mes types publiques.
J'en ai trois: NOTE (auquel le programme se réfère grâce à SaveNote)
EXAMEN (auquel le programme se réfère grâce à SaveExam)
ELEVE (auquel le programme se réfère grâce à SaveEleve)

Est-ce que ta remarque tiens toujours sachant ce que je viens d'écrire?

Merci en tout cas de te pencher sur le problème ;)

David
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 mai 2006 à 16:36
Quand tu dis : J'ai "ajouté un module" et y ai déclaré mes types publiques.
*Comment s'appelle ton module ? module1, ou tu l'as renommé ?
*SaveEleve, qu'est ce c'est ?

c'est en fait pour voir si le problème ne se situe pas dans la phrase
Open "C:\note.txt" For Random As 2 Len = Len(SaveNote)


Si "SaveNote" n'est pas de type string, t'es marron, d'où le message d'erreur d'incompatibilité

Mortalino
0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
6 mai 2006 à 16:56
Module1 ets bien le nom de mon module.

SaveEleve en fait... heu ben regarde ce que j'ai :

Public Type ELEVE
numeroeleve As Integer
nomeleve As String * 50
prenomeleve As String * 50
classeeleve As String * 10
End Type

Public SaveEleve As ELEVE

Donc voilà, SaveEleve c'est le nom qui fait référence au type ELEVE.

Ici, toutes les variables à saisir ne sont pas référencées mais pour l'exemple NOTE ben elle sont toutes déclarées et ça na fonctionne pas..

Ce qui m'étonne c'est que pour tout ce qui se rapporte aux élève, ça fonctionnait avant...
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 mai 2006 à 17:04
Dans ces 2 phrases :
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveNote)

remplace (temporairement) "= Len(SaveEleve)" par "= 10" (10 étant un nombre que j'ai mis au hasard, met la nombre de ton choix, bref le plus adapté)
idem pour "= Len(SaveNote)"


Juste pour voir si ça te cause tjs le problème, au moins on saura si c'est dans cette partie de code ou non.

Mortalino
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 mai 2006 à 17:06
mortalino, pour ton info l'instruction len(SaveNote) est tout à fait correcte dans ce cas là.

L'instruction Len renvoie le nombre de caractère d'une chaine de caractère OU le nombre d'octet d'une variable qu'elle soit classique ou de type user comme ici.

0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
6 mai 2006 à 17:12
En mettant "Open "C:\eleve.txt" For Random As 1 Len = 10" à la place de "Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)", le problème et l'erreur restent les mêmes.

Par contre en mettant "Open "C:\eleve.txt" For Random As 1 Len = xx" ben j'ai une erreur 5 Argument ou appel de procédure incorrect. Mais en faisant le débogage, il me surligne Open "C:\eleve.txt" For Random As 1 Len = xx alors qu'avec Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve) il me surligne ma première ligne (à savoir "SaveEleve.numeroeleve = TxtNumEleve")

Voili voilà...

Je risque de ne plus répondre beaucoup ce soir. D'ici Vingt minutes je ne serai plus là. Je repasserai faire un tour dans la soirée ;)

merci encore à vous ;)
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 mai 2006 à 17:20
Merci casy, sans se moquer, je ne savais pas que ca calculait aussi le Nb d'octets.


Sinon je suis ancré sur sa phrase
Open "C:\eleve.txt" For Random As 1 Len = Len(SaveEleve)

j'ai déjà eu des prob de référencement entre plusieurs module.

Si cette instruction (Open ...) est placée Hors du module où se trouve sa déclaration du Type ELEVE, ne serait il pas judicieux de placer


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

Mortalino
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 mai 2006 à 17:32
Ce n'est pas le type ELEVE mais bien la variable SaveEleve (et SaveNote dans le second cas) .

Pour moi il n'est pas utile de preciser le module, si SaveEleve est déclarée en tete de module, en public, elle est visible dans l'ensemble du programme, si elle est déclaré en private, elle n'est visible que dans le module ou elle est déclarée. Et donc si elle est utilisée dans un autre module, il devrai normalement avoir une erreur de variable non déclarée (avec l'option explicit active).

Au sujet de Len, s'il s'agit de connaitre, non pas la taille de la variable, mais la taille de la mémoire réservée à la variable (passage à une dll en C par exemple), il faut utiliser LenB qui elle tient compte des éventuels alignement mémoires des éléments à l'intérieur de la structure

0
davidguillon Messages postés 81 Date d'inscription lundi 9 août 2004 Statut Membre Dernière intervention 15 septembre 2009
6 mai 2006 à 17:35
L'erreur affichée est la même en mettant la ligne:
Open "C:\eleve.txt" For Random As 1 Len = Len(Module1.SaveEleve)

snif.... et à plus tard ;)
0
Rejoignez-nous