Sur un AS/400, la gestion des blocages d'enregistrement diffère de celle de WinDev : il n'est possible de bloquer qu'un seul enregistrement par fichier ouvert et par utilisateur. Par contre, il existe une gestion de file d'attente de blocages pour chaque enregistrement.
Il existe une seconde différence : à chaque tentative de blocage infructueuse (tentative de verrouillage d'un enregistrement déjà verrouillé), l'AS/400 va attendre un certain temps la libération de l'enregistrement. Le compte rendu n'est donné qu'à la fin de ce délai.
Cette attente, par défaut 60 secondes, correspond au paramètre "WAITRCD" de chaque fichier, physique et logique, utilisé par WinDev. Pour voir la valeur de ce paramètre, utilisez la commande DSPFD.
Le temps de réponse en verrouillage d'un enregistrement déjà verrouillé dépend donc de deux paramètres :
• WAITRCD propriété du fichier AS400,
• H.NbEssais, propriété WinDev.
Vous pouvez modifier ce délai sur l'AS/400 au niveau du fichier physique, par la commande CHGPF :
CHGPF FILE(LIB/FICHIER) WAITRCD(10) |
pour attendre 11 secondes |
CHGPF FILE(LIB/FICHIER) WAITRCD(*IMMED) |
pas d'attente, réponse immédiate |
Le constructeur de DDS propose par défaut de compiler les fichiers avec l'option WAITRCD(*IMMED).
HModifie doit verrouiller l'enregistrement
Pour faire une série de modifications, il est donc vivement recommandé d’ouvrir tout de suite le fichier en écriture.
Dans le cas contraire le HModifie va devoir relire l'enregistrement pour comparer les valeurs avec le cache. En cas de données modifiées (entre la première lecture et la vérification) :
Sous WinDev : une fenêtre affiche les données d'origine et les nouvelles en demandant la confirmation de la modification.
Sous WebDev où il n'est pas possible d'afficher ce type de fenêtre, la modification risque de provoquer une erreur. Il faut donc utiliser une gestion d'erreur (HSurErreur) ou l'option DRVOPTIMISTIC des infos étendues de la connexion.
Le code conseillé pour une série de modifications est donc :
TANTQUE PAS condition
HLitSuivant(Fichier, hBlocageEcriture)
// affecter valeurs...
HModifie(Fichier)
FIN
Exemple :
Countline est un entier
HOuvreConnexion(MaConnexion)
HLitPremier(Sp_cust,Cust_id)
TANTQUE PAS HEnDehors(Sp_cust)
Countline++
Sp_cust.Firstname = Countline
HSurErreur(Sp_cust,hErrTout,proc_erreur)
HModifie(Sp_cust)
HLitSuivant(Sp_cust,Cust_id)
FIN
//Procédure globale
PROCEDURE proc_erreur()
SELON HErreurEtatModification(Sp_cust,hEnrFichier)
CAS hEtatActif
//Forcer la modification
RENVOYER opRéessayer
CAS hEtatSup
//On ajoute l'enregistrement et on annule la modification
RENVOYER opAnnuler
AUTRE CAS
//On annule
RENVOYER opAnnuler
FIN