martes, 13 de noviembre de 2018

147. @@error SQL

Dirán que toco muchos temas, pero el salto se da por un hecho, si realmente quieren orquestar lo que es el desarrollo de sistemas, deben tener conocimiento de varias cosas, toco mucho base de datos, es por un tema, los desarrolladores, o bueno un gran numero de ellos se encuentran peleados con la base de datos, solo conocen las operaciones básicas y se niegan a ver un poco mas allá, y bueno siguiendo con el espíritu de crear ayudas rápidas que den esa gota que hace falta para trabajar hablemos de @@error.

@@error es una instrucción para SQL server, que le indica al cliente que nos de el ultimo numero de error que se encuentre registrado.

es importante, si es muy importante, por que otra de las cosas con las que muchos desarrolladores están peleados, es el control de errores real, es decir, ¿Que se debe hacer si hay un error de un tipo especifico?, recordemos que try catch no es control de errores, eso es simplemente un paleativo para que el proceso no se detenga.

felices lineas

lunes, 12 de noviembre de 2018

146. Lynq transformar objetos

Lynq nos permite manipular datos de una manera ágil y sencilla, en este ejemplo lo que vamos a aprender es como copiar datos entre 2 objetos que tienen una estructura diferente.

El select que estamos haciendo desde lynq lo que nos permite es crear un nuevo objeto (el objeto se crea al efectuar el select) y se asigna a un nuevo objeto, de esta manera se deja que el compilador se encargue de establecer la mejor opción para la copia entre objetos, evitando establecer una lógica de forma manual.

Veamos el ejemplo

namespace CopiarDatos
{
 
    public class Primaria
    {
        public string Nombre { get; set; }
        public string sexo { get; set; }
        public int Numero { get; set; }
        public Boolean paso { get; set; }
    }
 
    public class Secundaria
    {
        public string Nombre { get; set; }
        public string sexo { get; set; }
        public int grupo { get; set; }
        public int ubicacion { get; set; }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Primaria> primaria = new List<Primaria>();
            primaria.Add(new Primaria() { Nombre = "Juan Perez", 
                             Numero = 15, sexo = "H",paso=true });
            primaria.Add(new Primaria() { Nombre = "Raquel Perez", 
                             Numero = 17, sexo = "H", paso = true });
            primaria.Add(new Primaria() { Nombre = "Alejandra Perez", 
                             Numero = 165, sexo = "H", paso = false });
            primaria.Add(new Primaria() { Nombre = "Miguel Perez", 
                             Numero = 145, sexo = "H", paso = true });
            primaria.Add(new Primaria() { Nombre = "Raciel Perez", 
                             Numero = 155, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Juana Perez", 
                             Numero = 415, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Leonardo Perez", 
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Miguel Perez", 
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Angel Perez", 
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Rafael Perez", 
                             Numero = 115, sexo = "M", paso = false });
 
            List<Secundaria> x = (from a in primaria 
                 where a.paso == false select new Secundaria { 
                              Nombre = a.Nombre, sexo = a.sexo }).ToList();
 
            foreach(Secundaria objloop in x)
            {
                Console.WriteLine(objloop.Nombre + " - " + 
                                  objloop.grupo + " - " + 
                                  objloop.sexo + " - " + 
                                  objloop.ubicacion);                
            }
            Console.ReadLine();
        }
    }
}

¿Cual es la magia?

 List<Secundaria> x = (from a in primaria where a.paso == false 
       select new Secundaria { Nombre = a.Nombre, sexo = a.sexo }).ToList();

Esta linea es la magia, al momento de generar el select, indicamos que se cree un nuevo objeto y la asignación que tendrá de los valores


 select new Secundaria { Nombre = a.Nombre, sexo = a.sexo }).ToList();

Así llenamos los objetos de una manera eficiente, tanto para el compilador como para el programador.


Felices Lineas


jueves, 8 de noviembre de 2018

145. sp_monitor

La salud de un servidor es muy importante, nunca se deben resolver estos problemas solo incrementando la potencia del servidor, es muy importante que los sistemas se consideren como un todo.

Cuando un sistema tiene problemas de rendimiento, se debe observar ¿ Que elemento tiene el problema ?  pero también se debe localizar ¿ Cual es el elemento que es el que causa el problema?

Existen stores procedures que reportan información de la base de datos, monitores de rendimiento que muestran el estado de un servidor, o de un componente, todo esto debemos saber interpretarlo, por que nos permite generar mejores sistemas.

Un verdadero arquitecto no solo es responsable de sus programadores, es responsable de ese todo que forma el negocio, el arquitecto de sistemas es un director de orquesta, y como tal debe hacer funcionar ese todo

sp_monitor es uno de esos stores, este nos muestra el estado actual de nuestro servidor de SQL

¿Que información nos entrega?

last_run: Fecha en que el proceso fue ejecutado por ultima vez, es importante por que establece el punto desde el que se recolectaron los ultimos datos.

current_run: Fecha actual de ejecucion

seconds: Tiempo en que se tardo en recabar la informacion

cpu_busy: Numero de segundos que el CPU ha estado ocupado por el servidor de SQL

io_Busy: Numero de segundos que el servidor ha dedicado a procesos de entrada y salida

ide: Numero de segundos que el servidor ha estado ocupado

packets_received: Cantidad de paquetes recibidos

packets_sent: Cantidad de paquetes enviados

total_read: Numero de lecturas hechas por SQL Server

total_write: Numero de escrituras a SQL server

total_errors: Cantidad de errores que ocurrieron durante la lectura y escritura

connections: Cantidad de conexiones aceptadas por el servidor de SQL

Para que estos valores tengan sentido, es muy importante que se tome el tiempo que ha transcurrido entre la ejecución anterior y la ejecución actual del proceso, ademas de que es necesario siempre tener los valores de la ejecución anterior para tener valores de referencia

Felices lineas

jueves, 1 de noviembre de 2018

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 





miércoles, 24 de octubre de 2018

142. SQL INFORMATION_SCHEMA.COLUMNS

La manipulación y análisis de datos es una de las principales tareas en esta area, no se puede decir que hay un buen programador que no maneja una base de datos eficientemente, si el motor de datos falla, todo el proceso falla.

La base no solo es insertar, actualizar, buscar y borrar, se debe estructurar toda la información para no generar problemas de rendimiento.

Vamos a platicar de una tabla de sistema que es muy útil en el análisis de una base de datos, sobre todo cuando se requiere comprender el esquema de la misma desde el mismo código, esta tabla también permite en muchos casos crear consultas dinámicas, no recomiendo mucho que la usen para esto, pero es posible

select * from INFORMATION_SCHEMA.COLUMNS

Una vez que se ejecuto esta consulta, sql despliega la información campo por campo de todas las tablas y bases de datos en la instancia

Felices Lineas

martes, 23 de octubre de 2018

141. Lynq II

Vamos a seguir aprendiendo un poco de lynq, si ya se que tengo varias cosas abiertas pero también eso tiene su razón de ser, la de generar curiosidad, la programación se mueve por curiosidad.

En SQL nosotros podemos tomar un conjunto de registros, esto lo hacemos para reducir nuestro universo o por que nos interesa solo una parte de ellos, en sql usamos el argumento top, asi desde sql podemos seleccionar un conjunto de datos con una instrucción como:

select top 10 from la tabla

pero que pasa en Lynq, podemos hacer esto, la respuesta es si, y de una forma muy sencilla

var lista = (from c in lstAlumno where c.Edad > 15 select c).Take(1);

y si ademas quisieramos meter un orden

var lista = (from c in lstAlumno where c.Edad > 15 select c).OrderBy(c=>c.Edad).Take(1);

Como pueden ver empesamos ha hacer una combinacion de lynq y lamda

Continuaremos el dia de mañana

Felices lineas



lunes, 22 de octubre de 2018

140. Lamda I

Así como lo mencione en el post anterior, nuestra labor es manejar datos, comprender analizar, .net nos brinda gran apoyo al momento de describir las instrucciones que queremos emplear, pero debemos saber de que herramientas contamos.

Las expresiones Lamda, es una forma en que se puede describir una serie de instrucciones de una forma concisa, que facilita la lectura al momento de efectuar una operación, la expresión lamda simplifica la escritura del código, escribiendo en este mismo operaciones que antes requerían una mayor estructura (uso de delegados).

¿Como la construimos?

C# nos entrega funciones preparadas para el uso de expresiones lambda, la expresión lamda es sencilla, se requiere solo una invocación al objeto y después al elemento del mismo siguiendo la estructura de la función que invocamos.

hagamos un ejemplo:


La aplicación tiene exactamente el mismo comportamiento qe la que usamos en el post 139. la diferencia es la forma en la que escribimos en código, en este caso en ves de emplear una expresión de lynq usamos expresiones lamda

var lista =  lstAlumno.Where(c => c.Edad > 10);

si la comparamos contra la expresión de linq


var lista = from c in lstAlumno where c.Edad > 15 select c;


en este caso se ve mas sencilla la representación con lamda, pero conforme la complejidad se incrementa linq ofrece grandes ventajas, en próximos post incrementaremos la complejidad de las consultas para compararlas entre ellas.


Felices lineas

139. Linq I

Estamos en un mundo en el que la información cobra vida, nunca antes en la historia de la humanidad se había tenido tal acceso a la información, sin embargo, la información es tanta que ha perdido el orden, como desarrolladores debemos poder analizar esta información, día a día se nos dan mas herramientas para hacer este tipo de análisis.

Así pues revisemos que opciones tenemos para poder manipular eficientemente la información.

¿Que es Lynq? 

Es un componente de la plataforma .NET que permite agregar capacidades de consulta de manera nativa a los lenguajes de .NET

Lynq nos permite tener acceso a objetos de datos y explorarlos de una manera sencilla.

Si sabes SQL sabes Lynq

veamos un ejemplo::



Revisemos la consulta

var lista = from c in lstAlumno where c.Edad > 15 select c;

Que hace, crea un objeto c que toma los datos de lstAlumno, busca en ese todos aquellos que tengan una edad mayor a 15 años y genera el nuevo objeto

Si ejecutamos el programa:




Felices Lineas



martes, 16 de octubre de 2018

138. Abrir un documento en una ventana nueva aspx

Para poder abrir un documento en aspx en una nueva ventana del lado de back end se debe poder este codigo, en la pagina en la que se envia el llamdo esto para invocar a window.open del lado de javascript

        Dim url As String = "MuestraDocumento.aspx?Documento=thinkpython.pdf"
        Dim target As String = "'_blank'"
        Dim script As String = "window.open('" & url & "'," & target & "," & "'status=no, menubar=no, toolbar=no,location=no');"
        Page.ClientScript.RegisterStartupScript(Me.GetType, "someUniqueId", script, True)

y en la pagina que recibe la informacion

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Response.ContentType = "application/pdf"
        Response.Clear()
        Response.TransmitFile("C:\Carlos\Libros\" + Request.QueryString("Documento"))
        Response.End()
    End Sub

Felices lineas