martes, 6 de octubre de 2015

Llenar atributos de una clase de forma dinámica. [Borrador]

private object ExcelRowToObject(DataColumnCollection pColumns, DataRow pRow, object pObjecto)
        {
            object wRt = pObjecto;
            foreach (DataColumn dc in pColumns)
            {
                //http://stackoverflow.com/questions/12970353/c-sharp-dynamically-set-property
                //-->objName.GetType().GetProperty("nameOfProperty").SetValue(objName, objValue, null)
                // Llamamos a las columnas en el excel como en las propiedades para hacer más fácil la automatización
                if (dc.ColumnName != null)
                {
                    if (dc.ColumnName != string.Empty && dc.ColumnName != c_ID)
                    {
                        try
                        {
                            System.Reflection.PropertyInfo wPI = pObjecto.GetType().GetProperty(dc.ColumnName.Trim());
                            if (wPI.PropertyType == Type.GetType("System.Decimal"))//si evoluciona a más, mejor hacer un swicht
                            {
                                if (pRow[dc.ColumnName.Trim()].ToString() != string.Empty)
                                {
                                    wPI.SetValue(wRt, decimal.Parse(pRow[dc.ColumnName.Trim()].ToString()), null);
                                }
                            }
                            else
                            {
                                wPI.SetValue(wRt, pRow[dc.ColumnName.Trim()].ToString(), null);
                            }
                        }
                        catch (Exception wExc)
                        {
                            //GestionError(wExc);
                            //throw wExc;
                            throw new Exception(dc.ColumnName.Trim() + ": " + wExc.Message);
                        }
                    }
                }
            }
            return wRt;
        }

        private bool ExcelValidarColumnas(Type pTypeToTest, string pTableName, DataColumnCollection pColumns)
        {
            //https://msdn.microsoft.com/en-us/library/system.type(v=vs.110).aspx
            //http://stackoverflow.com/questions/12970353/c-sharp-dynamically-set-property
            //-->objName.GetType().GetProperty("nameOfProperty").SetValue(objName, objValue, null)  

            string wMsgAux = string.Empty;
            foreach (DataColumn dc in pColumns)
            {
                try
                {
                    if (dc.ColumnName != null)
                    {
                        if (dc.ColumnName != string.Empty && dc.ColumnName != "_ID")
                        {
                            //System.Reflection.PropertyInfo wPI = wpinTest.GetType().GetProperty(dc.ColumnName.Trim());
                            System.Reflection.PropertyInfo wPI = pTypeToTest.GetProperty(dc.ColumnName.Trim());

                            if (wPI == null)
                            {
                                wMsgAux += dc.ColumnName + "; ";
                            }
                        }
                    }
                }
                catch
                {
                    wMsgAux += dc.ColumnName;
                }
            }
            if (wMsgAux != string.Empty)
            {
                wMsgAux = "Columnas en el Excel (" + pTableName + ") con nombre incorrecto: " + wMsgAux;
                GestionError(wMsgAux);
                return false;
            }
            else
            {
                return true;
            }

        }


Y las uso así
 foreach (DataRow row in P_IN.Rows)
                {
Miclase wpin = Miclase();

 wpin = (Miclase)ExcelRowToObject(P_IN.Columns, row, wpin);
}
Donde P_IN es una DataTable con los mismos nombres de columna que los atributos. De hecho el DataTable lo he creado cargando un Excel.

viernes, 1 de agosto de 2014

Quitar los espacios HTML ( ) y similares en C#.

Podemos limpiar el texto de código html que nos viene de la página para tratarlo con HttpUtility.HtmlDecode.

string wHoraIni1 = HttpUtility.HtmlDecode(gvr.Cells[3].Text);

viernes, 23 de noviembre de 2012

Evaluar celda vacía en un GridView.

Problema: Al recorrer los filas (GridViewRow) de un GridView y evalúa una celda que quiero comparar con  string.Empty recibo    y la comparación no funciona.

Solución: Usar HttpUtility.HtmlDecode.
...
string wValor = HttpUtility.HtmlDecode(e.Row.Cells[2].Text).Trim();
       
 if (wFechaXmlFin == string.Empty)
{
                CheckBox cb = new CheckBox();
                cb = (CheckBox)e.Row.FindControl("cbSeleccion");
                cb.Enabled = false;
}
...

jueves, 5 de julio de 2012

Edad o diferencia entre fechas en SQL.

Pensaba que para calcular la edad en SQL lo podía hacer con DATEDIFF y el yyyy, pero no. Resta los años, así que he creado una función para calcular la edad:


CREATE FUNCTION [dbo].[fnEdad]
( @F1 AS SMALLDATETIME,
@F2 AS SMALLDATETIME
)
RETURNS INT
AS
BEGIN

DECLARE @NEDAD AS INT
SET @NEDAD = DATEDIFF(YYYY,@F1, @F2)--Realiza la diferencia entre años, si hace de '2011-12-31' a '2012-01-01'
-- devuelve 1.

IF DATEADD(YYYY, @NEDAD, @F1) > @F2 AND @NEDAD > 0 -- Es el año, pero faltan días, semanas o meses
BEGIN
SET @NEDAD  = @NEDAD  - 1
END

RETURN ISNULL(@NEDAD,0)

END



jueves, 14 de abril de 2011

Truncar decimales en C#

No deja de ser sorprendente que no hay un método de decimal en C# para truncar decimales. He visto por ahí formas de hacerlo con formatos y al final he optado por multiplicar por 10^decimales, truncar quitando los decimales y volver a dividir entre 10^decimales. Lo necesitaba para poder truncar a 2 decimales, pero me he hecho un método genérico.


private static decimal Truncate(decimal pImporte, int pNumDecimales)
{
    decimal wRt = 0;
    decimal wPot10 = 1;

    //for (int i = 1; i <= pNumDecimales; i++)
    //{
    //    wPot10 = wPot10 * 10;
    //}
  
    wRt = pImporte * wPot10;
    wRt = decimal.Truncate(wRt);
    wRt = wRt / wPot10;
    //wRt = decimal.Round(wRt, 2);

    return wRt;
}

lunes, 7 de febrero de 2011

ASP.NET con herramientas gratuitas, legales y útiles.

Leo en Tecnologías ASP.NET 4.0 (saltando desde la versión 2.0) de José Manuel Alarcón Aguín que hay programadores y empresas que optan por PHP o Java por la gratuidad de las licencias y que esto es un error. Yo estaba en el mismo error.


Me ha alegrado saber que Visual Studio dispone de versiones gratuitas y de libre descarga. Son las Express Edition. Tanto para el desarrollo Web, Visual Studio Web Developer, como para gestionar las bases de datos, SQL Server Express.

"Sus limitaciones son que sólo le está permitido ocupar 1 GB de RAM para caché de datos, utilizar un único procesador de la máquina (con los núcleos que tenga éste, da igual) y el tamaño máximo de las bases de datos que puede manejar la licencia es de 4GB".
Suficiente para la mayoría de aplicaciones con destino a una PYME.

Para descargar estas versiones Express http://www.microsoft.com/express

Notas de lectura desde ASP.NET 2.0 a ASP.NET 4.0.

Me estoy actualizando en cuanto a Framework, el nuevo proyecto vamos a hacerlo en el 4.0. La verdad que entre estar en 2 tipos de proyectos (SAP y ASP.NET) y el día a día a veces uno no lee ni se pone al día, y sigue con la inercia como si no hubiese novedades que nos faciliten el trabajo.


Para ello voy siguiendo la lectura del libro Tecnologías ASP.NET 4.0 (saltando desde la versión 2.0) de José Manuel Alarcón Aguín. Y como este blog además de para compartir es para anotar cosas que me puedan ser útiles ahora y en el futuro, iré exponiendo algunas notas y comentarios sobre el libro, un poco a vuela pluma por eso.