M11. Utilización de C# para cálculos avanzados

M11. Utilización de C# para cálculos avanzados

Es posible que en determinadas ocasiones debamos realizar algún cálculo que sea muy difícil o prácticamente imposible obtener mediante SQL. En estos casos, podemos añadir pasos que ejecuten un script en C# para crear nuevas tablas o calcular valores en las tablas.

Ejemplos concretos pueden ser calcular la diferencia con el valor anterior, calcular un Pareto (80-20) (más información sobre el principio de Pareto), etc.

La forma de crear un script es añadiendo un paso y eligiendo el tipo de paso Script

El paso no permitirá activar una conexión ni la utilización de variables de entorno y en el editor habrá un esquema de código con una función ScriptAction que recibe un DataSet.

Dentro de las llaves de la función, podemos escribir nuestro código respetando las siguientes reglas,

  • Podemos acceder a cualquiera de las tablas generadas en los pasos anteriores utilizando el nombre de la tabla que aparece en la columna Target Table de la lista de pasos.
  • No debemos modificar el nombre de la función ni los parámetros
  • Podemos utilizar C#

Las clases que intervienen habitualmente son:

Ejemplo de utilización
Script 1
El primero de los ejemplos añade una tabla llamada T1 con dos columnas y añade 14 valores diferentes.


public static void ScriptAction(DataSet dataSet) {
//Crear una datatable y añadirla al dataSet
DataTable table = new DataTable("T1");
dataSet.Tables.Add(table);

// Crear columna NumeroMes
DataColumn column = new DataColumn();
column.ColumnName = "NumeroMes";
column.DataType = typeof(int);
table.Columns.Add(column);

// Crear columna NombreMes
column = new DataColumn();
column.ColumnName = "NombreMes";
column.DataType = typeof(string);
table.Columns.Add(column);

// Añadir 14 filas
DataRow row;
for(int n = 0; n <= 13; n++) {
row = table.NewRow();
row["NumeroMes"] = n;
row["NombreMes"] = "Mes " + n.ToString();
table.Rows.Add(row);
}
}

Script 2
El segundo script utiliza la tabla generada en el paso anterior (T1) borrando aquellos registros (filas) cuyo valor en la columna NumeroMes no coincida con un mes real y añadiendo una columna con el trimestre. 


public static void ScriptAction(DataSet dataSet) {
// Referencia a la tabla creada en el paso 1
DataTable table = dataSet.Tables["T1"];

// Eliminar las rows que tengan un mes fuera del rango 1-12
int i = 0;
while(i < table.Rows.Count) {
if((int)table.Rows[i]["NumeroMes"] < 1 ||
(int)table.Rows[i]["NumeroMes"] > 12) {
table.Rows.RemoveAt(i);
} else {
i++;
}
}

// Añadir una columna
DataColumn column = new DataColumn();
column.ColumnName = "Trimestre";
column.DataType = typeof(String);
table.Columns.Add(column);

// Iterar las filas dando valor a las columnas
foreach(DataRow row in table.Rows) {
if((int)row["NumeroMes"] < 4) row["Trimestre"] = "Q1";
else if((int)row["NumeroMes"] < 7) row["Trimestre"] = "Q2";
else if((int)row["NumeroMes"] < 10) row["Trimestre"] = "Q3";
else row["Trimestre"] = "Q4";
}
}

Cabe destacar como se puede apreciar en la imagen, que la Target table de segundo paso se ha modificado (se puede escribir directamente el valor que queramos) para que coincida con la la única tabla que tendrá el DataSet, pues en el segundo script no añadimos ninguna tabla adicional.

Sobre el autor

Xavier Plaza:

0 Comments

Quieres compartir tus impresiones?

Tu dirección de correo no será publicada. Los campos obligatorios se marcan con *

Deja una respuesta