Page 1 sur 1

Comment savoir qu'un document est ouvert

MessagePosté: Mar 10 Sep 2013 09:21
de atagleike
Bonjour,

Je voudrais savoir, par l'utilisation des objets métier, si un document de vente est ouvert (en cours de modification ou de consultation) ou pas. J'ai essayé diverses méthodes, mais rien de vraiment efficace.

Quelqu'un a une idée ?

Merci

Hervé

Re: Comment savoir qu'un document est ouvert

MessagePosté: Dim 6 Oct 2013 14:32
de nizarbraham
Essaye ce code qui affiche tous les documents bloqués
Code: Tout sélectionner
SET NOCOUNT ON
DECLARE @DO_PIECE varchar(9)
DECLARE @DO_TYPE smallint
DECLARE @DO_DOMAINE smallint
DECLARE @DO_cbMarq int
DECLARE @DO_Dure_Contrat numeric
DECLARE @DO_majorachat numeric
DECLARE @lock int

DECLARE MyCursor CURSOR FOR
 SELECT DO_PIECE,DO_TYPE,DO_DOMAINE,cbMarq FROM F_DOCENTETE
 
 ORDER BY cbMarq

OPEN MyCursor -- j'initialise mon curseur
 
-- je le rempli avec la première ligne retournée par la requête
FETCH NEXT FROM MyCursor INTO @DO_PIECE, @DO_TYPE, @DO_DOMAINE, @DO_cbMarq
 
-- Tant que je n'ai pas traité tous les enregistrements de le requête
WHILE @@FETCH_STATUS  = 0
BEGIN
    exec CB_IsRecordLock 'F_DOCENTETE', @DO_cbMarq, @lock OUTPUT --Test si l'enregistrement est locké
    IF @lock > 0 print @DO_PIECE
           
   
   
    FETCH NEXT FROM MyCursor INTO @DO_PIECE, @DO_TYPE, @DO_DOMAINE, @DO_cbMarq
END
 
CLOSE myCursor -- je ferme mon curseur
DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur


Salutations

Re: Comment savoir qu'un document est ouvert

MessagePosté: Mar 5 Nov 2013 15:31
de Tim
il y a la méthode CouldModified qui permet de vérifier si un document est verrouillé et si ce n'est pas le cas ça le verrouille.

ensuite les méthodes read, write ou writedefault déverrouillent

Re: Comment savoir qu'un document est ouvert

MessagePosté: Jeu 28 Nov 2013 12:33
de DaliPieo
Bonjour à tous,

@Tim: avez vous un code à tester pour le dévérouillage..c'est intéressent! :D

Cordialement

Re: Comment savoir qu'un document est ouvert

MessagePosté: Mer 4 Déc 2013 19:45
de nizarbraham
Essaye ce code dont j'ai oublié l'origine
Code: Tout sélectionner
USE ma_base
DECLARE @LOCK int
DECLARE @lBase int
DECLARE @lTable int
DECLARE @lRes int
DECLARE @ress int
DECLARE @spid int
DECLARE @sp int

DECLARE MyCursor CURSOR FOR
SELECT cbMarq FROM F_DOCENTETE where DO_Piece='d3004428' -- BCXXX = NUMERO DE PIECE (numero du document)
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @ress

set @spid = 0

WHILE @spid < 200 -- on considère que 200 est un gros chiffre mais vous pouvez le mettre plus haut
BEGIN
set @spid=@spid+1
SET NOCOUNT ON
SELECT @lBase = DB_ID()
SELECT @lTable = OBJECT_ID('F_DOCENTETE')
EXECUTE @lRes = master..xp_CBUnLockRecord @spid,@lBase,@lTable, 3,@ress -- essaye de débloquer le document du processus
IF @lRes <> 0
RAISERROR(@lRes,11,1) WITH SETERROR

exec CB_IsRecordLock 'F_DOCENTETE', @ress, @LOCK OUTPUT -- test si le document est toujours bloqué
print @LOCK -- renvoi 1 si bloqué et 0 pour debloqué
print @spid
END

CLOSE myCursor
DEALLOCATE myCursor

Salut

Re: Comment savoir qu'un document est ouvert

MessagePosté: Lun 3 Mar 2014 12:25
de Tim
Désolé ça faisait un moment que je n'étais pas venu sur le forum.

le test est tout simple :

try
monDoc.CouldModified
mondoc.read
catch ex as exception
msgbox ("Doc ouvert")
end try

Re: Comment savoir qu'un document est ouvert

MessagePosté: Mer 30 Sep 2015 15:49
de gremlins13
Merci à tous,

Je réponds très très très très très tard, J'ai pris en compte toutes vos propositions, et finalement j'ai opté pour une solution très simple mais qui satisfait à ce que demande mon programme : c'est à dire je tente un simple update sur le document (par exemple 'UPDATE F_DOCENTETE SET DO_STATUT=DO_STATUT WHERE DO_PIECE='BCXXXXX') encapsulé dans un try except. Si j'ai une exception, j'en déduis que le document est ouvert quelque part, à condition, bien sur, que le document existe, mais ça , c'est une autre requête.

Re: Comment savoir qu'un document est ouvert

MessagePosté: Jeu 1 Oct 2015 14:24
de romulus001
La fonction dbo.CB_FntIsRecordLock permet de faire cela, si elle renvoie 0, le document n'est pas ouvert, 1 sinon.

1er paramètre en entrée : le nom de ta table où tu veux faire ton test (exemple: F_DOCENTETE)
2eme paramètre en entrée : la valeur du cbmarq de ta table concernée