titre_site.jpg (51607 octets)

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.

 

 ico_MsDos.jpg (1668 octets)  dbasedos.gif (376 octets) vdb5.gif (351 octets) Description



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.

Plus2_5-Icon.jpg (1250 octets)

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.

 

Plus2_5-Icon.jpg (1250 octets) xDML vers ooDML

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()

 

Code      ico_dbIII.jpg (1345 octets)   dbasedos.gif (376 octets)   vdb5.gif (351 octets)   Plus2_5-Icon.jpg (1250 octets)

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.