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

    viernes, 28 de marzo de 2014

    vb. olist.ForEach

    La chorra del dia de hoy , situación .net vb.



    Public Class miclase
        Private m_visible As Boolean
        Public Property EsVisible() As Boolean
            Get
                Return m_visible
            End Get
            Set(ByVal value As Boolean)
                m_visible = value
            End Set
        End Property
    End Class
    Dim olist As List(Of miclase) = Rellenarlista()
    'La lista se rellena con elementos todos con EsVisible =True
    '---Desde debug olist (0).EsVisible =True
    'Quiero que todos se pongan con EsVisible =False
    olist.ForEach(Function(x) x.EsVisible = False)
    '---Desde debug olist (0).EsVisible =True otra Vez


    Por qué??


    No hay forma de llamar a property x.EsVisible(False). VB no está distinguiendo entre el = de comparación y el de asignación.
    Pero hay una solución :


    olist.ForEach(Sub(x) x.EsVisible = False)


    Con esto ya funciona como queria