Requirement from my CIO: Salaudeen, Get me a SharePoint Workflows Report with Total No. of workflows wherever its running, for our intranet SharePoint site with Site Name, List Name, Workflow Name, and No. of Instances, etc.
Solution: As usual dive into the object model code (This can be achieved with PowerShell as well). Here it is.
and the output goes like this:
This time the requirement is: Get me the workflows for all the lists and Libraries with No. of workflows completed, In Progress, Terminated, Cancelled.
Alright, I changed the code slightly:
Solution: As usual dive into the object model code (This can be achieved with PowerShell as well). Here it is.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.SharePoint; using Microsoft.SharePoint.Administration; using Microsoft.SharePoint.Workflow; using System.IO; namespace GetWorkflowReport { class GetWorkflowsReport { static void Main( string [] args) { string site; try { if (args.Length == 0) { Console.WriteLine( "Enter the Web Application URL:" ); site = Console.ReadLine(); } else { site = args[0]; } SPSite tmpRoot = new SPSite(site); SPSiteCollection tmpRootColl = tmpRoot.WebApplication.Sites; //objects for the CSV file generation StreamWriter SW; SW = File.AppendText( "c:\\WorkflowReport.csv" ); //Write the CSV Header SW.WriteLine( "Site Collection Name, Site Name, Site URL, List Name, List URL, Workflow Name, Running Instances" ); //Enumerate through each site collection foreach (SPSite tmpSite in tmpRootColl) { //Enumerate through each sub-site foreach (SPWeb tmpWeb in tmpSite.AllWebs) { //Enumerate through each List foreach (SPList tmpList in tmpWeb.Lists) { //Enumerate through associated workflows foreach (SPWorkflowAssociation tmpSPWorkflowAssociation in tmpList.WorkflowAssociations) { // If you want to Limit to SPD workflows: check tmpSPWorkflowAssociation.BaseTemplate == null //Skip the Previous versons of workflows if (!tmpSPWorkflowAssociation.Name.Contains( "Previous Version" )) { //Remove the , in Site Name, document names and write them into the CSV file SW.WriteLine(tmpSite.RootWeb.Title.Replace( "," , " " ) + "," + tmpWeb.Title.Replace( "," , " " ) + "," + tmpWeb.Url + "," + tmpList.Title.Replace( "," , " " ) + "," + tmpWeb.Url + "/" + tmpList.RootFolder.Url + "," + tmpSPWorkflowAssociation.Name.Replace( "," , " " ) + "," + tmpSPWorkflowAssociation.RunningInstances); } } } } } //Close the CSV file object SW.Close(); //Dispose of the Root Site Object tmpRoot.Dispose(); Console.WriteLine( @"Report Generated Successfull at c:\WorkflowReport.csv. Press ""Enter"" key to Exit" ); //Just to Pause Console.ReadLine(); } catch (Exception ex) { //Log the exception to event log System.Diagnostics.EventLog.WriteEntry( "Get Workflow Report" , ex.Message); } } } } |
Update:
Another workflow Report:This time the requirement is: Get me the workflows for all the lists and Libraries with No. of workflows completed, In Progress, Terminated, Cancelled.
Alright, I changed the code slightly:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
| class GetWorkflowsReport { static void Main( string [] args) { string site; try { if (args.Length == 0) { Console.WriteLine( "Enter the Web Application URL:" ); site = Console.ReadLine(); } else { site = args[0]; } SPSite tmpRoot = new SPSite(site); SPSiteCollection tmpRootColl = tmpRoot.WebApplication.Sites; //objects for the CSV file generation StreamWriter SW; SW = File.AppendText( "c:\\WorkflowReportEx.csv" ); //Write the CSV Header SW.WriteLine( "Site Collection Name, Site Name, Site URL, List Name, List URL, Cancelled,Completed, Faulting,Running,Terminated" ); //Enumerate through each site collection foreach (SPSite tmpSite in tmpRootColl) { //Enumerate through each sub-site foreach (SPWeb tmpWeb in tmpSite.AllWebs) { //Enumerate through each List foreach (SPList tmpList in tmpWeb.Lists) { //Initialise the variables int Cancelled=0; int Completed=0; int Faulting=0; int Running=0; int Terminated=0; if (tmpList.WorkflowAssociations.Count > 0) //IF the List has any workflows associated { foreach (SPListItem oSPListItem in tmpList.Items) { foreach (SPWorkflow oSPWorkflow in oSPListItem.Workflows) { //Get the state of the workflow, Whether completed, Terminated, etc switch (oSPWorkflow.InternalState) { case SPWorkflowState.Cancelled: Cancelled++; ; break ; case SPWorkflowState.Completed: Completed++; break ; case SPWorkflowState.Faulting: Faulting++; break ; case SPWorkflowState.Running: Running++; break ; case SPWorkflowState.Terminated: Terminated++; break ; } } } //Remove the , in Site Name, etc and write them into the CSV file SW.WriteLine(tmpSite.RootWeb.Title.Replace( "," , " " ) + "," + tmpWeb.Title.Replace( "," , " " ) + "," + tmpWeb.Url + "," + tmpList.Title.Replace( "," , " " ) + "," + tmpWeb.Url + "/" + tmpList.RootFolder.Url + "," +Cancelled + "," +Completed+ "," + Faulting + "," + Running+ "," +Terminated); } } } } //Close the CSV file object SW.Close(); //Dispose of the Root Site Object tmpRoot.Dispose(); Console.WriteLine( @"Report Generated Successfull at c:\WorkflowReportEx.csv. Press ""Enter"" key to Exit" ); //Just to Pause Console.ReadLine(); } catch (Exception ex) { //Log the exception to event log System.Diagnostics.EventLog.WriteEntry( "Get Workflow Report Extended" , ex.Message); } } |
Read more: http://www.sharepointdiary.com/2012/02/workflow-reports-in-sharepoint.html#ixzz4LeXGXsYC
No hay comentarios:
Publicar un comentario