PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Passage de paramètre provoque une erreur
Passage de paramètre provoque une erreur
Iniciado por P@ul, 04,jun. 2020 14:37 - 11 respuestas
Miembro registrado
48 mensajes
Publicado el 04,junio 2020 - 14:37
Bonjour, il y a quelque chose que je ne comprends pas parfaitement.

Je reçois depuis un certain temps ce message d'erreur:
Le passage du paramètre 1 a provoqué une erreur.
Dans le cas d'un passage de paramètre par référence, un élément de type 'entier sur 8 octets' ne peut pas être converti vers le type 'entier'. Utilisez un paramètre local dans la procédure appelée ou passez un paramètre de type 'entier'.

Dans mon code, j'appelle une fonction que j'ai créée en passant directement en paramètre l'élément.

Exemple:
DonneCatégorieVéhicule(Combo_Véhicule)

Procedure DonneCatégorieVéhicule(nIdVéhicule est un entier)
...


La rubrique mémorisée de mon combo correspond à l'id du véhicule qui est un id automatique sur 4 octets dans ma base de données.






Pourquoi ça fait celà ?!?!
Miembro registrado
371 mensajes
Publicado el 04,junio 2020 - 15:13
Bonjour

Un entier n est pas égal a un entier sur 8 ou 4 octet car la taille allouée pour chaque type d entier n est pas la meme. Il faut donc que tu conserves le meme type dans le paramètres
Miembro registrado
291 mensajes
Publicado el 04,junio 2020 - 15:20
Bonjour

Procédure DonneCatégorieVéhicule(LOCAL nIdVéhicule est un entier )
...

Je me demande si cette syntaxe de poserai le même problème ... ?

Bien cordialement
Miembro registrado
48 mensajes
Publicado el 04,junio 2020 - 15:29
@GB

Merci pour ta précision... Effectivement, je comprends le principe.

Ce que j'aimerais savoir, c'est pourquoi mon COMBO me "retourne" un entier sur 8 octets ... d'où il prends ça ???
Miembro registrado
371 mensajes
Publicado el 04,junio 2020 - 16:51
Id automatique doit etre sur 8 octets ...
Miembro registrado
371 mensajes
Publicado el 04,junio 2020 - 16:52
Si ta combo est une combo table ta colonne id de la table doitcetre en 8 octets
Miembro registrado
48 mensajes
Publicado el 04,junio 2020 - 17:39
@GE

Encore une fois, merci pour tes pistes de solutions... Oui c'est une COMBO table, mais la valeur mémorisée ne "retourne" pas la valeur d'une colonne, mais bel et bien la valeur de la requête qui est associée au combo. Ont peut d'ailleurs voir que cette valeur est bel et bien un id automatique sur 4 octets (voir encerclé rouge dans l'image)




Miembro registrado
4.362 mensajes
Publicado el 04,junio 2020 - 17:52
GB a écrit :
Un entier n est pas égal a un entier sur 8 ou 4 octet

Par défaut un entier est un entier signé sur 4 (ou entier sur 4)

@Paul
Que renvoie TypeVar(REQ_Select_etc.IDVéhicule) ? Normalement il devrait renvoyer 8 pour une entier, s'il renvoie 9 on a un entier sur 8

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
48 mensajes
Publicado el 04,junio 2020 - 17:56
@Gemin1961

Oui effectivement, ça fonctionne en ajoutant "LOCAL" devant le paramètre dans la procédure. Merci!

...

Tout comme si je fais un Val( )... DonneCatégorieVéhicule(Val(Combo_Véhicule))

OU

que j'enlève le type de la procédure: PROCÉDURE DonneCatégorieVéhicule(IdVéhicule)


J'essai de comprendre ce que je fais de pas correct puisque ça génère des erreurs d'exécutions sans savoir pourquoi !!!
Miembro registrado
2.682 mensajes
Publicado el 04,junio 2020 - 18:02
Par défaut dans Windev, les paramètres passent par référence. Quand tu passes "Combo_Véhicule" comme paramètre, tu envoies une référence à ton objet et non à la valeur qu'il renvoie.

En utilisant local ou en appelant ta procédure de cette manière: DonneCatégorieVéhicule((Combo_Véhicule)) - on remarque les parenthèses supplémentaires- alors dans ce cas précis, on ne passe plus la référence de l'objet, mais la valeur qu'il retourne.

--
Cordialement,

Philippe SAINT-BERTIN
Miembro registrado
48 mensajes
Publicado el 04,junio 2020 - 21:39
@Philippe

Merci BEAUCOUP... c'est l'explication technique que j'attendais!

J'utilise maintenant le "double" parenthèses.

Bon DEV!
Miembro registrado
512 mensajes
Publicado el 05,junio 2020 - 15:43
Bonjour,
D'expérience, la solution des parenthèses n'est pas toujours viable, dans des situations plus ou moins alambiquées.

Pour un code robuste, je recommande d'utiliser le spécificateur LOCAL devant le nom du paramètre.

Autrement, si on veut "blinder" le code, il n'y a pas de mystère !
Il faut passer par une variable locale intermédiaire déclarée avec le type attendu pour le paramètre, lui affecter la valeur et passer cette variable en paramètre.
C'est verbeux, mais tout est sous contrôle, convient mieux au débogage, et c'est plus lisible.

nIdVéhicule est un entier = Combo_Véhicule
DonneCatégorieVéhicule(nIdVéhicule )

:-)