Bonjour
Le message d'erreur dans mon historique de travail est :
Code : Tout sélectionner
ID message . . . . . . : CPF502E
Date d'envoi . . . . . : 11/06/13 Heure d'envoi . . . . : 09:48:24
Message . . . . : Les contraintes référentielles n'ont pas pu être validées
pour le membre TABLEI01.
Cause . . . . . : L'opération en cours sur le membre TABLEI01, fichier
TABLEI01, bibliothèque BIBLITEST a échoué. La contrainte TABLE2_TABLE
pour le fichier dépendant TABLE dans la bibliothèque BIBLITEST et pour le
fichier parent TABLE2 dans la bibliothèque BIBLITEST n'a pas pu être
validée. Le numéro d'enregistrement 375855 dans le membre TABLE2, fichier
TABLE2, bibliothèque BIBLITEST, a été verrouillé par le travail
904515/QUSER/QZDASOINIT. Si le numéro d'enregistrement est 0, le fichier
TABLE2 de la bibliothèque BIBLITEST est verrouillé par le travail
904515/QUSER/QZDASOINIT. Le nom du travail n'est pas disponible s'il a la
valeur *N.
Que faire . . . : Renouvelez votre demande lorsque l'enregistrement ou le
fichier n'est plus verrouillé.
La contrainte de TABLE vers TABLE2 est :
Code : Tout sélectionner
alter table TABLE
foreign key TABLE2_TABLE (CHAMP_2)
references TABLE2 (CHAMP_1) on delete restrict
on update no action;
l'index TABLEI01 n'est pas "unique index".
En debut du programme PROGR1, je recherche l'enregistrement parent dans TABLE2 par un appel à un programme de service PROGR3 qui contient entre autres :
Code : Tout sélectionner
FTABLE2I01IF E K Disk Rename(TABLE2:TABLE201F)
...
C KTABLE2 Chain TABLE2I01F
En début de mon programme de service PROGR1 :
Si l'enregistrement parent est trouvé je prépare puis je fais le write de TABLE, qui me pose prb.
Si l'enregistrement parent n'est pas trouvé, l'enregistrement parent dans TABLE2 est créé,
par un CallP à un autre programme de service PROGR2.
Dans PROGR2 le fichier TABLE2 est déclaré, ouvert, écrit et fermé :
Code : Tout sélectionner
FTABLE2 O E Disk Rename(TABLE2:TABLE2F) Commit
F UsrOpn
...
C If Not %Open(TABLE2) >1
C Open TABLE2
C EndIf <1
...
C Write TABLE2F
...
C If %Open(TABLE2) >1
C Close TABLE2
C EndIf <1
puis j'appelle à nouveau PROGR3 pour rechercher l'enregistrement parent dans TABLE2 :
Code : Tout sélectionner
FTABLE2I01IF E K Disk Rename(TABLE2:TABLE201F)
...
C KTABLE2 Chain TABLE2I01F
juste avant le write dans PROGR1:
Code : Tout sélectionner
...
C Write TABLEF1 50
* clé en double
C 50 Eval P_Retour = '02'
...
Au debogueur dans PROGR1, l'enregistrement CHAMP_2 est préparé pour écrire dans TABLE avec dans CHAMP_2 la même valeur que dans son parent de TABLE2.
Dans STRSQL, l'enregistrement numéro 375855 de TABLE2 est bien créé avec dans CHAMP_1 la même valeur que dans son enfant de TABLE.
J'ai aussi cette erreur
Code : Tout sélectionner
ID message . . . . . . : CPF4028
Date d'envoi . . . . . : 11/06/13 Heure d'envoi . . . . : 13:34:40
Message . . . . : Ouverture du membre TABLE2 changée en SEQONLY(*NO).
Cause . . . . . : Le membre TABLE2, TABLE2, BIBLITEST a été ouvert avec
SEQONLY(*YES) dans le pgm ou dans la commande OVRDBF. Or, ce paramètre a été
remplacé par SEQONLY(*NO) en raison de l'erreur 1.
1 - Le programme a ouvert le membre TABLE2 en écriture seule.
SEQONLY(*YES) était défini avec le nombre d'enreg par défaut. Ce paramètre a
été remplacé par SEQONLY(*NO) afin de permettre au programme de gérer les
clés en double, le mappage de données, le mappage de clés et les erreurs de
sélection et/ou d'omission lors de l'écriture.
Que faire : Erreur 1 ou 6 :
-- Si le remplacement du paramètre SEQONLY(*YES) par SEQONLY(*NO) n'est
pas accepté, remplacez-le en indiquant SEQONLY(*YES N) dans la commande
OVRDB, N spécifiant le nombre d'enregistrements. Renouvelez votre demande.
Je ne vois pas dans le code où changer ce paramêtre.
Quelqu'un pourrait il m'éclairer du pourquoi un enregistrement reste locké alors que le fichier a été fermé ?