Mostrando las entradas con la etiqueta Ayuda Rapida. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ayuda Rapida. Mostrar todas las entradas

jueves, 1 de noviembre de 2018

144. Obtener el inicio de un dia SQL

El query es muy sencillo



select dateadd(DAY, datediff(day, 0, getdate()),0) 



Felices Lineas

viernes, 26 de octubre de 2018

143. HTML eliminar el marco de una imagen que se usa como liga

Nuevamente una ayuda rápida, la pregunta es Cuando uso una liga de html con una imagen ¿Como logro que no me aparezca el marco que me indica que ya visite el sitio?

por ejempo

se muestra un marco de color que no se desea, se debe cambiar en el estilo de la imagen el borde

<a href="Documento.aspx" target="_blank"><img src="../Imagenes/Ayuda.png" style="width:50px;height:50px;border:0" alt="Detalle Motivos FC" /></a> 
 
Felices Lineas 





martes, 16 de octubre de 2018

136.Generar una cadena aleatoria de manera agil

Esta es una función rápida para generar una cadena alfanumérica aleatoria

 public string GeneraCadenaAleatoria(int longitud)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                
                StringBuilder sb = new StringBuilder();
                while (sb.Length < longitud)
                {
                    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(Guid.NewGuid().ToString());
                    byte[] hash = md5Hash.ComputeHash(inputBytes);
                    sb.Append(Convert.ToBase64String(hash));
                }
                return sb.ToString().Substring(0, longitud);
            }
        }

Felices lineas

viernes, 26 de mayo de 2017

110. Unir archivos XSD

El esquema de un XML, nos da el formato del mismo, nos ayuda por que de esta forma tenemos el XML definido, sabemos que campos puede contener, de que tipo serán estos y en que lugar se deben encontrar estos.

Una ventaja de los archivos de formato XSD es que el esquema puede encontrarse definido en mas de un archivo, esto nos permite comprender el XML y separarlo en cada una de sus partes, pero una gran desventaja es que durante la validación es necesario unir el archivo en un solo XSD, eliminando todos aquellos atributos, tipos de datos o nodos duplicados

Una forma de eliminar estas entidades es por medio de la siguiente función:


//La función recibe un XMLSchemaSet que ya se encuentra cargado y un esquema que en ese momento se encuentra en disco
public XmlSchemaSet MergeSchemas(XmlSchemaSet schemaSet1, string schema2)
{
//Es necesario compilar el esquema para poderlo emplear y para validar que este es un esquema valido
     schemaSet1.Compile();
//Leemos el segundo esquema y lo compilamos
     XmlSchemaSet schemaSet2 = new XmlSchemaSet();
     schemaSet2.Add(null, schema2);
     schemaSet2.Compile();

//Se deben efectuar 3 validaciones por las variables que se encuentran en el XSD y se deben eliminar los elementos duplicados, es importante mencionar que se quitan los elementos duplicados pero este proceso no tiene la inteligencia para determinar cual de los 2 elementos tiene la ultima versión del mismo, este método se hace considerando que ambos elementos son iguales y que se busca que solo uno de ellos se conserve para que durante la validación de esquema no se genere un error de validación por un elemento duplicado. También es importante considerar que los tipos de dato se agreguen al XSD por medio de un import para que los XSD se encuentren completos al momento de compilarlos.

foreach (XmlSchemaElement el1 in schemaSet1.GlobalElements.Values)
{
     foreach (XmlSchemaElement el2 in schemaSet2.GlobalElements.Values)
     {
          if (el2.QualifiedName.Equals(el1.QualifiedName))
          {
               ((XmlSchema)el2.Parent).Items.Remove(el2);
               break;
           }
      }
}

foreach (XmlSchemaAttribute el1 in schemaSet1.GlobalAttributes.Values)
{
       foreach (XmlSchemaAttribute el2 in schemaSet2.GlobalAttributes.Values)
       {
             if (el2.QualifiedName.Equals(el1.QualifiedName))
             {
                   ((XmlSchema)el2.Parent).Items.Remove(el2);
                   break;
              }
       }
}
//Es muy importante que en este caso el valor se guarde en un tipo objeto, por que se pueden recibir diversos tipos de datos y estos deben ser analizados
foreach (Object el1 in schemaSet1.GlobalTypes.Values)
{
     foreach (Object el2 in schemaSet2.GlobalTypes.Values)
     {
          if (el1.GetType() == typeof(XmlSchemaSimpleType))
          {                      
                XmlSchemaSimpleType elt1 = (XmlSchemaSimpleType)el1;
                if (el2.GetType() == typeof(XmlSchemaSimpleType))
                {
                      XmlSchemaSimpleType elt2 = (XmlSchemaSimpleType)el2;
                      if (elt2.QualifiedName.Equals(elt1.QualifiedName))
                      {
                           ((XmlSchema)elt2.Parent).Items.Remove(elt2);
                           break;
                       }
                  }
             }
            
             if (el1.GetType() == typeof(XmlSchemaComplexType))
            {
                  XmlSchemaComplexType elt1 = (XmlSchemaComplexType)el1;
                  if (el2.GetType() == typeof(XmlSchemaComplexType))
                  {
                        XmlSchemaComplexType elt2 = (XmlSchemaComplexType)el2;
                        if (elt2.QualifiedName.Equals(elt1.QualifiedName))
                        {
                             if ((XmlSchema)elt2.Parent != null)
                            {
                                  ((XmlSchema)elt2.Parent).Items.Remove(elt2);
                                    break;
                            }
                       }
                  }
             }
        }
   }
  
   foreach (XmlSchema schema in schemaSet2.Schemas())
   {
        schemaSet2.Reprocess(schema);
   }
           
   schemaSet1.Add(schemaSet2);
   schemaSet1.Compile();
  
   return schemaSet1;
}

Felices Lineas!!!!

miércoles, 24 de mayo de 2017

109. Firmar con rsa - SHA256 C# - certificado del almacen de windows

Antes que nada, debo aclarar que la firma de una cadena se efectúa por medio de la clave privada, por lo que deben verificar que la clave privada se encuentren dentro del almacén para posteriormente hacer la firma de la cadena.

Veamos el código y expliquemoslo

//Establecemos el numero de certificado, que se empleara para la firma, dicho certificado deberá estar dentro del almacen de certificados de Windows y deberá tener su clave privada
 string noSerie = "3030323031303030303030313030303030383133";
//Establecemos la cadena que se firmara
 string CadenaAFirmar = "holaMundo";
//Buscamos el certificado que se empleara para la firma dentro del almacén de certificados
 X509Store almacen = null;
 almacen = new X509Store(StoreLocation.LocalMachine);
 almacen.Open(OpenFlags.OpenExistingOnly);
 X509Certificate2Collection Certificados = almacen.Certificates.Find(X509FindType.FindBySerialNumber, noSerie, false);
 X509Certificate2 CertificadoFirma = Certificados[0];
 almacen.Close();

//Se carga la clave privada
RSACryptoServiceProvider csp = null;
csp = (RSACryptoServiceProvider)CertificadoFirma.PrivateKey;
var enhCsp = new RSACryptoServiceProvider().CspKeyContainerInfo;
var cspparametro = new CspParameters(enhCsp.ProviderType, enhCsp.ProviderName, csp.CspKeyContainerInfo.KeyContainerName);
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspparametro))
            {
//Se firma la cadena
                rsa.PersistKeyInCsp = true;
                byte[] bytefirma = rsa.SignData(Encoding.UTF8.GetBytes(CadenaAFirmar), "SHA256");
                return bytefirma;
            }

Felices lineas

martes, 23 de mayo de 2017

108. XDocument consulta rapida

XDocument nos presenta una forma rápida de consultar un XML, es mas rápido que un XMLDocument dado que este guarda toda la información en memoria, XMLDocument, permite la carga de documentos de gran tamaño, dado que guarda únicamente un puntero al documento, XML document trae un conjunto de funciones útiles, dado que es un objeto mas grande, una de ellas es la posibilidad de dar una ruta para que se encuentre un nodo en particular, esto no lo podemos hacer con XDocument, ya que debemos ir nodo a nodo para hacer el análisis.

La siguiente función busca emular esta característica de XMLDocument, para poder aprovechar las ventajas en velocidad que nos da XDocument.

       public string ObtenerAtributo(XDocument Documento, string rutaAtributos, string RutasEspacoNombres)
        {
            EspaciosDeNombres objEspaciosNombres = new EspaciosDeNombres();
            List<EspacioDeNombres> EspaciosDeNombres = objEspaciosNombres.CargarEspaciosDeNombres(RutasEspacoNombres);
            String[] rAtributos = rutaAtributos.Split('\\');
            int AtributoUbicacion = rAtributos.Count() - 1;

            int contador = 0;
            XElement objElement = null;
            while (contador < AtributoUbicacion)
            {
                string[] AtributosComponentes = rAtributos[contador].Split(':');
                XNamespace EsNombres = EspaciosDeNombres.Find(c => AtributosComponentes[0] == c.Nombre).EspacioNombres;
                if (contador == 0)
                {
                    objElement = Documento?.Element(EsNombres + AtributosComponentes[1]);
                }
                else
                {
                    objElement = objElement?.Element(EsNombres + AtributosComponentes[1]);
                }
                contador++;
            }
            //Obteniendo el atributo
            return objElement?.Attribute(rAtributos[AtributoUbicacion])?.Value;
        }


¿Qué hace el código?

Recorre todas las rutas del XML con el fin de buscar el atributo especificado, dando una cadena en la que se establezca la ruta de un atributo.


Felices Lineas 

jueves, 5 de enero de 2017

90. SQL Padres sin hijos (Ayuda Rapida)

Una función sencilla para obtener aquellos registros de una relación entre 2 tablas en que se tenga un padre sin hijos es:

SELECT * FROM [Tablapadre]
LEFT JOIN [TablaHijo]
ON [Tablapadre].id = [TablaHijo].id
WHERE [TablaHijo].id IS NULL


El left join nos hace la relación de ambas tablas incluso con registros que no existen, por eso al buscar aquellos en los que una columna de la relación sea nula, el query nos entregara los registros que estamos buscando


Felices líneas

miércoles, 27 de julio de 2016

78. Saltos de Linea (Ayuda Rapida)

He estado un tiempo fuera del foro, preparando una nueva etapa del mismo, pero no he abandonado la misión, la misión de la sección de ayuda rápida, es la de dar la facilidad de creación para que con pequeños segmentos de código se puedan resolver problemas de manera sencilla.

El tema del día es como quitar los saltos de línea en una cadena, me dirán que es muy fácil, que solo se reemplaza la función Enviroment.NewLine por un espacio o por una cadena vacía, esto es correcto la mayoría de las veces.

Sin embargo hay que tomar en cuenta, que por motivos de sistema operativo o por error de programación esto no puede ser del todo correcto, la función consta de un retorno de carro y un salto de línea Char(10) y Char(13) respectivamente, por lo que es mejor eliminar estos caracteres de la línea en cuestión para controlar correctamente el salto de línea, ¿Por que usarlo separado?, ya sea por errores o por diseño, muchos programadores no usan los 2 caracteres que tiene el salto de línea, o los usan en orden inverso, esto hace que no sea posible determinar cuando ocurre realmente.

¿Cómo quedaría nuestra función?


No dejen de programar, no dejen de construir


jueves, 11 de febrero de 2016

56. Formato Universal de Fecha en SQL (Ayuda Rapida XVI)

Un problema muy común en las consultas de SQL, sobre todo cuando estas se deben hacer por algún medio que no se encuentra parametrizado (siempre que pase un parámetro a una consulta en C# independiente mente del la forma en la que se realice esto, se recomienda especificar el tipo de dato) por ejemplo al hacerlas desde el Management Studio es el poder colocar una fecha y que el motor la interprete correctamente sin importarle el idioma y la región geográfica.

Los desarrolladores debemos tener el conocimiento por que al final nuestro principal objetivo es el procesamiento de la información, y nuestra principal fuente de datos son las bases de datos.

Si estamos en C# que es el lenguaje que empleamos en este Blog, nuestro motor principal es SQL Server.

Existen 2 formas una, es emplear el formato:

YYYYMMDD

Es decir, por ejemplo el 04 de enero de 2015 seria 20150104, pero esta representación no se encuentra completa, ya que en muchos casos necesitamos también la hora, para ello se usa el formato ISO8601, este formato fue creado para transferir fechas entre sistemas.

El formato que emplearemos de dicho estándar sera:

YYYY-MM-DDTHH:mm:SS.sss

Asi podemos tener una fecha de ejemplo como es:

2015-01-06T11:22:36.568

Felices Lineas

lunes, 25 de enero de 2016

50. Split (Ayuda Rápida XII)

Una de las funciones mas útiles al momento de separar cadenas es split, esta nos permite separar textos por algún carácter o conjunto de caracteres, por ejemplo

string cadenas = Hola|mundo

si aplicamos la funcion split

string[] cadena = cadenas.Split('|');

obtenemos un arreglo en el que el primer elemento es Hola y el segundo Mundo

cadena[0] = Hola
cadena[1] = Mundo

Pero el Split puede hacer mas que separar una sola cadena, puede separar por un conjunto de caracteres, ¿Esto para que nos sirve?, para garantizar que el separador del campo es único y reducir la cantidad de errores.

¿y como se usa?

List<string> cfdi = c.Split(new string[] { "\t@@|@@\t" }, StringSplitOptions.None).ToList();

La linea anterior esta buscando una secuencia compleja que es tabulador @@|@@ tabulador, es decir si yo tengo una cadena que reúna esa secuencia la separara.

Esto se vuelve útil cuando un carácter único puede aparecer en la cadena, sobre todo cuando dejamos que el usuario capture en un campo cualquier cadena.

Felices lineas.

viernes, 22 de enero de 2016

49. Diferencia de fechas SQL (Ayuda Rapida XI)

Así como vimos en un post anterior como obtener la diferencia entre 2 fechas en C# hoy veremos lo mismo desde SQL, como lo he comentado anteriormente un buen desarrollador debe tener conocimientos de alto nivel de base de datos, por que al final nuestro principal trabajo es el procesamiento de la información.

La función que emplearemos en SQL es DATEDIFF, esta función nos permite obtener la diferencia de tiempo entre 2 fechas, especificando la parte de la fecha con la que queremos obtener la diferencia entre una fecha y otra.

La función recibe 3 parámetros que son:

- Parte de fecha para obtener la diferencia, esta puede tomar los siguientes valores:
year
quarter
month
dayofyear
day
week
hour
minute
second
millisecond
microsecond
nanosecond

-Fecha Inicial
-Fecha final

Ejemplo

SELECT DATEDIFF(SECOND,FechaInicial,FechaFinal) FROM Tabla1

Esta instrucción nos da como respuesta la cantidad de segundos entre una fecha y otra

Hasta la próxima


jueves, 21 de enero de 2016

47. GetFiles Vs EnumerateFiles (Ayuda rápida X)

Obtener los archivos de un directorio se puede considerar un tema muy sencillo sin embargo puede convertirse en un dolor de cabeza, sobre todo cuando la cantidad de archivos que se encuentran en una unidad es demasiado grande.

Cuando manejamos grandes cantidades de archivos, no solo es responsabilidad de nosotros como desarrolladores su manejo, dependemos de varios factores como son velocidad de los discos, el formato de los mismos y el sistema operativo.

Ahora buen tenemos 2 formas de determinar el contenido de un directorio:

string[] dirs = Directory.GetFiles(@"c:\", "c*");

que nos permite obtener un arreglo de cadenas con las ubicaciones en las que se encuentra un archivo especifico, esta función también nos permite usar un patrón de búsqueda

string[] dirs = Directory.GetFiles([RUTA], [PATRON]);

sin embargo esta función solo se recomienda cuando el numero de archivos es relativamente pequeño, por que muestra un resultado hasta después de que ha leído todos los archivos del disco, en mi caso personal me ha funcionado hasta 1 000 000 de archivos con un formato NTFS.

Ademas existe otra funcion para consultar el contenido de un directorio EnumerateFiles, esta es muy parecida a GetFiles

var txtFiles = Directory.EnumerateFiles(sourceDirectory);

sin embargo esta es asíncrona, podemos trabajar con ella aun cuando no tengamos todos los archivos, si bien en un conteo es mejor GetFiles, si debemos hacer algún procesamiento a cada uno de los archivos que encontremos EnumerateFiles(sourceDirectory) nos permite trabajar con los archivos conforme el sistema operativo los va descubriendo en el disco

foreach (string currentFile in Directory.EnumerateFiles(sourceDirectory))
{
string fileName = currentFile.Substring(sourceDirectory.Length + 1);
        Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
}

Hasta la proxima

jueves, 14 de enero de 2016

44. Reinstalar todos los paquetes nuget de una aplicación (Ayuda Rápida VIII)

Nuget es una gran herramienta que nos facilita el desarrollo de software, algunos lo comparan como una gran dulceria para los programadores, en ella tenemos cientos de dll a nuestra disposición para facilitarnos el trabajo.

Otra forma de usarlo es como un organizador de dll en nuestra organización tal como lo describí en el articulo: http://carlosamonroy.blogspot.mx/2015/07/herramientas-mi-propio-nuget.html, esto nos permite estar al día con la ultima versión de nuestras dll con un costo muy bajo y con una alta reutilización de los componentes.

Trabajamos menos hacemos mas y mejor.

Sin embargo existen casos en los que una dll puede corromperse, por copiado, desarrollo, una y mil maneras, ante nuget, la dll seguirá instalada, pero podemos tener un comportamiento no deseado en nuestra aplicación, o simplemente esta no funcionara.

¿Que hacer en ese caso?

Mi recomendación es reinstalar las dll de nuget, esto se realiza en forma automática, y para ello es necesario hacer lo siguiente:

1. Ir al menú herramientas en Visual Studio

2. Abrir la consola de administración de paquetes nuget.


3. Ejecutar la siguiente instrucción:

Update-Package -Reinstall

Esto reinstalara todas las dll del proyecto, como buena practica antes de hacer esto, les recomiendo sacar una copia del proyecto sobre el que están trabajando.

Felices lineas



viernes, 18 de diciembre de 2015

37. Concatenar archivos (Ayuda Rápida VII)

Muchas veces durante el trabajo diario es necesario concatenar grandes cantidades de archivos, desde el sistema operativo teniendo 2 o mas archivos en una carpeta


Empleamos la instrucción type y agregamos la salida de un archivo al final de otro

type x.txt >> y.txt

con >> indicamos que los archivos se concatenaran, si empleamos únicamente > un archivo sobrescribirá a otro.



Bien esto nos soluciona el problema de manera manual. ¿Pero que pasa si lo queremos hacer desde C#? invocar un proceso externo siempre es costoso.

Para ello usaremos la instrucción CopyTo de FileStream, esta instrucción nos permite copiar el contenido de un archivo a otro de una manera muy rápida y sencilla.

El código queda como se muestra a continuación:


Que hace el código, bueno el código de copiado de un archivo a otro se resume en la siguiente linea:

                    using (FileStream strFuente = File.OpenRead(Archivo))
                        strFuente.CopyTo(strArchivo);

en donde abre el archivo y copia su contenido.

felices lineas




martes, 8 de diciembre de 2015

33. Distinct en una lista C# (Ayuda Rápida VI)

Hoy toquemos un tema dentro de la categoría ayuda rápida, que es común a la hora de desarrollar, ¿Como obtengo los elementos diferentes que existen en una lista?

Por ejemplo:

Si tuviera la siguiente clase:


Como determino los tipos de animales

Mamífero, Pez, Ave.

La solución es muy sencilla, se emplea la estructura select de la lista, y se indice que seleccione el tipo y todos los que sean distintos.


Que tengo en este código, tengo 2 forma de hacer esta misma operación.

Animales.Select(c=>c.Tipo) ... Me permite decir que es lo que voy a seleccionar, esto haciendo un select sobre mi lista.

Si incluyo el modificador AsParallel, le indico al sistema que el select lo haga en paralelo, esto tendrá una mejora en el tiempo en que se recorre la lista.

Y finalmente la instrucción Distinct, me permite agrupar por el elemento que seleccione.

Cuando usar AsParallel y cuando no, depende principalmente de los recursos disponibles en el equipo, AsParallel sera mas rápido, pero con mayor consumo en el procesador.

En ambos casos la salida es:


Hasta la proxima