PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Conversion Numerique vers Entier dans les paramètres de requete
Conversion Numerique vers Entier dans les paramètres de requete
Débuté par Cousin, 20 nov. 2006 15:27 - 3 réponses
Posté le 20 novembre 2006 - 15:27
Bonjour,

J'ai des soucis avec le type Numérique.

Je ne vois pas où est le problème dans le code suivant :

id est un numérique= 5
REQ_Requête1.Param1=id

A l'execution le contenu de REQ_Requête1.Param1 se révéle égal à "<null>", alors qu'il devrait contenir la valeur "5"

Le code SQL de la requête est le suivant :
SELECT
Test.num AS num
FROM
Test
WHERE
Test.num = {Param1}

où "num" est une rubrique de type "Numérique sur 4 octet" dans le fichier Hyperfile "Test".


En revanche le code suivant fonctionne :

id est un entier= 5
REQ_Requête1.Param1=id


=> la seule différence est le type de la variable "id", ca fonctionne si on met entier mais pas si on met numérique.

Conclusion : Où est l'erreur? Comment faut-il raisonner pour éviter de la reproduire?

Merci d'avance.

NB : Je travaille sous Windev 10 60t
Posté le 20 novembre 2006 - 15:58
regarde dans l'aide, le type numérique :

Extrait :

Affectation d'un numérique

Lors de l'affectation d'un numérique par une valeur (valeur directement saisie, fournie par une fonction, …), cette valeur est automatiquement convertie en réel par le compilateur.

Par exemple :

n est un numérique (5,4)
n = 55555.3330

Après cette affectation, n vaut 55555.3329

Pour forcer l'affectation d'un numérique, utilisez 0n devant la valeur. Par exemple :

n est un numérique (5,4)
n = 0n55555.3330

Ceci explique peut-être ton problème.

Hubert
Posté le 20 novembre 2006 - 16:14
Numérique est un type de variable un peu particulier (comme Variant).

Je te conseille plutôt de déclarer id comme un entier ou un entier sans signe sur 4 octets.

"id est un numérique", déclare en fait un réel ou entier décimal avec 32 chiffres pour la partie entière et 6 chiffres pour la partie décimale.

C'est possible que ça soit la raison pour laquelle ta requête ne fonctionne pas car le type de ta variable et celui de ta rubrique ne sont pas identiques.

Hemmya.
Posté le 21 novembre 2006 - 11:15
Oui merci, effectivement il doit s'agir d'un problème de typage et de représentation interne des valeurs numériques.
Et la solution je l'ai, effectivement en déclarant ma variable comme "entier" la requête fonctionne.

Le problème c'est que :
1) je ne sais pas exactement d'ou provient le problème
2) plus grave, je ne sais pas comment éviter ce type d'erreur.


Pour le problème 1 :
Je supposais qu'en utilisant le pseudo-type "numérique" Windev faisait des conversions implicites. Dans le cas présent :

a) J'affecte une valeur à une variable de type "numérique", le compilateur crée une variable de type Reel, ok
b) j'affecte le contenu de cette variable à un paramètre de requête (non typé explicitement?), on conserve la valeur Reelle.
c) je compare ce paramètre avec une rubrique de fichier de type "numérique de format "±999 999 999", c'est à dire un entier signé sur 4 octets ; là logiquement le moteur hyperfile devrait faire une conversion implicite en transformant l'entier en réel avant de faire la comparaison.
=> ca ne marche pas dès l'étape b!! Et c'est là que je suis perdu, je ne sais pas comment est défini le type des paramètres de requêtes. Ici Windev me remplace ma valeur réelle "4" par "<null>, pourquoi?





Pour le 2 :
J'aimerais bien utiliser une règle infaillible, par exemple "ne jamais utiliser le type numérique dans les paramètres de requêtes". Est ce que cela conviendra?
Est ce qu'il y a une autre manière de procéder?
Avez vous déjà observé le même genre de soucis avec d'autres types (dates, chaines de caractères) ?



NB: Hubert, ca ne sert à rien de mettre "0n devant la valeur", le fonctionnement est le même.