| |

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.
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
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 |
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.
|