Update permet de réécrire des enregistrements d'une table avec les valeurs passées en paramètre.
Update [ classe ] [ Where_exp ] With champ = exp_chp [ , champ = exp_chp ]
Elément | Description | Restrictions |
classe | Abréviation d'un fichier ouvert | Aucune |
Where_exp | Expression_de_sélection Voir Where | Aucune |
champ | nom d'un champ de la table | Aucune |
exp_chp | expression donnant la valeur que doit prendre le champ | de type comptatible avec celui du champ - voir Where - |
# Mise à jour du champ FLGACTIF du fichier CLIENT pour tous les
# enregistrements dont les zones DEBIT et CREDIT sont à 0.
File CLIENT [CLI]
Update [CLI] Where DEBIT = 0 and CREDIT = 0 and FLGACTIF <> 1
& With FLGACTIF = 1
# affichage du nombre d'enregistrements modifiés
Infbox "enregistrements modifiés"-[S]adxuprec
# Incrémentation du nombre d'éditions
Update [DIV] Where FLAGEDIT & CLE >= [M]DEB1 With NBEDIT += 1
Update permet d'affecter certains champs des enregistrements d'une table avec les valeurs passées en paramètres en faisant automatiquement les opérations de lecture, verrouillage, réécriture et déverrouillage. Cette instruction permet de simplifier l'écriture du traitement et d'accélérer ces opérations dès que plusieurs enregistrements sont en cause.
Cette instruction exploite la possibilité de faire sur les bases de données Oracle une requête de même type. Adonix ne fait que traduire les expressions passées dans un langage compréhensible à la base de données, ce qui limite le choix des fonctions possibles. On se reportera à la documentation de la clause Where pour en avoir la liste.
Update met à jour la variable fstat pour indiquer comment s'est déroulée l'opération.
fstat | Code | MàJ | Explication |
0 |
| Oui | La mise à jour a eu lieu correctement. adxuprec enregistrements ont été modifiés. ou aucun enregistrement n'a été sélectionné. |
1 | ERLOCK | Oui et Non | En inter-blocage, dans ce cas, la transaction est abandonnée. |
3 | ERDUPCL | Non | Tentative de créer une clé non duplicable |
Adxuprec permet de connaître le nombre d'enregistrements mis à jour par une instruction Update.
ATTENTION : on ne peut pas prévoir le comportement d'une instruction Update qui affecterait un champ avec la valeur d'un champ lui-même affecté par Update.
Exemple :
Update [FIC] With CHAMP1 = VALEUR, CHAMP2 = CHAMP1.
Tentative de mise à jour d'enregistrements verrouillés :
Dans les deux cas, l' Update reste en attente et poursuit sa mise à jour lorsque l'enregistrement se libère. Par contre, en inter-blocage, l' Update arrête sa mise à jour et envoie un fstat=1.
Update ne modifie pas les variables de la classe [F] correspondant au fichier.
On ne peut pas utiliser une abréviation de lien pour mettre à jour un fichier.
La mise à jour par Update doit se faire à l'intérieur d'une transaction.
En cours de transaction, les modifications ne seront pas visibles par les autres utilisateurs.
Chaque verrouillage d'enregistrement "réussi" implique l'attribution d'un verrou, mais le verrou n'est libéré qu'à la fin de la transaction. Toute base utilise ses propres verrous et leur nombre est limité par un des paramètres de la base. Dans le cas où cette ressource serait épuisée, Adonix générera un erreur n 43 (FISLOCK). Il faudra alors, soit faire augmenter le nombre de verrous, soit modifier le programme, soit gérer cette erreur.
Le verrouillage dépend de la base de données. Il est indépendant de la valeur de [S]lockwait. Sous Oracle, Sql-serveur, Db2 la tentative de verrouillage se fera sans limitation de durée et sans possibilité de l'interrompre. Verrouiller la table dans son ensemble par Lock [abvf] est un moyen brutal, mais sûr d'éviter tout problème.