cs_ELICO
Messages postés8Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention29 juillet 2011
-
28 juil. 2011 à 08:45
cs_ELICO
Messages postés8Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention29 juillet 2011
-
29 juil. 2011 à 18:00
Bonjour,
Suite à une impossibilité de partager des fichiers "DBF" avec les utilitaires "APOLLO", j'ai donc cherché une procedure dont voici le source... (Auteur : Amadeus)
/....
Function LockFichier(sFich: string): hFile;
var
HandleFich: hFile;
// le type HFile n'est rien d'autre d'un LongWord
wHSize, wSize: longword;
ofs: TOFStruct; // on ne s'en servira pas (c'est juste pour le passer à OpenFile
begin
result:= 0;
if FileExists(sFich) then
begin
// on ouvre le fichier et on récupére son Handle
HandleFich:= OpenFile(pChar(sFich), ofs, OF_READ or OF_WRITE or OF_SHARE_EXCLUSIVE);
if HandleFich <> 0 then
begin
// on récupére la taille du fichier
wSize:= GetFileSize(HandleFich, @wHSize);
// on doit donné a LockFile la partie du fichier a verrouiller (c'est borne)
if LockFile(hf, 0, 0, wSize, wHSize) then
result:= HandleFich;
end;
end;
end;
Procedure UnLockFichier(HandleFich: hFile);
begin
if HandleFich <> 0 then
CloseHandle(HandleFich);
end;
/....
En bon débutant...donc mauvais. j' ai pris le code directement en copier coller dans mon source et compiler l'ensemble dans "DELPHI7".
Le résultat ne c'est pas fait attendre, erreur la variable .....inconnue.
.....
// on récupére la taille du fichier
wSize:= GetFileSize(HandleFich, @wHSize);
// on doit donné a LockFile la partie du fichier a verrouiller (c'est borne)
if LockFile(hf, 0, 0, wSize, wHSize) then
result:= HandleFich;
.....
[Erreur] FRetours.pas(542): Identificateur non déclaré : 'hf'
Effectivement cette variable n'est pas déclarée et comme je ne comprend pas tout et ne trouvant aucune explication sur la fonction "LockFile" (qui doit faire partie de l' API Windows) je ne sais pas à quoi correspond "hf". if LockFile(hf, 0, 0, wSize, wHsize).
peut être que hf correspond à HandleFich.
La raison à des raisons que la raison ignore, Mais l'ignorance c'est pire.
Ceci dit je suis un peu perplexe sur la difficulté rencontrée en DELPHI7 à locker et delocker un fichier partagé sur un réseau.
si, devant mon désarrois, quelqu'un ou quelle qu'une ont une méthode pour me sortir d'une ignorance aussi abyssale; je suis preneur.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 28 juil. 2011 à 10:17
Salut,
il me semble que toute base de données ont la possibilité de locker une table.
Dans ton exemple et avec les compos BDE (TTable), il suffit de mettre la propriété Exclusive à true!
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 28 juil. 2011 à 11:58
Il faut mettre la propriété Exclusice à true AVANT d' ouvrir la table!
Si un message d' erreur survient, c' est que la table est déjà utilisée par un autre programme...
cs_ELICO
Messages postés8Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention29 juillet 2011 28 juil. 2011 à 11:44
Merci Mauricio,
Mais le contexte est tel que les bases de données sont partagées (share) et que la commande "exclusive" implique au contexte de mettre la base en "exclusive off".
Aussi la commande "exclusive" s’étend sur la totalité de la base.
Donc un message d'erreur "cannot perform this operation on an open table".
La fonction exclusive est trop (exclusive).
"lockfile" est plus adapté, mais cette API n'est pas de mon niveau de programmation et pourtant cela a l'air d'être possible...Dommage.
merci encore et A+
PS: il serait intéressant d'expliquer le --contexte-- mais si on peut s'en passer ça sera plus rapide.
cs_ELICO
Messages postés8Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention29 juillet 2011 28 juil. 2011 à 14:31
Super présence MAURICIO,
Merci,
Alors alons un peu plus loin...
1 - le code delphi
/.....
If Key=VK_DELETE then
Begin
// cela ne marche pas.......
//IsRecordLocked(FicheTables.TableRetour,FALSE);
// cela ne marche pas.......non plus
//sfich := 'd:\x43276\elicocli\Retour.dbf';
//LockFichier(sfich):hFile;
If application.MessageBox( PChar('DESTRUCTION DU BORDEREAU ! N°: ' + fichetables.TableTemp_Ret.FieldByName('NUMERO').AsString ), PChar(' ATTENTION'), MB_OKCANCEL) = idok then
Begin
Application.ProcessMessages;
// cela ne marche pas.......
//sFich := FicheTables.TableRetour.TableName;
//LockFichier(sFich);
//avoir....
FicheTables.TableRetour.Exclusive := true;
//
FicheTables.TableRetour.ACTIVE:=true;
FicheTables.TableRetour.SetOrder(1);
Fichetables.TableTemp_Ret.active := true;
//avec SQL..... trop lourd
//FicheTables.TableRetour.SetKey;
//FicheTables.TableRetour['NUMEROC']:=Query2.FieldByName('NUMEROC').AsString;
//FicheTables.TableRetour.GoToKey;
NUMERO := Fichetables.TableTemp_Ret.FieldByName('NUMERO').value;
NUMERO2 := Fichetables.TableTemp_Ret.FieldByName('NUMERO').value;
NUMEROC := Fichetables.TableTemp_Ret.FieldByName('NUMEROC').AsString;
// petit control...
//Edit1.text := inttostr(NUMERO2);
application.ProcessMessages;
FicheTables.TableRetour.Seek(NUMEROC);
While ((NUMERO2=NUMERO) and not (FicheTables.TableRetour.EOF)) do
begin
If FicheTables.TableRetour.EOF then
begin
break;
end;
//cela ne marche pas.......
//FicheTables.TableRetour.Locked(FicheTables.TableRetour.Recno);
FicheTables.TableRetour.Edit;
FicheTables.TableRetour.FieldByName('NUMERO').Value:= 1;
FicheTables.TableRetour.Post;
// cela ne marche pas.......
//FicheTables.TableRetour.unlock(FicheTables.TableRetour.Recno);
FicheTables.TableRetour.Next;
NUMERO2 := FicheTables.TableRetour.FieldByName('NUMERO').value;
end;
/.....
ce code change le champ "NUMERO" par 1 tant que variable numero2 = champ NUMERO c'est tout .
cette table est partagée en (share) par d'autres utilisateurs, quand un utilisateur veut écrire dans la table il (lock) la table entiere ou uniquement l'enregistrement et (unlock) après l'écriture des modifs.
Bon disons que (exclusive) est trop radicale comme fonction, elle impose que le fichier soit complétement libéré par les autres utilisateurs.
C'est pourquoi, le code de Amadeus m'interresse.
Il me s'emble qu'il travail à un autre niveau avec le (HandleFich).
Merci de votra patience, mais généralement j'arrive à mes fins, mais là il y a un os.
cs_ELICO
Messages postés8Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention29 juillet 2011 28 juil. 2011 à 15:50
Merci encore MAURICIO
Mais oui je crois que le problème réside sur le niveau de surveillance des fichiers partagés et que je ne vois pas pourquoi dans délphi7 il y a cette difficulté.
/....
exemple dans HARBOUR
// on déclare l'environnement de toutes les bases en ouverture non exclusive
set exclusive off
// on active l'ouverture de la base en partage (share)
select 0
use &mretour shared
// on contrôle la possibilité de locker (rlock/lock) par la procedure "partage2"
procedure partage2
touche = space(1)
do while .not. rlock() .and. touche = space(1)
if .not. rlock()
tone(261.70,0.33)
tone(261.70,0.33)
if iscolor()
setcolor("W+/R, BG+/B,,,W+/R")
endif
@ 0,0 say "PARTAGE FICHIER SUR AUTRE POSTE tapez ESPACE pour reessayer !!!!" get touche
read
if lastkey() = K_ESC
@ 0,0 say "VOUS VOULEZ SORTIR O/N [O]=Sortie [N]=Reessayer " get touche picture "!"
read
if touche = "O"
clear all
release all
quit
endif
endif
touche = space(1)
set color to
@ 0,0 clear to 0,78
endif
enddo
// ouvre les index
set index to (xnumc),(xretour)
unlock()
/.....
// si on veut écrire dans la base
select &mretour
// lock le fichier
partage2()
replace champ1 with [valeur1]
//deblocage du fichier (unlock)
unlock()
unlock / rlock / lock sont des objets qui positionne l'environnement actif en débloquage / base bloquée pour écrire / enregistrement bloqué pour écrire.
Je ne sais pas si l'exemple éclairci le sujet ou au contraire.
cs_ELICO
Messages postés8Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention29 juillet 2011 29 juil. 2011 à 18:00
Hello MAURCIO
Toujours présent et attentif.
Effectivement "EDIT" et "POST" ne s'intéressent qu'à l'enregistrement.
Mais la intervient la notion "EXCLUSIVE" ou la on prend la main sur le fichier pour des effacements ou créations .....Encore faut il que le fichier ne soit plus partagé par un tiers.
Pour ce qui concerne l'appli en question, le utilisateur débraille la nuit et la je planifie les effacements, indexations, et autres ......