View Full Version : [C#] Soluzione logica problema
Salve, vi spiego la situazione:
io inserisco record in un db in cui un campo "valore" inserisco appunto un valore monetario; io vorrei che quando la somma del campo valore supera i valori di X (o multipli di esso) debba fare una operazione ma solamente la 1° volta che supera la soglia
Il mio problema appunto è quella di creare un algoritmo che risolva il problema.
X= 90
Valore
10 --> niente
40 --> niente
30 --> niente
15 --> sum 95 superato X, prima volta, eseguo operazione
20 --> sum 105 superato X, seconda volta, niente
60 --> sum 165 superato X, seconda volta, niente
25 --> sum 190 superato X*2, prima volta, eseguo operazione
20 --> sum 210 superato X*2, seconda volta, niente
ps: ovviamente posso registrare il fatto di aver superato la soglia per la prima volta
:)
banryu79
14-07-2009, 12:32
te la cavi con un "counter" inizializzato a 1 e che viene incrementato di 1 ogni volta che superi un multiplo del tuo numero X.
A questo punto basta che ogni volta che confronti il risultato della somma del campo attuale con le somme già accumulate, se il risultato è uguale o maggiore a "X*counter" (counter vale 1 all'inizio) fai quello che devi fare e incrementi counter di 1.
Esempio in T-SQL, assolutamente non controllato, assolutamente non la migliore soluzione
CREATE PROCEDURE dbo.InserisciEdEseguiSeSommaMaggioreUgualeASoglia
(
@nuovoValore FLOAT
,@soglia FLOAT
)
AS
DECLARE @sommaValorePreInsert FLOAT
SELECT @sommaValorePreInsert = SUM(Tabella.Valore)
FROM Tabella
WHERE ...
INSERT INTO Tabella
VALUES (@nuovoValore)
IF @sommaValorePreInsert < @soglia BEGIN
DECLARE @sommaValorePostInsert FLOAT
SELECT @sommaValorePostInsert = SUM(Tabella.Valore)
FROM Tabella
WHERE ...
IF @sommaValorePostInsert >= @soglia BEGIN
FAI QUELLO CHE DEVI
END
END
END
X= 90
Valore
10 --> niente
40 --> niente
30 --> niente
15 --> sum 95 superato X, prima volta, eseguo operazione
20 --> sum 105 superato X, seconda volta, niente
60 --> sum 165 superato X, seconda volta, niente
25 --> sum 190 superato X*2, prima volta, eseguo operazione
20 --> sum 210 superato X*2, seconda volta, niente
Anzitutto, piccola e pignola precisazione :
10 --> niente
40 --> niente
30 --> niente
15 --> sum 95 superato X, prima volta, eseguo operazione
20 --> sum 115 superato X, seconda volta, niente
60 --> sum 175 superato X, seconda volta, niente
25 --> sum 200 superato X*2, prima volta, eseguo operazione
20 --> sum 220 superato X*2, seconda volta, niente
Non so se cerchi una soluzione più Sql o più C#, comunque puoi risolvere semplicemente usando come incremento il valore stesso della "soglia" 90, senza contatori o variabili boolean accessorie :
private static int sum = 0;
//oppure calcolo sum facendo la Select Sum dal DB...
private static int incrSogliaSum = 90;
//calcolo della prossima soglia basata su sum attuale
private int sogliaSum = sum / incrSogliaSum * incrSogliaSum;
E poi ad ogni Insert a DB :
if (sogliaSum == 0) { sogliaSum = incrSogliaSum; }
MessageBox.Show(sogliaSum.ToString(),"Soglia =");
//inserimento nuovo record
int nuovoValore = Convert.ToInt32(textBox1.Text) ;
//insert ...
//...
sum += nuovoValore;
if ( sum >= sogliaSum )
{
//esegui operazione
MessageBox.Show(sum.ToString(),"Eseguita Operazione su sum =");
//...
sogliaSum += incrSogliaSum;
}
Nel mio esempio il nuovo valore sta, appunto, in una TextBox.
La prima MsgBox informa sul "cambio di soglia", mentre la seconda è una simulazione del tuo "esegui operazione"...
Funziona con un sum=0 ( DB vuoto ), ma anche con sum casuale > 0, nel qual caso sum andrà calcolato ad ogni apertura dell'applicazione, mentre la prossima "sogliaSum" viene calcolata in auto, basandosi sul sum attuale.
Prova... ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.