Page 1 sur 1

SQL erreur -802 en rpgle

Posté : lun. 19 sept. 2016, 08:57:59
par BrigitteG
Bonjour,

J'ai un petit soucis avec du code sql dans un source rpgle.

La zone contenue dans Wrubriq est définie en ALWNULL et peut-être une zone numérique ou une date.

Code : Tout sélectionner

DCL-S wNb         zoned(9:0);
Exec Sql
            select nunati, count(distinct :wRubriq) into :wNb
             from cinvrep
               where :wRubriq is not null
               group by nunati
               order by :wnb desc
              fetch first row only ;
            if sqlCod = 0;
             àNb = wNb;
            endif;
J'ai un code SQLCOD = -000000802.

Message . . . . : Erreur de conversion ou de mappage des données.
Cause . . . . . : Une erreur de type 1 s'est produite : Les types d'erreur et
leur signification sont les suivants :
1 - Dépassement de capacité arithmétique.

Quand je passe par strsql

Code : Tout sélectionner

select nunati, count(distinct IVIF) as wNb
             from cinvrep               
               where IVIF is not null     
               group by nunati            
               order by wnb desc          
              fetch first row only        

Code : Tout sélectionner

NUNATI                  WNB
7038215129                9
La requête marche.

N'étant pas une spécialiste du sql, je ne vois pas ce qui cloche.

Je vous en remercie d'avance pour votre aide.

SQL Dynamique

Posté : lun. 19 sept. 2016, 09:38:29
par cmasse
Bonjour,

un nom de zone ou de colonne, ne peux pas être mis en tant que variable.

faites du SQL Dynamique, c.a.d concaténez l'ordre SQL dans une variable, puis :

PREPARE

DECLARE xx CURSOR FOR

FETCH xx

Utilisation du Prepare Declare ...

Posté : lun. 19 sept. 2016, 15:16:25
par BrigitteG
Merci

voici mon code

Code : Tout sélectionner

àSql = 'Select count(distinct ' + %trim(wRubriq)
             + ') as wNb, Nunati  from cinvrep where '
             + %trim(wRubriq)
             + ' is not null group by nunati'
             + ' order by wNb desc'
             + ' fetch first row only' ;
             Exec Sql Prepare P2 from :àSql;
             Exec Sql Declare C2 Cursor for P2;
             EXEC SqL OPEN C2;
             EXEC SqL FETCH C2 INTO :wNb;
             EXEC SqL CLOSE C2;
             if sqlCod = 0;
              àNb = wNb;
             endif;
Je récupère bien le nb d'enreg maxi en fonction de mon numéro