16 de noviembre de 2015

Project Server: Eliminar Proyectos con PowerShell de forma masiva

Recientemente tuve la necesidad de eliminar de forma masiva una serie de proyectos desde una instancia de Project Server. El cliente en cuestión estaba enfrascado en un proceso de limpieza, quería eliminar de la instancia de Project Server actual, todos aquellos proyectos que consideraban obsoletos (eliminar todos los proyectos que cumplieran una determinada condición)

Con este escenario teníamos 2 opciones:

  1. Eliminar los proyectos mediante la interface de usuario, esta eliminación sería uno por uno.
  2. Realizar un Script PowerShell que eliminara los proyectos de forma automática.

Dado que la cantidad de proyectos a eliminar eran más de 500, nos decidimos por la segunda opción, aquí os dejo el script PowerShell:

# Establecer la conexión a la BBDD

$connection = new-object system.data.sqlclient.sqlconnection

$connection.ConnectionString = "Data Source=MiSqlServer;Initial Catalog=ProjectServer_Reporting;User ID=MiLoginUser;Password=MiLoginPassword;MultipleActiveResultSets=True"

$connection.open()

 

# Obtener la lista de proyectos a eliminar 

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand

$SqlCmd.CommandText = "SELECT ProjectUID, ProjectName FROM dbo.MSP_EpmProject_UserView WHERE Year < 2014 ORDER BY ProjectName " 

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter

$SqlAdapter.SelectCommand = $SqlCmd

$SqlCmd.Connection = $connection 

$DataSet = New-Object System.Data.DataSet 

$SqlAdapter.Fill($DataSet)

 

# Eliminar los proyectos y los sitios de proyectos asociados

$svcPSProxy = New-WebServiceProxy -uri "http://MiServidorProjectServer/PWA/_vti_bin/PSI/Project.asmx?wsdl" -UseDefaultCredential

foreach ($row in $DataSet.Tables[0])

{ 

    if ($row.ItemArray.Count -gt 0)

    {

        Write-Host "Deleting project" $row[1] 

        $projId = [System.Guid]$row[0]

        $svcPSProxy.QueueDeleteProjects([System.Guid]::NewGuid() , "true", $projId, "true")

    }

}

 

$connection.Close()

 

Notas:

  • En el script PowerShell hemos cambiado los datos que son propios del cliente (url de la instancia de Project Server, datos de conexión a la BBDD, condición para eliminar el proyecto)
  • El script funcionó en Project Server 2010, debería funcionar también en Project Server 2013.

16 de junio de 2015

How To: Gráfico de Columnas de Google

Veamos cómo lograr un gráfico similar al de la imagen en ASP.NET MVC usando el api de Google Chart.

image

Partimos del hecho de que tenemos una vista con un modelo de datos:

El Modelo:

@model List<ModelCitDepartamentoInfo>

La clase (ModelCitDepartamentoInfo) debe tener al menos estas 4 propiedades:

        public int TypeName { get; set; }

        public int CountCommitted { get; set; }

        public int CountOnGoing { get; set; }

        public int CountFinished { get; set; }

 

El HTML:

<div class="panel-body">

<div id="chartGoogleColumn-Steering-Projects"></div>

</div>

El código JavaScript:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<script type="text/javascript">

   google.load("visualization", "1", { packages: ["corechart"] });

   google.setOnLoadCallback(drawChart);

 

   function drawChart() {

     var data = fnGetData4GoogleChart_SteeringProjects();

    

     var options = {

            colors: ['#ffa564', '#d2d8e6', '#797979'],

            isStacked: true,

            legend: { position: "top" },

            bar: {groupWidth: "50%"},

        };

 

    var view = new google.visualization.DataView(data);

    view.setColumns([0,

            1, { calc: "stringify",

                sourceColumn: 1,

                type: "string",

                role: "annotation" },

            2, { calc: "stringify",

                sourceColumn: 2,

                type: "string",

                role: "annotation" },

            3, { calc: "stringify",

                sourceColumn: 3,

                type: "string",

                role: "annotation" }

        ]);

 

    var chart = new  google.visualization.ColumnChart(document.getElementById('chartGoogleColumn-Steering-Projects'));

    chart.draw(view, options);

  }

 

 

  function fnGetData4GoogleChart_SteeringProjects() {

        var data = new google.visualization.DataTable();

 

        data.addColumn('string', 'Type');

        data.addColumn('number', 'Committed');

        data.addColumn('number', 'OnGoing');

        data.addColumn('number', 'Finished');

 

        //Transformar el modelo de datos en json

        var json = @Html.Raw(Json.Encode(@Model.Select(x => new { x.TypeName, x.CountCommitted, x.CountOnGoing, x.CountFinished })

                ));

 

    for (var i=0; i < json.length; i++) {

      data.addRow([json[i].TypeName,

        json[i].CountCommitted == 0 ? null : json[i].CountCommitted,

        json[i].CountOnGoing == 0 ? null : json[i].CountOnGoing,

        json[i].CountFinished == 0 ? null : json[i].CountFinished

      ]);

    }

 

    return data;

  }

</script>

 

Y eso es todo, al visualizar la página veremos el gráfico de la imagen del inicio.

How To: Gráfico de Tarta de Google

Veamos cómo lograr un gráfico similar al de la imagen en ASP.NET MVC usando la api de Google Chart.

image Partimos del hecho de que tenemos una vista con un modelo de datos:

@model List<ProgramInfo>

La clase (ProgramInfo) debe tener al menos estas 2 propiedades:

        public string Name { get; set; }

 public int CountAll { get; set; }

 

El HTML:

        <section class="panel">

            <div class="panel-body">

                <div id="piechartGoogle"></div>

            </div>

        </section>

 

El código JavaScript:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<script type="text/javascript">

   google.load("visualization", "1", { packages: ["corechart"] });

   google.setOnLoadCallback(drawChart);

 

   function drawChart() {

     var arrBase = fnGetJsonData();

     var data = google.visualization.arrayToDataTable(arrBase);

     fnDisplayPieChartBase('piechartGoogle', data, 'Projects by Programs');

   }

 

   function fnDisplayPieChartBase(idDomElemnt, data, titleBase) {

     var options = { title: titleBase };

     var chart = new google.visualization.PieChart( document.getElementById(idDomElemnt));

     chart.draw(data, options);

   }

  

   function fnGetJsonData() {

     var json = @Html.Raw(Json.Encode(@Model.Select(x => new { x.Name, x.CountAll })));

 

     var arrResult = [];

     arrResult.push(['Program', 'Count']);

 

     for (var i=0; i < json.length; i++){

       arrResult.push([json[i].Name, json[i].CountAll]);

     }

     return arrResult;

   }

 

</script>

 

Y eso es todo, al visualizar la página veremos el grafico de la imagen del inicio.