Práce Foxpro 2.0 v síti
Práce
v síti je plně automatizována. Problémy jsou pouze při sdílení souborů.
V okamžiku změny obsahu záznamu je tento nepřístupný pro změny jiným uživatelem.
problém se ošetřuje příkazem SET REPROCES. Příkazy pracující s celým
souborem (PACK, COPY FROM, ZAP,..) vyžadují exklusivní otevření. Rušení yáynam;
nutno tedy pro víceuživatelský přístup řešit pouze příkazy .....
Řízení automatického uzamykání
SET REPROCESS TO <expN> [SECONDS] | TO AUTOMATIC
Určuje, jakým způsobem se
bude provádět uzamykání vět nebo souborů. Tímto příkazem určíme, jak
dlouho (<expN> SECONDS) nebo kolikrát (<expN> bez SECONDS) se bude
opakovat pokus uzamčení věty nebo souboru. Hodnota <expN> může být v
rozsahu -2 až 32000, implicitní hodnota je 0.
Tvar SET REPROCESS TO 0
-
je nastaven příkaz ON ERROR, pak po prvním neúspěšném pokusu o uzamčení
se provede akce zadaná v příkazu ON ERROR.
-
není nastaven příkaz ON ERROR a uzamčení je prováděno příkaze, pak se
pokus bude opakovat nekonečně krát. (Současně se zobra zí hlášení a činnost
příkazu lze přerušit klávesou Escape.) - není nastaven příkaz ON ERROR a
uzamčení je prováděno funkcí, není zobrazeno hlášení a funkce vrací
.F. .
Tvar SET REPROCESS TO -1
-
způsobí nekonečné množství pokusů o uzamčení věty nebo souboru s tím,
že není možno tento proces přerušit stlačením klávesy Escape a nelze použít
příkaz ON ERROR.
Tvar SET REPROCESS TO -2
-
způsobí stejnou činnost jako parametr nula nebo fráze TO AUTOMATIC. Oba
atributy musí být stanici přiřazeny administrátorem sítě. Není-li
stanice připojena k síti, vrací funkce řetězec deseti mezer plus znak
"#" následovaný mezerou a nulou. Jednouživatelská verze FoxPro
vrací jedničku. Vrácený řetězec je shodný se zprávou vypisovanou na
stavovém řádku (Exclusive, Record Unlocked atd.).
Zamykání souboru
FLOCK([<alias>])
Pokusí se uzamknout databázový
soubor a v případě úspěchu vrací .T. Ostatní uživatelé v síti mají
pak k uzamčenému souboru přístup pouze pro čtení. Jsou-li definovány jakékoliv
vazby na jiné soubory, uzamkne se vždy jen zadaný soubor. Pokus o uzamčení
se provede jen jedenkrát, není-li určeno jinak nastavením SET REPROCESS. Zrušení
uzamčení může provést jen uživatel, který soubor uzamkl a to buď příkazem
UNLOCK, uzavřením souboru nebo ukončením práce s FoxPro.
SET EXCLUSIVE ON | OFF
Určuje, zda databázový
soubor bude otevřen výhradně pro jednoho uživatele nebo ve sdíleném režimu.
Nastavení platí pro všechny databázové soubory, chceme-li otevřít jen některé
v módu EXCLUSIVE, použijeme frázi EXCLUSIVE v příkazu USE. (Doporučeno
nastavit v cofnig.fp na off).
Zamykání záznamů
RLOCK([<alias>] | [<expC>, <alias>])
nebo
LOCK([<alias1>] | [<expC>, <alias2>])
Pokus o uzamčení určených
vět databázového souboru, v případě úspěchu vrací .T.. Příkazy jsou
identické. Věta je po uzamčení přístupná pro ostatní uživatele v síti
pouze pro čtení. Provede se pouze jediný pokus o uzamčení věty, není-li příkazem
SET REPROCESS určeno jinak. Je-li nastaven příkaz SET MULTILOCK OFF, lze příkazem
uzavřít jednu - aktuální větu souboru otevřeného v aktuální oblasti,
nebo v oblasti zadané parametrem <alias1>. Následující uzamčení jiné
věty téhož souboru zruší případné předchozí nastavení. Je-li nastaven
příkaz SET MULTILOCK ON, lze uzamknout více vět jednoho souboru. Seznam čísel
vět zadáme parametrem <expC> (např. "1,2,5,...") a v tomto případě
se musí zadat jméno alias <alias2>. Je-li zadáno k uzamčení více vět
a nepodaří se všechny uzamknout, funkce vrací .F. a neuzamkne se žádná věta
zadaná v seznamu. Zrušit uzamčení může jen ten uživatel, který uzamčení
provedl a to buď příkazem UNLOCK, uzavřením souboru nebo ukončením práce
s FoxPro.
LOCK("1,5,12", "b")
SET LOCK ON | OFF
Určuje, zda se budou
automaticky uzamykat věty Implicitní hodnota SET LOCK OFF znamená, že příkazy,
které. vyžadují k práci přístup pouze pro čtení neuzamykají databázový
soubor. Potřebujeme-li zabránit tomu, aby se během práce databázový soubor
změnil zásahem jiného uživatele, nastavíme příkaz SET LOCK ON nebo příkazem
FLOCK() uzamkneme příslušné soubory.
SET MULTILOCKS ON | OFF
Umožňuje nebo zabraňuje
uzamykání více vět souboru Implicitní hodnota SET MULTILOCK OFF povoluje
uzamknout. pouze jednu větu souboru. Nastavení příkazu ON umožňuje
uzamknout více vět souboru současně.
Obnova celoobrazovkových příkazů
SET REFRESH TO <expN>
Určuje, jak se budou
zobrazovat změny vět provedené jinými uživateli v síti. Nenulová hodnota
<expN> v rozmezí 0 až 3600 určuje ve vteřinách, jak často se budou
promítat změny provedené ostatními uživateli v síti v databázových
souborech. Implicitní hodnota je 5 vteřin. Změny se projeví ve větách
zobrazených příkazem BROWSE, příkazy CHANGE a EDIT bez formátu a příkazem
MODIFY MEMO pro memo položky. Na věty zobrazované jiným způsobem příkaz
nemá vliv.
Odemykání
UNLOCK [IN <alias> | ALL]
Zruší uzamčení vět nebo
souborů. v zadané oblasti nebo všechna uzamčení provedená uživatelem
(ALL). Příkaz bez parametrů zruší uzamčení vět nebo souboru v aktuální
oblasti.
Cvičení
Zamykání souboru
nazev =
'PŘÍKLAD PROCEDURY ZAMYKAJÍCÍ SOUBOR'
PUBLIC chyb_cas,max_chyb_cas
&& Doba potřebná k ošetření
max_chyb_cas=5
&& Max. doba ošetření
chyb_cas=0.2
&& Počáteční hodnota doby
use diners
do zamykani with 5
PROCEDURE zamykani
PARAMETERS doba
PRIVATE zacatek
zacatek=VAL(SYS(2))
DO WHILE VAL(SYS(2))<zacatek+doba
IF FLOCK()
EXIT
ENDIF
ENDDO
WAIT 'SE SOUBOREM PRACUJE JINÝ UŽIVATEL' WIND
A=1
@3,4 GET A
FUNCTION "*T Návrat do hlavního menu;"+;
" \<Zobrazit kdo pracuje;
\<Poslat zprávu ostatním" ;
SIZE 3,40
READ
DO CASE
CASE A=1
RETURN TO
MASTER
CASE A=2
RETURN TO
MASTER
CASE A=3
RETURN TO
MASTER
ENDCASE
Jednoduché ošetření
chyb
nazev =
'PŘÍKLAD OŠETŘENÍ CHYB PŘI PRÁCI V SÍTI'
clea
@14,1 SAY nazev
PUBLIC chyb_cas,max_chyb_cas
&& Doba potřebná k ošetření
max_chyb_cas=5
&& Max. doba ošetření
chyb_cas=0.2
&& Počáteční hodnota doby
i=1
ON ERROR DO osetreni WITH ERROR() &&
Nastavení ošetření chyby
USE neexistujici.soubor
&& Uměle vyvolaná chyba č 1
@16,1 SAY "Maximální doba ošetření:
"+str(chyb_cas,3,1)+' sec'
PROCEDURE osetreni
PARAMETERS error
&& Číslo chyby
PRIVATE chyba,bacha,error,od,po,e,a
i=i+1
SET TALK off
chyba = "109 Záznam blokuje jiný uživatel
109"+;
"110 Soubor není exklusivní
110"+;
"108 Soubor blokuje jiný uživatel
108"+;
" 1 Soubor byl zrušen
1"+;
"124 Tiskárnu nelze sdílet
124"
bacha=' - čekat nebo K(onec)'
e=STR(error,3)
od=at(e,chyba)+4
po= rat(e,chyba)-od
a=' '
IF OD>0
&& Závada ze seznamu ?
WAIT SUBSTR(chyba,od,po)
;
+ bacha
TIME chyb_cas WINDOW to a
ELSE
WAIT "Závada číslo " +
e + ' '+MESSAGE() ;
+ bacha
TIME chyb_cas WINDOW to a
ENDIF
if a$'Kk'
RETURN TO MASTER
&& Uživatel končí
else
DO automatika
endif
RETRY
* Automatické
nastavování maximální doby ošetření chyby
PROCEDURE automatika
chyb_cas=IIF
(chyb_cas<max_chyb_cas,chyb_cas+0.2,max_chyb_cas)
SET REPROCES TO chyb_cas SECONDS
IF ERROR()>0 AND chyb_cas<max_chyb_cas
RETRY
ELSE
RETURN
ENDIF
Zamykání souborů v síti
(varianta)
nazev =
'PŘÍKLAD PROCEDURY ZAMYKAJÍCÍ SOUBOR'
PUBLIC chyb_cas,max_chyb_cas
&& Doba potřebná k ošetření
max_chyb_cas=5
&& Max. doba ošetření
chyb_cas=0.2
&& Počáteční hodnota doby
use diners
do zamykani with 5
PROCEDURE zamykani
PARAMETERS doba
PRIVATE zacatek
zacatek=VAL(SYS(2))
&& Čas zahájení pokusu
DO WHILE VAL(SYS(2))<zacatek+doba
&& Sledování doby pokusu
IF FLOCK()
&& Pokus o uzamčení
RETURN
&& Po úspěchu výstup
ENDIF
SET
WAIT 'SE SOUBOREM PRACUJE JINÝ UŽIVATEL' WIND
A=1
@3,4 GET A
FUNCTION "*T Návrat do hlavního menu;"+;
" \<Zobrazit kdo pracuje;
\<Poslat zprávu ostatním" ;
SIZE 3,40
READ
DO CASE
CASE A=1
RETURN TO
MASTER
CASE A=2
RETURN TO
MASTER
CASE A=3
RETURN TO
MASTER
ENDCASE
Ošetření chyb s
automatickým nastavením doby čekání
n = 'PŘÍKLAD OŠETŘENÍ CHYB PŘI PRÁCI V SÍTI'
clea
@14,5 SAY n
@13,3 to 15,len(n)+7 double
max_chyb_cas=5
&& Max. doba ošetření
chyb_cas=0.2
&&
Počáteční hodnota doby
i=1
ON ERROR DO osetreni WITH ERROR() &&
Nastavení ošetření chyby
* test
USE neexistujici.soubor
&& Uměle vyvolaná chyba č 1
@20,1 SAY "Maximální doba ošetření:
"+str(chyb_cas,3,1)+' sec'
PROCEDURE osetreni
PARAMETERS error
&& Číslo chyby
PRIVATE chyba,bacha,error,od,po,e,a
i=i+1
SET TALK off
chyba = "109 Záznam blokuje jiný uživatel
109"+;
"110 Soubor není exklusivní
110"+;
"108 Soubor blokuje jiný uživatel
108"+;
" 1 Soubor byl zrušen
1"+;
"124 Tiskárnu nelze sdílet
124"
bacha=' - čekat nebo K(onec)'
e=STR(error,3)
od=at(e,chyba)+4
po= rat(e,chyba)-od
* Potřebné pozdržení se signalizací
a=' '
IF OD>0
&& Závada ze seznamu ?
WAIT SUBSTR(chyba,od,po)
;
+ bacha
TIME chyb_cas WINDOW to a
ELSE
WAIT "Závada číslo " +
e + ' '+MESSAGE() ;
+ bacha
TIME chyb_cas WINDOW to a
ENDIF
* Ukončení práce podprogramu
if a$'Kk'
RETURN TO MASTER
&& Uživatel končí
else
DO automatika
endif
if i>2
&& Povoleny pouze 2 pokusy
return
endif
RETRY
Automatické nastavování
maximální doby ošetření chyby
PROCEDURE automatika
chyb_cas=IIF
(chyb_cas<max_chyb_cas,chyb_cas+0.2,max_chyb_cas)
SET REPROCES TO chyb_cas SECONDS
IF ERROR()>0 AND chyb_cas<max_chyb_cas
RETRY
ELSE
RETURN
ENDIF