Rewrite permet de réécrire un enregistrement donné sur une table.
Rewrite [ classe ] [ clé ] [ mode_lect [ valeur_clé ] ]
Elément | Description | Restrictions | ||||||||
clé | Désignation de la clé d'un fichier sous l'une des formes suivantes : | La clé doit être définie dans une clause Order By ou en paramétrage de la table. | ||||||||
exp_ind | Expression entière du nombre de parties de clés utilisées. Par défaut, toute la clé est utilisée. | 0 <=exp_ind <=nombre de composantes de la clé (au plus 8). | ||||||||
| ||||||||||
valeur_clé | Liste d'expressions séparées par ';' correspondant aux valeurs des sous-clés. | valeur compatible avec le type de la sous-clé. |
# Lecture d'un enregistrement pour modification du champ ZONE
Trbegin TEST [TEST]
Readlock [TEST]CLE2(1) = date$
If [S]fstat
[TEST]ZONE += 100
Rewrite [TEST]
Commit
Else
Rollback
Endif
# Décalages d'enregistrements
# (l'enregistrement no 2 est écrit sur le 1, le 3 sur le 2, etc..)
# Ne fonctionne que sur un fichier non vide et sans clés uniques.
Read [TEST]CLE First
Read [TEST]CLE Next
While fstat=0
Rewrite [TEST]CLE Prev
Read [TEST]CLE Next
Read [TEST]CLE Next
Wend
Rewrite permet de réécrire de nouvelles valeurs dans un enregistrement lu selon les divers modes énumérés dans le tableau précédent. Si on ne donne pas de valeur de clé pour les modes qui en demandent une ( '<', '>', '<=', '>=', '=' ), la valeur courante des variables de la classe [F] correspondant au fichier est utilisée.
Si aucun mode de lecture n'est donné, le mode Curr sera utilisé et l'enregistrement courant (c'est-à-dire le dernier lu) est modifié.
Les clés utilisables dans Rewrite sont :
On peut omettre dans la syntaxe de Rewrite l'abréviation du fichier ou le nom de la clé :
La variable fstat indique comment s'est déroulée l'écriture.
fstat | Code | Ecr. | Explication |
0 | Oui | La réécriture a eu lieu correctement. | |
1 | ERLOCK | Non | L'enregistrement est verrouillé. |
2 | ERECIND | Oui | En mode de lecture <= ou >= , signale que la lecture a eu lieu, mais que la clé trouvée est < ou > à la valeur recherchée. |
3 | ERDUPCL | Non | Tentative de création d'une clé dupliquée. |
4 | ERDEBF | Non | Début/Fin de fichier |
5 | ERPALEC | Non | Aucun enregistrement correspondant aux valeurs demandées. |
Lorsque la réécriture a réussi (c'est-à-dire si fstat est nul ou vaut éventuellement ERECIND), l'enregistrement devient l'enregistrement courant du fichier.
En attendant la fin de la transaction, les modifications ne seront pas visibles par les autres utilisateurs, sous Oracle, alors qu'elles le seront sous Sql-serveur. En effet, Adonix utilise pour Sql-serveur la technique du "dirty read"( ou read uncommited) c'est à dire que les écritures non encore commitées sont vues par les utilisateurs.
En fait, SQL-serveur offre la possibilité de faire des read "commited", mais dans ce cas, la lecture bloque sur les enregistrements modifiés ( contrairement à Oracle qui va lire dans les rollbacks-segments) ce qui risque d'engendrer des ralentissements tout particulièrement sur les listes gauches.
Il n'est pas possible d'utiliser une abréviation de lien pour réécrire un enregistrement.
La modification d'un enregistrement doit se faire à l'intérieur d'une transaction.
L'enregistrement à réécrire sera de toute façon verrouillé et la réécriture ne se fera que si cette opération a réussi, sinon [S]fstat sera positionné à 1. Se reporter à la documentation sur Readlock pour les problèmes concernant les verrouillages d'enregistrements.
Dès qu'on a plusieurs enregistrements à mettre à jour, l'instruction Update peut-être plus rapide.