titre_site.jpg (51607 octets)

SET EXCLUSIVE

Commande dBase IV et suivants

Contrôle si les tables ouvertes par dBASE ainsi que leurs fichiers mémo et index associés le sont en mode exclusif ou partagé.

Syntaxe

SET EXCLUSIVE on | OFF

Valeur par défaut

La valeur par défaut de SET EXCLUSIVE est OFF. Pour la modifier, définissez le paramètre EXCLUSIVE dans DBASEWIN.INI. Pour cela, utilisez la commande SET pour spécifier interactivement le paramétrage ou spécifiez directement le paramètre EXCLUSIVE dans DBASEWIN.INI.

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

Lorsque vous émettez SET EXCLUSIVE ON, les tables ouvertes (et leurs fichiers index et mémo associés) sont en mode exclusif, à moins que vous ne les ouvriez avec USE...SHARED. Lorsque vous ouvrez une table en mode exclusif, les autres utilisateurs ne peuvent pas ouvrir, visualiser, ni modifier le fichier et ses fichiers mémo et index associés. Si vous essayez d'ouvrir une table qu'un autre utilisateur a ouvert en mode exclusif, dBASE affiche un message d'erreur.


SET EXCLUSIVE OFF provoque l'ouverture en mode partagé des tables (et de leurs fichiers index et mémo), à moins que vous ne les ouvriez avec USE...EXCLUSIVE. Si une table en mode partagé est dans un répertoire partagé sur le réseau, les autres utilisateurs sur le réseau ayant accès au répertoire peuvent ouvrir, visualiser et modifier le fichier ainsi que ses fichiers mémo et index.

Si vous utilisez SET INDEX et que la table est ouverte en mode exclusif, dBASE ouvre l'index aussi en mode exclusif. Si la table est ouverte en mode partagé avec USE...SHARED, dBASE ouvre l'index dans le mode spécifié par USE.
Un index créé avec INDEX est ouvert en mode exclusif, que la table soit ouverte en mode partagé ou exclusif ou quel que soit le paramétrage de SET EXCLUSIVE. Après la création d'un index, vous pouvez l'ouvrir en mode partagé avec USE...INDEX...SHARED ou en émettant SET EXCLUSIVE OFF suivie de SET INDEX TO.

Les commandes suivantes requièrent l'utilisation exclusive d'une table avec soit SET EXCLUSIVE ON, soit USE...EXCLUSIVE :

    CONVERT
    COPY INDEXES
    DELETE TAG
    INDEX...TAG
    INSERT
    INSERT AUTOMEM
    INSERT BLANK
    MODIFY STRUCTURE
    PACK
    REINDEX
    ZAP

 

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

Le fichier d'aide dit que EXCLUSIVE est toujours OFF. Toutefois, en OODML, les méthodes de l'objet base de données comme packTable(), reindex() nécessitent que la table puisse être consulté exlusivement. Si la table est déjà ouverte par une autre requête (la propriété active de la requête est vrai), alors ces méthodes échouent.

La vraie difficulté est que, dans DB2K, alors que c'est "dessiné ainsi", si vous essayez d'ouvrir une table qui est déjà ouverte en mode exclusif, il n'y a pas d'erreurs récupérables, et pour augmenter encore plus de plaisir, «USE tablename EXCLUSIVE» ne renvoie pas une erreur non plus. Gary White a mis en place un code qui va vérifier si une table a été ouverte avec succès exclusivement:

function useExclusive

// vous dira si une table PEUT être ouverte en mode exclusif,

// rien ne garantit que cela le restera si vous n'agissez pas rapidement

parameter cTableName

local bSuccess, bContinue

bSuccess = true

bContinue = true

do

   try

      use &cTableName excl in select()

   catch ( exception e )

      // l'erreur la plus probable ici est : "File does not exist"

      // L'impossibilité de faire un usage exclusif ne sera pas interceptée ici

      MsgBox( e.message, "Erreur: " + ltrim( str(e.code) ), 16 )

      return false

   endtry

   try

      // Celui-ci va générer une exception

      delete tag "myDummyXYZ"

      exit

   catch ( exception e )

      // erreur 53 est "Tag does not exist"

      bSuccess := e.code == 53

      if bSuccess

         exit

      endif

      if e.code == 110    // utilisé par un autre

         bContinue := MsgBox( "Fichier utilisé par un autre", "Alerte", 48+5 ) == 4

      else // une autre erreur

         bContinue := MsgBox( e.message, "Erreur: " + ltrim( str(e.code) ), 16 + 5 ) == 4

      endif

      use

   endtry

until bSuccess or (not bContinue)

return bSuccess

Cette fonction utilise effectivement les commandes XBase en combinaison avec un bloc try / catch pour tenter d'ouvrir la table en mode exclusif. Si cela échoue, elle renvoie une erreur.

Pour l'utiliser pour, par exemple, "packer" une table en utilisant l'OODML, vous appelez la fonction, et si elle revient «vrai», fermer la table (qui est maintenant ouverte exclusivement), puis appelez la méthode packTable.

if useExclusive( cTableName )

   use in &cTableName // ferme la table

  _app.databases.packTable( cTableName )

endif

 

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

Dans l'exemple suivant, la table SOCIETE est ouverte avec SET EXCLUSIVE ON afin qu'un nouvel index soit créé. Après création, SOCIETE est réouverte avec EXCLUSIVE OFF :

CLOSE ALL
SET EXCLUSIVE ON
USE SOCIETE
INDEX ON C_SOCIETE+SOCIETE TAG CompComp
SET EXCLUSIVE OFF
* Les nouvelles commandes USE ne seront plus en exclusif
* Mais SOCIETE est actuellement en exclusif
USE SOCIETE ORDER CompComp
* Ceci libère le verrouillage exclusif de SOCIETE

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 : samedi 07 août 2010

©  M.Abraham.