4D v16.3Utiliser des transactions |
||
|
4D v16.3
Utiliser des transactions
Utiliser des transactions
Les transactions sont une série de modifications effectuées à l'intérieur d'un process sur des données reliées entre elles. Une transaction n'est sauvegardée de façon définitive dans la base que si la transaction est validée. Si une transaction n'est pas complétée, parce qu'elle est annulée ou en raison d'un quelconque événement extérieur, les modifications ne sont pas sauvegardées. Pendant une transaction, toutes les modifications effectuées sur les données de la base dans le process sont stockées localement dans un buffer temporaire. Si la transaction est acceptée avec VALIDATE TRANSACTION, les changements sont sauvegardés de façon définitive. Si la transaction est annulée avec CANCEL TRANSACTION, les changements ne sont pas sauvegardés. Dans tous les cas, ni la sélection courante ni l'enregistrement courant ne sont modifiés par les commandes de gestion des transactions. 4D prend en charge les transactions imbriquées, c'est-à-dire les transactions sur plusieurs niveaux hiérarchiques. Le nombre de sous-transactions autorisées est illimité. La commande Transaction level permet de connaître le niveau courant de transaction dans lequel le code est exécuté. Note : Par compatibilité, les transactions imbriquées sont désactivées par défaut dans les bases de données converties depuis une version antérieure à la v11 (cf. section Page Compatibilité). 4D inclut une fonctionnalité vous permettant de suspendre temporairement et de réactiver des transactions dans votre code 4D. Lorsqu'une transaction est suspendue, vous pouvez exécuter des opérations indépendantes de la transaction elle-même puis la réactiver afin de la valider ou de l'annuler, de façon classique. Lorsque la transaction est suspendue, vous pouvez, en particulier :
Pour plus d'informations sur ce point, reportez-vous à la section Suspendre des transactions. L'exemple de cette section s'appuie sur la structure présentée ci-dessous. C'est une base relativement simple de facturation. Les lignes de factures sont stockées dans une table appelée [Ligne Facture], qui est reliée à la table [Factures] par une relation entre les champs [Factures]NoFacture et [Ligne Facture]NoFacture. Lorsqu'une facture est ajoutée, un numéro unique est calculé avec la commande Sequence number. Le lien entre [Factures] et [Ligne Facture] est du type aller-retour automatique. L'option "Mise à jour auto dans les sous-formulaires" est cochée. La lien entre [Ligne Facture] et [Pièces] est manuel. Quand un utilisateur saisit une facture, les actions suivantes doivent être exécutées :
En d'autres termes, vous devez sauvegarder les données liées. C'est la situation type où vous devez utiliser une transaction. Vous pourrez ainsi être certain de pouvoir soit sauvegarder tous ces enregistrements pendant l'opération, soit annuler la transaction si un enregistrement ne peut être ajouté ou mis à jour. Si vous n'utilisez pas une transaction, vous ne pouvez pas garantir l'intégrité logique des données de votre base. Par exemple, si un enregistrement parmi ceux de la table [Pièces] est verrouillé, vous ne pourrez pas mettre à jour la quantité stockée dans le champ [Pièces]Entrepôt. Ce champ sera alors logiquement incorrect. La somme des pièces vendues et restantes dans l'entrepôt ne sera pas égale à la quantité d'origine saisie dans l'enregistrement. Vous pouvez éviter cette situation en utilisant les transactions. Il y a plusieurs façons d'effectuer une saisie sous transaction : (1) Vous pouvez gérer les transactions en utilisant les commandes de transaction START TRANSACTION, VALIDATE TRANSACTION et CANCEL TRANSACTION. Vous pouvez par exemple écrire : READ WRITE([Ligne Facture]) (2) Pour réduire les verrouillages des enregistrements pendant la saisie de données, vous pouvez aussi choisir de gérer les transactions à partir de la méthode du formulaire et d'accéder aux tables en LECTURE ECRITURE uniquement quand cela est nécessaire. La boucle d'ajout devient alors : READ WRITE([Ligne Facture]) Notez que la table [Pièces] est désormais en "lecture seulement" pendant la saisie de données. L'accès en lecture/écriture ne s'active que si les données sont validées. La transaction est ouverte dans la méthode du formulaire entrée de la table [Factures] : Case of Si vous cliquez sur le bouton bAnnuler, la saisie et la transaction doivent être annulées. Voici la méthode objet du bouton bAnnuler: Case of Si vous cliquez sur le bouton bOK, la saisie et la transaction doivent être acceptées. Voici la méthode objet du bouton bOK : Case of Dans le code ci-dessus, quel que soit le bouton sur lequel l'utilisateur a cliqué, nous appelons la commande CANCEL. Le nouvel enregistrement n'est pas validé par un appel à ACCEPT mais par SAVE RECORD. De plus, vous remarquez que SAVE RECORD est appelée juste avant la commande VALIDATE TRANSACTION. Ainsi, la sauvegarde de l'enregistrement [Factures] est partie intégrante de la transaction. Appeler la commande ACCEPT validerait aussi l'enregistrement mais dans ce cas, la transaction serait validée avant le stockage de la facture. Autrement dit, l'enregistrement serait sauvegardé en-dehors de la transaction. En fonction de vos besoins, personnalisez votre base à votre convenance, comme dans les exemples précédents. Dans le dernier exemple, la gestion du verrouillage des enregistrements de la table [Pièces] pourrait être plus élaborée.
Voir aussi
CANCEL TRANSACTION
|
PROPRIÉTÉS
Produit : 4D
HISTORIQUE
Modifié : 4D v15 R4 UTILISATION DE L'ARTICLE
4D - Langage ( 4D v16) |