IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AS/400 Discussion :

Affecter une valeur nulle à une zone en RPG


Sujet :

AS/400

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 726
    Par défaut Affecter une valeur nulle à une zone en RPG
    Bonjour,

    Voilà un cas que je n'ai encore jamais rencontré et qui me cause du souci.
    J'ai une zone integer (9b 0) dans un fichier, qui accepte les valeurs nulles (et pour cause, il correspond à un ID enreg dans une table parente éventuelle).
    En SQL j'ai pas de soucis. En PHP non plus.
    Mais j'ai besoin de faire un update en RPGLE, et malgré le Alwnull(*UsrCtl), je n'arrive pas à affecter la valeur NULL à ce champ. Il se retrouve toujours à 0 (la valeur par défaut d'un integer).
    Je pense que je m'y prend mal. Je sais tester si une zone est NULL (= *null), si elle accepte les NULL (%nullind), mais je ne trouve pas comment affecter la valeur NULL à mon champ.
    Une idée ?

  2. #2
    Membre Expert
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Par défaut
    Bonjour.

    Comme tu le sais, je ne m'y connais pas trop en RPG. Apparemment il suffirait de mettre à *OFF %indnull(variable) en gardant bien les options que t'avais déjà mises. Regarde ces deux liens :
    https://stackoverflow.com/questions/...in-db2-and-rpg
    http://www.rpgpgm.com/2016/03/handling-null-in-rpg.html

  3. #3
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    .Je ne sais pas si ça peut aider. J'ai eu un problème de ce genre à la fin des années 90. Nous avions une base de données DB2/400 avec des fichiers ayant des champs acceptant la valeur null. S'il était possible de lire les données avec les ordres RPG il était impossible de créer ou de modifier des enregistrements.
    La solution avait été d'utiliser du SQL pour toutes les lectures écritures. Mais comme c'était il y a longtemps ça a pu changer.

    Dans mon souvenir, il fallait déclarer une variable binaire et l'associer au champ dans la requête SQL.
    Exemple : update monfichier set mon_champ = :ma_valeur :mon_indicateur

    20 ans plus tard je ne me souviens plus de tous les détails mais selon la valeur affectée à l'indicateur (0 ou 1 ... je ne sais plus) le champ prenait soit ma_valeur soit null.

    Même chose pour les lectures : Select champ into :ma_valeur :mon_indicateur ou les curseurs. Ensuite pour savoir si le champ était null je testais la valeur de l'indicateur.

  4. #4
    Membre émérite
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Octobre 2006
    Messages
    726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2006
    Messages : 726
    Par défaut
    Merci.

    Le BIF %nullind ne fait que changer l'autorisation qu'à la zone à accepter la valeur null. Mais pour affecter NULL à la zone j'ai toujours pas trouvé.

    En SQL je n'ai aucun souci, d'ailleurs la mise à jour de l'enregistrement ne pose pas de problème.

    En fait, le souci est que je dois transmettre à la procédure qui est chargée de la mise à jour, l'enregistrement complet (redéfinie en DS externe)
    Et donc le NULL doit déjà être dans la DS.

    En attendant, j'ai trouvé un moyen de contourner le problème.
    J'ai modifié la procédure qui fait la mise à jour. Comme il n'y a pas d'enregistrement 0 (par définition), si dans le champ transmis j'ai 0, je met NULL dans mon Update ou Insert (via un case).

  5. #5
    Membre expérimenté
    Homme Profil pro
    Architecte technique & logiciel IBM i
    Inscrit en
    Septembre 2010
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique & logiciel IBM i
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2010
    Messages : 179
    Par défaut
    A priori, il me semble qu'en RPG, on ne sait pas manipuler réellement les valeurs nulles, et encore moins les affecter. Les indicateurs servent à indiquer si le champ est nul, mais on ne peut pas affecter une valeur nulle à un champ. Par exemple, quand on faisait des web services à partir de RPG, il y avait systématiquement un booléen accolé à chaque champ pour indiquer s'il devait être à nul.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 31
    Par défaut
    Bonjour,

    La PTF SI60418 apporte des évolutions dans la gestion des valeurs nulles.

    Il est maintenant possible de déclarer des variables admettant des valeurs nulles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    **free
    ctl-opt alwnull(*usrctl) ;
    
    dcl-s noemp char(6) nullind ;
    
    // mettre à null :
    %nullind( noemp ) = *on ;
    
    // Valoriser
    %nullind( noemp ) = *off ;
    noemp = '000012' ;
    
    // tester la valeur
    if not %nullind(noemp) and noemp <> '00010' ;
       dsply ( 'n° employé : ' + noemp ) ;
    endif ;
    Egalement pour les sous-zones de DS internes.

    Nathanaël

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 123
    Par défaut
    Citation Envoyé par m4k-Hurrican Voir le message
    Bonjour,

    Voilà un cas que je n'ai encore jamais rencontré et qui me cause du souci.
    J'ai une zone integer (9b 0) dans un fichier, qui accepte les valeurs nulles (et pour cause, il correspond à un ID enreg dans une table parente éventuelle).
    En SQL j'ai pas de soucis. En PHP non plus.
    Mais j'ai besoin de faire un update en RPGLE, et malgré le Alwnull(*UsrCtl), je n'arrive pas à affecter la valeur NULL à ce champ. Il se retrouve toujours à 0 (la valeur par défaut d'un integer).
    Je pense que je m'y prend mal. Je sais tester si une zone est NULL (= *null), si elle accepte les NULL (%nullind), mais je ne trouve pas comment affecter la valeur NULL à mon champ.
    Une idée ?


    Bonjour,

    Je crois qu'il y a une confusion qui provient d'un abus de langage courant avec "valeur null".
    NULL n'est pas une valeur, c'est un indicateur (un "marqueur" en SQL).
    Je préfère d'ailleurs la traduction en "valeur indéterminée".
    Une colonne/variable supportant la valeur indeterminée se voit ajouter un indicateur qui informe sur la validité ou non de son contenu.
    Si l'indicateur de valeur nulle (%NULLIND() en RPG, IS NULL en SQL) permet de savoir si la valeur est utilisable ou non.
    si l'indicateur de valeur nulle est vrai, peu importe le contenu de la variable : il n'a pas de signification fonctionnelle.
    example :
    dans une table des employées on va avoir une date de départ de l'employée (licenciement, démission, retraite ...).
    Si l'employé a un CDI, cette date est au départ indeterminée. C'est là que l'indicateur de valeur nulle est important : le contenu de la date n'a pas de signification si l'indicateur est positionné.
    L'orsque l'employé quittera l'entreprise, on changera la date de départ et on positionnera l'indicateur de valeur null à faux (%nullind(datedepart) = *off)

    En RPG, *NULL n'existe que pour les pointeurs (et les objets JAVA). Pour les autres types de données on ne peut ni affecter ni tester *NULL.

    Citation Envoyé par m4k-Hurrican Voir le message
    Merci.

    Le BIF %nullind ne fait que changer l'autorisation qu'à la zone à accepter la valeur null. Mais pour affecter NULL à la zone j'ai toujours pas trouvé.
    Ceci est erroné (AMHA) : %NULLIND() change l'état de l'indicateur de valeur nulle. Tu ne peux pas affecter *NULL à autre chose qu'un pointeur.

    En résumé, pour une zone supportant les "valeurs nulles" il faut toujours tester l'état de l'indicateur de valeur null associé par %nullind() afin de savoir si le contenu est utilisable ou non.

    Bonnes vacances !

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Réponses: 3
    Dernier message: 10/06/2009, 22h03
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Réponses: 5
    Dernier message: 13/12/2006, 13h34
  5. Affecter la valeur NULL à une cellule d'une table
    Par jacma dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 06/05/2005, 14h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo