Il Workflow dovrà avere l’aspetto simile a quello della figura 1.
Per il controllo create Task, impostiamo la proprietà TaskID, con l’assegnazione di un campo (Es. Taskid), per crearlo,tramite il designer selezionare nella finestra delle proprietà del controllo, il campo taskid, tramite il pulsantino, posto sul lato destro, nella finestra di dialogo selezionare la linguetta “Bind to a new member”. Selezioniamo l’opzione “Create Field” e nella casella di testo digitate il seguente testo “Taskid”, chiudete la finestra confermando con il pulsante OK.
Sempre nella finestra delle proprietà del controllo CreateTask, selezionate la voce “TaskProperties”, nella parte destra, fate click sul pulsantino con i tre punti, nella finestra che viene aperta, selezionate la linguetta “Bind To a new member” e nella casella di testo impostate il valore “TaskProperties” sempre selezionando l’opzione “Create Field”.
Di seguito si riporta il codice, delle suddette operazioni.
VB.Net
'imposto il task
TaskId = Guid.NewGuid()
TaskProperties.AssignedTo = "WIN2KSP2K7\Administrator"
TaskProperties.Description = "Mia descrizione"
TaskProperties.Title = "Mio Titolo"
TaskProperties.PercentComplete = 2
TaskProperties.StartDate = DateTime.Today
TaskProperties.DueDate = DateTime.Today.AddDays(2)
C#
//imposto il task
TaskId = Guid.NewGuid();
TaskProperties.AssignedTo = @"WIN2KSP2K7\Administrator";
TaskProperties.Description = "Mia descrizione";
TaskProperties.Title = "Mio Titolo";
TaskProperties.PercentComplete = 2;
TaskProperties.StartDate = DateTime.Today;
TaskProperties.DueDate = DateTime.Today.AddDays(2);
Fatto ciò aggiungiamo un metodo per l’evento MethodInvoking, in questo evento, visualizzeremo il testo che verrà riportato nel dettaglio del workflow, in particolare nella sezione “Cronologia flusso di lavoro”.
VB.Net
Private Sub logAttivita_MethodInvoking(ByVal sender As System.Object, ByVal e As System.EventArgs)
HistoryDescription = "Valore passato: " & workflowProperties.InitiationData
HistoryOutcome = "Workflow Terminato"
End Sub
C#
private void logAttivita_MethodInvoking(object sender, EventArgs e)
{
HistoryDescription = "Valore Passato: " + workflowProperties.InitiationData;
HistoryOutcome = "Workflow Terminato";
}
Ora non ci resta completare l’ultimo elemento, il controllo complete Task, per tale controllo, impostate la proprietà CorrelationToken, con il valore “TaskToken”, mentre per la proprietà TaskId, con il valore TaskId, che abbiamo creato in precedenza.
Creazione dei file XML:-
Di seguito si riporta il file Feature.xml, completato in ogni sua parte.
<?xml version="1.0" encoding="utf-8"?>
<!-- _lcid="1033" _version="12.0.3111" _dal="1" -->
<!-- _LocalBinding -->
<!-- Insert Feature.xml Code Snippet here. To do this:
1) Right click on this page and select "Insert Snippet" (or press Ctrl+K, then X)
2) Select Snippets->SharePoint Workflow->Feature.xml Code -->
<Feature Id="055264CF-F7D9-457f-B250-46E70F0D965D"
Title="WorkFlow con uso di Infopath"
Description="Questo Worfklow utilizza Infopath"
Version="12.0.0.0"
Scope="Site"
ReceiverAssembly="Microsoft.Office.Workflow.Feature, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
ReceiverClass="Microsoft.Office.Workflow.Feature.WorkflowFeatureReceiver"
xmlns="http://schemas.microsoft.com/sharepoint/">
<ElementManifests>
<ElementManifest Location="workflow.xml" />
</ElementManifests>
<Properties>
<Property Key="GloballyAvailable" Value="true" />
<!-- Value for RegisterForms key indicates the path to the forms relative to feature file location -->
<!-- if you don't have forms, use *.xsn -->
<Property Key="RegisterForms" Value="*.xsn" />
</Properties>
</Feature>
Terminata la fase di compilazione del file Feature.xml non ci resta che completare il file Workflow.xml.
<?xml version="1.0" encoding="utf-8" ?>
<!-- _lcid="1033" _version="12.0.3015" _dal="1" -->
<!-- _LocalBinding -->
<!-- Insert Workflow.xml Code Snippet here. To do this:
1) Right click on this page and select "Insert Snippet" (or press Ctrl+K, then X)
2) Select Snippets->SharePoint Workflow->Workflow.xml Code -->
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Workflow
Name="WorkflowInfopath"
Description="Dimostrazione di utilizzo di Infopath in Workflow"
Id="{512BC939-0684-475e-9107-8AE8996E5A0E}"
CodeBesideClass="SPWFInfopath.Workflow1"
CodeBesideAssembly="SPWFInfopath, Version=1.0.0.0, Culture=neutral, PublicKeyToken=c051e283858a6d51"
TaskListContentTypeId="0x01080100C9C9515DE4E24001905074F980F93160"
InstantiationUrl="_layouts/PaginaValore.aspx"
>
<Categories/>
<!-- Tags to specify InfoPath forms for the workflow; delete tags for forms that you do not have -->
<MetaData>
<Task0_FormURN>taskFormURN</Task0_FormURN>
<AssociateOnActivation>false</AssociateOnActivation>
</MetaData>
</Workflow>
</Elements>
VB.Net
<%@ Assembly Name="Microsoft.SharePoint.ApplicationPages, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Page Language="VB"Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase" MasterPageFile="~/_layouts/application.master" EnableViewState="false" EnableViewStateMac="false" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Workflow"%>
<%@ Import Namespace="Microsoft.SharePoint.Utilities"%>
<%@ Import Namespace="Microsoft.SharePoint.WebControls"%>
<script runat="server">
'dichiarazioni campi
'oggetto per la gestione del sito
Protected List As SPList
'oggetto elemento o riga di una lista
Protected ListItem As SPListItem
'classe che rappresenta l'assocazione di un workflow
Protected WorkflowAssociation As SPWorkflowAssociation
'oggetto che rappresenta un sito o un tipo di contenuto lista
Protected CCType As SPContentType
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim paramList As String = Request.Params("List")
Dim paramID As String = Request.Params("ID")
List = Web.Lists(New Guid(paramList))
ListItem = List.GetItemById(Convert.ToInt32(paramID))
Dim WorkflowAssociationID As Guid = New Guid(Request.Params("TemplateID"))
WorkflowAssociation = List.WorkflowAssociations(WorkflowAssociationID)
'verifico che non sia nulla, altrimenti ritento un associazione
If (WorkflowAssociation Is Nothing) Then
'ottengo il riferimento al workflow
Dim CTypeID As SPContentTypeId = CType(ListItem("ContentTypeId"), SPContentTypeId)
CCType = List.ContentTypes(CTypeID)
WorkflowAssociation = CCType.WorkflowAssociations(WorkflowAssociationID)
End If
If (WorkflowAssociation Is Nothing) Then Throw New SPException("Nessun Workflow trovato")
End Sub
Protected Sub BtnOk_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Try
Dim valore As String = txtNome.Text
Web.Site.WorkflowManager.StartWorkflow(ListItem, WorkflowAssociation, valore)
Catch ex As Exception
'nel caso che è un eccezione vado alla pagina degli errori
SPUtility.Redirect("Error.aspx", _
SPRedirectFlags.RelativeToLayoutsPage, _
HttpContext.Current, _
"ErrorText=" + "Errore")
End Try
SPUtility.Redirect(List.DefaultViewUrl, _
SPRedirectFlags.Default, _
HttpContext.Current)
End Sub
</script>
<asp:Content ID="Main" ContentPlaceHolderId="PlaceHolderMain" runat="server">
<table cellspacing="0" cellpadding="0" border="0" >
<TR>
<td valign=top><asp:Label Text="Nome:" ID="LblNome" runat=server></asp:Label></td>
<td> <asp:TextBox ID="txtNome" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td colspan="1">
<asp:Button ID="BtnOk" runat="server" Text="OK" OnClick="BtnOk_Click" /></td>
</tr>
</TABLE>
</asp:Content>
C#
<%@ Assembly Name="Microsoft.SharePoint.ApplicationPages, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>
<%@ Page Language="C#" Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase" MasterPageFile="~/_layouts/application.master" EnableViewState="false" EnableViewStateMac="false" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Workflow"%>
<%@ Import Namespace="Microsoft.SharePoint.Utilities"%>
<%@ Import Namespace="Microsoft.SharePoint.WebControls"%>
<%--Codice C#--%>
<script runat="server">
//dichiarazioni campi
//oggetto per la gestione del sito
protected SPList List;
//oggetto elemento o riga di una lista
protected SPListItem ListItem;
//classe che rappresenta l'assocazione di un workflow
protected SPWorkflowAssociation WorkflowAssociation;
//oggetto che rappresenta un sito o un tipo di contenuto lista
protected SPContentType CType;
protected void Page_Load(object sender, EventArgs e)
{
string paramList = Request.Params["List"];
string paramID = Request.Params["ID"];
List = Web.Lists[new Guid(paramList)];
ListItem = List.GetItemById(Convert.ToInt32(paramID));
Guid WorkflowAssociationID = new Guid(Request.Params["TemplateID"]);
WorkflowAssociation = List.WorkflowAssociations[WorkflowAssociationID];
//verifico che non sia nulla, altrimenti ritento un associazione
if (WorkflowAssociation == null)
{ // ottengo il riferimento al workflow
SPContentTypeId CTypeID = (SPContentTypeId)ListItem["ContentTypeId"];
CType = List.ContentTypes[CTypeID];
WorkflowAssociation = CType.WorkflowAssociations[WorkflowAssociationID];
}
if (WorkflowAssociation == null)
throw new SPException("Nessun Workflow trovato");
}
protected void BtnOk_Click(object sender, EventArgs e)
{
try
{
string valore = txtNome.Text;
Web.Site.WorkflowManager.StartWorkflow(ListItem,
WorkflowAssociation,
valore);
}
catch (Exception ex)
{
//nel caso che è un eccezione vado alla pagina degli errori
SPUtility.Redirect("Error.aspx",
SPRedirectFlags.RelativeToLayoutsPage,
HttpContext.Current,
"ErrorText=" + "Errore");
}
SPUtility.Redirect(List.DefaultViewUrl,
SPRedirectFlags.Default,
HttpContext.Current);
}
</script>
<asp:Content ID="Main" ContentPlaceHolderId="PlaceHolderMain" runat="server">
<table cellspacing="0" cellpadding="0" border="0" >
<TR>
<td valign=top><asp:Label Text="Nome:" ID="LblNome" runat=server></asp:Label></td>
<td> <asp:TextBox ID="txtNome" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td colspan="1">
<asp:Button ID="BtnOk" runat="server" Text="OK" OnClick="BtnOk_Click" /></td>
</tr>
</TABLE>
</asp:Content>
Creazione del modulo Infopath.
Nel modulo inseriamo un controllo casella di testo, ed un pulsante, come mostrato in figura 3, tramite la finestra delle proprietà della casella di testo, impostiamo il nome del controllo, in particolare nella pagina “Dati”, impostiamo la casella Nome Campo: con il valore “ValoreA” In questo modo abbiamo impostato al controllo un nome.
Figura 4
Dalla finestra regole, facciamo click sul pulsante aggiungi, e poi sul pulsante aggiungi azione, nella finestra azione (figura 5) selezionare la voce “Invia tramite una connessione dati”
Figura 5
A questo punto fate click sul pulsante aggiungi (figura 6)
Figura 6.
Nella finestra successiva, selezionate l’opzione “all’ambiente host, ad esempio una pagina ASP.Net o un’applicazione Host”
Figura 7
Inserite una nuova azione, selezionate l’opzione Chiudi il modulo(figura 8), in questo modo, il modulo verrà chiuso subito dopo il click del pulsante.
Figura 8
Occorre creare un file xml,chiamato ItemMetaData.xml, tale file, inseriamo il seguente tag.
<z:row xmlns:z="#RowsetSchema" ows_valoreA="" />
Dalla voce di menu strumenti, selezionare la voce “Connessioni Dati”, nella finestra che viene aperta fate click sul pulsante “aggiungi”, nella finestra che viene aperta (figura 9),selezionare l’opzione, crea nuova connessione per : Ricezione Dati
Figura 9
Fate click sul pulsante, nella finestra successiva, selezionate l’opzione documento xml (figura 10)
Figura 10
Come mostrato in figura 11.
Figura 11
Lasciate l’opzione di default(Figura12), ossia “includi i dati come file di risorse nel modello di modulo o nella parte modello”
Figura 12.
Fate click sul pulsante avanti, lasciando invariate le impostazioni (figura 13).
Figura 13
A questo punto nella connessione dati, avrete due valori, Invio ed itemmetadata.
A questo punto occorre impostare un valore predefinito per il controllo casella di testo (denominato valoreA) nella finestra delle proprietà di tale controllo, selezionare il pulsante formula (fx) (figura 14), nella finestra che viene aperta (inserisci formula) fate click sul pulsante “Inserisci campo o gruppo” (figura 14) nella finestra che viene aperta, selezionate dalla casella combinata origine dati, la voce ItemMetadata (secondaria) e selezionate la voce :owns_valoreA, come mostrato in figura 14.
Siamo giunti alla pubblicazione di tale modulo, prima di pubblicarlo, occorre impostare le opzioni del modulo, in particolare la protezione. Dal menu strumenti, selezionare la voce “opzioni modulo” nella finestra che viene aperta, selezionare nella parte sinistra, la voce dominio come mostrato in figura 15.
Figura 16
“Progetta Modello di modulo da aprire in un browser o in Infopath”
Figura 16
Dal menu file, selezionate l’opzione Pubblica, nella finestra che viene aperta (figura 17) selezionate l’opzione “In un percorso di rete” , a questo punto fate click sul pulsante avanti.
Figura 17
La successiva finestra (figura 18) ci indica, in quale cartella pubblicare il nome e con quale nome, potete salvare il file xsn, nella cartella in cui si trovano i file xml del nostro progetto, situata nella cartella Feature.
Figura 18
A questo punto, fate click sul pulsante avanti, nella successiva finestra, lasciate vuoto la casella,nel momento in cui fate click sul pulsante avanti, verrà visualizzato un messaggio(figura 19), fate click sul pulsante ok, per via che non si ha un percorso alternativo al nostro modulo.
Figura 19
A questo punto fate click sul pulsante pubblica, fate click sul pulsante chiudi, da notare che l’opzione “Apri il modello di modulo dalla posizione di pubblicazione..” non deve avere il flag.
Figura 20
Ora che il nostro modulo infopath, è stato pubblicato, dovremmo rilevare il codice id, ossia il codice identificativo, questo codice va inserito nel file xml, e precisamente in Workflow. Per rilevare il codice id, aprite il modulo pubblicato in modalità struttura (Designer) , dal menu file, selezionate la voce “Proprietà” nella finestra che viene aperta, copiate tutto il codice, che si trova nella casella ID, come mostrato in figura 21
Figura 21
Aprite il file Workflow.xml, e nel tag Task0_formUrn, copiate il codice id del modulo di infopath, come mostrato qui di seguito.
<Task0_FormURN>urn:schemas-microsoft-com:office:infopath:Infopath:-myXSD-2008-04-02T14-18-10</Task0_FormURN>
A questo punto non ci resta che installare e configurare il nostro progetto, copiando i vari file della macchina in questione (nel mio caso è una macchina virtuale virtual pc 2007), nella cartella FEATURES (C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\) create una cartella (per esempio SPWFInfopath) in essa copiate i file xml (feature.xml e workflow.xml).
Copiante nella cartella assebly (C:\WINDOWS\assembly) la dll, in questo modo viene registrata nella GAC.
Ora non resta che copiare la nostra pagina Aspx, nella cartella delle pagine di sharepoint, e precisamente nella cartella layouts (C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS ).
A questo punto occorre eseguire dal prompt dei comandi, l’installazione del file feature,xml.
La registrazione avviene tramite il file stsadm.exe di seguito si riporta il comando da eseguire
stsadm.exe -o installfeature -filename SPWFInfopath \feature.xml -force
Riavviamo il WebServer IIS, tramite il comando IISReset.
Attivazione del WorkFlow
Figura 22
Nella pagina che viene aperta, selezioniamo la voce “Impostazioni flusso di lavoro” che si trova nella sezione “Autorizzazioni e gestione”, nella pagina che viene aperta, aggiungiamo il nostro workflow, valorizzando gli opportuni campi. Prima di procedere all’esecuzione del nostro Workflow, occorre aggiungere una colonna nella attività, nella quale verrà visualizzato il valore del campo del modulo di infopath.
Per creare una colonna, andate nella sezione attività, e fate click sul menu “impostazioni elenco” che si trova nel menu a tendina “impostazioni” in modo da andare alla pagina Personalizza attività (figura 23).
Sempre nella pagina personalizza Attività, selezionate nella sezione Visualizzazioni, il nome della visualizzazione predefinita, in questo modo, nella pagina che viene aperta, potete abilitare la visualizzazione della colonna appena creata.
Esecuzione del Workflow.
Ora che nel nostro progetto è stato creato il workflow, non ci resta che eseguirlo, nella cartella documenti, selezioniamo un documento e dal menu di scelta rapida, selezioniamo la voce “Flussi di lavoro”, nella pagina che viene aperta (figura 24) , facciamo click sul nostro workflow.
Figura 24
A questo punto verrà avviata la nostra pagina (figura 25), come illustrato precedentemente, il worfklow, avrà il compito di visualizzare il testo della casella, nella cronologia del flusso di lavoro .
Figura 25
Il workflow, però non è ancora terminato, infatti occorre gestire le attività, tramite il modulo Infopath, il workflow risulterà con la dicitura “in corso” come mostrato in figura 26.
Fate click su tale voce, in modo che venga visualizzato il dettaglio del nostro workflow, fate click sul testo del titolo (figura 27), in questo modo verrà aperto il modulo infopath .
Figura 27
Verrà aperto il modulo infopath, all’interno di sharepoint, in una pagina Aspx (WrkTaskIp) come mostrato in figura 28.
Figura 28.
Dopo aver valorizzato la casella di testo, e fatto click sul pulsante di azione(con la dicitura "Pulsante"), i dati verranno inviati e verrà aperta la finestra del dettaglio del workflow, come mostrato in figura 29, riportando i dati della sola casella di testo della nostra pagina aspx nella cronologia del flusso.
Figura 29
Mentre per visualizzare i dati del inseriti nella casella di testo del modulo infopath, occorre andare nelle attività (ritornate in documenti condivisi, e nella parte sinistra, elenci, fate click sulla voce attività ) troverete nella colonna creata in precedenza con il nome “valoreA” il testo inserito nella casella del modulo di infopath, il tutto come illustrato in figura 30.
2 commenti:
Voglio solo ringraziarvi per il lavoro che svolgono e la loro volontà di condividere. Ha creato materiali eccezionali e tutti noi beneficiare della vostra generosità.
Grazie.
Continua a seguirmi.
Ciao Emanuele
Posta un commento