1. UNIVERSITÀ DEGLI STUDI DI TRIESTE
F A C OL T À DI I N GE GN E R I A
C OR S O D I L A U R E A S P E CI A L I S T I C A I N I N GE GN E R I A I N F OR M A T I CA
Tesi di laurea in
Complementi di Basi di Dati
Studio e realizzazione di soluzioni per lavoro
collaborativo basate sul motore di workflow di
SharePoint 2010
Laureando Relatore
Alexia Cociancich Chiar.mo Prof. Maurizio Fermeglia
Anno Accademico 2010/ 2011
~1~
4. Sommario
Introduzione........................................................................................................................................ 5
Caso in esame ................................................................................................................................... 6
Approccio tradizionale ............................................................................................................. 7
Approccio server .......................................................................................................................... 8
Approccio SharePoint ............................................................................................................... 9
Strumenti utilizzati ...................................................................................................................... 10
SharePoint ...................................................................................................................................... 10
Visual Studio 2010 Ultimate.............................................................................................. 12
Microsoft Access 2010 ........................................................................................................... 13
Smtp4Dev ....................................................................................................................................... 14
Workflow .............................................................................................................................................. 15
I workflow in SharePoint ..................................................................................................... 16
Workflow: caso specifico ......................................................................................................... 17
1. Caso ideale: utenti SharePoint ................................................................................... 19
1.1 I nvio semplici notifiche implementate con SharePoint Designer .. 20
1.2 Aggiunta di un report alle notifiche ................................................................... 22
2. Caso reale: utenti occasionali ..................................................................................... 24
2.1 Recupero informazioni su db esterno ................................................................ 25
Difficoltà incontrate .................................................................................................................... 29
Possibili sviluppi ............................................................................................................................ 30
Ringraziamenti ................................................................................................................................ 31
Fonti bibliografiche ...................................................................................................................... 32
Appendice ........................................................................................................................................... 33
Workflow 1.2 ................................................................................................................................ 33
Workflow 2.1 ................................................................................................................................ 35
Query Database .......................................................................................................................... 41
~4~
5. Introduzione
Spesso, quando si deve presentare un documento formale, ci si trova a
dover ripetere più volte le stesse operazioni, tanto che nella
maggioranza dei casi l’ iter è sintetizzabile con un algoritmo standard.
Per questo motivo automatizzare gli step ricorrenti può essere utile al
fine di snellire le procedure. Quando in questo algoritmo si richiede la
collaborazione di diversi utenti mediante lo scambio di informazioni, si
parla di workflow.
Ad Esempio si può presentare l’esigenza di dover far approvare un
documento, sottoponendolo all’ attenzione di più persone.
Per fare ciò bisogna innanzitutto condividere il materiale da
approvare, scambiando quindi dei file tra utenti.
~5~
6. Caso in esame
Il caso preso in esame coinvolge le fasi di revisione di un elaborato di
tesi.
Questo tipo di documento solitamente coinvolge diversi soggetti, in
primis il laureando o dottorando, principale autore dello scritto, quindi
vengono coinvolti dei reviewers (solitamente due o più), infine l’ ultima
approvazione spetta al relatore.
reviewer
reviewer
relatore
studente
reviewer
~6~
7. Approccio tradizionale
Tipicamente le interazioni tra gli attori coinvolti nel processo di
approvazione si svolgono via e-mail, creando una catena tra i contatti.
Questo sistema risulta particolarmente inefficiente per i seguenti
motivi:
• Il successo globale del progetto è fortemente condizionato
dall’ impegno individuale dei singoli soggetti. I nfatti è sufficiente
che un anello della catena si spezzi per compromettere la riuscita
dell’opera
• Scarsa efficienza in termini di tempo: nessuno può iniziare il
lavoro finché l’elemento gerarchico precedente non ha concluso il
proprio, impedendo la parallelizzazione dei processi.
• Gestione delle versioni del documento non automatizzata. Ogni
soggetto è tenuto a produrre una copia col rischio di confusione
tra le versioni del documento.
• Gestione delle notifiche soggetta ad errore umano. Chi è
incaricato di avvisare gli altri componenti del progetto può
sbagliare o dimenticare di inoltrare un messaggio di notifica
~7~
8. Approccio server
Una prima evoluzione del sistema consiste nel predisporre uno spazio
su un server ove caricare di volta in volta il documento da sottoporre
a revisione.
I vantaggi di questo approccio, rispetto a quello precedentemente
descritto sono i seguenti:
• Il documento è sempre disponibile a tutti coloro che hanno
l’ autorizzazione ad accedere alla risorsa
• Più soggetti possono iniziare il proprio lavoro
contemporaneamente
Tuttavia questi stessi punti di forza comportano dei rischi collaterali:
• Difficoltà della gestione delle versioni del documento. Qualora
due o più utenti iniziassero a modificare contemporaneamente lo
stesso file, ci si troverebbe davanti ad una situazione confusa e
disordinata delle versioni
• Le operazioni di scaricamento, caricamento, eventuale rinomina
del file sono affidate all’ utente e quindi soggette ad errore
• Le autorizzazioni relative ai documenti valgono per tutta la
durata del processo di revisione, percui non è possibile
distinguere dal punto di vista informatico in che fase il singolo
soggetto possa/ debba intervenire
~8~
9. Approccio SharePoint
Utilizzare sul server SharePoint costituisce un valore aggiunto.
Permette infatti di automatizzare la gestione dei documenti condivisi
da più utenti, riducendo il margine di errore in un’ottica
maggiormente collaborativa.
La piattaforma garantisce l’accesso ad utenti con ruoli diversi, ed in
base alle autorizzazioni di cui gode l’ utente, permette di svolgere
alcune azioni piuttosto che altre.
Tramite SharePoint è possibile implementare dei flussi di lavoro che
riguardano i documenti caricati sul sito, basando il workflow
sull’ interazione di diversi utenti.
Quest’ ultimo approccio è stato la base per lo sviluppo di una serie di
soluzioni collaborative.
~9~
10. Strumenti utilizzati
SharePoint
SharePoint è un prodotto M icrosoft pensato per la creazione di siti web
in maniera collaborativa, integrando servizi intranet ed extranet in un
unico portale. T ra le funzionalità principali fornite vi è un sistema che
permette una gestione efficiente dei documenti digitali.
Con SharePoint infatti è possibile creare cartelle su un server e
controllare gli accessi alle risorse mediante Active Directory in base
alle autorizzazioni possedute dall’utente, nonché personalizzarne il
layout.
Le edizioni di SharePoint attualmente sono tre: Foundation, Standard
ed Enterprise.
L’utente può accedere ai siti SharePoint mediante uno dei browser
supportati: Internet Explorer 7, Firefox 3.6, Safari 4.04, Google
Chrome 12, e successive versioni degli stessi 1.
I requisiti minimi del sistema sono: processore a 64 bit, quad-core, 4
Gb di RAM, disco rigido da 80 Gb, sistema operativo Windows a 64 bit,
SQL Server a 64 bit (dal 2005 SP3)
L’ idea iniziale era quella di installare la piattaforma su una virtual
machine con il sistema operativo Windows Server 2008 R2 installato
ed accedervi dal sistema host, purtroppo le risorse dei laptop per uso
domestico attualmente in commercio di cui mi sono servita per
sviluppare il progetto, non mi avrebbero garantito delle prestazioni
accettabili, qualora avessi dovuto usufruire due sistemi operativi
contemporaneamente. Inoltre, come illustrato in seguito, si è reso
necessario l’ impiego dell’ ambiente di sviluppo Visual Studio 2010, il
quale, per utilizzare i tool dedicati a SharePoint, richiede
l’ installazione sul medesimo sistema operativo di Windows SharePoint
Services. Pertanto ho provveduto ad installare la piattaforma sulla
macchina reale, che dispone di un sistema operativo Windows 7
Ultimate a 64 bit.
SharePoint Foundation 2010
Disponibile gratuitamente, SharePoint Foundation ( noto nelle versioni
precedenti come Windows SharePoint Services) costituisce la
piattaforma per i prodotti della famiglia M icrosoft SharePoint
1
Ad eccezione delle versioni a 32 bit di Internet Explorer, i browser sono supportati con limitazioni
~ 10 ~
11. (SharePoint Designer, Project Server, SharePoint Workspace, Office
Web Apps, Search Server) .
SharePoint Designer 2010 2
SharePoint Designer è un editor per i siti SharePoint che permette di
personalizzare gli elementi in essi contenuti (elenchi, raccolte,
workflow, pagine web) fornendo un’ interfaccia user-friendly ed
evitando all’utente di scrivere codice a mano. Si tratta di uno
strumento particolarmente efficiente per lo sviluppo delle funzionalità
più comuni.
2
SharePoint Designer 2010 è compatibile solo con siti SharePoint 2010
~ 11 ~
12. Visual Studio 2010 Ultimate
Visual Studio è un ambiente di sviluppo ideato per lavorare con il
framework .NET. T ra i linguaggi di programmazione supportati vi è C#,
che ho utilizzato durante l’ implementazione del progetto per scrivere
un algoritmo in grado di descrivere il flusso di lavoro preso in esame.
Inoltre Visual Studio 2010 mette a disposizione una serie di utili
strumenti per lo sviluppo di soluzioni per SharePoint mediante modelli
di progetto. Dalla versione più recente, definendo la relativa
destinazione sul sito SharePoint, è possibile effettuare direttamente la
distribuzione della soluzione nonché eseguirne il debug, ovviando il
sistema di deploy manuale, che spesso risulta macchinoso.
~ 12 ~
13. Microsoft Access 2010
Microsoft Access è un database management system relazionale
incluso nel pacchetto Office, grazie alla propria interfaccia user-
friendly è un prodotto molto diffuso per applicazioni domestiche. I l
progetto prevedeva l’ interrogazione di un database esterno al sito
SharePoint. Data la natura elementare della base di dati (una semplice
query) su una tabella (con poche colonne ed un numero ristretto di
righe), si è ritenuto che le funzionalità fornite da M icrosoft Access
coprissero le esigenze del progetto. Tuttavia qualora fosse richiesto un
impiego maggiormente professionale sarebbe possibile migrare i dati
verso un sistema che assicuri una migliore gestione dei dati, come ad
esempio, per rimanere in ambito M icrosoft, SQL Server.
~ 13 ~
14. Smtp4Dev
Per testare le funzionalità di invio e-mail pur non avendo di un server
di posta, non disponendo di una connessione internet in fase di demo
o volendo limitarsi alla simulazione dell’ invio per evitare di instradare
messaggi di test, sono ricorsa ad un software freeware, Smtp4Dev,
che si occupa di rimanere in ascolto sulla porta usata dal protocollo
smtp ( 25 per default) intercettando così le e- mail in transito.
L’ interfaccia grafica, molto semplice ed intuitiva consente all’utente
una serie di utili operazioni come ad esempio la visualizzazione del
messaggio tramite il client di posta configurato nel sistema. Poiché
SharePoint non permette di usare localhost come nome di dominio per
il server smtp, è necessario configurare tale parametro indicando il
domain name del pc sia nella pagina del sito outgoing e-mail settings
che all’ interno delle opzioni di Smtp4Dev
~ 14 ~
15. Workflow
Per workflow o flusso di lavoro si intende una sequenza di passaggi tra
loro correlati atti allo scambio di informazioni tra utenti. Si può
pensare come un algoritmo che descrive un lavoro mediante
l’ astrazione delle attività che lo compongono per mezzo delle quali gli
attori coinvolti contribuiscono attuando le azioni assegnate al proprio
ruolo. O meglio, citando la Workflow Management Coalition “The
automation of a business process, in whole or part, during which
documents, information or tasks are passed from one participant to
another for action, according to a set of procedural rules.”
~ 15 ~
16. I workflow in SharePoint
Workflow Foundation mette a disposizione librerie per
l’ implementazione di due categorie di flussi di lavoro: sequenziali e
macchina a stati. I l primo caso consiste in una successione di attività
che devono essere svolte in un ordine prefissato, nel secondo caso il
modello è organizzato in determinati stati, a loro volta composti da
attività che, qualora completate originano un evento che determina la
transazione da uno stato all’altro.
SharePoint Designer consente di implementare facilmente workflow
sequenziali 3, fornendo un ventaglio di operazioni standard componibili
tra loro, ovvero condizioni e azioni raggruppabili in step. SharePoint
Designer dispone di tre categorie di workflow: site, list o reusable. I l
primo è relativo ad un sito, trova perciò campo di applicazione in
diverse liste ed elementi appartenenti ad esse, i list workflow invece
sono associati ad una lista specifica, i reusable workflow infine hanno
il vantaggio di non costringere lo sviluppatore a scegliere a priori la
lista alla quale il flusso di lavoro verrà applicato. T uttavia, per quanto
ampia e personalizzabile sia la gamma di operazioni che l’editor rende
disponibile e che generalmente riesce a coprire la maggior parte delle
esigenze di sviluppo, qualora si renda indispensabile un’elaborazione
del codice, SharePoint Designer ha delle limitazioni difficilmente
sormontabili, pertanto in casi maggiormente complessi si rende
necessario l’ impiego di Visual Studio.
3
È possibile simulare una macchina a stati con SharePoint Designer, inserendo workflow secondari, tuttavia si
tratta di una forzatura non consigliabile nel caso di schemi particolarmente complessi.
~ 16 ~
17. Workflow: caso specifico
aso
Il flusso di lavo ro che ho svilup pato consiste ne l proce sso di
sviluppato
approvazione di un e labo rato da parte di alcuni reviewer. L’ idea è
stata que lla di dividere in due macro fasi il procedimento. Ne lla prima
macro-fasi
parte lo studente che ha redatto il documento accede al sito
Share Po int e lo carica in una carte lla pre stabilita a cui hanno accesso
(con pe rmesso di co llaborazione 4) so lo gli studenti e re lativi re latori a
con latori,
questo punto il primo wo rkflo w inizia automaticamente e viene
segnalata la prese nza de l nuo vo do cumento sul server inviando un
messaggio che confermi l’esito positivo de ll’o perazione allo stude nte
ed una notifica via e-mail al re lato re, quest’ultimo procede
mail
manualmente a ve rificarne il co nte nuto (e d e ventualmente co rre ggere
il nome de l file) e d assegnato al nuo vo e lemento i reviewer incaricati
iewer
di esaminare l’e laborato. Una vo lta ricaricato il file in un’altra carte lla
sul sito ( in questo caso gli ute nti che avranno accesso alla risorsa
saranno appunto i revie wer ed il re latore ha origine il secondo flusso
latore)
che preve de uno step iniziale in cui un’e mail di notifica contene nte le
niziale un’e-mail
info rmazioni nece ssarie avvisa i reviewer assegnati al proge tto
de ll’esiste nza de l nuovo documento sul sito, invitando li a prendere
visione de llo stesso e contattare quanto prima il re lato re. Quando
quest’ ultimo avrà rice vuto l’ appro vazione da parte di tutti gli attori
co invo lti, pro vve derà a modificare le pro prietà de l file sul sito,
assegnando allo stesso uno status che indichi l’esito po sitivo de l
processo . La variazione di questo valore innesca un e ve nt chento
preve de l’ invio di un messaggio ai reviewe r di cui so pra conte nente un
ringraziame nto pe r la co llabo razione pre stata ed al re latore
contenente il riepilogo de lle tesi presenti ne lla re lativa carte lla e d
ancora in attesa di appro vazio ne finale senza la quale il workflow no n
finale,
5
può co nclude rsi .
upload notifica relatore,
ringraziamento
studente studente
upload notifica feedback
cambio status
ringraziamento
reviewers,
reviewers reviewers
relatore (report relatore)
4
I tipi di permesso predefiniti di SharePoint sono cinque: limited access, read, contribute, design e full control. È
tuttavia possibile definire livelli personalizzati aggiuntivi.
finire
5
La prima implementazione non comprende l’automazione di quest’ultima funzionalità.
~ 17 ~
18. Questo progetto presenta alcune difficoltà che hanno richiesto
un’attenta valutazione al fine di stabilire quanto si potesse
automatizzare il flusso di lavoro e dove invece fosse indispensabile
l’ intervento umano. Si sarebbe potuto ad esempio unire i due workflow
in un unico, scrivendo il codice per un metodo che copiasse
automaticamente il file caricato da una cartella all’altra. Tuttavia, per
motivi che verranno meglio illustrati in seguito, la procedura di upload
sarebbe risultata più complessa, richiedendo il rispetto di una serie di
parametri troppo stretti, che avrebbero sicuramente introdotto una
grossa percentuale di errori umani.
Un altro punto che si sarebbe potuto formalizzare all’ interno del codice
è il cambio di status del documento, che è stato demandato
all’ intervento manuale del relatore. D’altra parte non solo è difficile
automatizzare il processo di approvazione con un’ interfaccia user-
friendly per l’utente non potendo sfruttare, come verrà spiegato in
seguito, l’ autenticazione per ciascun reviewer, ma, come rilevato da
esperienze pregresse, spesso il feedback da parte di questo tipo di
utente giunge attraverso canali comunicativi differenti ed obbligare i
reviewer ad interagire attivamente con il sito SharePoint potrebbe
determinare un rallentamento del flusso di lavoro.
Inoltre l’applicazione concreta dei workflow implementati
generalmente gestisce una quantità ridotta di elementi, pertanto
l’ intervento umano non risulta eccessivamente oneroso.
Dopo un’analisi dettagliata dei requisiti sono state progettate una
serie di diverse soluzioni, ciò è dovuto al fatto che le ipotesi teoriche
di un sistema ideale non sempre hanno trovato riscontro nella realtà.
~ 18 ~
19. 1. Caso ideale: utenti S
SharePoint
Per iniziare a studiare gli strumenti messi a disposizio ne da Share Po int
ho supposto de lle condizio ni ideali che rispecchiassero il mode llo
sugge rito dalla piattaforma stessa, ho assunto pe rciò che ciascun
atto re co invo lto nei flussi di lavoro dispo nesse di un account
personale , gode ndo pertanto de lle re lative proprie tà di autenticazione
ed auto rizzazio ne. Ho quindi creato tre utenti, uno per ciascun ruo lo
necessario , rispettivamente stude nte , reviewer e supe rviso re
studente
(re latore) . Ad o gnuno di essi ho fatto corrisponde re un gruppo in
Share Po int (stude nts, reviewers e superviso rs) , in mo do da garantire
rs),
flessibilità qualora si do vessero mo dificare i permessi relativi a tutti
gli utenti che rico prono il medesimo ruo lo sfruttan do il concetto di
sfruttando
ereditarietà. Sono state quindi definite due carte lle sul sito
Share Po int: repository (ne
(nella quale vengono caricate i docume nti dagli
le
stude nti) e re view (a disposizio ne de i revie wer e re lato ri) ,
quest’ ultima lista presenta due co lo nne personalizzate , una re lativa
ltima
allo status (campo boo le ano che indica se la tesi è stata approvata o
meno) e un’ altra contenente l’e lenco degli utenti co involti ne l processo
di revisione ( il campo è un tipo di dato pre definit o de dicato alla
definito
gestio ne degli ute nti, oppo rtunamente configurato in modo da po ter
contene re più valo ri conte mpo rane amente)
Figura 1: esempio upload di un file e relativa assegnazione ai rispettivi reviewers
~ 19 ~
20. 1.1 Invio semplici notifiche implementate con
SharePoint Designer
Per il primo esempio di imple mentazione è stato usato so lame nte
Share Po int Designer. Un wo rkflo w applicato alla lista re posito ry viene
attivato automaticamente o gni qualvolta si cre ii un nuo vo docume nto
ne lla stessa e si o ccupa di mandare un messaggio di ringraziamento
all’ utente che ha caricato il file ne lla carte lla (si presuppone che
l’ ute nte in questio ne co incida con lo stude nte autore della tesi) e d uno
al re lato re (che si presupp o ne unico proprie tario de lla carte lla a cui è
presuppo
associato il flusso di lavoro) contene nte l’url de lla risorsa
corrispondente.
Figura 2: esempio di implementazione di un workflow con SharePoint Designer
Un altro workflow associato alla lista re view, anch’esso attivato
auto maticamente ad o gni uplo ad, spedisce analo gamente una mail a
ciascun reviewe r specificato ne l campo contenente l’e lenco de gli utenti
associati (re vie we rs assigned) , so lle citando li a prende re visione de l
assigned),
docume nto in questione ( indicato pe r me zzo di link all’ url) e fornire un
riscontro a riguardo. I l flusso di lavo ro si co nsidera immediatamente
concluso do po que st’operazione . Con questa so luzione non è possibile
st’operazione.
inviare via mail un rie pilogo de i documenti non anco ra approvati
presenti ne lla lista, in quanto Share Point Designe r no n riesce a gestire
~ 20 ~
21. in maniera versatile concetti come i dataset, infatti per gestire l’ invio
della mail a più destinatari si è reso necessario ricorrere ad una
variabile locale di tipo stringa formata dalla concatenazione dei valori
presenti nell’elenco. Tuttavia il relatore potrebbe verificarli
autonomamente semplicemente aprendo una pagina del sito costituita
da una vista filtrata sull’elenco in questione.
~ 21 ~
22. 1.2 Aggiunta di un rep
ggiunta report alle notifiche
Per ovviare alla mancanza de l rie pilo go via mail si può aggiungere un
terzo wo rkflo w, impleme ntato con Visual Studio, mantenendo inalterati
que lli appena descritti in SharePo int Designe r I l flusso di lavoro , a
r.
differe nza de i precedenti, si attive rà non più ad ogni nuovo e le mento,
ma anche ad ogni modifica. In questo modo quando si modificano le
proprie tà de l documento contrassegnando lo come approvato , il flusso
di lavoro co mpie l' unica az ione specificata, cioè inviare un’e mail al
azione un’e-
re latore; questa conterrà l’e le nco de gli url corrisponde nti ai documenti
;
ancora in attesa di appro vazio ne. Pe r otte nere ciò ho inserito ne l
codice una query che valuta la clauso la re lativa al valo re conte nuto
ne l campo appro ve d e ho concatenato i risultati in una stringa da
usare ne l body de ll’e-mail.
mail.
Figura 3: esempio di semplice workflow in Visual Studio
~ 22 ~
24. 2. Caso reale: utenti occasionali
Una delle principali problematiche sorte in fase progettuale è stata il
controllo degli accessi al sito. Infatti non si poteva disporre di account
per ogni singolo attore coinvolto, mentre supervisori e studenti sono
dotati di username e password individuali, per i reviewer che nella
maggior parte dei casi entrano in contatto con il portale solamente
una volta ( quando cioè prelevano il documento dal server) , risulta
troppo oneroso attivare un account per ciascuno, percui l’ accesso
viene garantito condividendo le credenziali tra tutti coloro che
ricoprono il ruolo di reviewer. Ciò impedisce di adottare le soluzioni
esposte in precedenza in quanto rende impossibile sfruttare le
informazioni relative all’ utente, senza contare che al compimento di
un’azione da parte del reviewer il sistema non è in grado di
distinguere chi realmente impersoni il ruolo, e quindi associarne le
autorizzazioni corrispondenti.
~ 24 ~
25. 2.1 Recupero informazioni su db esterno
Per mantenere in relazione le informazioni concernenti i reviewer ed i
progetti ad essi assegnati, ho impiegato il database solitamente
interrogato dal relatore per estrarre manualmente i dati di cui sopra.
Il database dispone di informazioni riguardanti il documento
contenente l’elaborato ed il suo autore, e gli attori coinvolti nel
processo di approvazione: reviewers e supervisor. Ogni volta che uno
studente sottopone un elaborato all’ attenzione del proprio relatore,
quest’ ultimo deve aggiornare la tabella che associa i reviewer al
progetto.
Ho scritto una query che a partire da un parametro di input
rappresentante il nome del file (che deve coincidere con quello
caricato) fornisce il titolo della tesi in questione e gli indirizzi e- mail
del supervisor e dei reviewer assegnati.
Figura 5: implementazione in Visual Studio di un semplice workflow sequenziale che inolta un e-
mail al caricare di un file
Il primo workflow, incaricato di gestire l’ upload dei file sul sito
SharePoint da parte degli studenti segue la medesima logica di quello
visto in precedenza, inviando un messaggio al relatore contenente il
link per accedere alla nuova risorsa.
~ 25 ~
26. Il secondo flusso di lavoro prese nta una maggiore complessità Ne i
complessità.
casi precedenti si era assunto per se mplicità che la figura de l re latore
co incidesse co l proprie tario de lla pagina web, co n que sta nuo va
versione de l wo rkflo w invece le informazioni re lative al supe rvisor
risie dono ne l database , in questo modo è anche possibile che la stessa
lista o spiti le te si di più re lato ri contemporaneamente , scinde ndo la
sta contemporaneamente,
figura de ll’autore de lla lista da que lla de l supe rvisor
rvisor.
Figura 6: workflow sequenziale in Visual Studio con valutazione di più condizioni
Il flusso di lavo ro si attiva ad ogni creazione di un nuo vo e lemento
ne lla lista e rimane attivo grazie ad un ciclo while fino a quando il
campo status de l docume nto non assume un de terminato valore .
Questo contro llo è svo lto ad o gni mo difica de l file o de lle sue
delle
proprie tà, una serie di if e lse confrontano il valo re de l campo di
if-e
status. In questa soluzione ho esteso questo campo facendo in mo do
che po tesse assumere tre valori di tipo testo(a differe nza de i due
boo leani visti in precedenza): pending, appro ve d by re viewe rs e
ved
approve d by superviso r Se questo campo rimane invariato , non
r.
compie alcuna azione, se co rrisponde al valo re pending viene spe dita
un’e-mail in cui si invita ciascun re v iewer a prendere visione de l file in
mail viewer
questione ed un’e-mail al responsabile de lla lista inse re ndo ne l corpo
mail
de l messaggio l’e lenco de i documenti no n anco ra appro vati
definitivamente . Qualo ra il campo di status assuma il valore approve d
ualo
by re viewe rs vengono spe dite e mail ai medesimi so ggetti de l caso
e-
~ 26 ~
27. precedente ma con contenuti differenti, ai reviewer arriverà un
messaggio in cui li si ringrazia per il lavoro svolto, al responsabile la
stessa struttura dell’e-mail già vista, ma con l’elenco opportunamente
aggiornato. Infine, se lo status diviene approved by supervisor
significa che anche l’ultima valutazione è stata data, pertanto un’e-
mail ringrazia per l’operato svolto il supervisor analogamente a quanto
accaduto nei casi precedenti per i reviewer ed al responsabile della
lista arriverà una notifica in cui si indica che il processo di
approvazione del documento è giunto al termine. Quando si verifica
quest’ ultima ipotesi l’esecuzione del flusso esce dal ciclo principale ed
il workflow si considera concluso.
~ 27 ~
28. Figura 7: tabella di esempio utilizzata per archiviare le informazioni relative ai reviewer
~ 28 ~
29. Difficoltà incontrate
L’attività che ha richiesto più tempo è stata la configurazione
dell’ ambiente di sviluppo. L’ installazione di SharePoint e la successiva
configurazione richiedono un notevole impegno, inoltre non sempre le
risorse hardware minime di un home pc attualmente riescono a
soddisfare i requisiti minimi del sistema. L’ installazione della
piattaforma sul sistema operativo Windows 7 non è ben documentata
in rete e risulta piuttosto macchinosa.
Il deploy dei workflow è abbastanza semplice finché si utilizzano le
pagine prescelte per il debug, ma qualora si voglia distribuire una
soluzione su diversi siti è necessario compiere una serie di operazioni
manuali per niente semplici.
~ 29 ~
30. Possibili sviluppi
Combinando assieme gli strumenti messi a disposizione da SharePoint
è possibile comporre dei workflow rispondenti ad ogni esigenza, la
maggior parte delle funzionalità più comuni è alla portata anche di
sviluppatori non esperti.
La gestione automatizzata dei documenti digitali potrebbe evitare il
ricorso a supporti cartacei, velocizzando gli itineris, abbattendo i costi
ed i problemi legati alle distanze. Infatti spesso gli uffici risultano
intasati da fascicoli e tenerli in ordine è conseguentemente laborioso,
inoltre il rischio che qualcuna di queste pratiche venga smarrita è
tanto più alto quanto più difficile è interrogarne l’ archivio.
Ad esempio si potrebbe progettare un servizio web sul portale
dell’ università che, tenendo conto delle credenziali dell’ utente,
permetta agli studenti di inviare tramite internet le proprie tesi di
laurea, senza essere obbligati a presentarsi fisicamente allo sportello
muniti di copia cartacea dell’elaborato.
~ 30 ~
31. Ringraziamenti
Vorrei ringraziare tutti coloro che in questi anni hanno creduto in me
sostenendomi ed incoraggiandomi, soprattutto durante i numerosi
momenti di sconforto. Ma ancor di più ci tengo a ringraziare coloro
che al contrario mi hanno ripetuto che non ce l’avrei mai fatta,
stimolando la mia testardaggine a cercare di contraddirli. Infatti è
anzitutto grazie a questi ultimi che ho imparato a non accontentarmi
di obiettivi facili e a puntare sempre più in alto.
Il primo pensiero va alla mia famiglia, ovvero mia madre e mia nonna,
ma naturalmente anche a coloro che purtroppo non potranno esserci di
persona, in primis a mio padre, per aver avuto fiducia in me .
Un enorme grazie va ai miei amici, che con il loro affetto mi hanno
fatto sentire meno sola, sopportando il mio caratteraccio. M i astengo
dal fare nomi perché l’elenco sarebbe troppo lungo e avrei paura di
dimenticarne qualcuno, tra quelli che conosco da oltre 20 anni, quelli
che sono entrati nella mia vita solo da pochi mesi e quelli che per un
motivo o per l’altro ho perso di vista.
Un ringraziamento al mio relatore, il prof. Maurizio Fermeglia, che con
il proprio pragmatismo mi ha aiutato a concludere questo lungo
percorso di studi. Ringrazio inoltre tutto l’Ateneo per avermi offerto
l’opportunità di affrontare la laurea come fosse una sfida personale.
~ 31 ~
32. Fonti bibliografiche
Testi
• “Beginning SharePoint 2010 – Building Business Solutions with
SharePoint” A. Perran, S. Perran, J. Mason, L. Rogers
• “SharePoint 2010 Development with Visual Studio 2010” E.
Carter, B. Scholl, P. Jausovec (Addison-Wesley)
• “SharePoint 2010 Workflows In Action” P. Wicklund (Manning)
Riferimenti web
• http://office.microsoft.com/ it- it/sharepoint-help/
• http://www.wfmc.org/
~ 32 ~
33. Appendice
Workflow 1.2
using S y st e m ;
using S y st e m . Co m po n e n tM o d e l;
using S y st e m . Co m po n e n tM o d e l. D e s i gn ;
using S y st e m . Co l l e c t io n s ;
using S y st e m . D r a w in g;
using S y st e m . L i n q;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. Co m p i l e r ;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. S e r i a l iz at i o n ;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. D e s i g n ;
using S y st e m . Wo r k f l o w . R u n t i m e ;
using S y st e m . Wo r k f l o w . A ct iv i t i e s;
using S y st e m . Wo r k f l o w . A ct iv i t i e s. R u l e s ;
using M i cr o s o f t. S h ar e P o in t;
using M i cr o s o f t. S h ar e P o in t. Wo r k f lo w ;
using M i cr o s o f t. S h ar e P o in t. Wo r k f lo w A c t io n s;
n a m e sp a ce A ppr o v i n g. W o r k f l o w 1
{
p u b l i c se a l e d p ar t i a l c l as s Wo r k f lo w 1 : S e qu e n t i a lW o r k f l o w A c t iv it y
{
pu b l i c Wo r k f l o w 1( )
{
I n i t i a l iz e Co m po n e n t ( ) ;
}
pu b l i c Gu i d w o r k f lo w I d = d e f au l t( S y st e m . Gu i d) ;
pu b l i c S P W o r k f lo w A ct iv a t io n P r o pe r t i e s w o r k f l o w P r o p e r t i e s = n e w
S P W o r k f lo w A ct iv a t io n P r o pe r t ie s( ) ;
pu b l i c S tr i n g s e n dE m a i l R e po r t _B o d y = d e f au l t( S y s te m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e po r t _S u b j e c t = de f a u lt ( S y st e m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e po r t _T o = de f au l t( S y s te m . S tr in g) ;
pr iv a te v o i d o n Wo r k f l o w A c t iv at e d 1 _ I n v o k e d( o b je c t s e n d e r ,
E x t e r n a lD a t aE v e n tA r gs e )
{
str i n g d o c L i st = g e t D a t a( ) ;
se n d E m a i lR e p o r t _T o = w o r k f lo w P r o p e r t i e s. L i st. A u th o r . E m a i l;
se n d E m a i lR e p o r t _S u b j e c t = "A f i l e w as c h a n ge d in " +
w o r k f lo w P r o pe r t i e s. L i st. T i t l e ;
se n d E m a i lR e p o r t _B o dy = "T h e f o l l o w in g do cu m e n ts a r e s t i l l w a i t in g f o r
a pr o v a l: " + d o c L is t;
}
pu b l i c str i n g g e tD a t a( )
{
str i n g a = s tr in g. E m p ty ;
str i n g s tr U r l = w o r k f l o w P r o p e r t i e s. S i te U r l + "/ ";
u s i n g ( S P S it e s i te = n e w S P S i te( str U r l) )
{
u s in g ( S P We b w e b = s i te . O pe n W e b( ) )
{
st r in g l i st n am e = w o r k f lo w P r o p e r t i e s. L i st. T it l e ;
S P L i st l i st = w e b. L is ts [ l is t n a m e ] ;
S P Qu e r y m y q u e r y = n e w S P Q u e r y ( ) ;
~ 33 ~
34. m y qu e r y . Qu e r y = " ";
S P L i st I te m Co l l e c t io n it e m s = l is t. Ge tI te m s( m y q u e r y ) ;
f o r e a c h ( S P L is tI t e m i te m in i te m s)
{
if ( i te m ! = n u l l )
{
str i n g x = i te m . G e t F o r m a tt e dV a lu e ( " ap pr o v e d ") ;
if ( it e m . Ge t Fo r m at te dV a lu e ( " a ppr o v e d ") = = "Y e s ")
{
}
e ls e
{
a = a + "< br > " + w o r k f l o w P r o p e r t i e s . S it e U r l + " / " +
i te m . U r l ;
}
}
}
}
}
return a;
}
}
}
~ 34 ~
35. Workflow 2.1
using S y st e m ;
using S y st e m . Co m po n e n tM o d e l;
using S y st e m . Co m po n e n tM o d e l. D e s i gn ;
using S y st e m . Co l l e c t io n s ;
using S y st e m . D r a w in g;
using S y st e m . L i n q;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. Co m p i l e r ;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. S e r i a l iz at i o n ;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. D e s i g n ;
using S y st e m . Wo r k f l o w . R u n t i m e ;
using S y st e m . Wo r k f l o w . A ct iv i t i e s;
using S y st e m . Wo r k f l o w . A ct iv i t i e s. R u l e s ;
using M i cr o s o f t. S h ar e P o in t;
using M i cr o s o f t. S h ar e P o in t. Wo r k f lo w ;
using M i cr o s o f t. S h ar e P o in t. Wo r k f lo w A c t io n s;
n a m e sp a ce D o cU p lo a d. W o r k f l o w 1
{
p u b l i c se a l e d p ar t i a l c l as s Wo r k f lo w 1 : S e qu e n t i a lW o r k f l o w A c t iv it y
{
pu b l i c Wo r k f l o w 1( )
{
I n i t i a l iz e Co m po n e n t ( ) ;
}
pu b l i c Gu i d w o r k f lo w I d = d e f au l t( S y st e m . Gu i d) ;
pu b l i c S P W o r k f lo w A ct iv a t io n P r o pe r t i e s w o r k f l o w P r o p e r t i e s = n e w
S P W o r k f lo w A ct iv a t io n P r o pe r t ie s( ) ;
pu b l i c S tr i n g s e n dE m a i l 1 _B o d y 1 = de f a u lt ( S y st e m . S tr i n g) ;
pu b l i c S tr i n g s e n dE m a i l 1 _S u b je ct 1 = de f au l t( S y s te m . S tr in g) ;
pu b l i c S tr i n g s e n dE m a i l 1 _T o 1 = de f au l t( S y s te m . S tr i n g) ;
pr iv a te v o i d o n Wo r k f l o w A c t iv at e d 1 _ I n v o k e d( o b je c t s e n d e r ,
E x t e r n a lD a t aE v e n tA r gs e )
{
se n d E m a i l 1 _T o 1 = w o r k f l o w P r o p e r t i e s. L is t. A u th o r . E m a i l;
se n d E m a i l 1 _S u b je ct 1 = " D o cu m e n t u p lo a de d: " +
w o r k f lo w P r o pe r t i e s. I te m . D is p l ay N am e ;
se n d E m a i l 1 _B o d y 1 = "T h i s d o c u m e n t i s av a i ab l e : " +
w o r k f lo w P r o pe r t i e s. S i te U r l + "/ " + w o r k f l o w P r o pe r t ie s. I t e m U r l ;
}
}
}
using S y st e m ;
using S y st e m . Co m po n e n tM o d e l;
using S y st e m . Co m po n e n tM o d e l. D e s i gn ;
using S y st e m . Co l l e c t io n s ;
using S y st e m . D r a w in g;
~ 35 ~
36. using S y st e m . L i n q;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. Co m p i l e r ;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. S e r i a l iz at i o n ;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l;
using S y st e m . Wo r k f l o w . C o m po n e n tM o d e l. D e s i g n ;
using S y st e m . Wo r k f l o w . R u n t i m e ;
using S y st e m . Wo r k f l o w . A ct iv i t i e s;
using S y st e m . Wo r k f l o w . A ct iv i t i e s. R u l e s ;
using M i cr o s o f t. S h ar e P o in t;
using M i cr o s o f t. S h ar e P o in t. Wo r k f lo w ;
using M i cr o s o f t. S h ar e P o in t. Wo r k f lo w A c t io n s;
using S y st e m . D a t a. O l e D b;
using S y st e m . D a t a;
using S y st e m . Co l l e c t io n s . G e n e r i c;
n a m e sp a ce R e v ie w i n g. W o r k f l o w 1
{
p u b l i c se a l e d p ar t i a l c l as s Wo r k f lo w 1 : S e qu e n t i a lW o r k f l o w A c t iv it y
{
pu b l i c Wo r k f l o w 1( )
{
I n i t i a l iz e Co m po n e n t ( ) ;
}
pu b l i c Gu i d w o r k f lo w I d = d e f au l t( S y st e m . Gu i d) ;
pu b l i c S P W o r k f lo w A ct iv a t io n P r o pe r t i e s w o r k f l o w P r o p e r t i e s = n e w
S P W o r k f lo w A ct iv a t io n P r o pe r t ie s( ) ;
pu b l i c bo o l r e s = tr u e;
pu b l i c S t ac k < s tr in g> ds = n e w S t ac k < st r in g> ( ) ;
pu b l i c str i n g to = s tr in g. E m p ty ;
pu b l i c str i n g f i l e n am e = str i n g. E m p t y ;
pu b l i c str i n g t h e s i s = str i n g. E m p ty ;
pu b l i c str i n g d o cL i s t = str i n g . E m pt y ;
pu b l i c str i n g s u p e r v i so r = s tr in g. E m p ty ;
pu b l i c str i n g o w n e r = s tr in g. E m pty ;
pr iv a te v o i d W h i l e Co n d i t io n ( o b je ct se n d e r , Co n d i t io n a lE v e n tA r gs e )
{
e . R e s u lt = r e s;
f i l e n am e = w o r k f lo w P r o pe r t i e s. I te m . F i l e. N am e ;
o w n e r = w o r k f lo w P r o p e r t i e s. L i st. A u t h o r .E m a i l ;
O le D b Co n n e ct i o n o c = n e w
O le D b Co n n e c t io n ( @ " P r o v id e r = M i cr o so f t. A CE . OL E D B. 1 2. 0; D a t a
S o u r ce = F : R e v i e w e r s N a n o te ch . a cc d b; P e r s i st S e cu r i ty I n f o = F a l se ; ") ;
str i n g q u e r y = " R e v i e w e r Q u e r y ";
o c. Op e n ( ) ;
O le D b Co m m an d co m = n e w O le D bC o m m a n d ( q u e r y , o c ) ;
co m . Co m m a n dT y p e = Co m m an dT y pe. S t o r e dP r o c e d u r e ;
co m . P a r a m e te r s. A d d( "@ f i l e n a m e ", O le D bT y p e . V ar Ch a r ) . V a lu e =
f i l e n am e ;
O le D b D a t aR e a d e r d r = co m . E x e c u te R e a de r ( ) ;
w h i le ( dr . R e a d( ) )
~ 36 ~
37. {
d s. P u s h ( dr . Ge tS tr in g( 0) ) ;
s u p e r v i s o r = dr . Ge tS tr in g( 1) ;
t h e s is = dr . Ge tS tr in g( 2) ;
}
i n t m a x = d s. C o u n t;
f o r ( i n t co n t a = 0; co n t a < m ax ; co n t a+ + )
{
t o = ds. P o p( ) + "; " + to ;
}
dr . C lo se ( ) ;
}
pu b l i c H as h t a b l e o n W o r k f lo w I te m C h an ge d 1_ A f te r P r o p e r t i e s 1 = n e w
S y s te m . C o l le ct i o n s. H as h t a b l e ( ) ;
pu b l i c H as h t a b l e o n W o r k f lo w I te m C h an ge d 1_ B e f o r e P r o p e r t ie s1 = n e w
S y s te m . C o l le ct i o n s. H as h t a b l e ( ) ;
pu b l i c S tr i n g s e n dE m a i lP e n d i n g _T o = de f au l t( S y s te m . S tr in g) ;
pu b l i c S tr i n g s e n dE m a i lP e n d i n g _S u bj e c t = de f au l t( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i lP e n d i n g _B o dy = de f au l t( S y s te m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i lP e n d i n g _C C = d e f au l t( S y s te m . S t r i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e v i e w e d _ B o dy = d e f au l t( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i l R e v i e w e d _ C C = de f a u lt ( S y st e m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e v i e w e d _S u b je ct = d e f au l t( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i l R e v i e w e d _T o = de f au l t( S y st e m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e d _B o dy = d e f au l t( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e d _C C = de f a u lt ( S y st e m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e d _S u b je ct = d e f au l t( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e d _T o = de f au l t( S y st e m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e w R e l _ Bo d y = d e f au l t( S y s te m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e w R e l _S u b je ct = d e f au l t( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i l R e w R e l _T o = de f au l t( S y s te m . S tr in g) ;
pu b l i c S tr i n g s e n dE m a i l R e l _ Bo dy = de f a u lt ( S y st e m . S tr i n g) ;
pu b l i c S tr i n g s e n dE m a i l R e l _S u bj e c t = d e f au l t( S y s te m . S t r i n g ) ;
pu b l i c S tr i n g s e n dE m a i l R e l _T o = de f au l t( S y st e m . S tr i n g ) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e dR e l _B o d y = de f a u lt ( S y s te m . S t r in g) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e dR e l _S u b je ct = de f a u lt( S y s te m . S tr in g) ;
pu b l i c S tr i n g s e n dE m a i l A p pr o v e dR e l _T o = d e f au l t( S y s te m . S t r in g) ;
pr iv a te v o i d N o tC h a n ge d( o b je ct s e n de r , C o n d it i o n a lE v e n tA r gs e )
{
str i n g a S t a t u s =
o n W o r k f l o w I t e m Ch an ge d1 _ A f t e r P r o p e r t i e s 1[ "S ta tu s "] . T o S tr in g ( ) ;
if ( o n W o r k f l o w I te m C h a n ge d1 _ Be f o r e P r o p e r t ie s1 [" S t a t u s "] = = n u l l )
{
e . R e su l t = f a l se ;
r e tu r n ;
}
str i n g b S t a t u s =
o n W o r k f l o w I t e m Ch an ge d1 _ Be f o r e P r o pe r t i e s 1[ "S t at u s "] . T o S tr i n g( ) ;
~ 37 ~
38. if ( b S t a tu s = = a S t a tu s)
{
e . R e su l t = tr u e;
}
e ls e
{
e . R e su l t = f a l se ;
}
}
pr iv a te v o i d P e n d i n g ( o bj e c t se n d e r , Co n d i t io n a lE v e n tA r g s e )
{
str i n g a S t a t u s =
o n W o r k f l o w I t e m Ch an ge d1 _ A f t e r P r o p e r t i e s 1[ "S ta tu s "] . T o S tr in g ( ) ;
do cL i st = g e tD a t a( ) ;
se n d E m a i lP e n d in g_ T o = to ;
se n d E m a i lR e l_T o = o w n e r ;
se n d E m a i lP e n d in g_ S u b je ct = " D o cu m e n t w a i t in g f o r y o u r a p pr o v a l: " +
th e s i s;
se n d E m a i lR e l_ S u bj e c t = "D o c u m e n t u p lo a de d: " + th e s i s;
se n d E m a i lP e n d in g_ Bo dy = " T h e f o l lo w i n g d o c u m e n t i s av a i ab l e h e r e : "
+ w o r k f l o w P r o p e r t i e s . S it e U r l + " / " + w o r k f l o w P r o pe r t i e s. I te m U r l + "
< br > P l e as e g i v e u s a f e e d b ack a s so o n a s po ss i b l e . < br > B e st R e g ar ds ";
se n d E m a i lR e l_ Bo dy = " D o cu m e n t av a i ab l e : " +
w o r k f lo w P r o pe r t i e s. S i te U r l + "/ " + w o r k f l o w P r o pe r t ie s. I t e m U r l + " < br > < br >
T h e se do cu m e n t s ar e st i l l w a it i n g f o r a pr o v a l: " + d o c L is t;
if ( aS ta tu s = = " pe n d i n g")
{
e . R e su l t = tr u e;
}
e ls e
{
e . R e su l t = f a l se ;
}
}
pr iv a te v o i d R e v i e w e d( o b je c t s e n de r , Co n d i t io n a lE v e n tA r gs e )
{
/ / a p pr o v e d by r e v ie w e r s
str i n g a S t a t u s =
o n W o r k f l o w I t e m Ch an ge d1 _ A f t e r P r o p e r t i e s 1[ "S ta tu s "] . T o S tr in g ( ) ;
do cL i st = g e tD a t a( ) ;
se n d E m a i lR e v ie w e d_T o = to ;
se n d E m a i lR e w R e l_T o = o w n e r ;
se n d E m a i lR e v ie w e d_ S u bj e c t = " T h a n k s f o r r e v i e w i n g ";
se n d E m a i lR e w R e l_ S u bj e c t = "D o cu m e n t r e v ie w e d: " + th e s i s;
se n d E m a i lR e v ie w e d_ Bo dy = "T h an k y o u f o r r e v ie w i n g " + t h e s i s +
"< b r > B e st R e g ar d s " ;
~ 38 ~
39. se n d E m a i lR e w R e l_ Bo dy = " D o cu m e n t av a i a b le : " +
w o r k f lo w P r o pe r t i e s. S i te U r l + "/ " + w o r k f l o w P r o pe r t ie s. I t e m U r l + " < br > < br >
T h e se do cu m e n t s ar e st i l l w a it i n g f o r a pr o v a l: " + d o c L is t;
if ( aS ta tu s = = " a ppr o v e d by r e v i e w e r s ")
{
e . R e su l t = tr u e;
}
e ls e
{
e . R e su l t = f a l se ;
}
}
pr iv a te v o i d A p pr o v e d( o bj e ct se n d e r , Co n d i t io n a lE v e n tA r gs e )
{
/ / a p pr o v e d by su pe r v is o r
str i n g a S t a t u s =
o n W o r k f l o w I t e m Ch an ge d1 _ A f t e r P r o p e r t i e s 1[ "S ta tu s "] . T o S tr in g ( ) ;
do cL i st = g e tD a t a( ) ;
se n d E m a i lA ppr o v e d _T o = o w n e r ;
se n d E m a i lA ppr o v e d R e l _T o = s u p e r v is o r ;
se n d E m a i lA ppr o v e d _S u b je c t = " D o c u m e n t ap pr o v e d by su pe r v is o r : " +
th e s i s;
se n d E m a i lA ppr o v e d R e l _S u b je c t = "A p pr o v i n g c o m p le te d: " + th e s i s;
se n d E m a i lA ppr o v e d _B o dy = "D o cu m e n t av a i a b le : " +
w o r k f lo w P r o pe r t i e s. S i te U r l + "/ " + w o r k f l o w P r o pe r t ie s. I t e m U r l + " < br > < br >
T h e se do cu m e n t s ar e st i l l w a it i n g f o r a pr o v a l: " + d o c L is t;
se n d E m a i lA ppr o v e d R e l _B o d y = " T h a n k y o u f o r a pp r o v in g " + th e s is +
"< b r > B e st R e g ar d s " ;
if ( aS ta tu s = = " a ppr o v e d by su p e r v is o r ")
{
e . R e su l t = tr u e;
}
e ls e
{
e . R e su l t = f a l se ;
}
r e s = f a ls e;
}
pu b l i c str i n g g e tD a t a( )
{
str i n g a = s tr in g. E m p ty ;
str i n g s tr U r l = w o r k f l o w P r o p e r t i e s. S i te U r l + "/ ";
u s i n g ( S P S it e s i te = n e w S P S i te( str U r l) )
{
u s in g ( S P We b w e b = s i te . O pe n W e b( ) )
{
~ 39 ~
40. st r in g l i st n am e = w o r k f lo w P r o p e r t i e s. L i st. T it l e ;
S P L i st l i st = w e b. L is ts [ l is t n a m e ] ;
S P Qu e r y m y q u e r y = n e w S P Q u e r y ( ) ;
m y qu e r y . Qu e r y = " ";
S P L i st I te m Co l l e c t io n it e m s = l is t. Ge tI te m s( m y q u e r y ) ;
f o r e a c h ( S P L is tI t e m i te m in i te m s)
{
if ( i te m ! = n u l l )
{
if ( it e m . Ge t Fo r m at te dV a lu e ( "S t at u s ") = = " ap pr o v e d by
su pe r v i s o r " )
{
}
e ls e
{
a = a + "< br > " + w o r k f l o w P r o p e r t i e s . S it e U r l + " / " +
i te m . U r l + " ( " + it e m . G e t Fo r m at te dV a l u e (" S t a tu s ") + ") ";
}
}
}
}
}
return a;
}
}
}
~ 40 ~
41. Query Database
PARAMETERS filename Text ( 255 );
SELECT Reviewers.[E-mail Address], Reviewers.emailSupervisor,
Reviewers.ThesisT itle
FROM Reviewers
WHERE (((Reviewers.filename)=[ filename]));
~ 41 ~