FACOLTÀ DI INGEGNERIA
REALIZZAZIONE DI UN DASHBOARD
PER IL CONTROLLO DI COMMESSE SOFTWARE
DI UN SYSTEM INTEGRATOR
LAUREANDO: RELATORE:
Alessandro SIGNORETTI Chiar.mo Prof. Marco PARENZAN
CORRELATORE:
Ing. Mauro INZERILLO
2
4.2 Architettura di sistema ................................................................................ 41
4.3 Data Layer .................................................................................................... 43
4.3.1 Tabelle.................................................................................................. 43
4.3.2 Diagramma delle relazioni ................................................................... 48
4.4 Business Logic .............................................................................................. 48
4.4.1 Viste ..................................................................................................... 49
4.4.2 Stored Procedure ................................................................................. 50
4.4.3 User-Defined Functions ....................................................................... 54
4.5 Presentation................................................................................................. 69
4.5.1 Implementazione WinForm ................................................................. 69
4.5.2 Implementazione Web Part ................................................................. 78
5 CONCLUSIONI....................................................................................................... 96
3
1 INTRODUZIONE
L’applicazione, descritta e progettata in questo lavoro, serve a
consuntivare, controllare e pubblicare i dati riguardanti i progetti di sviluppo in
corso presso il Laboratorio Euris di Trieste.
4
Microsoft Office Sharepoint Server 2007 (MOSS2007), non sono ancora
generalmente disponibili nel canale commerciale e non offrono complesse
funzionalità di pubblicazione dati.
5
• Tracciamento e monitoraggio degli avanzamenti in relazione al lavoro
effettivo, supportati da misure calcolate di efficienza
6
1.4 Riassunto dei capitolo seguenti
• Capitolo 2 – Analisi funzionale: definizione astratta di tutte le entità e
delle relazioni tra queste per ottenere le specifiche da utilizzare per
definire le funzionalità del sistema.
7
2 ANALISI FUNZIONALE
L’applicazione per la gestione delle commesse software nasce
dall’esigenza di avere uno strumento informatico con il quale centralizzare i
dati tecnici ed economici dell’attività interna.
I requisiti sono stati ricavati da reali e ben definite esigenze di uno degli
utenti finali dell’intero sistema, nella fattispecie l’Ing. Mauro Inzerillo,
Responsabile Tecnico del laboratorio interno alla sede di Trieste della Euris
Solutions S.p.A.
2.1 Attori
Gli attori sono le persone (o gruppi di persone) che hanno interesse
all’utilizzo dell’applicazione di Gestione delle Commesse Software.
Questi soggetti, in base al proprio ruolo ben definito, avranno la
possibilità di effettuare inserimenti, modifiche e cancellazioni sui dati
complessivi o visualizzare statistiche e informazioni tecniche ed economiche a
partire da essi.
2.1.1 Laboratorio
Si occupa dell’effettivo sviluppo dei progetti ad esso commissionati.
I progetti richiesti possono spaziare tra reingegnerizzazione di codice a
creazione di 8apportino, tra personalizzazioni di sistemi informativi allo
sviluppo di applicativi ad hoc,
tra aggiunte di funzionalità su software già esistente a plug-in e tools per
applicativi commerciali.
8
Il Laboratorio è composto da dipendenti che lavorano principalmente
nella sede di Trieste.
E’ possibile che alla normale attività del laboratorio, collaborino in
alcuni casi anche persone esterne al laboratorio, ma comunque dipendenti della
Euris Solutions S.p.A.
9
2.2 Definizione delle Entità
2.2.1.1 Task
I Task sono il fulcro dell’attività propria del laboratorio, in quanto
rappresentano i singoli progetti che vengono sviluppati su commissione di
aziende clienti o di altre divisioni interne a Euris Solutions S.p.A.
Ad ogni persona che partecipa allo sviluppo del Task può essere
attribuito un ruolo che corrisponde alla mansione che il dipendente stesso sarà
chiamato a ricoprire all’interno del singolo progetto.
Un determinato ruolo, come ad esempio “Capo Progetto” o
“Programmatore Senior”, può essere ricoperto da più persone.
Il ruolo ricoperto da una certa persona in un determinato Task è
totalmente indipendente dal ruolo che ricopre in un altro Task, quindi, ad
esempio, se un dipendente è “Analista Programmatore” in un progetto, può
tranquillamente assumere il ruolo di “Sviluppatore” in un altro.
10
2.2.1.2 Preventivo
Quando si formalizza l’accordo con un cliente per lo sviluppo di un
progetto su commissione, l’azienda informatica deve fissare per contratto un
determinato numero di giornate lavorative (ognuna composta da 8 ore ) che
rappresentano il preventivo, cioè il numero di giorni-uomo che l’azienda
informatica dichiara di impiegare per fornire il proprio prodotto “chiavi in
mano” al cliente e sulle quali il cliente stesso baserà il proprio pagamento.
11
Esiste un preventivo per ogni singola
persona che partecipa allo sviluppo
dei Task afferenti alla commessa.
Commessa Persona Vengono considerate separatamente
tutte le ore di lavoro svolte dallo
stesso dipendente e registrate con lo
stesso codice commessa.
Esiste un solo preventivo relativo al
Task. Vengono considerate tutte le
Task ore di lavoro dei dipendenti registrate
con lo stesso codice di Ordine di
Lavoro.
Esiste un preventivo per ogni ruolo
definito nel Task. Vengono
considerate separatamente tutte le ore
Task figura
di lavoro dei dipendenti registrate con
lo stesso codice di Ordine di Lavoro e
appartenenti alla medesima figura.
Esiste un preventivo per ogni singola
persona che partecipa allo sviluppo
del Task in oggetto. Vengono
Task persona considerate separatamente tutte le ore
di lavoro svolte dallo stesso
dipendente e registrate con lo stesso
codice di Ordine di Lavoro.
12
Se il tipo di avanzamento è uno tra Commessa, Commessa Figura o
Commessa Persona, il nome del task corrisponderà al codice attribuito
alla prima commessa dalla quale il task ha iniziato ad erodere le ore al
momento della definizione dell’attività di sviluppo per il cliente. Se,
invece, il tipo di avanzamento corrisponde ad uno tra Task, Task Figura
o Task Persona, il nome del task corrisponderà al nome assegnato dal
Laboratorio all’intero progetto.
13
• Figura: persona fisica o ruolo (svolto da una o più persone fisiche) ai
quali viene associato un singolo preventivo all’interno di un task. Il
livello di granularità nella definizione degli attori del task dipende dal
tipo di avanzamento. La seguente tabella di correlazione tra tipo di
avanzamento e figura esemplifica il genere di legame che intercorre tra
i due attributi:
2.2.2.1 Avanzamento
L’avanzamento di un preventivo sul singolo Task in un determinato
mese è la misura di quanta parte del preventivo è attribuibile a quel mese.
14
Sulla base di quanto detto, l’avanzamento non è una misura reale del
lavoro effettivamente svolto dai membri del Laboratorio, ma una proiezione
dell’attività svolta sui giorni preventivati.
Dunque, mentre Task e preventivo sono una misura assoluta del lavoro
effettuato (non è influente se le ore di sviluppo complessive sono state
spalmate, ad esempio, in tre mesi piuttosto che in sei), l’avanzamento mostra lo
stato di progressione nel tempo dello sviluppo del progetto, in rapporto al
preventivo, con granularità mensile.
15
mese precedente a quello considerato, nello sviluppo di un progetto, o
di una parte di esso (in base alle persone o alle figure che partecipano
all’attività del task), in rapporto alle giornate di preventivo specificate.
16
Esprime una stima dello stato attuale del progetto.
• Giorni totali delle persone del laboratorio: attributo che ha una valenza
simile a quella dei giorni totali, ma le attività che contribuiscono alla
somma dei giorni provengono solo dal lavoro del Laboratorio. Si può
considerare come il lavoro realmente svolto su ogni progetto, o parte di
esso, fino al mese specificato.
17
18
Nel caso in cui il tipo di avanzamento del task sia task, task figura o
task persona, assume un significato equivalente al task.
• Task: nome del task al quale sottendono le attività elencate nel dettaglio
19
2.2.4 Check task mancanti
Il sistema in fase di progettazione e il sistema delle registrazioni delle
attività dei dipendenti, come già discusso, sono indipendenti tra loro.
Per effettuare una sorta di integrazione o, per meglio dire, fornire una
“comunicazione monodirezionale” di dati tra il sistema SIR e la Gestione delle
Commesse Software è stato instaurato un rapporto tra task (e relativi
preventivi) e attività registrate.
Mentre le registrazioni giornaliere vengono inserite “in blocco” nel
sistema, i task vengono introdotti singolarmente e manualmente nel sistema.
Gli attributi utili da conoscere sono quelli propri delle singole attività
registrate come “descrizione ODL”, “persona”, “figura assegnata”, “ore”, già
descritti diffusamente nel “Dettaglio avanzamenti”.
20
2.2.6 Check persone esterne
Controlla l’attività delle persone esterne al Laboratorio che hanno
partecipato allo sviluppo di task del Laboratorio.
21
• Gruppo: denominazione dell’azienda cliente che ha richiesto lo
sviluppo di un progetto identificato dal task.
22
• Costo totale: è la somma dei costi aziendali, considerati sul numero di
giorni effettivamente lavorati, di ogni persona che ha collaborato allo
sviluppo del task. Rappresenta il costo sostenuto dal Laboratorio, fino
al mese considerato, del lavoro reale svolto dai dipendenti su di un
determinato task.
23
• Ricavo totale di mercato: è la somma delle tariffe di mercato,
considerate sul numero di giorni di avanzamento totali inseriti, di ogni
persona che ha collaborato allo sviluppo del task. Rappresenta il costo
teoricamente sostenuto dall’azienda cliente, fino al mese considerato,
per il progresso dell’attività dei dipendenti dell’azienda informatica su
di un determinato task non effettiva ma dichiarata dal settore
commerciale della Euris all’azienda cliente.
Gli attributi utili da conoscere sono gli stessi della sezione “Gestione
degli avanzamenti economici”, in quanto questo dettaglio rappresenta
nient’altro che gli avanzamenti economici in forma disaggregata.
24
2.2.9 Avanzamenti Commessa
2.2.9.1 Commessa
La commessa è una componente di tipo finanziario, che non è tenuta in
considerazione dal punto di vista tecnico (il quale si basa esclusivamente sullo
sviluppo di un Task e i relativi preventivi e avanzamenti) e che quindi non
influenza l’attività del Laboratorio.
25
Commessa → Commessa
Task → Task
2. In alcuni casi può capitare che una commessa venga considerata come
fondo limitato dal quale diversi task possono attingere le giornate
residue disponibili, dunque si crea una corrispondenza 1:N tra le
commesse e task. Nello schema seguente è rappresentata l’eventualità
nella quale tre task erodono le giornate di un’unica commessa:
Commessa → Commessa
3. Nei due esempi precedenti ogni task era relazionato ad una sola
commessa. Si può verificare, invece, il caso nel quale un task erode le
giornate di avanzamento del mese considerato a due commesse
differenti, perché il residuo della prima commessa non è sufficiente a
coprire l’intero avanzamento. Se si verifica un’eventualità del genere, si
crea una corrispondenza M:N (con M che può assumere un valore
massimo di 2) tra le commesse e task. Nello schema seguente è
rappresentato un esempio del caso appena descritto, in particolare ci
sono sei differenti task che erodono le giornate di avanzamento da due
commesse, con un task che erode le giornate da entrambe le commesse:
26
Commessa → Commessa 1 Commessa 2
Scendendo più nel dettaglio, si può affermare che più di un Task, o parti
di essi, possono andare ad erodere le ore concordate nella commessa, finché
queste non sono terminate e, in tal caso, sarà necessario porre in essere una
nuova commessa nel caso in cui il cliente richieda funzionalità aggiuntive.
27
2.2.9.2 Attributi della commessa
Durante la fase di descrizione delle commesse è stata espressa la
motivazione per la quale, in un determinato mese, l’avanzamento di un task (e
quindi il task stesso) può essere associato a due commesse differenti, quindi, in
questa fase, si descrivono gli attributi utili per la gestione manuale di questo
genere di associazione:
Se
allora
28
Se, invece
!
allora
Se
allora
Se, invece
!
allora
0
Se
Se, invece
29
allora
30
3 CASI D’USO
Nei precedenti capitoli sono state definite le entità che dovranno interagire
nel sistema finale, le relazioni tra di loro e con l’esterno del sistema e il
significato dei loro attributi.
3.1 Task
La sezione task riveste un ruolo di notevole importanza dal punto di vista
della manipolazione dei dati, in quanto consente di inserire, modificare e
cancellare i dati su task e preventivi, due delle entità principali dell’intero
sistema.
31
• Inserimento
• Modifica
• Cancellazione
32
o Preventivo: in questa sezione viene consentita la cancellazione
dei preventivi. Questa operazione permette la rimozione fisica
di quest’entità dai dati del sistema e dunque spezza il legame tra
questa e il relativo task. Se il preventivo eliminato in questa
maniera è l’unico ancora legato ad un certo task, anche
quest’ultimo viene cancellato dal sistema.
• Visualizzazione
o Filtri: alla lista dei preventivi vengono applicati due tipi di filtri
3.2 Avanzamenti
La sezione avanzamenti offre una vasta visione sull’attività tecnica
dell’azienda informatica ed, in particolar modo, consente la gestione attiva dei
dati riguardanti l’avanzamento, cioè il valore che identifica il progresso
temporale del task.
33
Giorni
Nome Ava Ava totale Giorni totali A Ava
Descr Preventivo Ava Giorni Efficienza
Task totale persone Lab totali persone finire prec
Lab
• Visualizzazione
o Modalità: come per la sezione dei Task, viene visualizzata la
lista completa dei preventivi esistenti e i task ad essi associati.
In questo caso, però, le informazioni offerte provengono
dall’aggregazione dei dati locali su task e preventivi con le
attività provenienti da una sorgente dati esterna.
Codice Descrizione
Ore Task Tariffa Data Persona Note Commessa Figura
ODL ODL
34
o Filtri: alla lista dei preventivi vengono applicati tre tipi di filtri
• Visualizzazione
o Modalità: viene visualizzata la lista delle commesse alle quali
sono associate attività registrate, provenienti da una sorgente
dati esterna, che richiedono l’inserimento di un task che le possa
aggregare.
35
o Dettaglio Check task mancanti: consente di visualizzare, per la
specifica commessa selezionata, i dati relativi alle attività
sottese dal commessa stessa, sul modello dello schema
seguente:
36
Le operazioni possibili sul check delle persone esterne sono le seguenti:
• Visualizzazione
o Modalità: viene visualizzata la lista delle attività lavorative
registrate, provenienti da una sorgente dati esterna, che
riguardano dipendenti non appartenenti al laboratorio, i quali
hanno contribuito con un certo numero di giornate lavorative
allo sviluppo di task.
37
Ricavo
Sezione Tariffa di Ricavo Tariffa di
Costo Costo totale Tariffa
Commessa trasf. totale mercato
Avanzamenti medio totale di media
media di trasf. media
mercato
• Visualizzazione
o Modalità: a differenza della sezione degli Avanzamenti, viene
visualizzata la lista completa dei task che aggregano tutti i
preventivi esistenti. Inoltre vengono fornite, in aggiunta ai dati
tecnici degli avanzamenti, informazioni di tipo economico sui
singoli task, come è stato riportato nello schema precedente.
o Filtri: alla lista dei preventivi vengono applicati tre tipi di filtri
38
3.6 Avanzamenti Commessa
L’obiettivo della sezione avanzamenti delle commesse è quello di gestire
manualmente il rapporto che intercorre tra commesse, task e relativi
avanzamenti.
Avanzamento
Residuo Avanzamento Avanzamento Residuo
Commessa Task Descrizione seconda
Commessa Corrente Scaricato Commessa
commessa
39
alla disponibilità della commessa. Questo valore dovrà essere
associato manualmente ad un’altra commessa avente
disponibilità residua di giornate superiore allo 0.
Commesse Residuo
Task Residuo
con capienza commessa
40
4 IMPLEMENTAZIONE
Nel capitolo precedente è stato progettato, in maniera dettagliata, il
comportamento globale del sistema e la definizione dei casi d’uso, cioè le
funzionalità proprie dell’applicazione e le modalità tipiche di utilizzo delle
stesse.
Per rendere più agevole lo sviluppo del progetto, sono stati utilizzati i
seguenti ambienti di sviluppo:
41
giornaliere
liere dei dipendenti dell’azienda informatica) e con l’inserimento e la
manipolazione dei dati da parte degli utenti.
42
Le componenti del sistema sono rapidamente descritte di seguito:
• Architettura Three-Tier
4.3.1 Tabelle
43
Task
Allows
Attributi Tipo Size Chiave Descrizione
null
Identificativo univoco
IdTask int false PK
task
Denominazione del
Task nchar 100 false
Task
Descrizione estesa
Descrizione nchar 100 true
del Task
Commessa dalla
quale il Task
Commessa nchar 20 true
sta erodendo le
giornate
FK su
Tipo di avanzamento
Tipo
TipoAvanzamento int false determinato
Avanzame
per il Task
nto
Stato di attività del
Stato bit false
Task
Data di inizio attività
DataInizioTask datetime true
sul Task
Denominazione
Gruppo nchar 30 true
dell'azienda cliente
Preventivi
Allows
Attributi Tipo Size Chiave Descrizione
null
IdPreventivi int false PK Identificativo univoco preventivo
Breve descrizione del gruppo, della
Figura nchar 70 true figura o della singola persona a cui si
riferisce il preventivo
Numero di giornate di preventivo
sulla commessa, il task, la figura o la
Preventivo float true
persona in base al tipo di
avanzamento previsto
FK su
IdTask int false Task al quale afferisce il preventivo
Task
44
Avanzamenti
Allows
Attributi Tipo Size Chiave Descrizione
null
Identificativo univoco
IdAvanzamento int false PK
avanzamento
Mese int false Mese avanzamento
Anno int false Anno avanzamento
Numero di giornate di
Avanzamento float true
avanzamento mensile
FK su
IdPreventivi int false
Preventivi
Codice della 1° commessa sulla
quale viene spalmato
commessa1 nchar 20 true
l'avanzamento mensile del
preventivo
Numero di giornate di
avanzamento
avaComm1 float true
mensile spalmate sulla 1°
commessa
Codice dell'eventuale 2°
commessa
commessa2 nchar 20 true sulla quale viene spalmato
l'avanzamento mensile del
preventivo
Numero di giornate di
avanzamento
avaComm2 float true
mensile spalmate sull'eventuale
2° commessa
TipoAvanzamento
Allows
Attributi Tipo Size Chiave Descrizione
null
Identificativo univoco tipo
ID_tipo int false PK
di avanzamento
Denominazione del tipo
tipo nchar 40 true
di avanzamento
Descrizione estesa del tipo
descrizione nchar 100 true
di avanzamento
45
Persone
La tabella Persone contiene la lista di tutti dipendenti (membri del
laboratorio o altri dipendenti Euris) che hanno collaborato attivamente
all’avanzamento tecnico dei Task.
Allows
Attributi Tipo Size Chiave Descrizione
null
Identificativo univoco
id_persona int false PK
persona
cognome nchar 40 false Cognome della persona
nome nchar 30 false Nome della persona
Data a decorrere della
quale sono in
dataInizioValidita datetime false vigore il Costo Aziendale
e la Tariffa di
Trasferimento specificati
Costo giornaliero della
persona sostenuto
costoAziendale money false
dal Laboratorio per
attività del Laboratorio
Costo giornaliero della
persona sostenuto
tariffaTrasferimento money true dalla Euris, per attività
interne o esterne al
Laboratorio
Determina se una
persona è membro
personaLaboratorioTS bit false
o meno del Laboratorio
di Trieste
Commesse
Allows
Attributi Tipo Size Chiave Descrizione
null
Codice identificativo univoco
commessa nchar 20 false PK
alfanumerico della commessa
Numero totale delle giornate
preventivoGG real false
attribuite alla commessa
46
T_AttivitaConFigura
Contiene tutti i dati sulle attività giornaliere dei dipendenti Euris.
Attraverso un applicativo di gestione centralizzato delle attività del
personale, i dati inseriti da ogni singolo dipendente Euris sul lavoro svolto,
vengono inseriti nel Database SIR (Sistema Integrato Rapportini).
Il sistema in oggetto di tesi è stato, però, svincolato dal sistema dei
Rapportini, in quanto è nato per essere utilizzato solamente all’interno del
Laboratorio e dunque non integrato in altri sistemi.
Per estrarre i dati sulle attività dei dipendenti, nelle quali saranno
presenti anche quelle dei membri del Laboratorio, è stato dunque necessario
creare questa tabella di attività che viene alimentata in modo semi-automatico
tramite una Stored Procedure che importa tutte le attività fino alla data attuale.
Dato che per tutto il sistema è stata prevista una granularità di dati
mensile è sufficiente ripetere questa operazione a cadenza mensile.
Ordine di lavoro (ODL): rappresenta un progetto sul quale lavorano uno o più
sviluppatori. Ha un codice identificativo (codice_odl) e una descrizione
(Dsc_old) che, in molti casi, corrisponde al nome del Task.
Allows
Attributi Tipo Size Chiave Descrizione
null
Identificativo univoco
id int false PK
dipendente
Cognome nvarchar 50 false Cognome del dipendente
Nome nvarchar 50 false Nome del dipendente
Ore effettivamente lavorate
Ore_Durata real false
sull'attività specificata
Data di svolgimento
Data datetime false
dell'attività
Descrizione estesa
Dsc_odl nvarchar 50 true
dell'Ordine di Lavoro
Note nvarchar 200 true Note eventuali
Codice univoco della
Codice_commessa nvarchar 20 false
commessa
dsc_commessa nvarchar 50 true Descrizione della commessa
Codice univoco dell'Ordine di
codice_odl nvarchar 20 false
Lavoro
Tariffa di mercato del
dipendente, è il costo
Tariffa money true
sostenuto dal cliente per
ogni sua giornata di lavoro
Figura assegnata al
FiguraAssegnata nvarchar 80 true
dipendente
Gruppo interno all'Euris al
TipoOrdineLavoro nvarchar 8 true quale appartiene il
dipendente
47
4.3.2 Diagramma delle relazioni
48
4.4.1 Viste
• TaskEstesiVS
Lista dei preventivi correlati ai Task.
SELECT
dbo.Task.IdTask, dbo.Task.Task, dbo.Task.Descrizione,
dbo.Task.Commessa, dbo.TipoAvanzamento.tipo AS
TipoAvanzamento,
dbo.Task.Stato, dbo.Task.DataInizioTask,
dbo.Task.Gruppo,
dbo.Preventivi.IdPreventivi, dbo.Preventivi.Figura,
dbo.Preventivi.Preventivo
FROM
dbo.Task
INNER JOIN
dbo.TipoAvanzamento
ON dbo.Task.TipoAvanzamento =
dbo.TipoAvanzamento.ID_tipo
LEFT OUTER JOIN
dbo.Preventivi
ON dbo.Task.IdTask = dbo.Preventivi.IdTask
49
• CommesseConAvanzamentiCorrenti
Lista delle commesse con relative giornate di preventivo.
• PersoneConTariffe
Lista dei dipendenti Euris che hanno svolto almeno qualche ora
di attività all’interno di progetti del Laboratorio.
• PersoneLAB
Lista dei dipendenti del Laboratorio Euris della sede di Trieste.
Vengono riportati costo aziendale e tariffa di trasferimento dei
dipendenti e la data di inizio validità di questi valori.
• InsertTaskPreventivi
Inserisce nel DB un nuovo Task con relativo codice,
descrizione, preventivo, figura, gruppo, tipo di avanzamento e
commessa alla quale alla quale erode correntemente i giorni.
50
• UpdateTaskPreventivi
Effettua la modifica dei dati di un Task e l’eventuale
l’eventuale preventivo
specificato.
• DeleteTaskPreventivi
Elimina il preventivo specificato contestualmente
contestualmente a tutti gli
avanzamenti che sottendono ad esso.
Se il preventivo eliminato era l’unico in relazione con un certo
Task, anche quest ultimo viene eliminato.
• UpdateAvanzamenti
Effettua la modifica del valore in giornate dell’avanzamento
connesso
nesso ad un preventivo nella data specificata.
Se non esiste un avanzamento relativo al determinato
preventivo, con mese e anno specificati, allora viene inserito come
nuovo avanzamento.
• UpdateAvanzamentiCommessa
51
fa riferimento, cioè viene effettuata la “spalmatura” delle giornate
disponibili della commesse sugli avanzamenti del task collegato.
% @
&
@
$
Dove:
52
ALTER PROCEDURE [dbo].[UpdateAvanzamentiCommessa]
@datacorrente Datetime,
@avaScaricato float,
@commessa2 nvarchar(20),
@ava2 float,
@idTask int
AS
BEGIN
UPDATE dbo.Avanzamenti
SET commessa1 = AvanzamentiTask.Commessa,
avaComm1 = AvanzamentiTask.ava1,
commessa2 = @commessa2,
avaComm2 = AvanzamentiTask.ava2
FROM
(
SELECT Avanzamento, IdAvanzamento,
Commessa,
((Avanzamento/@AvaTask)*@AvaScaricato)
AS ava1,@commessa2 AS Commessa2,
((Avanzamento/@AvaTask)*@ava2) AS
ava2,@AvaScaricato AS avaScaricato,
@avaTask AS avatotaledeltask
FROM AvanzamentiCorrentiTask(
@datacorrente, @idTask)
) AS AvanzamentiTask
WHERE
dbo.Avanzamenti.IdAvanzamento =
AvanzamentiTask.IdAvanzamento;
END
• AnnullaAvanzamentiCommessa
Annulla le spalmature effettuate sugli avanzamenti appartenenti
al task specificato, in un certo mese, e ritorna il codice della commessa
che era correlata al task prima della spalmatura.
53
• UpdateTaskCommessa
UpdateTaskC
Sostituisce la commessa precedentemente collegata al Task con
quella specificata.
• ImportDatiDaSIR
Procedura che prende tutti i dati sulle attività dei dipendenti
Euris e le inserisce nella tabella T_AttivitaConFigura.
4.4.3 User
User-Defined Functions
Defined Functions
Le User-Defined Function possono essere suddivise in gruppi che
rappresentano le diverse funzionalità dell’applicativo di gestione delle
commesse.
4.4.3.1 Task
ask
• TaskEstesiGrouped
54
4.4.3.2 Consuntivi
onsuntivi avanzamenti
• ConsuntiviDaAConTotali
55
• TaskEstesiAttivitaDaA
Aggrega per preventivo tutte le attività in join con esso, in modo
tale da ottenere, per ogni preventivo, la somma delle ore delle attività
che sottende trasformata in giorni lavorati.
• TaskEstesiAttivitaTotali
Prima aggrega le attività per preventivo e per persona,
sommando le ore lavorate e trasformandole in giorni (in questo modo
vengono anche distinti il numero di giorni lavorati da membri del
laboratorio su un certo preventivo) e successivamente aggrega le attività
solo per preventivo e non più per persona, ottenendo la lista dei
preventivi e il rispettivo numero di giorni effettivamente lavorato totale
e i giorni lavorati solamente dai membri del laboratorio.
• TaskEstesiAttivitaNoGroupDaA
Ogni singola attività dei rapportini viene posta in join con un
certo preventivo solamente previo confronto tra valori selezionati sulla
base del tipo di avanzamento del task (ad esempio “nome del task” della
vista TaskEstesiVS e “descrizione dell’ODL” dalla tabella dei dati delle
attività nel caso in cui il tipo avanzamento sia “task”).
56
ALTER FUNCTION [dbo].[TaskEstesiAttivitaNoGroupDaA]
(
@datainizio Datetime,
@datafine Datetime
)
RETURNS TABLE
AS
RETURN
(
SELECT
dbo.TaskAttivitaGroupByCopia(
dbo.TaskEstesiVS.TipoAvanzamento,
dbo.TaskEstesiVS.Task,
dbo.TaskEstesiVS.Figura, NULL, NULL, NULL)
AS CampoPerJoinTaskEstesi,
dbo.TaskAttivitaGroupBy(
dbo.TaskEstesiVS.TipoAvanzamento,
dbo.TaskEstesiVS.Task,
dbo.TaskEstesiVS.Figura,
dbo.DatiPresenzeDaA.Note,
dbo.DatiPresenzeDaA.Codice_commessa,
dbo.DatiPresenzeDaA.Dsc_odl)
AS CampoPerGroupBy,
dbo.DatiPresenzeDaA.Dsc_odl,
dbo.DatiPresenzeDaA.Ore_Durata,
dbo.TaskEstesiVS.Task,
dbo.DatiPresenzeDaA.Tariffa,
dbo.DatiPresenzeDaA.Data,
dbo.DatiPresenzeDaA.Cognome,
dbo.DatiPresenzeDaA.Nome,
dbo.DatiPresenzeDaA.Note,
dbo.DatiPresenzeDaA.Codice_commessa,
dbo.DatiPresenzeDaA.FiguraAssegnata,
dbo.DatiPresenzeDaA.id,
dbo.DatiPresenzeDaA.codice_odl
FROM
dbo.TaskEstesiVS
LEFT OUTER JOIN
dbo.DatiPresenzeDaA(@datainizio, @datafine)
ON
dbo.JoinTaskAttivita(
dbo.TaskEstesiVS.TipoAvanzamento,
dbo.TaskEstesiVS.Task,
dbo.DatiPresenzeDaA.Dsc_odl,
dbo.TaskEstesiVS.Figura,
dbo.DatiPresenzeDaA.FiguraAssegnata,
dbo.DatiPresenzeDaA.Codice_commessa,
dbo.DatiPresenzeDaA.Cognome,
dbo.DatiPresenzeDaA.Nome) = 1
)
57
• TaskEstesiAttivitaNoGroupTotali
Le attività considerate sono quelle con data fino a quello
specificata.
• AvanzamentiCorrentiETotali
Lista di tutti i preventivi e, per ognuno, la somma di tutti i suoi
avanzamenti mensili, compreso il mese corrente
• AvanzamentiTotali
Lista di tutti i preventivi e, per ognuno, la somma di tutti i suoi
avanzamenti mensili, escluso quello del mese corrente.
58
• AvanzamentoCorrente
Lista di tutti i preventivi e, per ognuno, il suo avanzamento nel
mese corrente.
corrente
• DatiPresenzeDaA
Ritorna
itorna tutti i dati dei rapportini (attività giornaliere dei
dipendenti) tra 2 date.
date
• DatiPresenzeTotali
Ritorna
itorna tutti i dati dei rapportini (attività giornaliere dei
dipendenti) dall'inizio fino alla data specificata (trova anche
anch la data
iniziale del task più vecchio).
vecchio)
• DettaglioCampoPerGroupBy
Ritorna
itorna la lista delle attività da rapportino che sottendono
sotte al
preventivo specificato.
59
4.4.3.3 Avanzamenti
vanzamenti economici
• ConsuntiviPerTaskGroupBy
Aggrega
ggrega i preventivi dei "Consuntivi"
" per Task.
• ConsuntiviConAvaTot
Effettua il join tra i dati dei Consuntivi, aggregati per
preventivo, e i dati economici (costo aziendale, tariffa di trasferimento),
anch’essi aggregati per preventivo.
• ConsuntiviConEfficienzaAvaOGiorni
Fornisce, per ogni preventivo, tutti i valori di avanzamento (se
non è stato inserito alcun valore di avanzamento si prende in
considerazione il totale dei giorni effettivamente
effettivamente lavorati), preventivo,
giorni lavorati, i valori totali di costo aziendale, tariffa di trasferimento
e tariffa di mercato e i relativi valori medi, ottenuti semplicemente
effettuando il prodotto tra i valori economici totali per i giorni
effettivamente
ttivamente lavorati (per quanto riguarda il costo) o per
l’avanzamento (nel caso delle due tariffe) relativi al medesimo
preventivo.
60
Inoltre calcola l’efficienza su ogni singolo preventivo, come
rapporto tra avanzamento e giorni totali effettivamente lavorati fino alla
data specificata.
Costo_Medio,(Costo_Medio * GiorniTotali) AS
Costo_Totale,
Tariffa_Trasferimento_Media,
(Tariffa_Trasferimento_Media *
Ava_o_giorni_Totale) AS
Ricavo_Totale_Trasferimento,
Tariffa_Mercato_Media,(Tariffa_Mercato_Media *
Ava_o_giorni_Totale) AS Ricavo_Totale_Mercato,
61
• CostoAziendaleGroupBy
Aggrega per preventivo le persone che hanno svolto attività su
di esso.
• TaskEstesiPersoneNoGroupDaA
A partire dalle singole attività dei dipendenti collegate ai relativi
preventivi, viene effettuata l’aggregazione, all’interno di ogni distinto
preventivo, per persona che ha svolto l’attività (con la relativa somma
dei giorni lavorati all’interno del preventivo).
Inoltre, per ogni persona, si ottengono i relativi parametri
economici: costo aziendale giornaliero, tariffa di trasferimento
giornaliera e tariffa di mercato anch’essa giornaliera.
62
4.4.3.4 Check
heck
• AttivitaPersoneNoLABDaA
AttivitaPer
Ritorna la lista delle singole attività ricavate dai rapportini e
svolte da personale non appartenente al Laboratorio Euris di Trieste tra
l’intervallo di date specificato.
• CheckPersoneNoLabDaA
• AttivitaPersoneLABDaA
Ritorna la lista delle singole attività ricavate dai rapportini
rapportin e
svolte solamente da personale appartenente al Laboratorio Euris di
Trieste tra l’intervallo di date specificato.
• CheckCommesseDaANoGroup
Ritorna la lista delle singole attività svolte solamente da
personale appartenente al Laboratorio Euris di Trieste
Trieste che non sono
ancora state collegate ad alcun preventivo e, dunque, ad alcun task
sviluppato dal Laboratorio.
63
ALTER FUNCTION [dbo].[CheckCommesseDaANoGroup]
(
@datainizio Datetime,
@datafine
afine Datetime
)
RETURNS TABLE
AS
RETURN
(
SELECT
Attivita
Attivita.id, Attivita.Codice_commessa,,
Attivita
Attivita.dsc_commessa,
LTRIM
LTRIM(RTRIM(Attivita.Cognome)) + ' ' +
LTRIM
LTRIM(RTRIM(Attivita.Nome)) AS Persona,
Persona
Attivita
Attivita.Dsc_odl, Attivita.Ore_Durata,
,
Attivita
Attivita.Tariffa,Attivita.Data, Attivita
Attivita.Note,
Attivita
Attivita.FiguraAssegnata
FROM
AttivitaPersoneLABDaA
AttivitaPersoneLABDaA(@datainizio,@datafine
@datafine)
AS Attivita
WHERE
Attivita
Attivita.Id
NOT IN (
SELECT Id
FROM dbo.TaskEstesiAttivitaNoGroupDaA
TaskEstesiAttivitaNoGroupDaA(
@datainizio,@datafine)
WHERE id is not null
)
)
• CheckCommesseDaA
64
• DettaglioCheckCommessa
4.4.3.5 Spalmatura
palmatura avanzamenti
• AvanzamentiPrecedentiCommessa
Mostra tutti gli avanzamenti dei task che sono stati spalmati
sulle commesse nei mesi precedenti a quello specificato
65
ALTER FUNCTION [dbo].[AvanzamentiPrecedentiCommessa]
(
@datainizio Datetime
)
RETURNS TABLE
AS
RETURN
(
SELECT
commessa, preventivoGG, avaPrecedente,
IdAvanzamento, IdPreventivi
FROM
(
SELECT
dbo.Commesse.commessa,
dbo.Commesse.preventivoGG,
dbo.Avanzamenti.avaComm1 AS avaPrecedente,
dbo.Avanzamenti.IdAvanzamento,
dbo.Avanzamenti.IdPreventivi
FROM
dbo.Commesse
INNER JOIN dbo.Avanzamenti
ON dbo.Commesse.commessa =
dbo.Avanzamenti.commessa1
WHERE
Anno<YEAR(@datainizio)
OR (Anno=Year(@datainizio)
AND Mese<MONTH(@datainizio))
UNION
SELECT
dbo.Commesse.commessa,
dbo.Commesse.preventivoGG,
dbo.Avanzamenti.avaComm2 AS avaPrecedente,
dbo.Avanzamenti.IdAvanzamento,
dbo.Avanzamenti.IdPreventivi
FROM
dbo.Commesse
INNER JOIN dbo.Avanzamenti
ON dbo.Commesse.commessa =
dbo.Avanzamenti.commessa2
WHERE
Anno<YEAR(@datainizio)
OR (Anno=Year(@datainizio)
AND Mese<MONTH(@datainizio))
) AS AvanzamentiPrecedenti
)
66
• AvanzamentiPrecedentiCommessaConResiduo
amentiPrecedentiCommessaConResiduo
Ritorna la lista di tutte le commesse con i relativi avanzamenti
spalmati su di esse fino al mese precedente a quello specificato e con i
giorni residui da poter erodere.
• AvanzamentiCorrentiCommessa
Ritorna la lista dei Task che hanno subito un avanzamento nel
mese corrente.
• TaskCommessaDaAvanzare
Ritorna la lista
lista dei Task che hanno subito un avanzamento nel
mese corrente.
67
• AvanzamentiPrecedentiCommesseAssegnabili
AvanzamentiPrecedentiCommesseAssegnabili
• AvanzamentiCorrentiTask
Ritorna
torna gli avanzamenti del mese specificato relativi ai
preventivi del task specificato.
68
4.5 Presentation
69
4.5.1.1 Gestione dei dati
La gestione dei dati lato client di presentazione sfrutta diffusamente la
tecnologia ADO.NET 2.0.
70
CommesseAssegnabili fornisce la capienza residua di ogni
commessa fino al mese precedente
rispetto a quello specificato
Popola il dettaglio dei Check task
DettaglioCheckCommessa
mancanti
Popola il pannello Check attività
CheckPersoneNoLabDaA
persone esterne
Utilizzata nel processo di erosione,
ritorna la lista dei task che hanno
TaskCommessaDaAvanzare
subito un avanzamento nel mese
corrente
Popola il pannello degli avanzamenti
ConsuntiviPerTaskGroupBy economici con i task e i relativi valori
economici
Carica il dettaglio degli Avanzamenti
ConsuntiviConAvaTot economici con la lista di preventivi
relativa al task selezionato
Operazioni su DataSet
Sulle DataTable appartenenti al DataSet “Lab_Dati_Fatturazione”, si
possono effettuare le seguenti operazioni:
71
• Data:: le due DropDownList, una riguardante la data di partenza e l’altra
quella finale, sono
sono legate tra loro in modo tale che vengano sempre
visualizzate due date con mese uno successivo all’altro.
• Stato: DropDownList
ropDownList che ha come voci selezionabili
o Attivi:
Attivi: visualizza le informazioni dei soli task che hanno lo stato
impostato a true.
o Inattivi:
Inattivi: visualizza le informazioni dei soli task che hanno lo
stato impostato a false.
o Tutti:
Tutti visualizza tutte le informazioni sui task
indipendentemente dallo stato attuale.
72
4.5.1.3 Visualizzazione informazioni
73
I due metodi riportati di seguito vengono chiamati automaticamente dal
Framework .NET ogniqualvolta è necessario visualizzare le celle di un
DataGridView.
Il parsing di ogni singola cella viene effettuato sempre con un ordine ben
preciso:
• Partendo dalla prima cella, la prima sulla riga degli headers di colonna,
partendo da sinistra, si controllano tutte le celle sulla stessa riga da
sinistra verso destra.
• Giunti al termine della riga, si riparte dalla prima cella a sinistra della
riga successiva.
if (args.RowIndex == 0)
return;
if
(
columnName.Equals("taskDataGridViewTextBoxColumn1") ||
columnName.Equals("dataGridViewTextBoxColumn1") ||
columnName.Equals("campoPerGroupByDataGridViewTextBoxColumn")
)
{
if (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex))
{
args.Value = string.Empty;
args.FormattingApplied = true;
}
}
}
74
La porzione di codice C# sopra riportata effettua le seguenti operazioni:
75
Se la cella controllata appartiene alla riga degli headers di colonna,
viene settato il colore base.
if (sortedColumn == null)
{
sortedColumn =
Rows[args.RowIndex].DataGridView.Columns["taskDataGri
dViewTextBoxColumn1"];
}
Se non c’è imposto l’ordinamento sulla colonna del nome del task, per
poter raggruppare le righe.
Infine, in base alla colonna della quale fa parte la cella corrente, effettuo
un confronto per sapere se la riga corrente può essere raggruppata con quella
precedente e in tal caso, alla cella corrente viene assegnato il corretto colore
della colonna, “mescolato” opportunamente con quello della riga sulla quale si
trova la cella.
76
string currentColumnName =
Rows[args.RowIndex].DataGridView.Columns[args.ColumnIndex].
Name.ToString();
if
(
currentColumnName.Equals(
"preventivoDataGridViewTextBoxColumn1") ||
currentColumnName.Equals("Ava_Totale") ||
currentColumnName.Equals("AvaTotalePersoneLab") ||
currentColumnName.Equals("GiorniTotali") ||
currentColumnName.Equals("GiorniTotaliPersoneLab") ||
currentColumnName.Equals("A_finire")
)
{
colorControl(args.RowIndex, sortedColumn.Index, args);
args.CellStyle.BackColor = createColor(deltaR, 0, 0);
}
else if
(
currentColumnName.Equals(
"avanzamentoDataGridViewTextBoxColumn") ||
currentColumnName.Equals("GiorniPeriodo")
)
{
colorControl(args.RowIndex, sortedColumn.Index, args);
args.CellStyle.BackColor = createColor(0, deltaG, 0);
}
else if (
currentColumnName.Equals(
"avanzamentoTotaleDataGridViewTextBoxColumn"))
{
colorControl(args.RowIndex, sortedColumn.Index, args);
args.CellStyle.BackColor = createColor(0, 0, deltaB);
}
else if
(
currentColumnName.Equals("Efficienza") ||
currentColumnName.Equals(
"numeroTariffeDataGridViewTextBoxColumn")
)
{
colorControl(args.RowIndex, sortedColumn.Index, args);
args.CellStyle.BackColor =
createColor(deltaR, deltaG, deltaB);
}
else
{
colorControl(args.RowIndex, sortedColumn.Index, args);
args.CellStyle.BackColor = currentColor;
}
}
77
Il risultato finale ottenuto è il seguente:
4.5.2.1 Obiettivo
Progettazione e sviluppo di una WebPart, da utilizzare in un sito MOSS
2007, che consenta la pubblicazione di dati aziendali provenienti da DB.
78
4.5.2.2 Struttura WebPart
Alla Web Part potranno accedere diversi tipi di utenti, tutti inseriti
all’interno di gruppi gestiti dal sito Sharepoint in oggetto.
Ogni utente del sito Sharepoint, appartenente ad uno o più gruppi, una
volta effettuata l’autenticazione, visualizzerà la WebPart in oggetto.
79
• Responsabili dell’attività tecnica: hanno interesse a tenere sotto
controllo l’attività propria di sviluppo di applicativi per il cliente. I
parametri ai quali sono interessati sono, tipicamente, lo stato di
avanzamento di tutti i progetti dei quali sono responsabili, la
distribuzione delle ore lavorate da parte dei dipendenti nei diversi
progetti e l’efficienza del team di sviluppo sul singolo progetto o su
tutti i progetti attualmente in fase di sviluppo. La misura dell’efficienza
può essere calcolata, ad esempio, come rapporto tra avanzamento, fino
alla data attuale, e giorni effettivamente lavorati sul task.
80
4.5.2.3 Struttura EditorPart
• GroupsColumnsEditor
81
• UsersSqlEditor
Ogni utente sarà selezionabile da una lista che conterrà tutti gli
utenti che possono accedere al sito Sharepoint nel quale è stata inserita
la Web Part.
• ConnectionParametersEditor
82
Figura 4.8 – EditorPart Parametri di Connessione DB
83
Figura 4.9 – WebPart AvanzamentiDataGridWP
84
[WebBrowsable(false),
Personalizable(PersonalizationScope.Shared)]
public String ConnectionString
{
get
{
return this._CONNECTION_STRING;
}
set
{
this._CONNECTION_STRING = value;
}
}
string → TextBox
bool → CheckBox
85
• SqlQueryString: query SQL per il caricamento dei dati da DB. Ha il
seguente formato:
nome_gruppo1,nome_colonna1:permesso!nome_colonna2:permesso!...!;nome_gruppo2,
nome_colonna1:permesso!....!;
Con:
nome_utente1,filtro_sql;nome_utente2,filtro_sql;
86
NOTA SUL FORMATO DELLE STRINGHE SQL
E’ stata implementata una funzionalità di riconoscimento di tag ad hoc,
inseribili all’interno della query SQL di connessione e dei filtri SQL relativi
agli utenti. Questi tag, in sede di caricamento dati da DB, vengono sostituiti dai
valori che rappresentano.
<nome_tag>
e sono i seguenti:
• <user> → utente connesso
• <datetime> → data e ora attuale
• <site> → nome del sito corrente
PROBLEMI RISCONTRATI
87
4.5.2.5 Implementazione EditorPart
88
Ogniqualvolta il numero di CheckBox aggiunte alla collezione dei
Controlli della EditorPart è maggiore di quelle create precedentemente, si
presenta un errore non gestibile.
Dato che il numero di colonne presenti nel set di record ritornati dalla
query SQL definita, può essere sempre variabile, per ovviare al problema si è
pensato di inserire ogni volta un numero fisso di CheckBox
(maxColumnsNumber definito come costante intera): le CheckBox che
rappresentano le colonne vengono visualizzate, mentre le altre vengono rese
non visibili.
89
VARIABILI DI SESSIONE
Le variabili di sessione sono ottenute tramite la proprietà “WebPartManager”
della WebPart.
this.WebPartManager.Page.Session.Remove(
"previousUserSelection")
90
4.5.2.6 Life Cycle di WebPart e Editor Part
Il Framework di Sharepoint gestisce il caricamento dei dati, la loro
memorizzazione persistente e la visualizzazione dei controlli sulla pagina del
sito dove è presente la Web Part, effettuando delle chiamate in un certo ordine
ed a alcuni particolari metodi delle classi astratte WebPart e EditorPart.
Aggiorna l'Editor Part con i valori forniti dalla Web Part associata
(sincronizzazione)
91
public override bool ApplyChanges()
Salva sulla Web Part i dati inseriti nella Editor Part associata
Legenda
AvanzamentiDataGridWP
GroupsColumnsEditor
UsersSqlEditor
ConnectionParametersEditor
92
• Caricamento WebPart in stato Browsable
CreateChildControls
Render
OnEditModeChanged
CreateChildControls
CreateEditorParts
CreateChildControls
SyncChanges
Render
CreateChildControls
Render
SyncChanges
Render
CreateChildControls
Render
SyncChanges
93
• Evento di un controllo
CreateEditorParts
CreateChildControls
Render
CreateChildControls
Render
CreateChildControls
Render
CreateChildControls
Render
Metodo chiamato
dall’Handler degli eventi
CreateEditorParts
SyncChanges
CreateChildControls
SyncChanges
CreateChildControls
SyncChanges
CreateChildControls
Render
CreateChildControls
Render
ApplyChanges
Render
ApplyChanges
Render
ApplyChanges
94
• Pressione tasto “OK”
CreateEditorParts
ApplyChanges
CreateChildControls
SyncChanges
CreateChildControls
SyncChanges
CreateChildControls
SyncChanges
CreateChildControls
OnEditModeChanged
ApplyChanges
Render
ApplyChanges
CreateEditorParts
CreateChildControls
CreateChildControls
OnEditModeChanged
CreateChildControls
Render
CreateChildControls
95
5 CONCLUSIONI
L’applicazione sviluppata e descritta dettagliatamente in questa tesi, si
divide in due parti:
96
Durante lo sviluppo del progetto ho dovuto confrontarmi inizialmente
con problematiche di carattere prettamente tecnico (analisi e progettazione di
Database relazionali e acquisizione di esperienza nella codifica C# e SQL) per
passare successivamente ad una fase di puro apprendimento su una tecnologia
per me del tutto nuova come MOSS 2007, utile allo sviluppo e l’integrazione di
WebPart.
97