martes, 21 de febrero de 2017

Cómo crear tablas dinámicas en excel, fácil y práctico

Cómo crear tablas dinámicas en Excel, fácil y práctico


lunes, 28 de diciembre de 2015

Calculo de días festivos para Colombia

El siguiente post tiene como fin, publicar las funciones necesarias para calcular los días festivos en Colombia. Esta desarrollado en T-SQL compatible con Sql Server 2008 o superior.

Está compuesto por 5 funciones de las cuales tres son para acciones auxiliares y las dos restantes permiten listar los festivos de un año determinado o verificar si una fecha es festivo.

Espero sea de utilidad.

1. Función que nos permite crear una fecha a partir del día, mes y año. Para evitar problemas con la configuración regional.

DROP FUNCTION F_CREAR_FECHA
GO
CREATE FUNCTION F_CREAR_FECHA(@ANIO INT, @MES INT, @DIA INT)
RETURNS DATE
AS
BEGIN
 RETURN DATEADD(mm, (@ANIO - 1900) * 12 + @MES - 1 , @DIA - 1)
END
2. Función que a partir de una fecha obtiene el siguiente lunes.


DROP FUNCTION F_OBTENER_SIGUIENTE_LUNES
GO
CREATE FUNCTION F_OBTENER_SIGUIENTE_LUNES(@FECHA DATE)
RETURNS DATE
AS
BEGIN
 DECLARE @LUNES INT = 1
 IF @@DATEFIRST = 7 
 BEGIN 
  SET @LUNES = 2
 END
 IF @@DATEFIRST = 1 
 BEGIN 
  SET @LUNES = 1
 END
 IF @@DATEFIRST = 2 
 BEGIN 
  SET @LUNES = 7
 END
 IF @@DATEFIRST = 3 
 BEGIN 
  SET @LUNES = 6
 END 
 IF @@DATEFIRST = 4 
 BEGIN 
  SET @LUNES = 5
 END   
 IF @@DATEFIRST = 5 
 BEGIN 
  SET @LUNES = 4
 END    
 IF @@DATEFIRST = 6
 BEGIN 
  SET @LUNES = 3
 END     
 DECLARE @FECHA_DEVOLVER  DATE
 IF DATEPART(DW, @FECHA) = @LUNES
 BEGIN
  SET @FECHA_DEVOLVER = @FECHA
 END
 ELSE
 BEGIN
  SET @FECHA_DEVOLVER = DATEADD([day], ((DATEDIFF([day], '19000101', @FECHA) / 7) * 7) + 7, '19000101');          
 END 
 RETURN @FECHA_DEVOLVER
END
3. Función que calcula el domingo de pascua para un año en particular.
DROP FUNCTION F_CALCULA_DOMINGO_PASCUA
GO
CREATE FUNCTION F_CALCULA_DOMINGO_PASCUA(@A_ANO INT)
RETURNS DATE
AS
BEGIN
 DECLARE @M  INT = 25
 DECLARE @N  INT = 5
 DECLARE @A  INT
 DECLARE @B  INT 
 DECLARE @C  INT 
 DECLARE @D  INT 
 DECLARE @E  INT 
 DECLARE @DIA INT
 DECLARE @MES INT
 
 IF  (@A_ANO >= 1583 AND @A_ANO <= 1699)  
 BEGIN
   SET @M = 22
   SET @N = 2
 END 
 ELSE IF (@A_ANO >= 1700 AND @A_ANO <= 1799)  
 BEGIN 
  SET @M = 23
  SET @N = 3 
 END
 ELSE IF (@A_ANO >= 1800 AND @A_ANO <= 1899)  
 BEGIN
  SET @M = 23
  SET @N = 4 
 END
 ELSE IF (@A_ANO >= 1900 AND @A_ANO <= 2099)  
 BEGIN
  SET @M = 24
  SET @N = 5 
 END
 ELSE IF (@A_ANO >= 2100 AND @A_ANO <= 2199)  
 BEGIN 
  SET @M = 24
  SET @N = 6; 
 END 
 ELSE IF (@A_ANO >= 2200 AND @A_ANO <= 2299)  
 BEGIN
  SET @M = 25
  SET @N = 0
 END  
 
 SET @A = @A_ANO % 19
 SET @B = @A_ANO % 4
 SET @C = @A_ANO % 7
 SET @D = (19 * @A + @M) % 30;
 SET @E = (2 * @B + 4 * @C + 6 * @D + @N) % 7; 

 
 IF (@D + @E < 10) 
 BEGIN
  SET @DIA = @D + @E + 22
  SET @MES = 3
 END
 ELSE 
 BEGIN 
  SET @DIA = @D + @E - 9
  SET @MES = 4
 END
 
 
 IF (@DIA = 26 AND @MES = 4)
 BEGIN 
  SET @DIA = 19
 END
 IF (@DIA = 25 AND @MES = 4 AND @D = 28 AND @E = 6 AND @A > 10)
 BEGIN
  SET @DIA = 18
 END
  
 RETURN dbo.F_CREAR_FECHA(@A_ANO, @MES, @DIA);
END

4. Función Recibe un año y retorna el listado de los festivos para ese año.
DROP FUNCTION F_LISTA_FESTIVOS
GO
CREATE FUNCTION F_LISTA_FESTIVOS(@ANIO INT)
 RETURNS @ListaFestivos TABLE(FechaFestivo DATE, Descripcion VARCHAR(50))
AS
BEGIN
 DECLARE @PASCUA DATE = dbo.F_CALCULA_DOMINGO_PASCUA(@ANIO)
 DECLARE @ES_FESTIVO BIT = 0
 
 
 -- Festivos Fecha Fija 
   INSERT INTO @ListaFestivos VALUES(dbo.F_CREAR_FECHA(@ANIO, 1, 1), 'Año Nuevo')
   INSERT INTO @ListaFestivos VALUES(dbo.F_CREAR_FECHA(@ANIO, 5, 1), 'Día del Trabajo')
   INSERT INTO @ListaFestivos VALUES(dbo.F_CREAR_FECHA(@ANIO, 7, 20), 'Grito de la Independencia')
   INSERT INTO @ListaFestivos VALUES(dbo.F_CREAR_FECHA(@ANIO, 8, 7), 'Batalla de Boyacá')   
   INSERT INTO @ListaFestivos VALUES(dbo.F_CREAR_FECHA(@ANIO, 12, 8), 'Inmaculada Concepción')      
   INSERT INTO @ListaFestivos VALUES(dbo.F_CREAR_FECHA(@ANIO, 12, 25), 'Navidad') 
 -- Festivos Siguiente Lunes
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 1, 6)), 'Epifanía (Reyes Magos)')
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 3, 19)), 'San José esposo de la virgen María')   
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 6, 29)), 'San Pedro y San Pablo')      
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 8, 15)), 'Asunción de la Virgen')         
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 10, 12)), 'Día de la Raza')            
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 11, 1)), 'Todos los Santos')               
   INSERT INTO @ListaFestivos VALUES(dbo.F_OBTENER_SIGUIENTE_LUNES(dbo.F_CREAR_FECHA(@ANIO, 11, 11)), 'Independencia de Cartagena')                  
 -- Festivos Dependientes de la pascua
   INSERT INTO @ListaFestivos VALUES(DATEADD(DAY,-7,@PASCUA), 'Domingo De Ramos')                  
   INSERT INTO @ListaFestivos VALUES(DATEADD(DAY,-3,@PASCUA), 'Jueves Santo')                     
   INSERT INTO @ListaFestivos VALUES(DATEADD(DAY,-2,@PASCUA), 'Viernes Santo')                        
   INSERT INTO @ListaFestivos VALUES(@PASCUA, 'Domingo De Pascua')                           
   INSERT INTO @ListaFestivos VALUES(DATEADD(DAY,43,@PASCUA), 'Ascensión de Jesús') 
   INSERT INTO @ListaFestivos VALUES(DATEADD(DAY,64,@PASCUA), 'Corpus Christi')    
   INSERT INTO @ListaFestivos VALUES(DATEADD(DAY,71,@PASCUA), 'Sagrado Corazón de Jesús')       

 RETURN;
END
5.Función Recibe una fecha y retorna un Booleano indicando si es festivo o no
DROP FUNCTION F_CALCULA_ES_FESTIVO
GO
CREATE FUNCTION F_CALCULA_ES_FESTIVO(@FECHA DATE)
RETURNS BIT
AS
BEGIN
 DECLARE @ES_FESTIVO BIT = 0
 IF EXISTS (SELECT * FROM dbo.F_LISTA_FESTIVOS(YEAR(@FECHA)) WHERE FechaFestivo = @FECHA) 
 BEGIN
  SET @ES_FESTIVO = 1
 END
 RETURN (@ES_FESTIVO);
END
Por último la manera de verificar las funciones:


SELECT dbo.F_CALCULA_ES_FESTIVO(CONVERT(DATE, '01/01/2016')) EsFestivo
SELECT * FROM dbo.F_LISTA_FESTIVOS(2016) ORDER BY FechaFestivo

Y el resultado de las consultas seria el siguiente:



viernes, 28 de agosto de 2015

Activar contadores de rendimiento en pruebas de carga

Al realizar pruebas de carga con Visual Studio en ciertas ocasiones ocurre que no es posible tomar los contadores de rendimiento de las servidores (base de datos, aplicaciones, entre otros) donde esta la aplicación.

los siguientes pasos son los necesarios para permitir la toma de dichos contadores, esta es la traducción y adecuación de un post ya publicado previamente en ingles, si quieres ir al post original este es el link.

En el servidor al cual se le van a tomar los contadores de desempeño realizar los siguientes pasos:

 En el firewall, en el apartado de reglas de entrada, verificar que estén permitidas las reglas correspondientes a “Performance Logs and Alerts”.


2       Agregar a los usuarios de dominio con los cuales se va a realizar la prueba, a los grupos de usuario: Performance Log Users y Performance Monitor Users.

Verificar que los servicios de Windows Performance Logs & Alerts y Remote Register estén activos e iniciados.



Otro inconveniente que se presenta esta asociado al tiempo que espera Visual Studio para recibir la notificación de los contadores, el cual en ciertas ocaciones no es suficiente, lo cual se  soluciona agregando las siguientes lineas en los archivos VsTestConfig.exe.config y Devenv.exe.config:

  <appSettings>
    <add key="LoadTestCounterCategoryReadTimeout" value="180000"/>
    <add key="LoadTestCounterCategoryExistsTimeout" value="180000"/>
  </appSettings>



jueves, 23 de julio de 2015

Ejecutar un procedimiento al iniciar o reiniciar la instancia en Sql Server 2008

¿Alguna vez has necesitado que se ejecute un procedimiento almacenado apenas se inicie o reinicie la instancia?

Esta solución la necesité cuando tenía algunas tablas en la base de datos tempdb, que como saben se borran cada vez que se reinicia la instancia, por lo cual necesité garantizar que cada vez que se reiniciaba la instancia se crearan las tablas. 

¡Espero sea de utilidad! 

Nota: Debemos tener claro que solo podemos hacer que se ejecute un procedimiento almacenado, el cual no debe recibir parámetros y debe estar creado en la base de datos Master. Sin embargo este procedimiento almacenado puede realizar internamente operaciones sobre otras bases de datos. 

1. Debemos verificar que el parámetro 'scan for startup procs' debe tener el valor '1', ¿Como verificamos el valor de este parámetro?
USE MASTER
GO
SELECT VALUE, VALUE_IN_USE, DESCRIPTION 
FROM SYS.CONFIGURATIONS 
WHERE NAME = 'scan for startup procs'
GO



Si el resultado de la consulta es diferente a '1', no habrá problema, en el paso tres lo solucionaremos.

2. En este paso haremos el procedimiento almacenado que se ejecutará cuando se inicie/reinicie la instancia. Para este ejemplo crearemos un procedimiento que crea una tabla en la base de datos temporal.

USE MASTER
GO
CREATE  PROCEDURE Usp_Create_Dummy as
DECLARE @sql VARCHAR(4000) =  ' '
SET @sql  = @sql +  'USE tempdb  '
SET @sql  = @sql + CHAR(13)
SET @sql =  @sql +  'SET ANSI_NULLS ON  '
SET @sql  = @sql + CHAR(13)
SET @sql =  @sql +  'SET QUOTED_IDENTIFIER ON  '
SET @sql  = @sql + CHAR(13)
SET @sql =  @sql +  'CREATE TABLE [dbo].[TablaDummy]( '
SET @sql =  @sql +  ' [llave] [uniqueidentifier] NOT NULL, '
SET @sql =  @sql +  ' [Valor] [ntext] NULL'
SET @sql =  @sql +  ')'
SET @sql  = @sql + CHAR(13)
EXEC (@sql)

3. Ahora asociaremos el procedimiento para que se ejecute cuando se inicie/reinicie la instancia:
USE MASTER
GO
EXEC sp_procoption @ProcName = 'Usp_Create_Dummy' , @OptionName =  'startup' , @OptionValue = 'on'; 
GO

Al ejecutar el paso tres automáticamente el valor del parámetro 'scan for startup procs' cambiará a '1' solo se debe reiniciar el servicio de Sql Server. 

4. El último punto es, ¿Como verificamos que nuestro procedimiento almacenado está en la lista de ejecución?, es muy sencillo con la siguiente consulta lo verificamos:

SELECT name,create_date,modify_date
FROM sys.procedures
WHERE OBJECTPROPERTY(OBJECT_ID, 'ExecIsStartup') = 1


Espero sea de utilidad.

lunes, 23 de septiembre de 2013

Enviar correo electrónico desde C# con una cuenta de correo de gmail

El siguiente código permite enviar correo un electrónico desde C# con una cuenta de correo de gmail
 
 public void EnviarCorreoElectronico(String pAsunto, String pCuerpo)
        {
            using (MailMessage vMailMenssage = new MailMessage())
            {
                vMailMenssage.To.Add(new MailAddress("correo1@gmail.com"));
                vMailMenssage.To.Add(new MailAddress("correo2@gmail.com"));
                vMailMenssage.From = new MailAddress("MiCorreo@gmail.com");
                vMailMenssage.Subject = pAsunto;
                vMailMenssage.Body = pCuerpo;
                vMailMenssage.IsBodyHtml = true;
                vMailMenssage.Priority = MailPriority.High;

                using (SmtpClient vSmtpClient = new SmtpClient())
                {
                    vSmtpClient.Host = "smtp.gmail.com";
                    vSmtpClient.Port = 587;
                    vSmtpClient.EnableSsl = true;
                    vSmtpClient.UseDefaultCredentials = true;
                    vSmtpClient.Credentials = new NetworkCredential("MiCorreo@gmail.com", "EstaEsMiClave123");

                    vSmtpClient.Send(vMailMenssage);
                }
            }
        }

miércoles, 31 de julio de 2013

Obtener información sobre las características del navegador que se ejecuta en el cliente

El siguiente código permite obtener información sobre las características del navegador que se ejecuta en el cliente:
 
        System.Web.HttpBrowserCapabilities vBrowser = Request.Browser;

        //Navegador
        String vNombreNavegador = vBrowser.Browser;
        //Versión
        String vVersionNavegador = vBrowser.Version;
        //Sistema operativo o plataforma
        String vPalataformaNavegador = vBrowser.Platform;

        //Se pueden obtener características adicionales por medio del objeto HttpBrowserCapabilities, muchas de las características indican si el navegador es compatible con ellas, no si están activas en el cliente.

Obtener los archivos de una carpeta

Lo siguiente nos permite obtener y recorrer todos los archivos de una carpeta específica:
 
        //Nos indica la ruta del directorio donde queremos buscar los archivos
        String vPath = @"C:\Users\Usuario\Downloads";

        //Recorremos los archivos que tiene el directorio 
        foreach (String vArchivo in Directory.GetFiles(vPath))
        {
            //Aquí manipulamos los archivos.
        }
Podemos realizar la búsqueda por una extensión particular, para este ejemplo todos los archivos .zip.
 
        //Nos indica la ruta del directorio donde queremos buscar los archivos
        String vPath = @"C:\Users\Usuario\Downloads";

        //Recorremos los archivos que tiene el directorio que son .zip
        foreach (String vArchivo in Directory.GetFiles(vPath, "*.zip"))
        {
            //Aquí manipulamos los archivos.
        }