titre_site.jpg (51607 octets)

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.

 ico_MsDos.jpg (1668 octets)   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.

Plus2_5-Icon.jpg (1250 octets) 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().

 

 

bug_jpg.jpg (2635 octets)  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.