Partage de fichiers [Résolu]

Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 28 juil. 2011 à 08:45 - Dernière réponse :
Messages postés
8
Date d'inscription
mardi 20 mai 2003
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
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 juil. 2011 à 10:17
3
Merci
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

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 juil. 2011 à 11:58
3
Merci
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

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 juil. 2011 à 14:53
3
Merci
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

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Meilleure réponse
Messages postés
308
Date d'inscription
jeudi 29 septembre 2005
Dernière intervention
17 septembre 2013
- 29 juil. 2011 à 14:11
3
Merci
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;

Merci beckerich 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de beckerich
Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 29 juil. 2011 à 15:08
3
Merci
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

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 29 juil. 2011 à 15:08
3
Merci
Je voulais dire:
Attention quand même car ça ne marche pas pour les SGBD client/serveur.


Composants Cindy pour Delphi

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Meilleure réponse
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 29 juil. 2011 à 15:09
3
Merci
De plus, la question était "partage de fichier" et non pas locker un enregistrement ^^


Composants Cindy pour Delphi

Merci cs_MAURICIO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de cs_MAURICIO
Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 28 juil. 2011 à 11:44
0
Merci
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.
Commenter la réponse de cs_ELICO
Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 28 juil. 2011 à 14:31
0
Merci
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+
Commenter la réponse de cs_ELICO
Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 28 juil. 2011 à 15:50
0
Merci
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+
Commenter la réponse de cs_ELICO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Dernière intervention
15 décembre 2014
- 28 juil. 2011 à 15:54
0
Merci
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
Commenter la réponse de cs_MAURICIO
Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 28 juil. 2011 à 17:40
0
Merci
Merci MAURICIO et peut être à bientôt



CELMAR
Commenter la réponse de cs_ELICO
Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 29 juil. 2011 à 14:36
0
Merci
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
Commenter la réponse de cs_ELICO
Messages postés
8
Date d'inscription
mardi 20 mai 2003
Dernière intervention
29 juillet 2011
- 29 juil. 2011 à 18:00
0
Merci
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
Commenter la réponse de cs_ELICO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.