| |

REPLACE
Remplace le contenu des champs spécifiés de la table en cours par les données issues
des expressions indiquées.
Syntaxe
REPLACE <champ 1> WITH <exp 1> [ADDITIVE][, <champ 2> WITH <exp 2>
[ADDITIVE]] ...][<portée>] [FOR <condition 1>] [WHILE <condition
2>][REINDEX]
<champ 1> WITH <exp 1>
Désigne les champs à remplacer par les données issues des expressions indiquées.
Plusieurs champs d'un même enregistrement peuvent être changés en incluant des
expressions <champ n> WITH <exp n> supplémentaires séparées par des
virgules..
Pour remplacer plusieurs champs, il peut être intéressant d'utiliser REPLACE ALL...
(voir exemple dans code ci-dessous).
ADDITIVE
Ajoute le texte indiqué à la fin d'un champ Mémo plutôt que de remplacer le texte
existant. ADDITIVE ne peut être utilisé qu'avec un champ Mémo d'une table dBASE.
<portée>
Le nombre d'enregistrements à remplacer. RECORD <n> identifie le numéro d'un
enregistrement unique. NEXT <n> identifie les n enregistrements suivants en partant
de l'enregistrement en cours. ALL indique tous les enregistrements. REST indique tous les
enregistrements jusqu'à la fin du fichier en partant de l'enregistrement en cours.
FOR <condition 1>WHILE <condition 2>
Détermine les enregistrements sur lesquels agit la commande REPLACE. La clause FOR
restreint l'action de REPLACE aux enregistrements pour lesquels la <condition 1> est
vraie. WHILE démarre le traitement avec l'enregistrement en cours et le poursuit avec les
suivants tant que la <condition 2> est vraie.
REINDEX
Indique que tous les index affectés doivent être reconstruits après l'exécution de
l'opération de remplacement.
La commande REPLACE écrase le contenu du champ avec les nouvelles données. Le type du
champ sélectionné peut être quelconque sauf binaire et OLE. (Utilisez respectivement
REPLACE BINARY et REPLACE OLE pour remplacer les champs Binaire et OLE.)
Toutefois, le champ et l'expression définies par la clause WITH doivent être de même
type. Dans le cas d'un champ Numérique, l'expression WITH peut être de taille
supérieure à celle définie pour le champ mais la valeur numérique est alors affichée
en notation scientifique. Lors de la conversion d'un champ Mémo en un champ de type
caractère, REPLACE tronque les données pour que leur taille soit celle du champ cible.
Pour changer plusieurs champs à la fois, il suffit d'inclure une expression <champ
n> WITH <exp n> supplémentaire pour chacun des champs. Lorsque les options
<portée>, WHILE et FOR sont utilisées, les données sont remplacées dans tous les
enregistrements de la portée répondant aux conditions indiquées.
Utilisez l'option ADDITIVE pour ajouter une chaîne de caractères à la fin du texte
contenu dans un champ Mémo. Vous pouvez ajouter un espace au début de la chaîne pour
obtenir un espacement approprié.
Faites tout particulièrement attention en remplaçant des données dans une table
disposant d'un index maître avec les options <portée>, WHILE et FOR. dBASE met
automatiquement à jour tous les fichiers index ouverts après l'exécution de
l'opération de remplacement. Après le remplacement des données modifiant la valeur d'un
champ clé de l'index maître, l'enregistrement et le pointeur d'enregistrement sont
immédiatement positionnés en fonction de la nouvelle valeur clé. Si le remplacement
effectué dans le champ clé provoque le déplacement d'un enregistrement (et celui du
pointeur) au-delà des enregistrements qui correspondent à la portée définie ou
répondent aux conditions indiquées, le remplacement n'est pas effectué pour cet
enregistrement. Pour effectuer des remplacements dans un champ clé d'une table indexée,
vous devez d'abord fermer l'index (SET ORDER TO), puis mettre à jour les données avant
de réouvrir l'index avec SET INDEX et effectuer sa mise à jour avec REINDEX.
Le remplacement dans des champs autres que le champ clé de l'index maître n'agit pas sur
l'ordre d'indexation, et peut donc s'effectuer avec les options <portée>, WHILE et
FOR sans aucun problème.
Lorsque vous remplacez une valeur numérique, la longueur de la nouvelle valeur ne peut
excéder la taille du champ ; dans le cas contraire, le contenu du champ est
remplacé par des astérisques et les données initialement stockées sont détruites.
REPLACE modifie les données des champs de la table en cours sauf si vous utilisez
alias->champ pour spécifier un champ dans une table alias.
Si aucune relation n'a été définie à partir de la table en cours, seul
l'enregistrement en cours de la table alias peut être remplacé. Si une relation a été
définie, vous pouvez utiliser les options <portée>, FOR <condition 1>
et WHILE <condition 2> pour remplacer plusieurs enregistrements dans la table alias.
REPLACE sans option substitue le contenu de <champ 1> par <exp 1> uniquement
pour l'enregistrement en cours.
L'expression définie doit être du même type que le contenu du champ remplacé sauf dans
le cas d'un champ Mémo qui peut être remplacé par une expression de type caractère.

Lorsque vous remplacez un champ de type numérique ou flottant dans une table DBF,
l'ampleur de la nouvelle valeur ne doit pas dépasser la partie entière du champ. Par
exemple, si le champ numérique est défini comme une largeur de 4 avec 1 décimale, vous
ne pouvez pas avoir un nombre supérieur à 99,9. Si c'est le cas, le contenu des champs
sont remplacés par une approximation de la nouvelle valeur en notation scientifique, si
elle s'adapte, sinon le contenu des champs sont remplacés par des astérisques,
détruisant les données stockées. La notation scientifique exige une largeur de champ
d'au moins 7 caractères. Cette condition n'est pas une erreur, mais dBASE Plus affichera
un message d'avertissement de débordement numérique (numeric overflow warning message)
dans le volet de sortie de la fenêtre de commande.
Les autres types de champs qui stockent des nombres, y compris les entiers Long et Short,
ont une plage numérique définie. Assurez-vous que le nombre que vous essayez d'y stocker
ne dépasse pas ces limites.
Utilisez l'opérateur d'alias dans le <champ> (c'est-à-dire : alias-> champ)
pour remplacer les champs d'autres tables que la table sélectionnée. Vous pouvez mixer
les champs de différentes tables dans la même déclaration REPLACE, bien que le champ
d'application de la commande est basé sur la table en cours. S'il n'y a pas de relation
entre la table en cours et les autres tables, parcourant l'ensemble de table (par exemple,
en raison de la portée ALL), le pointeur d'enregistrement ne sera pas déplacé dans les
autres tables.
Attribuer des valeurs directement aux propriétés valeur des objets
Fields dans le tableau des champs de l'ensemble des lignes (dans une boucle qui traverse
l'ensemble de lignes si nécessaire).
form.rowset.fields["NomDuChamp"].value := unevaleur |
Si vous n'enregistrez pas cela, ce sera stocké dans un tampon
d'enregistrement, jusqu'à ce qu'on ait, soit: un appel explicite à form.rowset.save(),
une navigation se produit dans la table (next(), first(), last( ) ...), ou le formulaire
(et/ou la requête) est fermé (désactivé).
Il n'existe aucune méthode directe en OODML pour effectuer un REPLACE ALL.
Une solution, quoique lente, est d'utiliser une boucle et de passer à travers toutes
les lignes d'une table.
Une solution beaucoup plus rapide consiste à utiliser l'instruction locale SQL UPDATE .
La syntaxe est :
UPDATE nomdelatable ;
SET nomduchamp=unevaleur, nomduchamp2=uneautrevaleur, etc.;
WHERE unecondition
La clause "WHERE" est facultative (tout comme la commande
REPLACE dans XBase a une clause optionnelle FOR).
Un exemple pourrait être le besoin de remplacer un champ logique pour toutes les lignes
du jeu de lignes avec "false":
UPDATE MaTable SET monChampLogique = false |
Si vous avez besoin d'avoir une condition, par exemple un champ date basé sur une valeur:
UPDATE MaTable SET monChampLogique = false WHERE myDateField <= date() |
Dans l'exemple suivant, REPLACE définit ou modifie les données du
fichier TEMP.DBF qui se présente comme une copie de la table CLIENTEL :
SET SAFETY OFF |
USE CLIENTEL EXCLUSIVE |
INDEX ON NRO_CLIENTS TAG NRO_CLIENTS |
COPY TO TEMP.DBF |
USE TEMP |
REPLACE ALL SOCIETE with PROPER(SOCIETE) |
* Si le nom de société a été saisi en |
* majuscules, bascule en majuscules/minuscules. |
REPLACE ALL ETAT with UPPER(ETAT) |
* Si l'une ou l'autre des deux lettres de
l'état |
* est une minuscule, la bascule en majuscule. |
REPLACE ALL TELEPHONE with
STUFF(TELEPHONE,AT("-",TELEPHONE),1,"*") |
* Remplace les tirets par des astérisques dans
le champ |
* TELEPHONE. |
REPLACE ALL NOTES with "Les taxes de la Géorgie sont
appliquées"; |
ADDITIVE FOR ETAT="GA" |
* Place une chaîne de texte dans le champ Mémo
NOTES |
* pour tous les enregistrements dont l'état
correspond à la Géorgie. |
GO TOP |
BROWSE |
CLOSE ALL |
SET SAFETY ON |
retour
Sources :
Aide Visual dbase V5.7
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm
Aide dBase Plus 2.6.0
Retour à l'accueil
Si vous voyez des erreurs, ou souhaitez apporter des compléments, n'hésitez pas à le signaler.
Dernière modification : vendredi 06 août 2010
© M.Abraham.
|