Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > Informix
Informix Forum d'entraide Informix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/07/2011, 15h07   #1
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Par défaut Requête UPDATE Informix

Bonjour à tous,

Je débute en SQL et j' "administre" une base de donnée sous Informix pour un logiciel de GPAO. Je cherche à mettre à jour un champ en fonction de certains critères. Je vous dresse le tableau :

une table INCOST avec un champ clé INCOST.PART et un champ INCOST.INPQTY à mettre à jour
une table SFROUT avec un champ clé SFROUT.PART et des champs à tester

Voilà la requête que j'ai pondu:
Code :
1
2
3
4
UPDATE INCOST
SET INPQTY=(SELECT MAX(SFROUT.RTESSET/SFROUT.RTECSET)
 FROM SFROUT WHERE SFROUT.PART=INCOST.PART AND SFROUT.RTECSET<>0 AND SFROUT.RTEOPFG='N')
WHERE INCOST.INPQTY=1;
Elle marche presque mais j’obtiens une erreur car le champ INQPTY ne peut pas être NULL or selon les cas, le SELECT ne trouve pas toujours un résultat.
Comment gérer le NULL (je voudrais : si NULL, SET INQPTY=1)
J'ai essayé des CASE, des IF, des IFNULL, je m'en sort pas Pourtant ça doit pas être compliqué...

Help. Merci.
Paillard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 15h36   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Non, ce n'est pas compliqué, il suffit de connaitre la fonction NVL...

NVL(expression, defaut) retourne defaut si expression est NULL, expression sinon.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 10h41   #3
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Bonjour al1_24 et merci pour votre réponse,

Malheureusement, la fonction NVL ne semble pas reconnue par mon système. J'ai épuré ma requète jusqu'à :

Code :
1
2
3
UPDATE INCOST
SET INPQTY=NVL(1/0,1)
WHERE INCOST.PART='3075501  ';
Et j'obtient :
674 : Procedure (nvl) not found.
111 : ISAM error : no record found

C'est peut-être un pb de version de Informix? Y a-t-il un moyen de la trouver?
De plus, je craint qu'une fonction type NVL() ne fonctionne pas avec une requete (SELECT..FROM..WHERE) en tant qu'expression.
Je me demande si je ne suis pas dans une impasse avec cette structure...

Pas si simple en fait
Paillard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 12h03   #4
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
L'expression 1/0 ne retourne pas NULL !!!
Mais une erreur de calcul
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 15h13   #5
Invité de passage
 
Homme
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Ah d'accord, dans d'autres langages proches (mySql par ex) IFNULL(1/0,10) renvoie 10, je pensais que c'était pareil mais bon, peu importe... Le code erreur indique que c'est la fonction qui n'est pas reconnue. D'ailleurs, si je fait:
Code :
1
2
3
UPDATE INCOST
SET INPQTY=NVL(1,10)
WHERE INCOST.PART='3075501  ';
j'obtient la même erreur. C'est donc bien le nvl() qui n'est pas reconnue -> 674 : Procedure (nvl) not found

Pourquoi mon Informix ne reconnait pas nvl()???

Edit : Ma version est : Informix-ESQL 7.23 TC1
Paillard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 16h25   #6
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 23
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 23
Points : 29
Points : 29
Bonjour,

Informix-SQL est une partie cliente.
Si la version mentionnée est celle du moteur: 7.23.TC1, il y a des chances que cette fonction ne soit pas supportée. Cette version est ancienne et plus supportée depuis de très nombreuses années.

Hope this help.
nelem75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 11h16   #7
Membre régulier
 
Homme Eric Vercelletto
Achitecte Informix SGBD et applications
Inscription : octobre 2010
Messages : 63
Détails du profil
Informations personnelles :
Nom : Homme Eric Vercelletto
Âge : 51
Localisation : France, Finistère (Bretagne)

Informations professionnelles :
Activité : Achitecte Informix SGBD et applications
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 63
Points : 95
Points : 95
Bonjour

pour avoir la version de ton serveur, possibilités:
1) tu te logues sur le serveur comme utilisateur informix, et tu tapes
onstat -p
si tu obtiens quelque chose , cela veut dire que du es en Informix Dynamic Server. dans ce cas la première ligne indique ta version de serveur.
si tu n'as rien, c'est :
soit la variable d'environnement INFORMIXDIR, INFORMIXSERVER et PATH ne sont pas correctement valorisées, soit ton moteur est Informix SE.

Si tu es en SE, NVL n'existe pas et n'existera probablement pas. IBM maintient le produit et le vend toujours, mais ne fait que du bug fixing. Et à vrai dire pas trop d'intérêt car aujourd'hui tu peux avoir Informix Dynamic Server Innovator C Edition pour zéro Euros, et tu auras un moteur autrement plus puissant et actuel.

Pour info NVL et decode ont été introduits dans IDS 7.30 ( en 1998 ).
Ceci dit, tu peux aussi te faire ta propre procédure stockée "my_nvl", qui aura le même effet. Un truc du style:
paramètres entrants: la valeur en question, la valeur à mettre si NULL
paramètre sortant: la valeur corrigée,
si la valeur récupérée est null, tu renvoies une autre valeur, sinon la même.
La syntaxe au niveau du sql appelant sera strictement la même. Attention par contre au nom de la procédure, car le jour où tu migreras vers une version actuelle et supportée, ce que je te conseille, tu auras un doublon sur cette fonction et il faudra la supprimer.

Il serait peut-être temps de te reactualiser au niveau version. Je comprends qu'on ne change pas une équipe qui gagne en production, mais il est bon aussi d'avoir une version "moderne" où tu sois sûr qu'elle est maintenue.

A ta dispo si tu veux en savoir plus
Bon courage
Eric
begooden-it est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h21.


 
 
 
 
Partenaires

Hébergement Web