Search  
Friday, May 25, 2012 ..:: Forum ::.. Register  Login
 Forum Minimize
Pentru a putea posta mesaje trebuie să vă înregistraţi.
Notă: Mesajele cu conţinut jignitor sau ilegal (inclusiv cereri de soft piratat) nu sunt acceptate şi vor fi şterse imediat .

Pentru a primi raspunsuri rapide si corecte, scrieti in mesaj ce intentionati sa faceti, ce mesaj de eroare primiti, in ce context si in urma caror actiuni. De asemenea, mentionati versiunea de FoxPro in care lucrati!
Dacă nu specificați versiunea, se consideră VFP 9.0 SP2.

SearchForum Home
  Visual FoxPro  Client/Server  Update DB in ti...
 Update DB in timp real
 
 1/30/2009 8:57:49 AM
User is offlinelmax25
57 posts


Update DB in timp real
 (N/A)

Salut.

Vreau sa fac si eu o aplicatie in VFP+MS SQL Express dar sint abia la inceput....

Exemplu :

Aplicatia se bazeaza pe stocuri(intrari-iesiri) cu baza de date pe server. In acelasi timp 2 sau mai multi useri vor sa vinda un anumit produs.Bineinteles ca atunci fiecare are deja pe PC-ul lui cursorul cu stocurile din magazie - aceleasi cantitati la fiecare produs.Unul dintre ei scade din stocul unui produs 50 unitati.

Intrebarea mea este : Va vedea acest lucru cel de-al doilea user ?? In cursorul de pe PC-ul lui se va updata automat cantitatea la stocul respectiv ?

Daca se poate va rog fiti cit mai expliciti .

Va multumesc !

 1/30/2009 9:17:45 AM
User is offlineaflorin
840 posts
1st


Re: Update DB in timp real
 (N/A)
Citeva sugestii:

- uita-te putin pe managementul tranzactiilor in MSSQL Server: asta iti asigura ca niciodata doi useri nu vor face update pe aceeasi inregistrare in acelasi timp
- uita-te pe TIMESTAMP datatype - asta te poate ajuta sa vezi daca nu cumva cineva a facut UPDATE pe o inregistrare pe care vrei sa o modifici si tu

Ideea mea ar fi cam asa:
- vei avea intr-o tabela pe server cite o linie cu fiecare produs, cu stocul real
- fiecare intrare sau iesire se baga intr-o tranzactie in care, printre altele, faci UPDATE si pe tabela de mai sus
- ca sa vezi daca nu cumva altcineva a facut o alta tranzactie pe produsul tau, verifici pe coloana timestamp daca s-a modificat linia respectiva

Florin Aparaschivei - Iasi
 1/30/2009 12:16:10 PM
User is offlineDaniel Buduru
2335 posts
1st




Re: Update DB in timp real
 (Romania)
 lmax25 wrote
Aplicatia se bazeaza pe stocuri(intrari-iesiri) cu baza de date pe server. In acelasi timp 2 sau mai multi useri vor sa vinda un anumit produs.Bineinteles ca atunci fiecare are deja pe PC-ul lui cursorul cu stocurile din magazie - aceleasi cantitati la fiecare produs.Unul dintre ei scade din stocul unui produs 50 unitati.

Intrebarea mea este : Va vedea acest lucru cel de-al doilea user ?? In cursorul de pe PC-ul lui se va updata automat cantitatea la stocul respectiv ?

Fiecare set de inregistrari adus de pe server la client corespunde momentului in care s-a executat SELECT-ul pe server. Este posibil ca, exact in acel moment, o inregistrare sa fie actualizata, dar tranzactia in care este actualizata sa nu fie comisa inca; in acest caz, setul adus de pe server nu reflecta aceasta modificare. Operatorul poate vedea stocul existent in momentul in care intocmeste documentul, dar stocul real se verifica si se actualizeaza in momentul salvarii pe server. Verificarea stocului astfel incat sa nu se ajunga pe stoc negativ se face eficient direct pe server, intr-un trigger After Insert, Update, Delete, trigger care, in cazul in care stocul devine negativ, returneaza o eroare iar inregistrarea respectiva nu este salvata.
Cum se implementeaza asa ceva:
Solutia lui Florin, cu tabela de stoc curent, este cea mai eficienta. Aceasta tabela poate avea urmatoarea structura:
IDGestiune, IDArticol, Intrare, Iesire, Stoc_Curent (coloana calculata), timestamp.
Va ava o cheie primara pe IDArticol+IDGestiune si CHEK CONSTRAINT cu expresia Intrare-Iesire>=0

Presupun ca exista o tabela (doua de fapt, antet si linii) in care se inregistreza documentele de miscare (nir, facturi, etc). Tabela "linii" va contine idarticol, gestiune, intrare, iesire.
Pe aceasta tabela se creeaza un trigger After Insert, Update, Delete
In acest trigger se executa urmatoarele operatii: se actualizeaza stocul curent cu cantitatile sterse (update, delete), se creeaza inregistrarea in tabela stoc_curent  in cazu in care nu exista articolul/gestiunea, se actualizeaza stocul curent cu cantitatile adaugate (insert, update).
Ca exemplu de cod in acest trigger (functioneaza si in cazul in care, la actualizare, s-a modificar articolul sau gestiunea unei inregistrari existente; cursorul deleted contine valorile dinainte de modificare, cursorul inserted contine valorile de dupa modificare) :

UPDATE stoc_curent set intrare=intrare-isnull(deleted.intrare,0), iesire=iesire-isnull(deleted.iesire) from stoc_curent, deleted WHERE stoc_curent.idarticol=deleted.idarticol and stoc_curent.idgestiune=deleted.idgestiune

INSERT INTO stoc_curent (idarticol, idgestiune) SELECT idarticol, idgestiune FROM inserted where inserted.idarticol+inserted.idgestiune not in (SELECT idarticol+idgestiune from stoc_curent)

UPDATE stoc_curent set intrare=intrare+inserted.intrare, iesire=iesire+inserted.iesire FROM stoc_curent, inserted WHERE stoc_curent.idarticol=inserted.idarticol and stoc_curent.idgestiune=inserted.idgestiune

Daca in tabela stoc_curent intrare-iesire aeste <0, verificarea restrictiilor pe aceasta tabel a (CHECK CONSTRAINT) va rejecta modificarea, triggerul va returna o eroare iar inregistrarea respectiva din tabela linii nu se va salva. Ramane sa interpretezi eroarea returnata in VFP, sa recitesti cursorul de stocuri si sa atentionezi operatorul, ca sa reia operatia cu noile date.

Bineinteles ca exista si o alta abordare, cu examinarea stocului client-side, dar ar trebui sa instalezi lock-uri (UPDLOCK sau HOLDLOCK) pentru a preveni modificarea liniei un timp ce este examinata, iar lucrurile deja se complica si poti ajunge usor la deadlock ....



Daniel Buduru
  Visual FoxPro  Client/Server  Update DB in ti...

Search  Forum Home         

 Google Ads Minimize

    

Copyright 2002-2010 Profox   Terms Of Use  Privacy Statement