prb valeur nulle dans cles lors d'accès sur LF ?

RPG (3 et 4, free), CL, SQL, etc...
Répondre
germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

prb valeur nulle dans cles lors d'accès sur LF ?

Message par germor »

Bonjour,
en V5R4MO.
J'essaye en vain de lire un LF alors que les clés complètes et partielles sont bien renseignées.

le WRKOBJ du fichier donne
IBANTIEI02 *FILE BIBLIOTHEQ LF Index Table

le STRPDM, Gestion des membres affiche :
IBANTIEI02 INDEX Index Table

le LF est fait comme ceci :
create unique index IBANTIEI02 on IBANTIE (A6IDCPTTIE asc, A6IDCPTIND asc, A6COSENSUT asc, A6DATDEBVA asc);

Code : Tout sélectionner

32 FIbanTieI02UF   E           K Disk    rename(IbanTie:FIbanTi
33 F                                     prefix(I02:2)         
34 F                                     commit                
...
861 C     K_IbanTieI02  KList                             
862 C                   Kfld                    A6IdCptTie
863 C                   Kfld                    A6IdCptInd
864 C                   Kfld                    A6CoSensUt
865 C                   Kfld                    A6DatDebVa
867 C     K_IbanTie_E   KList                             
868 C                   Kfld                    A6IdCptTie
869 C                   Kfld                    A6IdCptInd
870 C                   Kfld                    A6CoSensUt
 
894 C     K_IbanTieI02  setGT     IbanTieI02   
895 C     K_IbanTie_E   readE(n)  IbanTieI02   
896 C                   if        not %eof   
...
903 C                   endIf  
...
puis
911 C     K_IbanTieI02  setLL     IbanTieI02
912 C     K_IbanTie_E   readPE    IbanTieI02
913 C                   if        not %eof  
...
962 C                   endIf
le programme ne passe jamais dans le if not%eof du readPE alors qu'il le devrait.

le STRSQL du PF à l'identique du LF affiche :
> select a6idcpttie, a6idcptind, a6cosensut, a6datdebva from ibantie
order by a6idcpttie, a6idcptind, a6cosensut, a6datdebva

....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....
IdCompteTier IdCompteIndi sens DateDdébutVal
...
4.066 - V 01/07/11
- 379 P 20/12/02
- 418 P 03/01/03
...
L'order by semble ne pas fonctionner : la ligne 4.066 - V 01/07/11 devrait arriver avant la ligne - 379 P 20/12/02 car le tiret "-" semble représenter 000000000F.

C'est pourquoi j'essaye d'afficher dynamiquement le LF.
Quelqu'un aurait-il une piste ?
:)
Modifié en dernier par germor le mar. 11 oct. 2011, 13:16:43, modifié 1 fois.

cmasse
Site Admin
Messages : 791
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

prb sur LF et val. nulle

Message par cmasse »

Bonjour,

j'ai cru voir sur le résultat du SELECT SQL, qu'il y avait valeur nulle pour la première zone clé ?

si c'est le cas, les valeurs significatives sont considérées par SQL comme inférieures à la valeur nulle, donc l'ORDER BY est bien respecté.

et cela expliquerait aussi l'accès par SETLL et READPE.


EN effet, quand il y a val. nulle possible il faut associer un indicateur à la KLIST

Code : Tout sélectionner

861 C     K_IbanTieI02  KList                             
862 C                   Kfld    *in60           A6IdCptTie
863 C                   Kfld                    A6IdCptInd
864 C                   Kfld                    A6CoSensUt
865 C                   Kfld                    A6DatDebVa
867 C     K_IbanTie_E   KList                             
868 C                   Kfld     *in60          A6IdCptTie
869 C                   Kfld                    A6IdCptInd
870 C                   Kfld                    A6CoSensUt 
si l'indicateur est OFF on cherche avec la valeur de la zone (A6idcpttie dans l'exemple), si l'indicateur est ON on cherche avec valeur nulle dans cette colonne.

je pense que c'est la raison du non fonctionnement du code.
Christian Massé (Volubis.fr)

germor
Messages : 75
Enregistré le : lun. 06 juin 2011, 08:01:43

prb sur LF et val. nulle

Message par germor »

Merci,

Ça fonctionne comme désiré avec :

Code : Tout sélectionner

     C                   If        %nullind(A6idcpttie)  = *on                  
     C                   Eval      *in60 = *on
     C                   endIf                                                       
Au début j'avais ajouté :
C Eval A6idcpttie = *loval
dans le if , mais ça n'apporte rien.

J'ai aussi fait pareil sur la deuxième colonne de la clé avec des valeurs nulles possibles.
:)

Répondre