Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Dans mon application j'ai une table "Sequence" qui regroupe tous les noms de mes tables et un champ sequence qui donne le dernière séquence de ma clé primaire. Cette table est mise à jour par la procédure stockée ci-dessous, qui selectionne la sequence, l'incrémente de 1 et retourne la valeur comme clé primaire dans un nouvel enregistrment de la table correspondante. La procédure fonctionne très bien, mais l'ennui est que des fois, les séquences prennent du retard dans la table "Sequence" par rapport à certaines autres tables. ex sequence = 8 dans la table sequence alorsque dans la table Variations la séquence est à 9. ça veut dire que des fois il sélectionne bien, mais ne met pas à jour la table sequence (ce qui est annormal, pck j'ai mis tout dans une transaction). Et cette situation me provoque chaque fois des violations de contrainte de clé primaire. Quelqu'un peut-il m'aider à résoudre ce pbm ?
Procédure stockée
PROCEDURE dbo.GetSequence ( @tablename varchar(255) ) AS DECLARE @CurrentValue int BEGIN TRANSACTION LaTransaction SET @CurrentValue = (SELECT ncurrentvalue FROM Tsequence WHERE ltablename = @Tablename); SET @CurrentValue = @CurrentValue + 1; UPDATE Tsequence SET ncurrentvalue = ncurrentvalue + 1 WHERE ltablename = @Tablename SELECT @CurrentValue; IF @@ERROR <> 0 ROLLBACK TRANSACTION LaTransaction; ELSE COMMIT TRANSACTION LaTransaction;
Appel de la procédure stockée
//Ceci est le code d'une procédure de ma DWControle parente d'où héritent toutes mes autres DWControles //La procédure est appelée à chaque insertion d'un nouvel enregistrement. DECLARE proc_GetSequence PROCEDURE FOR dbo.GetSequence @tablename = :is_tablename; //variable d'instance contenant le nom de la table EXECUTE proc_GetSequence; FETCH proc_GetSequence INTO :ll_currentvalue; ls_err = sqlca.sqlerrtext CLOSE proc_GetSequence ; if SQLCA.sqlcode <> 0 THEN messagebox("Erreur",ls_err) END IF CLOSE proc_GetSequence ; return ll_currentvalue
Hors ligne
Bonjour,
Même si ça ne réponds pas à ta question, habituellement, le n° de séquence n'est incrémenté qu'une fois que la nouvelle ligne a bien été enregistrée, au cas où il y aurait annulation de la saisie ou tout autre problème d'enregistrement dans la base.
Pour info tu utilises quel SGBDR ? Ne serait-il pas mieux de lui laisser gérer cette tâche (PK autoincrement pour Sybase, sequence pour Oracle,...) ?
Hors ligne
Merci beaucoup pour ta réponse,
J'utilise MS SQL Server 2000. Je n'utilise pas les autoincrément de la base pck j'ai besoin de contrôler la suite de mes séquences. C'est une bonne idée que d'appeller la séquence à l'enregistrement. Mais le problème n'est certainement pas du au fait que je fais appel à ma procédure à l'insertion.
Merci beaucoup !
Hors ligne
Certes, peut-être un point-virgule à la fin de
UPDATE Tsequence SET ncurrentvalue = ncurrentvalue + 1 WHERE ltablename = @Tablename
??
Hors ligne