viernes, 18 de abril de 2014

Trigger – SQL server

Chorra pero interesante, si te piden hacer un histórico de un tabla
No vamos a entrar en si es trabajo del administrador, del log… esto es fácil y  rápido
  1. Nos creamos una tabla que tiene la misma estructura que la tabla que queremos auditar backup_movimientos_mitabla , añadiendo 3 campos
    Fecha --> de tipo date
    Movimiento -->de tipo char(1) --> para saber si es un (Insert, Update o Delete)
    Secuencia--> como campo identity y además primary key
  2.  De la tabla que queremos audtiar, añadimos  el siguiente trigger


    CREATE TRIGGER [dbo].[tr_mitabla]
       ON  [dbo].[mitabla]
       AFTER  INSERT,DELETE, UPDATE
    AS
    BEGIN
           -- SET NOCOUNT ON added to prevent extra result sets from
           -- interfering with SELECT statements.
           SET NOCOUNT ON;
           DECLARE @Type as char(1)
           -- Identificar que evento se está ejecutando (Insert, Update o Delete)
    if exists (SELECT * FROM inserted)
      if exists (SELECT * FROM deleted)
           SELECT @Type='U' -- Si es un update
      else                             
           SELECT @Type='I' -- Si es un insert
      else                              
           SELECT @Type='D' --  si es un delete

    -- Ahora guadarmos el cambios segun sea un tipo u otro
     if @Type ='D' or  @Type ='U'
           insert into backup_movimientos_mitabla  select  *, getdate(), @Type  FROM deleted
     else
           insert into backup_movimientos_mitabla  select  *, getdate(), @Type  FROM inserted

    set NoCount OFF;     
    END
     

    Y ya está , lo probamos


    insert into mitabla (column1, column2) values ('9999','Prueba backup');
    update  mitabla set column2='Prueba backup 0 '  where column1 ='9999';
    delete from mitabla where  column1 ='9999';
    select * from backup_movimientos_mitabla





    Como veras cuando hay un update, guardo el valor que había en la tabla, si quisieras guardar tanto el valor anterior como el nuevo tendrías que usar Deleted & Inserted, cuando es de tipo ‘U’


    Claro que hay otra formas:

    Trigger genérico
    Change Data Capture (CDC) y Change Tracking (CT).

    viernes, 4 de abril de 2014

    Contains mayúsculas y minúsculas


    Esto es una curiosidad,

    Quería hacer una filtro, en un datagridview con una caja de texto, algo muy normal

    Un ejemplo super-completo en http://joseluisgarciab.blogspot.com.es/2013/08/filtrar-datagridview-usando-listas.html

    Lo mío era más sencillo, y menos reutilizable, y quería que se filtrara por “contiene”



    olist.ForEach(Sub(a) a.EsVisible = a.NombrePantalla.Contains(txtFiltro.Text))



    Si hago esto me distingue entre mayúsculas y minúsculas.

    Si ya sé que podría hacer:



    olist.ForEach(Sub(a) a.EsVisible = a.NombrePantalla.ToUpper.Contains(txtFiltro.Text.ToUpper))


    Pero me parece más elegante:



    olist.ForEach(Sub(a) a.EsVisible = Regex.IsMatch(a.NombrePantalla, txtFiltro.Text, RegexOptions.IgnoreCase))