Partage de fichiers

Résolu
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 juillet 2011 - 28 juil. 2011 à 08:45
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 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.

Merci d'avance

14 réponses

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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!

A+


Composants Cindy pour Delphi
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
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...

A+



Composants Cindy pour Delphi
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 juil. 2011 à 14:53
Normalement,

je fais ça:

try
table1.Exit;
except
ShowMessage('Cet enregistrement est en édition par un autre programme');
end;

Mais je suppose que ton problème de share ne se résoud pas si facilement ...

A+

Composants Cindy pour Delphi
3
beckerich Messages postés 302 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 17 septembre 2013 2
29 juil. 2011 à 14:11
bonjour,

@mauricio,

pour locker un enregistrement, si tu mets l'enregistrement en Edit, ça ne suffit pas ?
C'est juste une idée qui me passe par la tête...

try
Query.Edit;
finally
Query.Cancel;
end;

Luc;
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
29 juil. 2011 à 15:08
lol,

mon 3ème post sur cette question:
"Normalement,

je fais ça:

try
table1.Edit;
except
ShowMessage('Cet enregistrement est en édition par un autre programme');
end;

Mais je suppose que ton problème de share ne se résoud pas si facilement ...

A+
"

ce qui veut dire que tu n'as pas testé ma méthode

Attention quand même car ça ne marche que pour les SGBD client/serveur.

A+


Composants Cindy pour Delphi
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
29 juil. 2011 à 15:08
Je voulais dire:
Attention quand même car ça ne marche pas pour les SGBD client/serveur.


Composants Cindy pour Delphi
3
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
29 juil. 2011 à 15:09
De plus, la question était "partage de fichier" et non pas locker un enregistrement ^^


Composants Cindy pour Delphi
3
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 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.
0
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 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.

A+
0
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 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.

Je reste à l'écoute de vos bons conseils.

A+
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
28 juil. 2011 à 15:54
Je suis désolé mais je n' ai aucune autre idée.

D' ailleurs, je chercher moi-même un moyen simple de locker un enregistrement (et de pouvoir si un enregistrement est locké) d' une table sous MYSQL.

A+


Composants Cindy pour Delphi
0
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 juillet 2011
28 juil. 2011 à 17:40
Merci MAURICIO et peut être à bientôt



CELMAR
0
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 juillet 2011
29 juil. 2011 à 14:36
Bravo Beckerich

Tout d abord Bonjour,

Après tout ce parcours initiatique, j'en étais exactement au même endroit et tu confirmes et ça c'est agréable.

le lock c'est "Edit" et le unlock c'est ....."Post".

Ex:
FicheTables.TableRetour.Edit;
FicheTables.TableRetour.FieldByName('NUMERO').Value:=1;
FicheTables.TableRetour.Post;

Je cherche la confirmation dans une aide fantôme...

Au faite.. où trouve t'on une aide en français de delphi en dehord de l'aide delphi intégrée...?

Merci

A+

CELMAR
0
cs_ELICO Messages postés 8 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 29 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 ......

je pars en week end et lundi sera un autre jour.

Bon weekend

CELMAR
0
Rejoignez-nous