titre_site.jpg (51607 octets)

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

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

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

form.rowset.delete()

 

bug_jpg.jpg (2635 octets)  Les difficultées rencontrées :

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.