
COPY
Crée une nouvelle table et y copie les enregistrements de la table en cours. COPY vous
permet aussi d'exporter des données vers des fichiers non dBASE.
Syntaxe
COPY TO <fichier> | ?[<portée>] [FOR <condition 1>] [WHILE
<condition 2>] [FIELDS <liste de champs>] [[TYPE] SDF | DBMEMO3 | PARADOX |
DBASE | DELIMITED [WITH <caractère> | BLANK] ] |[[WITH] PRODUCTION]
TO <fichier> | ?
Spécifie le nom de la table ou du fichier que vous voulez créer. COPY TO ? affiche une
boîte de dialogue, dans laquelle vous pouvez spécifier un nouveau fichier destination.
Si vous spécifiez un fichier sans inclure son chemin d'accès, Visual dBASE sauvegarde le
fichier dans le lecteur et le répertoire en cours. Si vous spécifiez un fichier sans
inclure son extension, définir un type de table par défaut avec SET DBTYPE ou utiliser
l'une des options TYPE, Visual dBASE affecte l'extension .DBF.
Vous pouvez aussi copier des enregistrements dans une table d'une base de données
(définie au moyen de l'utilitaire de configuration BDE) en spécifiant la base de
données comme préfixe (entourée de deux-points) du nom de la table, tel que :base
de données:table. Si la base de données n'est pas déjà ouverte, Visual dBASE affiche
une boîte de dialogue dans laquelle vous spécifiez des paramètres, tels que le nom de
connexion et le mot de passe, nécessaires pour établir une connexion à cette base de
données.
Si vous n'incluez pas d'extension à <fichier>, dBASE affecte l'extension .TXT.
<portée>
Le nombre d'enregistrements à copier dans <fichier>. RECORD <n> identifie un
enregistrement unique par son numéro d'enregistrement. NEXT <n> identifie n
enregistrements, en commençant par l'enregistrement en cours. ALL spécifie tous les
enregistrements. REST spécifie tous les enregistrements à partir de l'enregistrement en
cours jusqu'à la fin du fichier.
FOR <condition 1>WHILE <condition 2>
Détermine les enregistrements affectés par COPY. FOR restreint COPY aux enregistrements
qui satisfont à <condition 1>. WHILE commence le traitement à l'enregistrement en
cours et le poursuit avec chaque enregistrement suivant tant que <condition 2> est
vraie.
FIELDS <liste de champs>
Spécifie les champs à copier dans la nouvelle table.
[TYPE] SDF | WB1 | DBMEMO3 | PARADOX | DBASE | DELIMITED [WITH
<caractère> | BLANK]
Spécifie le format du fichier dans lequel vous voulez copier les données. Le mot
réservé TYPE est inclus uniquement pour améliorer la lisibilité; il n'a pas d'effet
sur l'opération de la commande. Le tableau suivant présente les différents formats de
fichiers supportés :
Type Description
SDF Un fichier "System Data Format". Les
enregistrements sont de longueur fixe dans le fichier SDF, et la fin d'un enregistrement
est marquée par un retour chariot et un saut de ligne. Si vous n'incluez pas d'extension
pour <fichier>, Visual dBASE affecte l'extension .TXT.
DBMEMO3 Des fichiers table (.DBF) et mémo (.DBT) au format
dBASE III PLUS.
PARADOX Une table Paradox. Les enregistrements sont des
lignes Paradox et les champs sont des colonnes Paradox. Visual dBASE affecte l'extension
.DB.
dBASE Une table dBASE (valeur par défaut). Si vous n'incluez
pas d'extension pour <fichier>, Visual dBASE affecte l'extension .DBF.
DELIMITED Un fichier texte dans lequel :
Les champs Caractère sont délimités par des guillemets ou par le
<caractère> spécifié si vous utilisez WITH <caractère>.
Les champs Logique sont les caractères T et F.
Les champs Numérique sont des nombres.
Chaque retour chariot/retour à la ligne indique un nouvel
enregistrement.
WITH <car>
Délimite les champs Caractère d'un fichier texte délimité avec le caractère
<car> au lieu des guillemets.
WITH BLANK
Sépare les données du fichier texte délimité par des espaces au lieu de virgules. Les
champs Caractère ne sont pas délimités par des guillemets ou autres délimiteurs.
[WITH] PRODUCTION
Spécifie la copie du fichier d'exploitation .MDX associée à la table. Cette option peut
uniquement être utilisée lors de la copie vers une autre table dBASE.
Description
|
Utilisez COPY pour copier la totalité ou une partie d'une table dans un fichier de même
type ou d'un type différent. Si un index est actif, COPY classe les enregistrements de la
nouvelle table ou du nouveau fichier selon l'ordre d'indexation. La commande COPY ne copie
pas un champ _dbaselock dans une table créée avec CONVERT.
Si vous copiez (COPY) une table contenant un champ Mémo dans une autre table dBASE,
Visual dBASEcrée un autre fichier de même nom que la table mais avec l'extension .DBT,
et y copie le contenu du champ Mémo. Cependant, si vous utilisez l'option SDF ou
DELIMITED et émettez COPY vers un fichier texte ASCII, Visual dBASE ne copie pas le
fichier mémo .DBT.
Les enregistrements supprimés sont copiés dans le fichier cible (dans le cas d'une table
dBASE) à moins qu'une condition FOR ou WHILE les exclut ou que SET DELETED ne soit à ON.
Les enregistrements supprimés restent marqués pour suppression dans la table cible
dBASE.
Vous pouvez utiliser COPY pour créer un fichier contenant des champs provenant d'une ou
de plusieurs tables. Pour cela, ouvrez les tables sources dans différentes zones de
travail et définissez une relation entre les tables. Utilisez SET FIELDS TO pour
sélectionner les champs de chaque table à copier vers un nouveau fichier. Avant
d'émettre la commande COPY, SET FIELDS doit être à ON et vous devez sélectionner la
zone de travail où réside la table parent.
La commande COPY ne vérifie pas que les fichiers construits sont compatibles avec
d'autres logiciels. Il vous est possible de spécifier des longueurs de champs, longueurs
d'enregistrements, nombre de champs ou nombre d'enregistrements incompatibles avec
d'autres logiciels. Vérifiez les limitations sur les fichiers de votre logiciel avant
d'exporter des tables avec COPY.
xDML vers ooDML
|
La méthode OODML est d'utiliser l'objet updateSet, et la méthode copy()
de cet objet.
Prenons quelques exemples. Le premier est de copier un jeu de lignes ou une table dans une
autre. Pour ce faire, nous devons avoir une table ou un ensemble de lignes qui est la
source (à savoir, ce que nous voulons copier), et nous devons définir le nom d'un
ensemble de lignes ou de table comme destination, ou la nouvelle table.
Au plus simple, nous pouvons faire:
u = new UpdateSet() |
u.source := "FISH" |
u.destination := "COPYFISH" |
u.copy() |
Cela va copier les lignes de la table «FISH», du répertoire samples, vers
"COPYFISH", créant une nouvelle table.
Pas très passionnant. Nous pourrions faire la même chose avec:
COPY TABLE FISH TO COPYFISH |
Alors, quel est le problème ? Eh bien ... en ooDML entre autres choses, nous pouvons
créer des tables de différents types. Si vous utilisez une table locale, et voulez
copier cette table à un serveur SQL Aliased BDE, vous pouvez faire:
u = new UpdateSet() |
u.source := "FISH" |
u.destination := ":myalias:Fish" |
u.copy() |
Et ceci créera une nouvelle table dans "myalias" (tel qu'il est défini dans
le BDE), et convertira la table dans le type approprié. C'est une façon d'obtenir votre
table dans une base de données Interbase, par exemple.
Toutefois, une autre chose, et peut-être même plus utile à noter, c'est que nous
pouvons créer un ensemble de lignes à partir d'une requête et copiez simplement les
lignes qui correspondent peu importe les conditions dont nous avons besoin. L'exemple
ci-dessous utilise la table des clients (CUSTOMER) dans l'exemple MUGS, et suppose que
vous avez l'Alias BDE MUGS fixé dans le BDE (qui a été installé là, mais vous devrez
peut-être le recréer). Il permet de copier uniquement les lignes qui ont le champ
"Etat Id" contenant la valeur "CA" (Californie).
d = new database() |
d.databaseName := "MUGS" |
d.active := true |
q = new query() |
q.database := d
// assigne la base
de données mugs ... |
q.sql := "select * from CUSTOMER" |
q.active := true |
q.rowset.filter := [:state id: = 'CA'] |
q.rowset.indexName := "Last Name" |
|
u = new UpdateSet() |
u.source := q.rowset |
u.destination := "CA_CLIENTS" |
u.copy() |
|
// Nettoyage |
q.active := false |
d.active := false |
Dans cet exemple, la nouvelle table sera créée «sur place» - à savoir, dans le
répertoire où vous travaillez actuellement, par opposition à la base de données MUGS.
Si vous voulez copier vers la base de données MUGS, vous devrez définir la destination
":MUGS:CA_CLIENTS.DBF".
---------------------------------------------------------------------------------
REMARQUE: Vous pouvez utiliser un objet requête pour l'un ou les deux ensembles de
lignes de la source et de destination. À savoir,
q1 = new query() |
q1.sql = "select * from fish" |
q1.active = true |
|
q2. = new query() |
q2.sql = "select * from copyfish" |
q2.active = true |
|
u = new updateSet() |
u.source := q1.rowset |
u.destination := q2.rowset |
u.copy() |
---------------------------------------------------------------------------------
Dans le cas de la méthode copy(), vous ne pouvez pas créer un jeu de lignes qui n'existe
pas, à savoir:
q2 = new query() |
q2.sql = "select * from sometable" |
|
[... du code ...] |
u.destination := q2.rowset |
Etant donné que ce jeu de lignes n'existe pas, vous obtiendrez une erreur référence
non valide (invalid reference error).
---------------------------------------------------------------------------------
NOTE: Utiliser la méthode copy() ne copie pas les index
de la table originale. Il s'agit d'un grave inconvénient, et même si je crois
qu'elle travaille "comme prévu", c'est un peu gênant. (Voir COPY TABLE
si vous devez aussi copier les index ...)
---------------------------------------------------------------------------------
Vous pouvez également copier les champs de l'ensemble de lignes en cours en parcourant le
tableau des champs - le code ci-dessous suppose deux tables avec la même structure:
q1 = new query() |
q1.sql = "Select * from table1" |
q1.active |
|
q2 = new query() |
q2.sql = "Select * from table2" |
q2.active |
|
q2.rowset.beginAppend()
// commencer une
nouvelle ligne |
for i = 1 to q1.rowset.fields.size |
q2.rowset.fields[i].value := ; |
q1.rowset.fields[i].value |
next |
q2.rowset.save() |
Notez que le code ci-dessus ne tiennent pas compte des champs autoincrement ou _dBASELOCK,
ce qui pertubera l'opération (ils sont en lecture seule, vous pouvez simplement faire des
tests pour eux (il existe des exemples pour ces cas)). En outre, assigner la valeur d'un
champ binaire ne peut pas être fait de cette façon, vous aurez besoin d'utiliser les
deux méthodes de l'objet fields copyToFile() et replaceFromFile().
Les
difficultées rencontrées : |
1) DB2K, Windows Millenium, IDE de dBase, Win 98
Le problème :
Avec DB2K COPY To .... .SDF Type SDF génère une erreur sous windows millenium, ou
le IDE de dBase (pas pour les EXE) : Database Engine Error: Incompatible record
structures. La même commande sous Win 98 est OK.
La solution :
La différence de coimportement venant des systèmes utilisés, regarder le contenu des
fichiers .ini. La suppression de la ligne "ldriver = Windows» dans le
[CommandSettings] de dB2K.INI a fait disparaître l'erreur.
2) Parfois des difficultés si le nom du fichier est créé à partir d'une
variable
Exemple :
COPY TO LEFT(mMonth,3)+LTRIM(mYear)+
".DBF" WITH PRODUCTION // pas de soucis
mais
mFile = LEFT(mMonth,3)+LTRIM(mYear)+ ".DBF"
COPY FILE (mFile) TO A:
renvoie une erreur "Fichier non trouvé"
La solution :
COPY FILE (mFile) TO ("A:\"+mFile)
ou
new File( ).copy( mFile, "A:\"+mFile )
3) La commande Copy to... ne fonctionne pas toujours
Le coté supposée "erratique" du fonctionnement de Copy to...
Ceci peut provenir du nom des champs à copier. Rappel des prescriptions
de dBase :"pour le nom du champ (jusqu'à 31 caractères pour dBASE Plus), vous
pouvez entrer des lettres, des chiffres et caractères de soulignement, mais aucun autre
caractère. *** Le premier
caractère doit être une lettre ***." Les champs comme "1er_prenom"
ou "2eme_Prenom" sont à proscrire, car sources de problèmes, mais pas à
chaque fois, d'où un comportement semblant aléatoire.
4) Sous VdB5.7 message d'erreur pour un GO TOP après un COPY TO
Le problème :
Après avoir copié une table, en voulant travailler avec pour se
positionner sur le premier enregistrement, une erreur Database Engine Error se déclenche
La solution évoquée :
Essayez d'utiliser FLUSH pour écrire les changements sur le disque avant
d'utiliser la fonction COPY TO
Note sur FLUSH : FLUSH vous permet de sauvegarder les
informations de la zone tampon de données sur disque sans fermer au préalable les tables
ou les index. FLUSH sauvegarde les informations des tables et des fichiers associés
ouverts dans des zones de travail autres que la zone de travail en cours.
Utilisez FLUSH lorsque vous voulez stocker des informations critiques sur disque.
Cependant, n'utilisez pas trop fréquemment FLUSH, car elle ralentit l'exécution.
retour
Sources :
Aide Visual dbase V5.5
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm
Les cas évoqués
1 |
Groupes de discussion : dbase.bug-reports
De : "Ken Mayer [dBASE, Inc.]" <kma...@dbase.com>
Date : Mon, 28 Jan 2002 13:50:34 -0800
Date/heure locale : Lun 28 jan 2002 23:50
Objet : Re: Bug in Copy To xxxxxxx Type SDF ? |
2 |
Groupes de discussion : dbase.programming
De : "AutoTraker Inc." <db...@autotraker.com>
Date : Thu, 20 Mar 2003 11:12:11 -0500
Date/heure locale : Jeu 20 mar 2003 18:12
Objet : Re: COPY FILE problem |
3 |
Groupes de discussion : dbase.programming
De : Ivar B. Jessen <bergisha...@it.notthis.dk>
Date : Tue, 10 Feb 2004 22:11:24 +0100
Date/heure locale : Mar 10 fév 2004 23:11
Objet : Re: Copy to error |
4 |
Groupes de discussion : dbase.version5
De : "Rev. Marcus Capone" <i...@isd-dc.org>
Date : Sun, 29 Jul 2001 16:38:09 GMT
Date/heure locale : Dim 29 juil 2001 18:38
Objet : vDB5.7 - Navigation after COPY TO |
Si vous voyez des erreurs, n'hésitez pas à le signaler.
Dernière modification : samedi 24 juillet 2010
© M.A.
|