Recherche sur le blog

lundi 18 juillet 2011

[SQL] Conversion chaînes et numériques AS400

Ce matin, je me suis battu pour convertir un numérique en chaîne de caractères afin de le comparer à, vous devinez, une chaine. Il faut savoir que lorsque l'on exécute la requête SQL via l'émulation 5250 (commande "strsql"), les conversions se font automatiquement, du moins pour la comparaison que j'effectuais. Bien sûr, ce n'est pas le cas lorsque l'on passe par le module Easycom for WinDev, puisqu'il faut bien entendu mapper les données : elles doivent donc être d'un format équivalent pour que la comparaison puisse se faire. Mais voyons ensemble ce que j'avais tenté en premier lieu...

Ma première requête allait récupérer une partie d'un champ qui contenait en fait un nombre précédé de zéros, sur 3 caractères. Ce nombre se trouvait en septième position, il fallait donc récupérer 3 caractères à cette position. J'ai ensuite voulu le comparer à un numérique de 2 octets (supportant jusqu'à 3 chiffres, sans virgule). Ma condition donnait ceci :

...AND SUBSTR(Poinvente, 7, 3) = NADRWO...

Ma requête ne renvoyait aucun résultat lors du test via WinDev, et déclenchait une erreur à la lecture lors de l'exécution du programme et du remplissage du tableau (via la fonction WinDev "TableAffiche ()". En me rendant dans "WRKACTJOB" sur ma session 5250, option "Gérer" sur le job correspondant, j'ai pu afficher l'historique de tous les messages. En faisant F10, tout le log s'affiche et on peut alors y apercevoir un problème de conversion (F1 sur une ligne de log donne plus de détails). Il faut alors trouver comment convertir soit la chaîne, soit le numérique. La solution a été de reconvertir le numérique. Pour ce faire, j'ai utilisé la méthode DIGITS sur le champ "NADRWO".

IBM donne l'information suivante quant à l'utilisation de la fonction :

The DIGITS function returns a character string representation of the absolute value of a number.
|The argument must be an expression that returns the |value of one of the following built-in numeric data types: SMALLINT, |INTEGER, or DECIMAL.
If the argument can be null, the result can be null; if the argument is null, the result is the null value.
The result of the function is a fixed-length character string representing the absolute value of the argument without regard to its scale. The result does not include a sign or a decimal point. Instead, it consists exclusively of digits, including, if necessary, leading zeros to fill out the string. The length of the string is:
  • 5 if the argument is a small integer
  • 10 if the argument is a large integer
  • p if the argument is a decimal number with a precision of p. 
La fonction transforme un numérique en chaine de caractère en y ajoutant le nombre de zéros nécessaires. Il faut souligner la dernière phrase qui indique que la longueur de la chaîne sera de "p" si le nombre est un décimal avec une précision de "p". Ici, le numérique défini dans la base de données est d'une précision de 3 nombres dont 0 pour la partie après la virgule. Ainsi, si on utilise "DIGITS ()" quand "NADRWO" = 3, on obtiendra "003". Notre conversion peut donc se faire sans problème et  la requête s'exécute.
    
Bon développement à tous !