Gestione multiutenza

venerdì 17 aprile 2009 - 17.53

tarabasch84 Profilo | Junior Member

ciao ragazzi,
dovrei programmare la gestione ordini in un ambiente multiutenza. Premetto che la numerazione degli ordini è gestita da me programmaticamente. Supponiamo che si verifichi una situazione di questo tipo:
- Tizio accede alla sezione "NuovoOrdine"; NumeroOrdine = 5;
- Caio accede alla sezione "NuovoOrdine"; NumeroOrdine = 5;
Se entrambi dovessero decidere di salvare le modifiche si creerebbe una situazione di inconsistenza nel database visto che non è corretto salvare due documenti con la stessa numerazione.
Più che la risoluzione al problema in sè, vorrei sapere come risolvereste la questione più in generale, sapendo che una situazione del genere la si incontrerebbe anche per gestire Fatture, Bolle, etc...
Grazie anticipatamente.
Saluti Aldo.




--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Ciao Aldo,
ti consiglio di usare le Transazioni.

Se sviluppi in Vb.dot dai un occhiata qua:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=6767

altrimenti in C# qua:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=9045

Ciao

tarabasch84 Profilo | Junior Member

Si ho dato una sguardo. Ritornando al caso d'uso che ho postato precedentemente, come faccio ad evitare con l'utilizzo delle transaction che Caio visualizzi in fase di creazione dell'ordine il numero 5 dato che il Numero 5 (in caso di salvataggio) non sarebbe corretto?


--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Con l'uso delle transizioni non hai di questi problemi, in quanto ogni comando Insert Select Update ecc.. vengono gestite singolarmente quindi se caio tenta di modificare un campo nel DB e Tizio nello "stesso istante caso impossibile" tenta di modificare anch'esso il campo, la sua richiesta viene messa in coda dalla transizione.
Quindi viene prima eseguita la transizione di Caio, poi quella ti Tizio.

Spero di essere stato chiaro.

Fammi sapere

tarabasch84 Profilo | Junior Member

Sei stato chiarissimo ma io questo lo sapevo già. Forse non sono stato chiaro io. Cerco di analizzare la questione in maniera pià approfondita. Supponiamento che nel database siano memorizzati due ordini, il primo con numero 1 e il secondo con numero 2. In data odierna Tizio accede alla sezione "Nuovo Ordine" e il programma si predispone per accogliere l'input utente visualizzando a video una schermata di inserimento Ordine con numero uguale a 3. Caio contemporaneamente accede alla stessa sezione perchè intenzionato anche lui a lavorare sugli ordini. Il numero dell'ordine visualizzato è pari a 3. Entrambi quindi, prima di procedere con l'immissione dei dati e il relativo salvataggio, visualizzano lo stesso numero d'ordine. Una volta completato l'ordine Tizio procede con il salvataggio che va a buon fine, ma Caio non può effettuarlo in quanto il numero dell'ordine visualizzato, cioè 3, risulta essere già presente.
Questo problema potrebbe presentarsi anche nelle Fatture, Bolle etc. Come si potrebbe risolvere questo problema affinchè non si presenti il rischio che la numerazione dei documenti sia uguale?




--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Adesso ho capito il tuo problema.
Una soluzione che potresti adottare è quella di effettuare alla creazione di un nuovo ordine, una INSERT. Facendo così assicuri che a Caio quando preme il pulsante Nuovo Ordine gli viene associato ID di quell'ordine con tutti i campi vuoti. Nel pulsante di salvataggio invece esegui un UPDATE, cioè vai a riempire quei campi creati in precedenza ma vuoti.

Fammi sapere

tarabasch84 Profilo | Junior Member

Il tuo suggerimento implica che nel caso in cui Caio decida di non salvare più l'ordine dovrei eliminare quella riga. Diciamo che così potrebbe andare. Ora però mi è sorto un altro dubbio. Supponiamo che Tizio acceda alla sezione "Nuovo Ordine" e il sistema suggerisca a video il numero 5 (ciò significa che nella Tabella Ordini è stata inserita una riga con un'unico campo valorizzato e cioè il numero ordine). Contemporaneamente Caio accede alla stessa sezione e il sistema suggerisce a video il numero 6 (è stata inserita un'altra riga). Tizio decide di non salvare più l'odine. Caio salva l'ordine. Risultato finale: la numerazione nella Tabella Ordini risuterà non contigua a causa del mancato salvataggio di Tizio dell'ordine numero 5. Siccome è importante che la numerazione dei documenti sia contigua, come potrei risolvere quest'altro inconveniente?


--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Ciao
scusami, io so facendo fatica a seguirti.
Quest'applicazione girerà su più palmari allora?
Come fai ad avere questo problema se su due palmari hai due DB diversi?

Ti consiglio di ti cambiare la tua struttura del programma e usare quella con un unico DB sul server.


Fammi sapere

tarabasch84 Profilo | Junior Member

Guarda che la mia struttura prevede già un db sql server e non gira su palmari, ma su terminali.
--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Scusami non so perchè ho capito Palmari.

Sul server hai in DB SQL Server. Finqua OK
Allora secondo me non dovresti avere su ogni terminale un DB, devi sfruttare un DB sul server ed accedere dai terminali per inserimento e modifica degli ordini.

PErchè non vuoi utulizzare questa struttura???

Fammi sapere

tarabasch84 Profilo | Junior Member

Scusa ma chi ti ha detto che su ogni terminale c'è un db. Il db sql Server è unico. Il problema è che la numerazione dei documenti deve essere progressiva e a causa della multiutenza si possono verificare dei problemi come quello suddetto che vorrei evitare. Ecco perchè ti chiedevo un consiglio.
--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Aldo ti chiedo di scusarmi, ho fatto confusione con un altro Post simile.

Come ti ho suggerito in precedenza con le transazioni non dovresti avere problemi.
Senza transazioni sarà un pò più complicato, perchè sono tantissime le cose da gestire quindi devi implementare insert, select update e remove a catenza e di conseguenza tempo in più di CPU e RAM.

Perchè non vuoi usare le transazioni?

Fammi sapere

tarabasch84 Profilo | Junior Member

Chi ti ha detto che non voglia farlo. Allora ti propongo questa situazione: Supponiamo che Tizio acceda alla sezione "Nuovo Ordine" e il sistema suggerisca a video il numero 5 (ciò significa che nella Tabella Ordini è stata inserita una riga con un'unico campo valorizzato e cioè il numero ordine). Contemporaneamente Caio accede alla stessa sezione e il sistema suggerisce a video il numero 6 (è stata inserita un'altra riga). Tizio decide di non salvare più l'odine. Caio salva l'ordine. Risultato finale: la numerazione nella Tabella Ordini risuterà non contigua a causa del mancato salvataggio di Tizio dell'ordine numero 5. Siccome è importante che la numerazione dei documenti sia contigua, ti domando: come risolvo questo con le Transazioni??
--
Credo che parte della colpa sia di billy...

luxsor Profilo | Guru

Potresti fare una tabella temporanea, dove effettui le insert del nuovo ordine, in più ci aggiungi un campo Bit (Si o No), che abiliti True quando l'utente preme il tasto salva.
Su questa tabella effettui un ciclo con una where sul quel campo, se tale campo è true effettui un Insert nel DB sul Server.

Fammi sapere
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5