Mostrando las entradas con la etiqueta Ayuda Rápida. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Ayuda Rápida. Mostrar todas las entradas

viernes, 26 de mayo de 2017

111. Obtener los tributos duplicados de una lista

Un caso muy especial en las listas, es que muchas veces deseamos buscar los elementos duplicados, a que me refiero.

Supongamos que tenemos la siguiente lista

1,5,6,7,7,8,9

Yo esperaría obtener los números duplicados, es decir  7

¿Cómo lo hago?

Es muy fácil por medio de lynq

List<String> duplicados = Impuesto.GroupBy(s => s).SelectMany(grp => grp.Skip(1)).ToList();

Agrupamos la lista que deseamos validar, y le pedimos que se salte aquellos en los que solo encuentre 1

Felices Líneas


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!!!!

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, 9 de febrero de 2017

94. Configurar el IIS para https (pruebas) - Ayuda rapida

Las aplicaciones web son muy útiles, dado que se pueden ejecutar en distintos equipos con en cualquier parte del mundo, muchas veces es necesario efectuar pruebas de dichas aplicaciones de manera local, por lo que tenemos 2 opciones, usar el IIS express que viene con nuestro Visual Studio, o usar el IIS que viene dentro de Windows, cuando una aplicación madura, siempre es mejor instalar dichas aplicaciones en nuestro IIS antes de que estas sean liberadas, esto para verificar configuraciones, y el comportamiento de las mismas.

Una configuración necesaria que en muchos casos olvidan los desarrolladores es montar el sitio sobre https, esto es importante, por que en algunas aplicaciones por ejemplo WCF, la configuración cambia si en sitio es http o https.

El principal impedimento para esto, es que se requiere un certificado digital y estos certificados son costosos, por lo que para desarrollo, siempre podemos usar un auto certificado.

Para crear un auto certificado, debemos entrar en el Administrador de Internet Information Services (IIS).


Seleccionar sobre el nombre del servidor


Y seleccionar en la configuración del IIS Certificados de servidor

Entramos en la pantalla



Con el botón derecho sobre esta pantalla aparece un menú, y en el seleccionamos Certificado autofirmado


Seleccionemos un nombre para el certificado y con esto tendremos un nuevo certificado autofirmado

Ahora tenemos que configurar el protocolo https para nuestro sitio.

Entremos al sitio sobre el cual deseamos hacer esto.



y del lado derecho vamos a encontrar el menú enlaces


Seleccionemos el enlace y agreguemos un nuevo enlace



Se indica que es tipo https, y se selecciona nuestro certificado, con esto ya podemos entrar a nuestro sitio con http y https



 Felices lineas




miércoles, 14 de diciembre de 2016

89. Eliminar duplicados en una base de datos (Ayuda Rapida)

El siguiente Query permite eliminar rápidamente registros duplicados en una base de datos de SQL, es muy importante para que el Query opere correctamente, que exista un índice que ordene los registros de la misma manera en que forman los campos únicos.

Otro punto importante, para efectuar este cambio es que se debe evaluar la posibilidad de borrar cualquier otro índice que tenga la tabla durante el proceso, esto ayudara a que el borrado sea mas rápido ya que no actualizara los índices.

WITH CTE AS(
   SELECT [Campo1],[Campo2],[Campo3],...,Renglon = ROW_NUMBER()OVER(PARTITION BY [Campo1],[Campo2],[Campo3],... ORDER BY [Campo1],[Campo2],[Campo3],...)
   FROM [Tabla]
)
DELETE FROM CTE WHERE Renglon > 1

Felices lineas

martes, 13 de diciembre de 2016

87. Arreglo de caracteres a Cadena C# (Ayuda Rapida)

Un problema muy simple que ocurre algunas veces con conversiones de datos, como convertir un arreglo de caracteres a una cadena.

Para ello es necesario usar el constructor que nos proporciona string y pasar el arreglo como cadena.

char[] Arreglo = new char[4];
Arreglo[0] = 'h';
Arreglo[1] = 'o';
Arreglo[2] = 'l';
Arreglo[3] = 'a';

string cadena = new string(Arreglo);

Con esto se ha efectuado la conversión,

Felices líneas

martes, 15 de marzo de 2016

67. SQL Llenar con ceros un numero (Ayuda Rápida XIX)

Uno de los formatos mas comunes para un entero, es presentar este con ceros a la izquierda, esta funcionalidad SQL no la crea de manera directa, sin embargo, por medio de la combinación de 2 funciones podemos obtenerla rápidamente.

Primero usaremos la función RIGHT.

¿Que hacer RIGHT? bueno nos devuelve los caracteres que se encuentran a la derecha de la cadena, por ejemplo:

SELECT RIGHT('hola mundo', 3)

nos entregara ndo como resultado

Partimos del hecho que el numero siempre al cual deseamos agregar los ceros siempre es menor a la longitud de la cadena.

Así que lo que haremos sera lo siguiente:

1. Concatenaremos el numero a una cadena con ceros.
2. Por medio de RIGHT, le indicaremos el tamaño de la cadena que deseamos

Y listo tenemos una cadena con ceros

SELECT RIGHT('00000' + CAST(11 AS VARCHAR(5)) , 5)

el resultado sera: 00011

ahora en vez del 11 coloquemos el campo al cual deseamos dar este formato, listo tenemos el formato de una manera que no afecta el desempeño de sql

Felices lineas





viernes, 19 de febrero de 2016

62. This platform could not be created becouse a solution platform of the same name alrready exists (Ayuda Rápida XIX)

Cuando trabajamos con muchos datos y requerimos que se saque el máximo provecho del procesador, es necesario también considerar la compilación sobre la que se hará la aplicación, compilar a 64 bits nos puede traer buenos resultados cuando los milisegundos cuentan.

El error:

This platform could not be created becouse a solution platform of the same name alrready exists

es un error común, que genera Visual Studio cuando a un proyecto que ya se encuentra previamente configurado para compilar a 64 bits, se agrega otro nuevo proyecto, que no trae esta configuración por defecto.


La solución a esto, es la creación manual de un perfil para la compilación a 64 bits, 

¿Como hacemos esto?

Es necesario que abramos en un editor de texto el archivo de proyecto del nuevo proyecto que estamos agregando (csproj).


Dentro de el, encontraremos la siguiente seccion:



La sección que se encuentra delimitada por PropertyGroup indica el tipo de compilación, en este caso vamos a agregar el tipo de compilación a 64 bits, para ello debemos agregar la siguiente configuración
.
Guardamos el archivo.

abrimos nuevamente nuestra solución, y ya tendremos la configuración de proyecto para compilar a 64 bits.




viernes, 12 de febrero de 2016

58. BCP (BulkCopy) Unicode en SQL Server(Ayuda Rápida XVIII)

Últimamente he estado hablando de muchos temas de SQL, no he olvidado los de C#, todavía debemos continuar con los patrones de diseño, y con los cambios que nos ha traído la nueva versión del lenguaje, pero como lo he mencionado anteriormente, un desarrollador completo debe conocer varios aspectos del entorno en el que se mueve.

El bulkcopy y el bulk insert son herramientas muy útiles por que nos permiten la rápida carga y descarga de datos, bulk insert es mucho mas flexible, y se puede considerar una evolución de Bulkcopy, hablemos hoy de bulkcopy.

Bulkcopy nos permite extraer a un archivo desde una ventana de comando toda la información o parte de ella de una tabla de SQL, de una manera muy rápida, pero ojo, la velocidad tiene un precio, Bulkcopy provoca bloqueos en la base de datos.

Así podemos extraer la información con una instrucción como esta:

bcp [Query] queryout [ruta] -S [Servidor] -T -d [Base_de_datos] -c -C ACP

que le estamos diciendo a la base que efectue un bulk copy de un query, esto lo copie a una ruta de salida, -S le indica cual es el nombre del servidor -T indica que no usara pasword, - d indica el catalogo -c indica el tipo de datos a usar en el archivo de texto - C ACP, este es el caso por el que escribimos este post, nos especifica la codificacion para que se guarden los datos que se encuentran en unicode de manera correcta.

¿Por que nos interesa esto?

Bueno el problema que se genera es que cuando usamos un tipo de dato como nvarchar, almacenamos la información en unicode, es decir tenemos un tamaño de palabra mayor que nos permite almacenar una mayor cantidad de símbolos, la version 5.1 de unicode permite alrededor de 100 000 símbolos, si no especificamos el formato, un símbolo se trata de representar por su equivalente en otro formato, como consecuencia el documento se corrompe.

En el caso del idioma español esto nos pasa con la ñ, los acentos que son propios de nuestro idioma.

Ahora si tenemos un archivo ¿Como podemos hacer el proceso contrario y subirlo a la base de datos?

La instrucción es muy similar

bcp [tabla] in [Archivo] -S [Servidor] -d [base de datos] -T -c -E -C ACP

que dice la instrucción, la instrucción anterior dice lo siguiente, inserta en la tabla, el contenido del archivo, -S nos indica el servidor de base de datos -d la base de datos -T que no pedirá password -c que los campos son caracteres -E como es una inserción le decimos que puede insertar columnas tipo identity -C ACP indica la codificación.

Es muy importante que si los datos se extraen con una codificación estos se importen con la misma codificación.


Felices lineas

jueves, 11 de febrero de 2016

57. Eliminar la parte de tiempo de una fecha (Ayuda Rápida XVII)

En C# tenemos el tipo de dato DateTime, pero existen casos en los que no nos interesa la hora, minutos y segundos, la forma de eliminarlos es muy sencilla.

DateTime Fecha = DateTime.Now;
var Fecha2 = Fecha.Date;

se emplea la propiedad Date de DateTime

Esta si fue ayuda rápida, saludos

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

viernes, 5 de febrero de 2016

53.Determinar si una constraint existe en SQL (Ayuda Rápida XV)

Como lo he dicho anteriormente un desarrollador no es aquel que solo sabe el lenguaje de programación, en nuestro caso C#, sino que es aquel que sabe como explotar todos los componentes que giran alrededor del mismo.

¿Como determinamos si una constraint ya existe en SQL?

El proceso es muy sencillo, vamos ha hacer una consulta a la tabla INFORMATION_SCHEMA.TABLE_CONSTRAINTS

¿Cuales deben ser nuestros criterios de búsqueda?

Consideraremos 3 criterios de búsqueda

1. El esquema
2. La tabla
3. El nombre de la constraint

¿Como seria la instrucción?

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
                   WHERE CONSTRAINT_SCHEMA=[Esquema] AND CONSTRAINT_NAME=[Constraint] AND TABLE_NAME=[Tabla])
BEGIN
  [Accion]
END
GO


Felices lineas

52. Discos duros virtuales (Ayuda Rápida XIV)

El día de hoy es muy útil trabajar en maquinas virtuales, la virtualización nos permite simular ambientes y mejorar el proceso de pruebas, esto es muy útil para el desarrollador, podemos crear maquinas virtuales locales o incluso en la nube lo que nos permite entregar un software de mayor calidad ya que mejoramos el proceso de prueba, siempre es importante que nuestro software se pruebe en un ambiente en donde no se encuentren instalados los componentes que tenemos en nuestro equipo de desarrollo.

Los discos duros virtuales también se convierten en una herramienta muy útil ya que son contenedores en los que se puede almacenar archivos y estos archivos pueden guardarse con diferentes formatos de almacenamiento incluso diferentes al formato en el que se encuentra el disco duro local.

Los sistemas de archivos tienen diferentes características, y es importante conocerlas como desarrollador, ya que vivimos en la era del big data, en la que se tiene grandes cantidades de información, y tener un mal entendimiento o usar un formato solo por herencia puede generar alguna sorpresa desagradable, en un próximo articulo hablare sobre estos formatos.

El disco duro virtual como contenedor de archivos lo podemos usar para efectuar pruebas en diferentes equipos virtualizados teniendo un conjunto de pruebas precargado o emplearlo para compartir información de manera rápida.

Windows tambien es capaz de leer estos discos duros virtuales como si fueran un disco duro de sistema

Por lo regular esta es una tarea típica de un administrador de sistemas, pero como desarrolladores nos resulta muy útil saberlo hacer.

El disco duro virtual que emplearemos es el que tiene como extensión vhd.

¿Como hacemos esto?

1. Abrimos el administrador de discos, para ello emplearemos la instrucción.

2. En el administrador de seleccionamos el menú acción:


 3. Seleccione Exponer VHD


4. Seleccione el disco duro virtual


5. Y el disco duro se mostrara como un disco duro mas



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

martes, 19 de enero de 2016

46. Día Inicial de un mes SQL (Ayuda Rápida IX)

En muchos casos es necesario obtener el primer día de cada mes en SQL, yo he empleado una función muy sencilla y rápida para hacer esto:

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

¿Que hace?

Bueno toma la cantidad de meses que hay desde la fecha inicial de SQL, y a esa fecha que es ya un día uno, incrementa dicha cantidad de meses.

Saludos