Ciclo nidificato

martedì 16 novembre 2010 - 00.33
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows XP  |  Visual Studio 2008  |  SQL Server 2008 R2  |  Crystal Reports 2008

Peppino Profilo | Junior Member

Ciao a tutti.
Scusate se post lo stesso problema già postato in precedenza, ma visto che non ho avuto nessuna risposta, penso sia dovuto al fatto che forse non era esposto in modo chiaro, allora provo a riscriverlo, sperando che il problema della mancata risposta sia quello. Diversamente gradirei comunque una qualsiasi risposta se non è chiedere tanto.

Riepilogando, uso visual basic con visual studio 2008 e un database ricavato con sql management studio.

Ho TabellaProvigioni
(PK) CodiceProv(int) Causale(varChar) Importo(decimal)

Ho TabellaNominativi
(PK) CodiceNome(int) Cognome(varChar) Nome(varChar) Perc(real)

Ho TabellaRiparto
(PK) CodiceRip(int) CodiceNome(int) Cognome(varChar) Nome(varChar) Perc(real) ImpRip(decimal)

Dim Codice As Integer = CInt(TxtCodice.Txt)

Ho la seguente query (non so se scritta in modo corretta), che ottengo la somma dell’importo

Dim cmdTmp As New SqlCommand
cmdTmp.Connection = ConnessioneDatabase
cmdTmp.CommandText = "SELECT SUM(Importo) FROM Provigioni WHERE CodiceProv = @Codice"
cmdTmp.Parameters.Add(New SqlParameter("@Codice", SqlDbType.Int))
cmdTmp.Parameters("@Codice").Value = Codice
ConnessioneDatabase.Open()
Dim risImp As Object = cmdTmp.ExecuteScalar()
ConnessioneDatabase.Close()
If risImp Is DBNull.Value Or risImp Is Nothing Then
risImp = 0
End If

Dim importo1 As Decimal = CDec(risImp)

Ho la seguente query (come sopra), che ricavo l’elenco dei Nominativi

Dim i As Integer
Dim stringa As String
Dim dst As DataSet
Dim adp As SqlDataAdapter
Dim cmd As SqlCommand
Dim bds As BindingSource
cmd = New SqlCommand()
cmd.Connection = SqlHelper.ConnessioneDatabase
cmd.CommandText = "SELECT * FROM Nominativi ORDER BY Cognome, Nome"
adp = New SqlDataAdapter(cmd)
dst = New DataSet
adp.Fill(dst, "CodiceNome")
adp.Fill(dst, "Cognome")
adp.Fill(dst, "Nome")
adp.Fill(dst, "Perc")
bds = New BindingSource()
bds.DataSource = dst
bds.DataMember = "CodiceNome"
bds.DataMember = "Cognome"
bds.DataMember = "Nome"
bds.DataMember = "Perc"

adp.Dispose()
cmd.Dispose()
cmd.Connection.Close()

For i = i To i + 15
If i < bds.Count Then
stringa = CStr(dst.Tables("CodiceNome").Rows(i).Item(0))
stringa = CStr(dst.Tables("Cognome").Rows(i).Item(1))
stringa = CStr(dst.Tables("Nome").Rows(i).Item(2))
stringa = CStr(dst.Tables("Perc").Rows(i).Item(3))

End If
Next i

Fino a questo punto sembra vada tutto bene. Quello che adesso vorrei realizzare (e che non riesco) è:
connettere la TabellaRiparto, creare un ciclo con la TabellaNominativi, se viene trovato il record con “CodiceNome”,” Cognome” e “Nome”, prendere ‘Importo1’ dividerlo con ‘Perc’ e salvarlo come ‘ImpRip’. Se non viene trovato il record con “CodiceNome”,” Cognome” e “Nome”, creare un nuovo record e aggiungere “CodiceNome”,” Cognome” e “Nome” e il calcolo prima descritto e salvare il tutto. Scusate se ho postato tutto questo, ma per Voi sicuramente è scemenza ma per me che sono principiante è diventata una palla al piede e quindi spero con tutto questo di essere stato abbastanza chiaro.
Ringrazio tutti e sopratutti quelli che avranno la bontà di darmi un aiutino o magari indirizzarmi su qualcosa (che io ho cercato ma non trovato) che potrà aiutarmi a risolvere il mio problema. Grazie ancora. Saluto Ciao. Peppino.

alx_81 Profilo | Guru

>Ciao a tutti.
Ciao

>Scusate se post lo stesso problema già postato in precedenza,
>ma visto che non ho avuto nessuna risposta, penso sia dovuto
>al fatto che forse non era esposto in modo chiaro, allora provo
>a riscriverlo, sperando che il problema della mancata risposta
>sia quello. Diversamente gradirei comunque una qualsiasi risposta
>se non è chiedere tanto.
ora è spiegato meglio, posso rispondere

>Fino a questo punto sembra vada tutto bene. Quello che adesso
>vorrei realizzare (e che non riesco) è:
>connettere la TabellaRiparto, creare un ciclo con la TabellaNominativi,
>se viene trovato il record con “CodiceNome”,” Cognome” e “Nome”,
>prendere ‘Importo1’ dividerlo con ‘Perc’ e salvarlo come ‘ImpRip’.
>Se non viene trovato il record con “CodiceNome”,” Cognome” e
>“Nome”, creare un nuovo record e aggiungere “CodiceNome”,” Cognome”
>e “Nome” e il calcolo prima descritto e salvare il tutto. Scusate
>se ho postato tutto questo, ma per Voi sicuramente è scemenza
>ma per me che sono principiante è diventata una palla al piede
>e quindi spero con tutto questo di essere stato abbastanza chiaro.
Forse riesci a fare tutto con un solo SQL, senza ricorrere a cicli.
Facciamo così, posta alcuni dati di esempio delle due tabelle, ed i dati che, con essi, vorresti ottenere..

>Grazie ancora. Saluto Ciao. Peppino.
di nulla!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Peppino Profilo | Junior Member

Ciao Alex grazie per l’interessamento e per la tempestiva risposta.

Chiedo scusa, ma le Tabelle con le Colonne e quello che vorrei come risultato è quello che ho scritto sopra. Comunque riprovo in un modo diverso.

Dim importo1 As Decimal = CDec(risImp)
Ottenuto l’importo che serve

Ho la seguente query, che ricavo l’elenco dei Nominativi

Dim i As Integer
Dim stringa As String
Dim dst As DataSet
Dim adp As SqlDataAdapter
Dim cmd As SqlCommand
Dim bds As BindingSource

cmd = New SqlCommand()
cmd.Connection = SqlHelper.ConnessioneDatabase
cmd.CommandText = "SELECT * FROM Nominativi ORDER BY Cognome, Nome"
adp = New SqlDataAdapter(cmd)
dst = New DataSet
adp.Fill(dst, "CodiceNome")
adp.Fill(dst, "Cognome")
adp.Fill(dst, "Nome")
adp.Fill(dst, "Perc")
bds = New BindingSource()
bds.DataSource = dst
bds.DataMember = "CodiceNome"
bds.DataMember = "Cognome"
bds.DataMember = "Nome"
bds.DataMember = "Perc"
adp.Dispose()
cmd.Dispose()
cmd.Connection.Close()

‘Ciclo che mi elenca i Nominativi
For i = i To i + 15
If i < bds.Count Then
stringa = CStr(dst.Tables("CodiceNome").Rows(i).Item(0))
stringa = CStr(dst.Tables("Cognome").Rows(i).Item(1))
stringa = CStr(dst.Tables("Nome").Rows(i).Item(2))
stringa = CStr(dst.Tables("Perc").Rows(i).Item(3))
End If

A questo punto ho ottenuto il nominativo del primo record:
CodiceNome Cognome Nome Perc
2 Rossi Mario 15%

Ora aprire la TabellaRiparto che ha come colonne
CodiceNome Cognome Nome Perc ImpRip

fare la lettura di tutti i records e

Se CodiceNome = 1 e Cognome = Rossi e Nome = Mario Allora
ImpRip = Importo1 / Perc
Altrimenti
creare un nuovo record con
CodiceRip = codice CodiceNome = 1, Cognome = Rossi, Nome = Mario, Perc = Perc, ImpRip = Importo1 / Perc
Fine
Salvare il record modificato o il nuovo record
E cosi fino alla fine dei records della TabellaNominativi
Next i

Quindi alla fine dovrei avere la TabellaRiparto + o - cosi popolata
CodiceRip CodiceNome Cognome Nome Perc ImpRip
codice 1 Bianchi Mario 25 x
codice 2 Rossi Rosa 15 y
codice 3 Verdi Andrea 20 z

spero di essere stato chiaro, diversamente non saprei.
Grazie ancora. Saluto. Peppino.

Peppino Profilo | Junior Member

Ciao a tutti.
Chiedo scusa, lo so che non è una pretesa avere una risposta, ma a dir la verità sono alquando deluso.
Non so cosa abbiano le mie domande o i miei post di cosi diverso per non meritare una risposta.
Dico questo perchè non è la prima volta che mi capita e non ancora sono riusito a darmi una spiegazione.
Forse, come dite voi avvolte può essere poco comprensivo, ma non penso sia sempre cosi, in quanto leggo gli post e le domande non sono cosi differenti da quelle che faccio io.
Richiedo scusa per questa mia lamentela. Io gradirei in ogni caso una risposta, non penso casta cosi tanto. Saluto. Ciao. Peppino.

alx_81 Profilo | Guru

>Non so cosa abbiano le mie domande o i miei post di cosi diverso
>per non meritare una risposta.
>Dico questo perchè non è la prima volta che mi capita e non ancora
>sono riusito a darmi una spiegazione.
>Forse, come dite voi avvolte può essere poco comprensivo, ma
>non penso sia sempre cosi, in quanto leggo gli post e le domande
>non sono cosi differenti da quelle che faccio io.
>Richiedo scusa per questa mia lamentela. Io gradirei in ogni
>caso una risposta, non penso casta cosi tanto. Saluto. Ciao.
Peppino, ti ho chiesto dei dati di esempio, e hai continuato a postarmi del codice.
Nonostante questo sto studiando sul tuo codice per capire se con uno statement risolviamo tutto.
Poi ci sono le risposte a tutti gli altri, che sono a volte molto più veloci di un problema come questo.
Abbi pazienza, che se qualcuno riesce a risolvere il problema, vai tranquillo che ti arriva risposta.
Un saluto, e vedrai che la risposta arriva presto
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Peppino Profilo | Junior Member

Ciao a tutti. Ciao Alessandro.
Appena adesso ho avuto modo di leggere la posta, visto il messaggio ho creduto in una risposta inerente al mio problema, purtroppo non è cosi. Richiedo scusa per la mia lamentela, forse non avrei dovuto. Per quanto riguarda il mio problema, be per me sicuramente è cosa ingarbugliata, ma per voi esperti io penso non lo sia altrettanto. Come già mensionato prima, la mia non è una pretesa e quindi sono qui, se volete o non volete darmi una risposta, comunque ringrazio e saluto. Peppino.

alx_81 Profilo | Guru

>Come già mensionato prima, la mia non è una pretesa
>e quindi sono qui, se volete o non volete darmi una risposta,
>comunque ringrazio e saluto. Peppino.
Questo week end mi sono messo su questo post per cercare di capire cosa ti serve.
Purtroppo mi mancano delle info, ma proviamo a ripartire da zero:

Tu hai tre tabelle:

Provigioni
(PK) CodiceProv(int) Causale(varChar) Importo(decimal)

Nominativi
(PK) CodiceNome(int) Cognome(varChar) Nome(varChar) Perc(real)

Riparto
(PK) CodiceRip(int) CodiceNome(int) Cognome(varChar) Nome(varChar) Perc(real) ImpRip(decimal)

Intanto ti chiedo, come mai ripeti tutto il record della "Nominativi" (CodiceNome, Cognome, Nome, Perc) anche nella "Riparto"? Ti basta segnare CodiceNome nella "Riparto".
Oppure la tua sorgente è la "Riparto" e vuoi inserire i record di riparto non ancora presenti nella "Nominativi"? Non è un modello molto pulito a mio modo di vedere.

Detto questo, tu vorresti ricavare importi dinamicamente partendo dalla riparto? Vuoi anche inserire o aggiornare i record su Nominativi?
Riesci a spiegarmi bene la tabella sorgente, cosa deve fare e dove, perchè proprio non riesco a capire il caso, prova a mettere valori di esempio nelle tabelle specificando da dove parti, dove devi passare, che casi vuoi implementare, senza codice.. solo input e output con due righe di spiegazione.
ciao

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Peppino Profilo | Junior Member

Ciao a tutti. Ciao Alessandro.
Chiedo scusa se proprio non riesco a farmi capire cosa voglio ottenere e dispiace, prima perchè faccio perdere a Voi tempo prezioso e io non riesco ad avere la risposta che mi serve. Purtroppo quando si ha che fare con principianti quale io sono, è da mettere in preventivo anche questo. Riprovo facendo un prospettino come dici tu.

1) TABELLA NOMINATIVI
CodiceNome Cognome Nome Perc%
1 Rossi Mario 25%
2 Verde Roberto 35%
3 Bianco Remo 22%
4 Giallo Michele 18%

2) TABELLA PROVIGGIONI
CodiceProv Causale Importo
1 Ricavo per prestazione x 1.000,00
2 Ricavo per prestazione y 800,00
3 Ricavo per prestazione z 1.500,00
4 Ricavo per prestazione w 700,00

Risultato che vorrei ottenere.
Estrarre il totale dalla colonna importo delle tabella proviggioni. Elaborare la seguente.

3) TABELLA RIPARTO - (giustamente basta riportare solo CodiceNome).
CodiceRip CodiceNome Perc% ImpRip
1 1 25% 1.000,00
2 2 35% 1.400,00
3 3 22% 880,00
4 4 18% 720,00

LA TABELLA RIPARTO è soggetta ad aggiornamenti in base agli insermenti che vengono fatti nella TABELLA PROVIGGIONI, quindi quando viene premuto il tasto "Aggiorna", per ogni nominativo passato, se non trova il CodiceNome deve aggiungere una nuova riga, altrimenti deve solo aggiornare l'ImpRip.

Penso che in questo modo dovrebbe essere abbastanza chiaro.
Tantissimi grazie per l'interessamento e per l'eventuale risposta.
Saluto. Ciao. Peppino.

alx_81 Profilo | Guru

>Riprovo facendo un prospettino come dici tu.
credimi, è l'approccio migliore.

>1) TABELLA NOMINATIVI
>CodiceNome Cognome Nome Perc%
> 1 Rossi Mario 25%
> 2 Verde Roberto 35%
> 3 Bianco Remo 22%
> 4 Giallo Michele 18%
>
>2) TABELLA PROVIGGIONI
>CodiceProv Causale Importo
> 1 Ricavo per prestazione x 1.000,00
> 2 Ricavo per prestazione y 800,00
> 3 Ricavo per prestazione z 1.500,00
> 4 Ricavo per prestazione w 700,00
>
>Risultato che vorrei ottenere.
>Estrarre il totale dalla colonna importo delle tabella proviggioni.
>Elaborare la seguente.
>
>3) TABELLA RIPARTO - (giustamente basta riportare solo CodiceNome).
>CodiceRip CodiceNome Perc% ImpRip
> 1 1 25% 1.000,00
> 2 2 35% 1.400,00
> 3 3 22% 880,00
> 4 4 18% 720,00

domande:
- la tabella riparto, come fa a conoscere il legame tra il nominativo e la provvigione?
- Come fai a stabilire quale importo deve essere assegnato ad un particolare nominativo?
- Esiste per caso un'applicazione che deve prendere tutti i nominativi e un operatore sceglie quale provvigione attribuirgli?

>Penso che in questo modo dovrebbe essere abbastanza chiaro.
siamo vicinissimi
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Peppino Profilo | Junior Member

Ciao Alessandro, scusami ma ho provato a trovare un altro modo di spiegare quale dovrebbe essere il risultato da ottenere, ma alla fine mi porta sempre a quello che ho già scritto. L'unica cosa che posso aggiungere è quello che la tabella RIPARTO come risultato, è simile a un tabella di riparto delle spese condominiali. Quindi come un amministratore a fine anno con un programma di gestione condominiale clicca su un bottone ed elabora le spese secondo i millesimi di proprietà, la stessa cosa è quella che serve a me. Diversamente credo che debba rinunciare questa idea e non consumare ancora il Vs tempo. Comunque ringrazio per il tempo che mi hai dedicato. Saluto tutti.
Ciao. Peppino.

alx_81 Profilo | Guru

>Ciao Alessandro, scusami ma ho provato a trovare un altro modo
>di spiegare quale dovrebbe essere il risultato da ottenere, ma
>alla fine mi porta sempre a quello che ho già scritto. L'unica
>cosa che posso aggiungere è quello che la tabella RIPARTO come
>risultato, è simile a un tabella di riparto delle spese condominiali.
>Quindi come un amministratore a fine anno con un programma di
>gestione condominiale clicca su un bottone ed elabora le spese
>secondo i millesimi di proprietà, la stessa cosa è quella che
>serve a me. Diversamente credo che debba rinunciare questa idea
>e non consumare ancora il Vs tempo. Comunque ringrazio per il
Ti dico cosa ho capito, perchè purtroppo trovo che tu stia involontariamente dando per scontata la presenza di un particolare software che fa una particolare operazione.
Siccome non credo sia corretto dare risposte ad un problema non capito (e se mi scappa, correggo appena possibile) provo ad illustrarti cosa devi fare.
Se mi dai l'ok, ti faccio anche un esempio in vb.net, però prima di tutto, è buona norma capire se un comando sql ti può risolvere il problema senza fare cicli, che a volte, possono risultare inutili.
Dimmi se ho capito bene:

Tu hai un programma che ti lista, come prima cosa, i nominativi di questo appartamento (ammesso che lo sia).
ognuno dei nominativi, può avere già l'importo ripartito oppure potrebbe essere un nominativo che ancora non ha la ripartizione.
Selezionando una riga dai nominativi tu vuoi poter premere un pulsante, e tale pulsante dovrebbe:
- creare il legame tra il riparto e il nominativo con l'importo calcolato se il legame non esiste
- aggiornare l'importo se il legame esiste già

corretto? Non preoccuparti che non perdiamo tempo se proviamo a risolvere un problema, e, credimi, di certo non mi metto a giudicare se una persona è principiante o meno, anzi, sono sempre impegnato per aiutare chi può avere bisogno dei miei consigli. Semplicemente non trovavo corretto sentirmi dire "sono deluso" dal momento in cui solo ora, piano piano, riesco a capire il problema effettivo. Sto cercando di aiutarti in ogni modo, e ti posso assicurare che ci arriviamo in fondo..
un saluto, e aspetto la tua risposta


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Peppino Profilo | Junior Member

Ciao Alessandro, vorrei avere un poco della pazienza che avete Voi, purtroppo nell'inesperienza in materia a volte manca anche quella pazienza che serve più di qualsiasi altra cosa, ecco perchè ho avuto quello sfogo giustamente non gradito, ma ormai quella è acqua passata. Ritornando al problema forse (dico forse ma solo per colpa mia ovviamente) se l'intesa è reciproca, ci siamo. L'unica cosa è che non devo selezionare una riga o un nominativo alla volta ma bensì con un click devo chiamare la tabella dei Nominativi, quindi in automatico fare lo scrool di tutta la tabella e per ogni nominativo agire sulla tabella Riparto facendo il resto. Ecco perche il titolo è definito ciclo nidificato.
Ripeto ancora tanti grazie, ma non solo se arriviamo alla risposta ma per tutto il tempo e la pazienza che mi stai dedicando. Saluto.
Ciao. Peppino.

Peppino Profilo | Junior Member

Ciao a tutti. Ciao Alessandro, voglio comunicarti che penso di aver risolto il mio problema, ho trovato un esempio "INSERT, UPDATE, DELETE" ho adattato l'esempio secondo le mie esigenze e sembra che vada bene. Comunque voglio ringraziarti per il tuo interessamento. Spero che la prossima volta non sia una cosa cosi difficile da spiegare. Grazie a tutti del Forum. Saluto.
Ciao. Peppino.

alx_81 Profilo | Guru

>Ciao a tutti. Ciao Alessandro, voglio comunicarti che penso di
>aver risolto il mio problema, ho trovato un esempio "INSERT,
>UPDATE, DELETE" ho adattato l'esempio secondo le mie esigenze
>e sembra che vada bene. Comunque voglio ringraziarti per il tuo
>interessamento. Spero che la prossima volta non sia una cosa
>cosi difficile da spiegare. Grazie a tutti del Forum. Saluto.
eheheh, purtroppo ho pochissimo tempo ultimamente..
ma ti allego l'esempio comunque. Perchè l'ho finito stamattina
uso il MERGE STATEMENT (http://technet.microsoft.com/en-us/library/bb510625.aspx)

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

Peppino Profilo | Junior Member

Ciao Alessandro, grazie per l'esempio, gli ho dato uno sguardo veloce e come concetto sembra uguale come ho scritto io, solo che il tuo esempio è più pulito mentre al mio a confronto sembra ci siano delle cose superflue e quindi userò il tuo esempio per perfezionare quello mio.
Ancora tantissimi grazie. Saluto.
Ciao. Peppino.

alx_81 Profilo | Guru

>Ciao Alessandro, grazie per l'esempio, gli ho dato uno sguardo
>veloce e come concetto sembra uguale come ho scritto io, solo
>che il tuo esempio è più pulito mentre al mio a confronto sembra
>ci siano delle cose superflue e quindi userò il tuo esempio per
>perfezionare quello mio.
>Ancora tantissimi grazie. Saluto.
figurati, dovevamo arrivare in fondo!
fatti vivo ancora da queste parti eh!

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5