Bienvenidos

Recuerda que tus comentarios son importantes y recuerda agradecer si te fue útil algun artículo publicado aquí.

L1f3 15 a D@nc3 Flo0r

jueves, 14 de febrero de 2019

Query para ver los objetos modificados en la base de datos

Para ver los objetos creados y/o modificados en una base de datos de SQL Server podemos utilizar el siguiente query:

declare @ano int
set @ano = 2019 
declare @mes int
set @mes = 01
select name, [type], [type_desc], create_date, modify_date
from sys.objects
where type not in ('SQ','D','F','IT','PK','S')
  and (year(modify_date) = @ano or year(create_date) = @ano)
  and (create_date <> modify_date or create_date = modify_date)
ORDER BY modify_date, [TYPE], [NAME]

En este caso estamos filtrando  por año y mes y estamos excluyendo algunos objetos.

Listado de objetos disponibles:

D :  DEFAULT_CONSTRAINT
F :  FOREIGN_KEY_CONSTRAINT
FN :  SQL_SCALAR_FUNCTION
IT :  INTERNAL_TABLE
P :  SQL_STORED_PROCEDURE
PK :  PRIMARY_KEY_CONSTRAINT
S :  SYSTEM_TABLE
SQ :  SERVICE_QUEUE
U :  USER_TABLE
V :  VIEW

Repetir el encabezado de una tabla en un reporte en cada página (RDLC)

Si estamos diseñando un reporte en visual studio con una tabla y queremos que la fila del encabezado (header) de la tabla se repita en todas las paginas del reporte, debemos seguir estos pasos:

1. Seleccionar la tabla completa y activar la propiedad RepeatRowHeaders



2. Hacer click en la flecha pequeña que aparece en la esquina inferior derecha del reporte y hacer click en la opcion Advanced Mode




3. Cuando se activa el modo avanzado se despliega un detalle que representa las filas de la tabla en la seccion Row Groups, aqui seleccionamos la primera fila que representa el encabezado (Static) y al seleccionarla activamos las propied RepeatOnNewPage. Si queremos que además el header permanezca siempre visible mientras nos deslizamos hacia abajo en el reporte, activamos la opción FixedData. En caso de tener un grupo en la tabla y querramos que todas las filas que componen el encabezado se repitan en todas las páginas, las vamos seleccionando en Row Groups y le activamos la opción a todas.


jueves, 22 de diciembre de 2016

Log de correos enviados desde Database Mail

Visualizar el log de correos enviados desde el servicio de correos de SQL SERVER.

Para ver los correos enviados podemos usar el siguiente query. La parte del WHERE sería para ver solo los del día actual, asi que se puede eliminar si queremos ver todos los correos.

USE msdb ;  
GO  
  
SELECT     mailitem_id, 
    recipients, 
    copy_recipients, 
    blind_copy_recipients,
    [subject],
    body,
    send_request_date,
    send_request_user,
    sent_status,
    sent_date,
    last_mod_date
FROM  sysmail_allitems
WHERE convert(varchar, sent_date,101) = convert(varchar, getdate(),101)

GO

miércoles, 21 de diciembre de 2016

Secuencia numérica (Identity) en un query SELECT de sql server

Para retornar una secuencia numérica como un campo dentro de un SELECT de SQL Server podemos usar el siguiente código.
select ROW_NUMBER() OVER (ORDER BY fecha) as Sec,Nombre, Apellido, Fecha 
from usuarios
En el query anterior estamos creando un campo que no existe en la tabla llamado Sec donde se va a desplegar una secuencia numérica por cada fila que retorne la consulta.
Luego se esta mostrando el campo nombre, apellido y fecha de la tabla Usuarios

Resultado:

Sec Nombre Apellido Fecha
1 Juan Perez 10/10/2013
2 Laura Martinez 10/10/2013
3 Lucas Pena 7/7/2014
4 Maria Diaz 11/13/2014
5 Jose Castillo 12/1/2014

domingo, 27 de noviembre de 2016

Visualizar la descripción de las tablas y campos de una base de datos en SQL SERVER

Escribir la descripción de las tablas y los campos de una base de datos de SQL SERVER es una buena práctica y facilita el trabajo en el futuro cuando no recordemos exactamente lo que se guarda en cada lugar.

Además sirve para generar automáticamente la documentación de la base de datos. En otras palabras, las herramientas de documentación de bases de datos, buscan lo escrito en la descripción y automaticamente la pasan a la documentación,

Ejemplo que he utilizado de estas herramientas son: SQL Doc, ApexSqlDoc y DBDoc

Para visualizar rápidamente la descripción de las tablas y campos, podemos usar este query. Espero que les ayude.

SELECT      u.name + '.' + t.name AS [table],
            td.value AS [table_desc],
            c.name AS [column],
            cd.value AS [column_desc]
FROM        sysobjects t
INNER JOIN  sysusers u
    ON      u.uid = t.uid
LEFT OUTER JOIN sys.extended_properties td
    ON      td.major_id = t.id
    AND     td.minor_id = 0
    AND     td.name = 'MS_Description'
INNER JOIN  syscolumns c
    ON      c.id = t.id
LEFT OUTER JOIN sys.extended_properties cd
    ON      cd.major_id = c.id
    AND     cd.minor_id = c.colid
    AND     cd.name = 'MS_Description'
WHERE t.type = 'u'
ORDER BY    t.name, c.colorder


Fuente: http://stackoverflow.com/questions/887370/sql-server-extract-table-meta-data-description-fields-and-their-data-types

miércoles, 16 de noviembre de 2016

Hacer funcionar un plugin de Jquery dentro de un UpdatePanel de Ajax

En el siguiente ejemplo vamos a hacer funcionar el plugin DatePicker de Jquery en una página con un Master Page y un UpdatePanel de Ajax.

La razón por la que los plugins de Jquery no te funcionan cuando el master page tiene Ajax es porque la función del Update Panel es precisamente refrescar solamente secciones de la página, mientras que los plugins de Ajax se envian a ejecucion cuando se hace el post back completo.

Este sería el codigo en el master page:
Codigo de la página
Con esta solución ya funcionan los plugins de Jquery en una página con Master Page y UpdatePanel de Ajax

sábado, 12 de noviembre de 2016

Quiero aprender a programar

Durante la parte de mi vida en que me ha tocado la función de desarrollador de aplicaciones, varias personas me han hecho la misma pregunta: ¿Qué debo hacer para aprender a programar?

Esta es una pregunta compleja y al mismo tiempo halagadora ya que normalmente los desarrolladores de software son vistos como “nerds” encerrados en una habitación todo el día sentados frente a un computador escribiendo códigos que mágicamente la computadora interpreta y aparece en la pantalla un sistema o una página web.

Muchas personas prefieren mantenerse lo más alejado posible de todo lo que ocurra en ese mundo desconocido de los desarrolladores de software así que cuando alguien pregunta ¿Qué debo hacer para aprender a programar? Más vale darles la respuesta correcta.

El mundo actual funciona en casi todos sus aspectos con tecnología, la podemos encontrar en todos los ámbitos de la vida cotidiana, desde un computador, los Smartphone, los televisores, las neveras, todo ya tiene alguna especie de software, esto nos da el primer paso para aprender a programar. Tenemos mucho campo en el desarrollo de software así que lo primero es decidir para qué quieres programar.

Muchos tienen la idea de que para ser programador hay que ser un genio matemático, esto es completamente falso, aunque dominar las matemáticas es una ventaja, lo más importante en la programación es la lógica. Esa lógica es la que nos permitirá solucionar los problemas, entender lo que desean o necesitan los usuarios, realizar aplicaciones más sólidas, eficientes y user friendly, es decir que sean de fácil uso para las personas.

Entonces, si ya sabes para qué plataforma quieres programar o ya sabes las situaciones de la vida que quieres mejorar con la tecnología y ya tienes conceptos de lógica, debes elegir un lenguaje de programación que sea óptimo para el fin que deseas.

Existen cientos de lenguajes de programación diferentes, con diferentes complejidades, pero también para diferentes usos. Así como avanza la tecnología de uso cotidiano, también avanza la tecnología para los desarrolladores de software, por lo que cada día es más fácil “programar”. Existen frameworks o plataformas que interpretan códigos de programación de lenguajes que utilizan funciones y etiquetas muy similares al lenguaje humano y los convierten a lenguaje de máquina y cada día esto se vuelve más eficiente.

Existen también lenguajes de programación muy similares, por lo que aprendiendo uno podrás dominar otros en muy poco tiempo. Dependiendo el área en la que quieras desarrollarte, algunos lenguajes de ejemplo podrían ser: Para aplicaciones comerciales o de oficina puedes investigar sobre .NET, Java, Python y SQL. Para aplicaciones móviles te interesará investigar sobre C++ (C plus plus) o Java. Si te interesa el desarrollo web te interesará investigar sobre HTML, PHP, CSS, JavaScript, Ruby, Python, .NET o SQL. Si lo que deseas es entrar a lo que llamamos lenguajes de bajo nivel y medio nivel es decir códigos que pueden ejecutar funciones más cerca del hardware puedes investigar sobre C o Assembly.

En internet existe información ilimitada sobre los diferentes lenguajes de programación, así como páginas web que enseñan a programar de manera rápida y divertida, existen videos y muchos libros sobre programación. Lo más importante en tomar en cuenta es que la programación nunca se aprende completamente, cada día se aprende algo nuevo. Es posible que el día de hoy no entiendas un concepto, pero si sigues practicando e investigando llegará un día en que te darás cuenta que eso que ayer no entendías hoy se vuelve sencillo, ya que el aprendizaje de la programación es por niveles, lo que aprendes hoy será la base para entender lo del futuro. Busca un programador experimentado que te sirva como mentor y como decimos en este mundo, la programación entra por los dedos así que programa todos los días.

Imágenes desde:
https://tctechcrunch2011.files.wordpress.com/2013/09/keep-calm-and-learn-to-code-2.png?w=400

miércoles, 7 de septiembre de 2016

Obtener el texto de un hipervínculo que esté dentro de un gridview Asp.Net C#

Si tenemos un gridview en el cual en una de las columnas los valores son hipervínculos y queremos obtener el texto o el NavigateUrl de ese hyperlink debemos hacer lo siguiente.

Normalmente para obtener el texto de un campo en un Gridview usamos este código:
NombreGridView.Rows[e.RowIndex].Cells[0].Text;
Pero cuando se trata de un hyperlink, debemos hacer lo siguiente:

Si queremos el texto:
((HyperLink)NombreGridView.Rows[e.RowIndex].Cells[0].Controls[0]).Text;

Si queremos el NavigateUrl((HyperLink)NombreGridView.Rows[e.RowIndex].Cells[0].Controls[0]).NavigateUrl;

Recuerda que si lo quieres hacer con el row seleccionado puedes usar "SelectedRow":
string str = ((HyperLink)NombreGridView.SelectedRow.Cells[0].Controls[0]).Text;


viernes, 11 de enero de 2013

SQL: Constraint para que un campo acepte solamente un rango de números determinado

Si queremos agregar un nivel mas de validación a la base de datos, tenemos la forma de hacerlo mediante los constraints.

Un ejemplo sería si queremos que en un campo específico que sea tipo integer, se guarden solamente números del 0 al 100, podemos usar el siguiente código en SQL SERVER.

Este constraint se crea en la tabla "Tabla1" y se llama "NombreConstraint" y se crea en la columna llamada "Columna1"

ALTER TABLE Tabla1
ADD CONSTRAINT NombreConstraint
CHECK (Columna1 BETWEEN 0 AND 100)

jueves, 10 de enero de 2013

.NET WCF utiliza el nombre del servidor en vez de la IP

Cuando se publica un servicio en WCF en un servidor este usa el nombre del servidor para componer el WSDL. Esto hace que cuando un servidor se acceda desde fuera del dominio el WSDL sea inutil puesto que se esta utilzando el nombre del servidor que es desconocido desde fuera de su dominio. Por esto el servicio debe ser configurado por el Web.config para que se pueda acceder desde cualquier URL y el WSDL se componga utilizando la IP con la cual se accedio. Para esto se modifica el tag de system.serviceMode como acontinuación:

 > 
       .
       .
       .
    multipleSiteBindingsEnabled="true" />
 >

Colaboración gracias a: Carlos Toribio \o/

miércoles, 2 de enero de 2013

Redireccionar o redirigir a la página actual (asp.net)

Para redireccionar a la misma página en la que nos encontamos y asi limpiar todo como si acabaras de entrar podemos usar la siguiente sentencia

Response.Redirect(Request.RawUrl);

domingo, 23 de diciembre de 2012

Es posible crear un índice único en un campo que acepte NULL ??

Este es un tip bastante interesante que me llegó de un website al que estoy inscrito.

Es posible tener un indice único en un campo que acepte NULL ??
Pues la respuesta es SI! y se puede lograr de la siguiente manera...


USE [DBPRUEBA]
GO

CREATE TABLE [dbo].[tbl_prueba](
 [id] [int] 
) ON [PRIMARY]

GO

CREATE UNIQUE NONCLUSTERED INDEX UNCI_prueba
ON [dbo].[tbl_prueba](id)
WHERE id IS NOT NULL
GO
--=======================================
insert into [dbo].[tbl_prueba] values(1)--success
insert into [dbo].[tbl_prueba] values(2)--success
insert into [dbo].[tbl_prueba] values(NULL)--success
insert into [dbo].[tbl_prueba] values(NULL)--success
insert into [dbo].[tbl_prueba] values(2)--error [Cannot insert duplicate key row in object 'dbo.tbl_test' with unique index 'NCI_test'.]

GO
select * from [dbo].[tbl_prueba]

El truco esta en pasar la condición deseada en la creación del índice

Buen fin de semana!

sábado, 13 de octubre de 2012

miércoles, 22 de agosto de 2012

Evita el Síndrome del tunel carpiano

Tips para evitar el Sindrome de Tunel Carpiano

Nosotros que trabajamos mucho en la computadora, es importante tomar en cuenta estos tips para evitar el Síndrome de Tunel Carpiano que cada vez es mas común.

Clic en la foto para agrandar


sábado, 16 de junio de 2012

Guardar el resultado del comando DIR

Suponemos que tenemos una carpeta con muchos archivos y queremos ver un listado de los mismos.

Si deseamos guardar el resultado que retorna el comando DIR en el Command Prompt se hace de esta manera:

En CMD entra a la carpeta donde están los archivos que quieres listar y escribe:

dir > C:\archivo.txt

Ejemplo:

dir *.aspx > C:\lista.txt

Este ejemplo busca todos los archivos aspx de una carpeta y escribe el resultado en un archivo llamado lista.txt en el disco C:

Si queremos solamente los nombres de los archivos:

dir /w /a-d *.aspx > C:\lista.txt

miércoles, 16 de mayo de 2012

Tomar el valor de un control del masterpage

Imagina que tenemos un label en el masterpage y de una de las paginas queremos tomar el valor de ese label o talvez queremos asignar un valor a ese label.

Para hacer esto utilizamos este código:

Lab.lbl1= this.Master.FindControl("Content").FindControl("Login1").FindControl("lblID");


O este si queremos cambiar el valor del color a un botón del masterpage:



 //Cambiando el color de un boton
LinkButton BotonMenu = Master.FindControl("LoginView1").FindControl("LinkButton1") as LinkButton;
if (BotonMenu != null)
{
      BotonMenu.BackColor = System.Drawing.Color.FromName("#bfcbd6");
}


Si te fijas estos controles del ejemplo están dentro de un LoginView. Si tu control esta fuera dentro de algún componente como un loginview o un panel debes utilizar esa manera pero si esta fuera puedes dejar un solo FindControl.

GridView.RowCommand : Obtener un valor al ejecutar un comando en el gridview

La idea es tener un botón dentro del gridview y que cuando se le haga clic al botón se seleccione el valor de una de las columnas y se ejecute la acción.

En la propiedad command del boton se le puede especificar el nombre que quieras al comando y luego llamarlo de la siguiente manera:


void CustomersGridView_RowCommand(Object sender, GridViewCommandEventArgs e)
  {
    if(e.CommandName=="NombreComando")
    {
      // Selecciona el indice de la fila del boton en el que se hizo clic
      int index = Convert.ToInt32(e.CommandArgument);
            
      // retorna el row en que se hizo clic
      GridViewRow row = CustomersGridView.Rows[index];
            
      // asigna el valor de la celda de la columna 2 y la fila en que se hizo clic  
      string item = Server.HtmlDecode(row.Cells[2].Text);
        
    }
  }

Existen unos comandos ya predeterminados integrados al control Gridview que son:
Valor de CommandNameDescripción
"Cancel"
Cancela una operación de edición y devuelve el control GridView al modo de sólo lectura. Provoca el evento RowCancelingEdit.
"Delete"
Elimina el registro actual. Provoca los eventos RowDeleting y RowDeleted.
"Edit"
Pone el registro actual en modo de edición. Provoca el evento RowEditing.
"Page"
Realiza una operación de paginación. Establece la propiedad CommandArgument del botón en "First", "Last", "Next", "Prev" o en un número de página para especificar el tipo de operación de paginación que se va a realizar. Provoca los eventos PageIndexChanging y PageIndexChanged.
"Select"
Selecciona el registro actual. Provoca los eventos SelectedIndexChanging y SelectedIndexChanged.
"Sort"
Ordena el control GridView. Provoca los eventos Sorting y Sorted.
"Update"
Actualiza el registro actual en el origen de datos. Provoca los eventos RowUpdating y RowUpdated.

fuente: http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.gridview.rowcommand(v=vs.80).aspx

martes, 1 de mayo de 2012

Error: System.Threading.ThreadAbortException: Thread was being aborted.

System.Threading.ThreadAbortException: Thread was being aborted.

Que significa este error que aparece registrado en nuestro log?

Este error normalmente ocurre cuando utilizamos la sentencia Response.Redirect() para redirigirnos a otra página.
Ej.: Response.Redirect("Default.aspx");
 Esta sentencia va a funcionar pero arrojará el error en los logs "System.Threading.ThreadAbortException: Thread was being aborted" porque no le hemos especificado al código si luego de hacer el direccionamiento debe continuar o terminar la ejecución de la página actual.

Por eso el comando nos da el hint: "endResponse: Indicates whether execution of the current page should terminate."

Así que la sintaxis correcta debería ser:
Response.Redirect("Default.aspx",false);

lunes, 30 de abril de 2012

Obtener las bases de datos de un servidor de SQL SERVER

Para listar las bases de datos atachadas en un servidor de SQL SERVER se puede utilizar una de estas opciones:


EXEC sp_databases

EXEC sp_helpdb

EXEC sp_msForEachDB 'PRINT ''?'''

Cada una retorna las bases de datos del servidor con algunas informaciones de diferencia asi que podemos utilizar la que mas nos convenga

jueves, 22 de marzo de 2012

Retornar el listado de tablas de una base de datos con la cantidad de registros

Para retornar un listado de las tablas de una base de datos con la cantidad de registros en cada tabla se pueden utilizar uno de estos queries:



SELECT '[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' AS fulltable_name,
SCHEMA_NAME(t.schema_id) AS schema_name,
t.name AS table_name,
i.rows
FROM sys.tables AS t INNER JOIN sys.sysindexes AS i
ON t.object_id = i.id AND i.indid < 2

o

select distinct convert(varchar(30),object_name(a.id)) [Table Name], a.rows from sysindexes a inner join sysobjects b on a.id = b.id 

Referencia:  http://venkattechnicalblog.blogspot.com/2008/09/list-out-all-tables-and-row-count-in.html
http://geekswithblogs.net/TakeNote/archive/2007/09/22/115537.aspx