Gestione di un timesheet settimanale

martedì 16 giugno 2009 - 11.56

Anonimo Profilo | Senior Member

Ciao a tutti! Prima di tutto mi chiamo Allan e sono nuovo qui.
Uso da poco l'ambiente di sviluppo VS8 e mi trovo in certe difficoltà, come in questa che sto per dirvi.
In una pagina ho un calendario, con la possibilità di selezionare la settimana. E poi ho una tabella, con varie dropdownlist rappresentate da clienti e altrettante dropdownlist rappresentate dalle commesse, in base ai clienti. Dopodiché ho delle textbox che rappresentano quante ore ha fatto un certo dipendente in una giornata, per una commessa specifica. Ci sono 7 colonne di textbox, che rappresentano i giorni della settimana.
Vorrei capire dove potrei salvare tutti questi dati, o almeno dove mi consigliate, e poi come salvarli. In pratica mi manca solo questo passaggio per completare la pagina e, selezionando una settimana, caricare i dati.
Grazie in anticipo!

EDIT: uso come linguaggio codebehind c#.

Anonimo Profilo | Senior Member

Qualcuno?
Scusate se lo uppo il thread, ma se qualcuno mi potesse aiutare...
X-RayStyle

Jeremy Profilo | Guru

Ciao Allan.
In un database???

Ciao

Anonimo Profilo | Senior Member


835x836 92Kb


Come si vede nell'img, credi che sia possibile salvare tutto quello in un database? Cioè, non ci sarebbero infiniti campi?
Magari mi sbaglio..
X-RayStyle

Jeremy Profilo | Guru

Ciao Allan.
Ti confermo l'uso di un database ..... basta strutturarlo bene.
Ad ogni modo, se hai bisogno .... facci sapere...
Ciao

Anonimo Profilo | Senior Member

L'ho fatto il db. Sono riuscito a fare i primi comandi sql quali salvare i dati e caricarli, selezionando una settimana. Però mi è sorto un altro problema, cioè: se per esempio carico una settimana, e lunedì ci sono già delle ore, se faccio salva giustamente il db salverà sulla tabella dati doppi, anziché modificarli o non toccarli proprio.
Come faccio a gestire questo problema di dati doppi?
Pensavo ad una cosa del tipo:

se ore_addebitate è diverso da 0
e se il record esiste
update ...
altrimenti
insert ...

Però in linguaggio c#?

Jeremy Profilo | Guru

Ciao Allan.
Non ho capito bene il problema ... però ti posso comunque rispondere che dipende dal fatto che tu abbia usato gli automatismi o meno.
Mi spiego meglio.
Qualora tu avessi optato per una soluzione disconnessa (dataset,datatable,etc..) allora avresti la possibilità di sfruttare l'automatismo del dataadapter, il quale, gestisce automaticamente le operazioni di aggiunta/modifica/cancellazione dei records.

Qualora tu avessi optato per altre soluzioni, dovresti prima effettuare una verifica dei dati presenti nel datatabase ed in funzione dei risultati, decidere se eseguire una query di update od una di insert.

Ad ogni modo ... rimango a disposizione per ulteirori info.

Facci sapere...
Ciao

Anonimo Profilo | Senior Member

Ok, mi spiego meglio. :D Posto il pezzo di codice della classe in cui consiste nel salvare i dati immessi.

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

Insomma, la classe l'ho poi richiamata nell'evento btnSalva_Click per ogni textbox. Il problema è, se per esempio il 29/06/2009 ho salvato nella textbox "Permessi" il valore "2", ma mi sono accorto di aver sbagliato, e vado a modificarlo, anziché salvarmelo sopra sulla tabella del database me ne inserisce un altro di record, chiaramente perché non ho gestito l'update. Come potrei gestirlo? Sono stato chiaro adesso?

-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Ciao Allan.
Ho visto il tuo codice ed, a parer mio, ritengo ci siano un sacco di cose da mettere a posto ...... ma, a questo, possiamo pensarci in un secondo momento.
Visto il codice, suppongo tu voglia continuare a gestire le operazioni CRUD(Create,Read,Update e Delete) senza l'ausilio di un dataadapter (se non è così ... faccelo sapere).

Tenuto conto di quanto detto sopra, credo che il tuo errore sia nella gestione della condizione riferita al valore di campo5 (questa sarebbe una di quelle cose da mettere a posto).

Non ci sono molte possibili cause di errore .... la gestione della decisione di inserimento piuttosto che aggiornamento del Record, dipende esclusivamente da quella condizione ... se campo5 non è uguale al VALORE STRINGA 0 inserisci il record ... altrimenti lo aggiorni e, per qualche ragione, lo cancelli.(anche questo passaggio non è molto chiaro).

Ad ogni modo, per gestire l'aggiornamento di un record piuttosto che l'inserimento di uno nuovo, hai bisogno di fare preventivamente una select in modo tale da verificare, in base ai criteri di ricerca, che effettivamente il record non sia già presente e, qualora lo fosse, allora procedi con l'update.

Rimango comunque a disposizione per ultriori chiarimenti ....
Ciao.





Anonimo Profilo | Senior Member

Eh, ci credo che ci siano un sacco di cose da mettere a posto. E' da un paio di mesi che uso asp.net.
Riguardo l'utilizzo del DataAdapter, credi che sia più semplice? Potrebbe essere un'idea per rendere il codice più leggero, se è più semplice.
Ti spiego la condizione. Siccome la classe è poi richiamata nell'evento btnSalva_Click, allora la condizione funziona in base ai nuovi dati che l'utente inserisce. Infatti, se l'utente ha inserito un valore stringa diverso da zero, allora inserisce. Altrimenti aggiorni il record (perché comunque il record l'hai modificato mettendolo a zero) e lo cancelli (perché non mi interessa se un utente ha fatto zero ore di permessi il giorno 29/06/2009, ma mi interessano solo le ore diverse da zero).
Io vorrei che ci fosse dentro l'if, un altro if: se il record su cui sto lavorando esiste già nella tabella del db, allora lo aggiorno. Altrimenti lo inserisco nel db. Non è il modo più conveniente vero?
Comunque sono un po' confuso. Provo a fare una select.

-------------------
| X-RayStyle |
-------------------

Anonimo Profilo | Senior Member

Ci sono riuscito! Ma a modo mio..

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

Non è un bel vedere vero? Ahaha ho fatto delle piccole modifiche. Ho chiamato il metodo Carica, che permette di fare la select. Se le ore immesse sono diverse da quelle che c'erano già allora si va a fare un altro if, in cui si controlla se le ore che c'erano già erano uguali a zero. Se sì inserisce.. se no passa subito all'aggiornamento.
C'è da migliorare però, me ne rendo conto da solo.
Tra l'altro avrei un'altra domanda. Per caricare automaticamente le dropdownlist? I dati dove l'id commessa è rappresentata da una label vanno bene, ma dove essa è rappresentata da una ddl no. Vorrei che nel momento in cui clicco su una settimana tutto si caricasse da solo, ddl comprese, anziché andare a selezionare clienti ecc ecc..
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Ciao Allan
>Eh, ci credo che ci siano un sacco di cose da mettere a posto.
>E' da un paio di mesi che uso asp.net.
Intendiamoci ... non volevo sollevare una critica ..... lo dico per te!!

>Riguardo l'utilizzo del DataAdapter, credi che sia più semplice?
Dipende dai punti di vista .... dal punto di vista pratico ..... sicuramente si.
Dal punto di vista didattico .... perdi un sacco di esperienza.

>Potrebbe essere un'idea per rendere il codice più leggero, se
>è più semplice.
Diciamo che per il momento potrebbe essere utile lasciar fare tutto a lui .... una volta che l'applicazione funziona, puoi decidere di modificare il codice in modo da svolgere tu il lavoro che svolgerebbe il DataAdapter.

>Ti spiego la condizione. Siccome la classe è poi richiamata nell'evento
>btnSalva_Click, allora la condizione funziona in base ai nuovi
>dati che l'utente inserisce. Infatti, se l'utente ha inserito
>un valore stringa diverso da zero, allora inserisce.
Si ... ma zero, è un numero, non è una stringa, pertanto andrebbe valutato in quanto tale ...(ma questo per il momento si potrebbe tralasciare, ma è comunque una cosa da mettere assolutamente a posto)

>Altrimenti
>aggiorni il record (perché comunque il record l'hai modificato
>mettendolo a zero) e lo cancelli (perché non mi interessa se
>un utente ha fatto zero ore di permessi il giorno 29/06/2009,
>ma mi interessano solo le ore diverse da zero).
Questo non vuol dire che tu debba cancellarlo ....
Ad ogni modo, io gestirei tutto come se fosse un magazzino.
In un magazzino può entrare una certa quantita di merce e può uscire una certa quantita di merce, ma comunque una volta che tutta la merce entrata ... è uscita, non è necessario cancellare l'articolo ... perchè potrebbe verificarsi il caso in cui la merce torni in entrata.
Provo a spiegarmi meglio.
Se compri 100 viti .... e dopo 2 giorni ne usi 30, nella tabella del database, io avrei 2 record.
Il primo con |VitiLunghe| 100| ..... e l'altro |VitiLunghe| -30|.
Mai e poi mai penserei di modificare il primo record ed avere |VitiLunghe| 70| .... piuttosto, qualora volessi sapere la giacenza a magazzino dell'articolo VitiLunghe, farei una select con i criteri necessari per avere la somma del campo quantita di tutti i record VitiLunghe.
Spero di essermi spiegato.

>Io vorrei che ci fosse dentro l'if, un altro if: se il record
>su cui sto lavorando esiste già nella tabella del db, allora
>lo aggiorno. Altrimenti lo inserisco nel db. Non è il modo più
>conveniente vero?
E' il modo più corretto ... (in questo caso)

>Comunque sono un po' confuso. Provo a fare una select.
Facci sapere...
Ciao

>
>-------------------
>| X-RayStyle |
>-------------------

Jeremy Profilo | Guru

>Ci sono riuscito! Ma a modo mio..
L'importante è che ci sei riuscito .... comunque leggi il mio precedente post (l'ho inviato in ritardo)

Anonimo Profilo | Senior Member

>Ciao Allan
Ciao

>Intendiamoci ... non volevo sollevare una critica ..... lo dico
>per te!!
Lo so, tranquillo

>Si ... ma zero, è un numero, non è una stringa, pertanto andrebbe
>valutato in quanto tale ...(ma questo per il momento si potrebbe
>tralasciare, ma è comunque una cosa da mettere assolutamente
>a posto)
Zero è un numero sì, e su questo non ci piove. Però se vedi bene ho anche i TicketRestaurant, che accettano soltanto la stringa "T", per dire che è stato utilizzato. Per cui faccio il tutto come stringa. Magari lo modifico se proprio non va bene.

>Questo non vuol dire che tu debba cancellarlo ....
Sì, l'esempio l'ho capito. Però il caso è che uno va a mettere un campo a zero solo perché ha sbagliato a digitare, o perché sbagliato proprio campo. Capito? E il campo aggiornato a zero non mi serve più. Insomma, cerco di mettermi nei panni di un utente in questo caso.

Grazie delle altre info comunque.
-------------------
| X-RayStyle |
-------------------

Anonimo Profilo | Senior Member

Questa è la domanda che mi sono fatto qualche messaggio fa: "Tra l'altro avrei un'altra domanda. Per caricare automaticamente le dropdownlist? I dati dove l'id commessa è rappresentata da una label vanno bene, ma dove essa è rappresentata da una ddl no. Vorrei che nel momento in cui clicco su una settimana tutto si caricasse da solo, ddl comprese, anziché andare a selezionare clienti ecc ecc.."

Te Jeremy sapresti dirmi qualcosa?
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Ciao Allan.
Temo di non aver capito la domanda.

Facci sapere...
Ciao

Anonimo Profilo | Senior Member

Ok. Allora.. Per quanto riguarda il salvataggio dei dati va tutto bene.
Per quanto riguarda il caricamento no. Le prime righe, "permessi", "ferie", "infortuni" ecc ecc riesco a caricarle di ore, selezionando una settimana qualsiasi.
Invece per le dropdownlist delle commesse no. Per caricarle devo per forza cliccare su una settimana, poi su Modifica, selezionare un cliente e da lì posso selezionare la commessa.
Io vorrei, selezionata una settimana, caricare tutto: le eventuali ore che ho fatto per permessi, ferie, infortuni ecc ecc e le ore delle commesse, oltre alle commesse selezionate in automatico per quello specifico giorno. Per esempio, seleziono questa settimana in corso. Metti che ho fatto due ore per la commessa "abc" il 29/06/2009. Bene, dopo che ho selezionato la settimana, il sito mi caricherà in automatico nella prima dropdownlist delle commesse il valore "abc", e nella textbox di quel giorno riferito a quella commessa il dato "2", cioè le due ore fatte in quel giorno per quella commessa. Ovviamente il sito dovrà caricare anche il cliente in automatico, perché la commessa dipende dal cliente.
Mi sono spiegato meglio? Se sì, questa cosa è possibile?

-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Ciao Allan.
Se sono tutti dati disponibili .... ti basterebbe impostare il valore corrente del DrpDownList con il valore del cliente o della commessa (dipende da ciò che ti serve) ed eseguire la procedura che attualmente ti popola i textbox con i dati Appartenenti a quel cliente (o Commessa).

Per esempio:
Private sub dropDownList_SelectedValueChanged etc.... PopolaTextBox End Sub Private Sub ModificaGiornoDalCalendario DropDownListCliente.Value="NomeCliente" dropDownList_SelectedValueChanged End Sub

Spero di essermi spiegato ma, sopratutto, di aver capito il problema (mmmhhh.... mi sa di no )

Ad ogni modo .... facci sapere....
Ciao

Anonimo Profilo | Senior Member

Sì più o meno ci siamo. Domani provo.
Per quanto riguarda il caricamento delle textbox collegate ai permessi, ferie ecc ecc io ho fatto così:

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

Poi nella classe Timesheet, il metodo Carica è il seguente:

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

Capito più o meno il concetto?
Grazie comunque della pazienza.
-------------------
| X-RayStyle |
-------------------

Anonimo Profilo | Senior Member

Jeremy, voglio caricare sia cliente che commessa, perché la commessa è del cliente, cioè fa parte del cliente.
In ogni caso mi sono aggiustato. Ora metto il pezzo di codice aggiuntivo.

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

Se faccio così carica sia il cliente che la commessa, ma le ore no. Mi dà che ddlCommessa1.SelectedValue = "", anche se in realtà il metodo le ha passato il valore "20050263". Il caso strano è che nella pagina riesco a visualizzare quella commessa sulla dropdownlist, e nel codice mi dà uguale a "".
Un altro caso strano è che, se commento "ddlCommessa1.Items.Clear();" dell'evento "protected void ddlCliente1_SelectedIndexChanged", mi dà la seguente eccezione su "ddlCommessa1.SelectedValue = mioTS.CaricaCommessa(User.Identity.Name, lblLun.Text, ddlCliente1.SelectedValue).ToString();", cioè:
"SelectedValue in 'ddlCommessa1' non valido, poiché non è incluso nell'elenco di elementi.
Nome parametro: value"
Cavolo, ci sono quasi..
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Ciao Allan.
Aspetta ... mi sono perso un attimo ... c'è qualcosa che non quadra.

Anonimo Profilo | Senior Member

Cioè?
Entro martedì devo finirlo. :azz
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

>protected void ddlCliente1_SelectedIndexChanged...
>{
> ddlCommessa1.Items.Clear();
> if (ddlCliente1.SelectedIndex == 0)
> {
> ddlCommessa1.Items.Add("scegli commessa 1");
> }
>}
>protected void ddlCommessa1_SelectedIndexChanged...
>{
> Timesheet mioTS = new Timesheet();
>
> // carico le ore di quella commessa
>txtLun1.Text = mioTS.Carica1(User.Identity.Name, lblLun.Text,
>ddlCliente1.SelectedValue, ddlCommessa1.SelectedValue).ToString();
Quello che non mi quadra è che tu passi alla funzione
>ddlCliente1.SelectedValue e ddlCommessa1.SelectedValue,
ma nella Routine precedente, tu hai fatto
>ddlCommessa1.Items.Clear()
Pertanto, il valore di ddlCommessa1.SelectedValue sarà sempre vuoto.

Facci sapere...
Ciao

Anonimo Profilo | Senior Member

Adesso sono io a non capire.. Ma insomma, come faccio a selezionare automaticamente un valore della dropdownlist? Seleziono la settimana e voglio che automaticamente il valore della commessa "20050263" venga selezionato (perché è stata lavorata quella commessa in quella settimana), oltre al cliente di questa commessa che è su un'altra dropdownlist, e voglio che le ore fatte in quella commessa vengano visualizzate nella textbox.
Con:
Private sub dropDownList_SelectedValueChanged etc.... PopolaTextBox End Sub

...mi hai fatto capire che questo sarebbe l'evento dropDownList_SelectedIndexChanged di c# no? E che lì inserisco il controllo che mi permette di inserire le ore sulle textbox.
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

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

Facci sapere....
Ciao

Anonimo Profilo | Senior Member

Provato, ma... si ferma a ddlCommessa1.Text = ...

"SelectedValue in 'ddlCommessa1' non valido, poiché non è incluso nell'elenco di elementi.
Nome parametro: value"

Sempre lo stesso errore.


EDIT: ho provato in un'altra maniera.. anzi, solo cambiando la proprietà di ddlCommessa1.

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

Lo fa quasi alla perfezione. Quasi perché, innanzitutto riesco a visualizzare tutti i campi interessati (ddlCliente, ddlCommessa e txtLun1), però se clicco sul bottone Modifica e vado a vedere cosa potrei scegliere dal ddlCommessa1 (appunto per modificare) noto che ha inserito un altro di 20050263 di commessa, cioè su ddlCommessa1 ne ho due di commesse uguali 20050263, cosa che non va assolutamente bene. :uhm



Ulteriore EDIT: tra l'altro ci sarebbe da valutare anche il fatto che, siccome ci sono 8 dropdownlists di clienti e 8 di commesse, una commessa non può ripetersi nelle altre dropdownlists, se già selezionata in una dropdownlist.

Jeremy Profilo | Guru

Allan ... Ciao.
Lo puoi mostare tutto il codice relativo a ste benedette DropDownList ??? ... se ti aggiunge un nuovo elemento, probabilmente da qualche parte nel codice lo aggiungi.
Adesso sono al lavoro .... ma entro sera vediamo di trovare una soluzione.

Facci sapere....
Ciao

Anonimo Profilo | Senior Member

Non c'è molto di codice, comunque eccolo qua:

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


E nella classe Timesheet i seguenti metodi:

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

Jeremy Profilo | Guru

Ciao Allan.
Ti allego un progettino di esempio .... non guardare ne il codice ne la grafica .... dimmi solo se è il risultato che vuoi ottenere.
Ovviamente, devi cliccare su un giorno del calendario ( tieni presente che ho inserito date per il mese di luglio)
Facci sapere....
Ciao

Anonimo Profilo | Senior Member

>Ciao Allan.
>Ti allego un progettino di esempio .... non guardare ne il codice
>ne la grafica .... dimmi solo se è il risultato che vuoi ottenere.
>Ovviamente, devi cliccare su un giorno del calendario ( tieni
>presente che ho inserito date per il mese di luglio)
>Facci sapere....
>Ciao

Sarà che il tuo esempio è in vb.net, ma non riesco a farlo partire. Mi dà una ventina d'errori.
Spiegami brevemente cosa vorresti dire con quell'esempio. Selezionato un giorno, si caricano automaticamente le dropdownlist e la textbox?
Io vorrei, selezionato un giorno (nel caso dell'esempio), che si caricassero automaticamente il cliente e la commessa eventualmente salvate sul db. Insomma, seleziono il giorno 03/07/2009 e mi si caricano automaticamente i dati: nella ddlCommessa la commessa lavorata in quel giorno, e nella ddlCliente il cliente di quella commessa, oltre che nella textbox le ore lavorate per quella commessa in quel giorno selezionato. Tutto qui. E' tutto in automatico.. Basta un click (nel giorno 03/07/2009, o in qualunque altro giorno) che ottengo tutto.
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Ciao Allan.
Allora non capisco proprio il problema .... allo scatenarsi dell'evento ValueChanged(o qualcosa del genere) del controllo Calendario .... non devi fare altro che:
- Impostare la proprietà Text del ddlCommesse con il valore della commessa che estrai dal Db.
- Impostare la proprietà Text del ddlCliente in funzione del valore della proprietà Text della ddlCommessa
- Impostare la proprietà Text delle TextBox con il valore delle ore per la commessa specificata.
Tutti i dati a disposizione li hai nel tuo dataset preventivamente valorizzato

Ovviamente, devi preventivamente assegnare alla proprietà DataSource delle ddl, l'origine dati dal quale prelevi i valori di Commessa e Cliente.
Quindi:
ddcommessa.datasource=ds.tables("Commesse") ddlcommessa.DataField="Commessa" etc...

se hai ulteriori problemi .... puoi mandarmi il progetto via mail all'indirizzo tiziano[at]mtimpianti.net .... oppure allegarlo al prossimo post.

Facci sapere....
Ciao

Anonimo Profilo | Senior Member

Quindi devo fare tutto incentrato sulle commesse? Nel senso che il cliente lo ricavo dalla commessa?
Perché se per esempio devo salvare dei dati, faccio così: seleziono prima un cliente, poi mi si caricano la/e commessa/e di quel cliente, ne seleziono una e poi inserisco le ore e clicco su Salva.
Per quanto riguarda la visualizzazione dei dati prima lavoro sulle commesse, poi su clienti? E per ultime le ore?
Provo domani così come mi hai detto.. altrimenti se non va ti invio subito il progetto, entro pranzo.
Grazie della pazienza.
-------------------
| X-RayStyle |
-------------------

Jeremy Profilo | Guru

Figurati .... mi spiace solo non riuscire ad aiutarti diversamente.
Ad ogni modo ... domani sono su Modena tutto il giorno ... se mi mandi il progetto entro pranzo .... te lo restituisco per sera tardi.
Ciao

Anonimo Profilo | Senior Member

Ti ho mandato una mail. Per ora non ci sono riuscito.
-------------------
| X-RayStyle |
-------------------
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5