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