Fil d’Ariane du forum – Vous êtes ici :ForumForums techniques: AS/400Appel d'API AS400 en RPG pour lis …
Vous devez vous identifier pour créer des messages et des sujets.

Appel d'API AS400 en RPG pour lister les utilisateurs d'un groupe

12

Bonjour ,
Ceci est mon premier poste sur Xdocs et qui j'en suis sure ne sera pas le dernier .
je dois écrire un programme en RPG IV pour lister les utilisateurs appartenant a un groupe donné.
j'ai besoin donc de savoir a quelle API faire appel et/ou un exemple de programme pour mieux comprendre.
Mon but final étant de proposer une interface écran pour activer ou désactiver un utilisateur d'un groupe.
Merci de votre aide :rolleyes:

Dans Opérations Navigator, on doit pouvoir faire ça, non ?

Sinon, l'API QSYRAUTU devrait te convenir.

Citation de GAPIII

Dans Opérations Navigator, on doit pouvoir faire ça, non ?

Sinon, l'API QSYRAUTU devrait te convenir.

Sous Navigator je n'est pas la possibilité de desactiver provisoirement un utilisateur.

Ce qui m'a été demander de faire c'est de concevoir une interface
pour un utilisateur n'ayant pas beaucoup de droit dans le système puis à l'aide d'un écran désactivé ou activer provisoirement le profile de l'utilisateur d'un groupe précis.
Un exemple de l'utilisation de l'API si possible
merci de m'aider

Programme de Carsten Flensburg récupéré ici : CLIQUER ICI
Dans cet exemple, il récupère les membres du groupe NOVAGRPIT.
Voici la doc de l'API : CLIQUER ICI

**
** Program . . : EXA512
** Description : Retrieve authorized users (QSYRAUTU) API example
** Author . . : Carsten Flensburg
**
**
** Compile and setup instructions:
** CrtRpgMod Module( EXA512 )
** DbgView( *LIST )
**
** CrtPgm Pgm( EXA512 )
** Module( EXA512 )
** ActGrp( *NEW )
**
**
**-- Control specification: --------------------------------------------**
H Option( *SrcStmt )
**-- System information:
D PgmSts SDs Qualified
D PgmNam *Proc
**-- API error data structure:
D ERRC0100 Ds Qualified
D BytPrv 10i 0 Inz( %Size( ERRC0100 ))
D BytAvl 10i 0
D MsgId 7a
D 1a
D MsgDta 128a
**-- Global variables:
D Idx s 10i 0
D BytAlc s 10i 0
D RcvVar s 65535a Based( pRcvVar )
**-- Global constants:
D PRF_NAM_GT c '0'
D PRF_NAM_GE c '1'
**-- Retrieve API parameters:

D RtvApi Ds Qualified Inz
D GrpNam 10a
D SltCri 10a
**-- List information:
D RtnRcdFbi Ds Qualified Inz
D BytRtn 10i 0
D BytAvl 10i 0
D NbrPrf 10i 0
D EntLen 10i 0
**-- User information:
D AUTU0100 Ds Qualified Based( pAUTU0100 )
D UsrPrf 10a
D UsrGrpI 1a
D GrpMbrI 1a
**-- Retrieve authorized users:
D RtvAutUsr Pr ExtPgm( 'QSYRAUTU' )
D RcvVar 65535a Options( *VarSize )
D RcvVarLen 10i 0 Const
D RtnRcdFbi 16a
D FmtNam 8a Const
D SltCri 10a Const
D StrPrf 10a Const
D StrPrfOpt 1a Const
D GrpNam 10a Const
D Error 1024a Options( *VarSize )
D EndPrf 10a Const Options( *NoPass )

**-- Entry parameters:
D EXA512 Pr
**
D EXA512 Pi

/Free

RtvApi.SltCri = '*MEMBER';
// RtvApi.GrpNam = 'Insert Group Profile'
RtvApi.GrpNam = 'NOVAGRPIT';

BytAlc = 4096;
pRcvVar = %Alloc( BytAlc );

DoU RtnRcdFbi.BytAvl BytAlc;
BytAlc = RtnRcdFbi.BytAvl;
pRcvVar = %ReAlloc( pRcvVar: BytAlc );
EndIf;

RtvAutUsr( RcvVar
: BytAlc
: RtnRcdFbi
: 'AUTU0100'
: RtvApi.SltCri
: '*FIRST'
: PRF_NAM_GE
: RtvApi.GrpNam
: ERRC0100
);

If ERRC0100.BytAvl > *Zero;
Leave;
EndIf;
EndDo;

If ERRC0100.BytAvl = *Zero;

ExSr GetPrfInf;
EndIf;

*InLr = *On;
Return;

BegSr GetPrfInf;

pAUTU0100 = pRcvVar;

For Idx = 1 to RtnRcdFbi.NbrPrf;

// Structure AUTU0100 now contains member user profile information...

If Idx < RtnRcdFbi.NbrPrf;
pAUTU0100 += RtnRcdFbi.EntLen;
EndIf;
EndFor;

EndSr;

/End-Free
Ensuite, pour savoir si le profil est *ENABLED ou *DISABLED il suffit d'appeler l'API QSYRUSRI

pour chacun des users récupérés.
Le statut (10a) est dans le format USRI0100, zone STATUS position 37.
CLIQUER ICI

Ci-dessous le programme pour récupérer le statut de QPGMR

D GetUsrInf PR ExtPgm('QSYRUSRI')
D RcvVar 53
D RcvVarLen 9b 0
D Format 8 const
D UserPrf 10 const
D Error 1 const
D Receiver s 53 inz(' ')
D VarLength s 9b 0 inz(53)
D Msg s 40

/free

//--------------------------------------------------------
// MAIN PROGRAM
//--------------------------------------------------------

GetUsrInf(Receiver:VarLength:'USRI0200':'QPGMR':' ');
Statut = %Subst(Receiver:37:10);

Citation de k2r400

Programme de Carsten Flensburg récupéré ici : CLIQUER ICI
Dans cet exemple, il récupère les membres du groupe NOVAGRPIT.
Voici la doc de l'API : CLIQUER ICI

**
** Program . . : EXA512
** Description : Retrieve authorized users (QSYRAUTU) API example
** Author . . : Carsten Flensburg
**
**
** Compile and setup instructions:
** CrtRpgMod Module( EXA512 )
** DbgView( *LIST )
**
** CrtPgm Pgm( EXA512 )
** Module( EXA512 )
** ActGrp( *NEW )
**
**
**-- Control specification: --------------------------------------------**
H Option( *SrcStmt )
**-- System information:
D PgmSts SDs Qualified
D PgmNam *Proc
**-- API error data structure:
D ERRC0100 Ds Qualified
D BytPrv 10i 0 Inz( %Size( ERRC0100 ))
D BytAvl 10i 0
D MsgId 7a
D 1a
D MsgDta 128a
**-- Global variables:
D Idx s 10i 0
D BytAlc s 10i 0
D RcvVar s 65535a Based( pRcvVar )
**-- Global constants:
D PRF_NAM_GT c '0'
D PRF_NAM_GE c '1'
**-- Retrieve API parameters:

D RtvApi Ds Qualified Inz
D GrpNam 10a
D SltCri 10a
**-- List information:
D RtnRcdFbi Ds Qualified Inz
D BytRtn 10i 0
D BytAvl 10i 0
D NbrPrf 10i 0
D EntLen 10i 0
**-- User information:
D AUTU0100 Ds Qualified Based( pAUTU0100 )
D UsrPrf 10a
D UsrGrpI 1a
D GrpMbrI 1a
**-- Retrieve authorized users:
D RtvAutUsr Pr ExtPgm( 'QSYRAUTU' )
D RcvVar 65535a Options( *VarSize )
D RcvVarLen 10i 0 Const
D RtnRcdFbi 16a
D FmtNam 8a Const
D SltCri 10a Const
D StrPrf 10a Const
D StrPrfOpt 1a Const
D GrpNam 10a Const
D Error 1024a Options( *VarSize )
D EndPrf 10a Const Options( *NoPass )

**-- Entry parameters:
D EXA512 Pr
**
D EXA512 Pi

/Free

RtvApi.SltCri = '*MEMBER';
// RtvApi.GrpNam = 'Insert Group Profile'
RtvApi.GrpNam = 'NOVAGRPIT';

BytAlc = 4096;
pRcvVar = %Alloc( BytAlc );

DoU RtnRcdFbi.BytAvl BytAlc;
BytAlc = RtnRcdFbi.BytAvl;
pRcvVar = %ReAlloc( pRcvVar: BytAlc );
EndIf;

RtvAutUsr( RcvVar
: BytAlc
: RtnRcdFbi
: 'AUTU0100'
: RtvApi.SltCri
: '*FIRST'
: PRF_NAM_GE
: RtvApi.GrpNam
: ERRC0100
);

If ERRC0100.BytAvl > *Zero;
Leave;
EndIf;
EndDo;

If ERRC0100.BytAvl = *Zero;

ExSr GetPrfInf;
EndIf;

*InLr = *On;
Return;

BegSr GetPrfInf;

pAUTU0100 = pRcvVar;

For Idx = 1 to RtnRcdFbi.NbrPrf;

// Structure AUTU0100 now contains member user profile information...

If Idx < RtnRcdFbi.NbrPrf;
pAUTU0100 += RtnRcdFbi.EntLen;
EndIf;
EndFor;

EndSr;

/End-Free
Ensuite, pour savoir si le profil est *ENABLED ou *DISABLED il suffit d'appeler l'API QSYRUSRI

pour chacun des users récupérés.
Le statut (10a) est dans le format USRI0100, zone STATUS position 37.
CLIQUER ICI

Ci-dessous le programme pour récupérer le statut de QPGMR

D GetUsrInf PR ExtPgm('QSYRUSRI')
D RcvVar 53
D RcvVarLen 9b 0
D Format 8 const
D UserPrf 10 const
D Error 1 const
D Receiver s 53 inz(' ')
D VarLength s 9b 0 inz(53)
D Msg s 40

/free

//--------------------------------------------------------
// MAIN PROGRAM
//--------------------------------------------------------

GetUsrInf(Receiver:VarLength:'USRI0200':'QPGMR':' ');
Statut = %Subst(Receiver:37:10);

Merci de votre aide. j'essaye de le mettre en oeuvre et je tiendrai au courant
encore merci

Code : sous-fichier GESTUSR.DSPF

A DSPSIZ(24 80 *DS3)
A* MSGLOC(27)
A CA03
A CF12
A R SFL01 SFL
A 08 SFLNXTCHG
A ZCDSEL 1A B 6 4
A LOGIN 10A O 6 7
A STATUT 10A O 6 20
A LIBELLE 40A O 6 34
A R FORC1 SFLCTL(SFL01)
A SFLSIZ(0020)
A SFLPAG(0019)
A N07 ROLLUP(02)
A OVERLAY
A 04 SFLDSP
A N04 ERASE(SFL01)
A 05 SFLDSPCTL
A 06 SFLCLR
A 07 SFLEND
A WRAN01 4S 0H SFLRCDNBR
A 2 12'GESTION DES UTILISATEURS DU POINTA-
A GE SYSPER'
A COLOR(WHT)
A DSPATR(RI)
A DSPATR(BL)
A 5 2'Opt '
A DSPATR(UL)
A COLOR(WHT)
A 5 7'Utilisateur'
A DSPATR(UL)
A COLOR(WHT)
A 5 20'Etat actuel '
A DSPATR(UL)
A COLOR(WHT)
A* 5 36'Détail -
A* '
A* DSPATR(UL)
A* COLOR(WHT)
A 4 2'A=Activé D=Desactivé '
A COLOR(BLU)
A 2 61DATE
A 1 61SYSNAME
A 3 61TIME
A 1 2USER
A R FORB1
A OVERLAY
A 21 3'F3=QUITTER'
A COLOR(BLU)

Code : programme de Carsten Flensburg modifier EXA512.RPGLE


**-- Control specification: __________________________________________
H Option(*SrcStmt : *nodebugio) dftactgrp(*no) alwnull(*usrctl)
FGESTUSR CF E WORKSTN SFILE(SFL01:WRAN01)

**_____________________________________________________________________
**Declaration du Fichier ecran
**_____________________________________________________________________
**-- System information:
D PgmSts SDs Qualified
D PgmNam *Proc
**-- API error data structure:
D ERRC0100 Ds Qualified
D BytPrv 10i 0 Inz( %Size( ERRC0100 ))
D BytAvl 10i 0
D MsgId 7a
D 1a
D MsgDta 128a
**-- Global variables:
D Idx s 10i 0
D BytAlc s 10i 0
D RcvVar s 65535a Based( pRcvVar )
**-- Global constants:
D PRF_NAM_GT c '0'
D PRF_NAM_GE c '1'
**-- Retrieve API parameters:

D RtvApi Ds Qualified Inz
D GrpNam 10a
D SltCri 10a
**-- List information:
D RtnRcdFbi Ds Qualified Inz
D BytRtn 10i 0
D BytAvl 10i 0
D NbrPrf 10i 0
D EntLen 10i 0
**-- User information:
D AUTU0100 Ds Qualified Based( pAUTU0100 )
D UsrPrf 10a
D UsrGrpI 1a
D GrpMbrI 1a
**-- Retrieve authorized users:
D RtvAutUsr Pr ExtPgm( 'QSYRAUTU' )
D RcvVar 65535a Options( *VarSize )
D RcvVarLen 10i 0 Const
D RtnRcdFbi 16a
D FmtNam 8a Const
D SltCri 10a Const
D StrPrf 10a Const
D StrPrfOpt 1a Const
D GrpNam 10a Const
D Error 1024a Options( *VarSize )
D EndPrf 10a Const Options( *NoPass )

**-- Entry parameters:
D EXA512 Pr
**
D EXA512 Pi

**_____________________________________________________
**
**_____________________________________________________
D GetUsrInf PR ExtPgm('QSYRUSRI')
D RcvVar 53
D RcvVarLen 9b 0
D Format 8 const
D UserPrf 10 const
D Error 1 const

**_____________________________________________________
**Declaration de la procedure pour executer de commande
**_____________________________________________________
DQcmdExc PR EXTPGM('QCMDEXC')
D 256A Const options(*varsize)
D 15P 5 Const

**_____________________________________________________
** Declaration des variable de travail standalone
**_____________________________________________________
* ici on test sur le groupe TESTGRP a vous de le modifié
D usrgrp s 10 inz('TESTGRP') Varying
D Quote S 1 inz('''')
D format s 8 inz('USRI0100') Varying
D Cmd s 256A Varying

D Receiver s 53 inz(' ')
D VarLength s 9b 0 inz(53)
D Msg s 40
D W_FIN_PGM S N INZ(*OFF)

**Pointeur de recouvrement des indicateurs du sous fichier static
DIndPtr S * INZ(%ADDR(*IN))
D DS BASED(IndPtr)
D ROLLUP 2 2
D SFLDSP 4 4
D SFLDSPCTL 5 5
D SFLCLR 6 6
D SFLEND 7 7
D SFLNXTCHG 8 8
D FIN_SFL 70 70

**_____________________________________________________
**_______________________________DEBUT PGM

/Free
DOW NOT W_FIN_PGM ;

Eval SFLDSPCTL = *ON ;
WRITE FORC1 ;
// WRITE FORB1;

//_______________Initialisation sous fichier
EXSR INITSFIC ;
//_______________renvoi les profiles usr
EXSR RTVUSRS;

// If ERRC0100.BytAvl = *Zero;
ExSr GetPrfInf;
// EndIf;

//Touche F3=Fin Programme
If *INKC ;
Eval W_FIN_PGM = *ON ;
else;
ExSR Traitement;
ENDIF;

ENDDO ;

*InLr = *On;
Return;
//___________________________________________________________FIN PGM

//__________________________Insertion sous fichier
//________________________________________________
BegSr GetPrfInf;
//WRAN01 = 0;

pAUTU0100 = pRcvVar;
For Idx = 1 to RtnRcdFbi.NbrPrf - 1 ;
//La Structure AUTU0100 contient les infos du profile usr
If Idx < RtnRcdFbi.NbrPrf;
pAUTU0100 += RtnRcdFbi.EntLen ;
// programme pour recuperer et afficher le statut
LOGIN = AUTU0100.UsrPrf ;
GetUsrInf(Receiver:VarLength:format:LOGIN:' ');
STATUT = %Subst(Receiver:37:10);
if (STATUT = '*DISABLED');
STATUT= 'Désactivé';
else ;
STATUT= 'Activé';
ENDIF;
EndIf;

LOGIN = AUTU0100.UsrPrf;
// dsply (AUTU0100.UsrPrf + ' ' +statut );
// Insertion dans le sous fichier
Eval SFLDSP = *ON;
Eval WRAN01 += 1;
Eval ZCDSEL = *blank ;
WRITE SFL01 ;
Write FORB1;
EndFor;

Exfmt FORC1; // Affichage de l'ecran
EndSr;

BEGSR RTVUSRS;
RtvApi.SltCri = '*MEMBER';
// Renseigner votre groupe d'utilisateur
RtvApi.GrpNam = usrgrp;
BytAlc = 4096;
pRcvVar = %Alloc( BytAlc );
DoU RtnRcdFbi.BytAvl BytAlc;
BytAlc = RtnRcdFbi.BytAvl;
pRcvVar = %ReAlloc( pRcvVar: BytAlc );
EndIf;
RtvAutUsr( RcvVar
: BytAlc
: RtnRcdFbi
: 'AUTU0100'
: RtvApi.SltCri
: '*FIRST'
: PRF_NAM_GE
: RtvApi.GrpNam
: ERRC0100
);
If ERRC0100.BytAvl > *Zero;
Leave;
EndIf;
EndDo;
ENDSR;

//__________________Effacement du sous fichier
//____________________________________________
BEGSR INITSFIC;
Eval WRAN01 = 0;
Eval SFLEND = *ON;
Eval SFLCLR = *ON;
Eval SFLDSP = *OFF;
Eval SFLDSPCTL = *OFF;
WRITE FORC1;
Eval SFLDSPCTL = *ON;
Eval SFLCLR = *OFF;
ENDSR;
//__________________Traitement apres selection
//____________________________________________
BEGSR Traitement ;
READC SFL01;
Dow not (%eof());
IF ZCDSEL *BLANK ;
Select;
When %trim(ZCDSEL) = 'A'; // Activer
// programme pour desactiver un profil utilisateur
Cmd = 'CHGUSRPRF USRPRF('+ LOGIN +') STATUS(*ENABLED)';
QcmdExc(cmd:%len(cmd));
When %trim(ZCDSEL) = 'D'; // Desactiver
Cmd = 'CHGUSRPRF USRPRF('+ LOGIN +') STATUS(*DISABLED)';
QcmdExc(cmd:%len(cmd));
Other;
Endsl;
ENDIF;

ZCDSEL = *BLANK; // On efface la zone d'option A ou D
Update SFL01; // On met a jour le sous fichier
ReadC SFL01; // On lit l'enregistrement suivant
Enddo;
ENDSR ;
/End-Free

Merci a tous ceux qui m’ont permis de mettre en place ce programme
Ceux qui sont intéressés peuvent le modifier

Je viens de détecter une anomalie dans le programme
le premier utilisateur du groupe est ignoré
et j'ai du mal a cerné le problème

CLIQUER ICI

aide sur l'API commande

Citation de gayeous

Je viens de détecter une anomalie dans le programme
le premier utilisateur du groupe est ignoré
et j'ai du mal a cerné le problème

CLIQUER ICI

aide sur l'API commande

J'ai résolu le problème en créant un utilisateur bidon avec un profile commençant par AAAA

tous les moyens sont bon pour arriver a ses fins

Merci a tous

Citation de gayeous

Je viens de détecter une anomalie dans le programme
le premier utilisateur du groupe est ignoré
et j'ai du mal a cerné le problème
...
tous les moyens sont bon pour arriver a ses fins

Merci a tous

le problème est là:
pAUTU0100 = pRcvVar;
For Idx = 1 to RtnRcdFbi.NbrPrf - 1 ;
//La Structure AUTU0100 contient les infos du profile usr
If Idx < RtnRcdFbi.NbrPrf;
pAUTU0100 += RtnRcdFbi.EntLen ;

D'abord tu initialises pAUTU0100 sur le premier utilisateur, puis tu le déplaces immédiatement au début dans ta boucle plutôt qu'a la fin.
Du coup le premier utilisateur passe à la trappe, et avec le If Idx < RtnRcdFbi.NbrPrf; tu dois avoir deux fois le dernier, non ?

vazymimil à trouvé.

La ligne pAUTU0100 += RtnRcdFbi.EntLen ;
doit passer juste avant le EndFor.

De plus :

La boucle for est fausse : For Idx = 1 to RtnRcdFbi.NbrPrf ;
pour avoir tous les utilisateurs.

La condition If Idx < RtnRcdFbi.NbrPrf;
est fausse et ne sert à rien, à supprimer.

12