| |

DELETE
Pour les tables dBASE, marque les enregistrements pour suppression. Lors de l'accès
aux tables Paradox ou SQL, DELETE supprime définitivement les enregistrements de la
table.
Syntaxe
DELETE[<portée>][FOR <condition 1>] [WHILE <condition 2>]
<portée>
Le nombre d'enregistrements à supprimer. 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 DELETE. FOR restreint DELETE aux
enregistrements qui satisfont à la <condition 1>. WHILE commence le traitement à
l'enregistrement en cours et le poursuit avec chaque enregistrement suivant tant que
<condition 2> est vraie
Description
|
Lorsque vous utilisez DELETE pour marquer des enregistrements pour suppression dans une
table dBASE, Visual dBASE ne les enlève pas réellement de la table. Il le fait
uniquement à l'émission de la commande PACK. DELETE sans option marque uniquement
l'enregistrement en cours. Avec une table Paradox ou SQL, la commande DELETE enlève
immédiatement les enregistrements de la table (identique à l'émission de la commande
PACK sur une table dBASE).
La marque de suppression qui apparaît à côté des enregistrements dans une liste ou un
affichage est un astérisque.
Pour manipuler une table comme si vous aviez émis la commande PACK, mais sans supprimer
de manière irrévocable les enregistrements, mettez SET DELETED à ON (valeur par
défaut). Pour rappeler les enregistrements, émettez la commande RECALL. Cependant,
utilisez ZAP pour supprimer tous les enregistrements d'une table.
xDML vers ooDML
|
Le XBase utilise une suppression "soft". Le seul avantage d'utiliser ceci est
que les enregistrements sont toujours dans la table, au cas où vous avez besoin de les
rappeler. Certains développeurs ont appris à compter sur ceic, parce que ce qui se passe
réellement, c'est un champ caché logique utilisé dans la table, et certains
développeurs ont écrit le code pour faire un filtre sur le drapeau supprimé. Notez que
ce produit uniquement pour les .DBF - c'est le seul format de table qui utilise la
suppression par soft - tous les autres formats de table suppriment une ligne lorsque vous
spécifiez que vous voulez vraiment la supprimer.
Le OODML, en soi, ne reconnaît pas la suppression par soft. Lorsque vous émettez un
appel à la méthode delete() de l'ensemble de lignes, le champ logique ne s'inscrit pas
sur la table .DBF, mais la ligne disparaît, quel que soit le paramètre de SET DELETED.
Il n'y a donc pas d'équivalent OODML pour RECALL, et il n'est pas possible d'interroger
le drapeau "supprimé" à l'aide de la fonction deleted().
Si vous souhaitez utiliser l'API du BDE, vous pouvez effectivement travailler de façon
similaire aux capacités du XDML comme si elles étaient intégrées à l'OODML. Gary
White a fourni un formulaire (SDQUERY.WFM) qui le fait, et la requête personnalisée est
dans le fichier SDQUERY.CC. Ces deux fichiers sont dans le code source. ZIP.
Si vous voulez rappeler les enregistrements supprimés, vous devrez utiliser le XBase pour
le faire.
Remarque : les lignes, cependant, une fois que vous les avez supprimé à l'aide de la
commande OODML, existent toujours, et vous pourrez de temps en temps souhaiter compacter
la table (voir PACK pour plus de détails).
Usage :
Ce n'est pas vraiment un problème, mais une difficulté d'utilisation,
car utiliser des tables .dbf, même en les manipulant en ooDML maintient en fait la
suppression logique. Si on ne peut pas y accèder en ooDML, en Xbase cela reste possible .
Extrait d'une discussion sur ce sujet :
Commentaire 1
> Selon l'Aide dBase et les choses que j'ai lu ici la suppression
par soft n'est pas
> prise en charge dans la méthode rowset (jeu de lignes).
La suppression Soft EST supportée dans le jeu de lignes OODML, en
supposant que vous
utilisez des tables dbase .DBF. C'est-à-dire si vous supprimez un enregistrement, il est
marqué comme supprimé et ne figurera pas dans votre jeu de lignes.
Cependant, le jeu de lignes ne peut être fait pour afficher les enregistrements
supprimés. Peut-être
est-ce là qu'il y a une confusion ? Vous pouvez toujours consulter les enregistrements
supprimés lorsque
accéder à la table par la ligne de commande, mais pas dans un formulaire, ni une grille
(grid),
l'ensemble de lignes ne peut pas afficher ou accéder aux enregistrements supprimés.
Au moment de PACKer une table, le filtre et le statut de SET DELETED ne
compte pas. Une fois compressés, les enregistrements marqués pour suppression sont
définitivement
supprimés. Vous pouvez également utiliser la fonction PACKTABLE de rowset pour accomplir
la même chose.
Commentaire 2
> Selon l'Aide dBase et les choses que j'ai lu ici la suppression par soft n'est
pas
> prise en charge dans la méthode rowset (jeu de lignes).
> J'ai eu des problèmes lorsque les enregistrements supprimés ne sont pas visibles
dans une
grille mais peuvent être accessibles à partir d'autres procédures.
Certainement, les seuls cas où ceux-ci sont manipulés avec XDML ....
Dans ce cas SET DELETED ON devrait aussi les rendre invisibles en XDML.
rowset.delete() fait la même chose que la commande XDML DELETE - elle marque la ligne
avec une suppression logicielle. La ligne est invisible en OODML (y compris par
rowset.findkey())
mais on peut encore voir dans XDML lorsque SET DELETED ON a été modifié.
> J'utilise uniquement les méthodes de l'ensemble de lignes (rowset).
> Tout fonctionne bien si j'ouvre une table dans le navigateur, définit
> le filtre à supprimer et redeleted et comprime la table.
> Il ne se débarrasse pas des enregistrements, si je fais juste un pack.
Quel genre de pack est-ce ? XDML PACK commande?
Vraisemblablement vous ne recevez pas une erreur "utilisation exclusive requise"
(Exclusive Use Required error).
Bruce Beacham
Commentaire 3
> Avec la suppresion logique en programmation orientée objet j'ai beaucoup de
difficultés et de nombreuses "Key violations" dans >mes applications, car
même si les enregistrements ne semblent plus être là, ils le sont encore réellement!
>Je sais que je peux «packer» la table et ainsi me débarrasser d'eux, mais dans un
environnement multi-utilisateur, il n'est pas >toujours facile d'obtenir l'usage
exclusif.
Non seulement les enregistrements supprimés ne sont pas physiquement
supprimés mais ils font considérablement ralentir le travail sur les tables pour des
recherches non indexées, des tris, ou lorsque l'on utilise des clauses where.
J'ai opté pour la solution qui consiste à utiliser un filtre logique et exclure les
enregistrements dans ma requête SQL plutôt que de faire un delete. Plus tard, lors de la
maintenance de la base de données nous supprimons en effet et compressons (pack) les
tables.
En tout cas, nous n'avons jamais aucune violation de clé d'index puisque chaque
enregistrement a une clé unique qui n'est jamais dupliquée. Nous ne réutilisons jamais
une clé même si l'ancien enregistrelment utilisant cette clé a été supprimé.
Rich..
retour
Sources :
Aide Visual dbase V5.5
http://www.dbase.com/Knowledgebase/INT/xb2vdb7oodml/x2oodml.htm
Commentaire 1 :
Groupes de discussion : dbase.bug-reports
De : Paul Van House <pvanho...@houston.rr.com>
Date : Wed, 26 Mar 2003 09:53:33 -0600
Date/heure locale : Mer 26 mar 2003 17:53
Objet : Re: rowset and soft delete
|
Commentaire 2 :
Groupes de discussion : dbase.bug-reports
De : Bruce Beacham <bbeac...@lowman.co.uk>
Date : Wed, 26 Mar 2003 16:08:33 +0000
Date/heure locale : Mer 26 mar 2003 18:08
Objet : Re: rowset and soft delete
|
Commentaire 3 : Sujet : Re: oop Deletes
Date : Fri, 17 May 2013 13:30:10 -0400
Auteur : "Rich..." <dbas.e@autotraker.com>
Distribution : dbase.programming |
|
Si vous voyez des erreurs, n'hésitez pas à le signaler.
Dernière modification : dimanche 11 août 2013
© M.A.
|