viernes, 24 de abril de 2015

SqlServer - update filas con datos de la misma tabla

Una curiosidad
En una tabla tenemos: La columan Year y nombre es clave única
year nombre alias
2014 user1 alias1
2014 user2 alias2
2014 user3 alias3
2015 user1 NULL
2015 user5 NULL
2015 user6 NULL

Hemos dado da alta para el nuevo año  2015 los usuarios , pero queremos traspasar los alias de un año a otro

Pues un update no?


update mitabla set alias = ( Select alias from  mitabla  aux  where aux.year ='2014' and aux.nombre = nombre   
where year= '2015'

Esto da un error, poco aclarador
Mens. 512, Nivel 16, Estado 1, Línea 1
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.<br />
Se terminó la instrucción
Mens. 512, Nivel 16, Estado 1, Línea 1
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
Se terminó la instrucción
La solución


update mitabla set alias = ( Select alias from  mitabla  aux  where aux.year ='2014' and aux.nombre = mitabla.nombre  where year= '2014'

viernes, 17 de abril de 2015

La locura del DateTimePicker


Tenemos un DateTimePicker con la propiedadad ShowCheckBox a true

DateTimePicker1.ShowCheckBox = True

Estamos en el 2015, si en el load del DateTimePicker pongo lo siguiente


    DateTimePicker1.Checked = False
        DateTimePicker1.Value = "17/10/2014"
        DateTimePicker1.ShowCheckBox = False
        DateTimePicker1.Enabled = False
¿Qué valor se muestra?

Pues el dia de hoy

Lo modificamos un poquito, no mucho


        DateTimePicker1.Checked = True
        DateTimePicker1.Value = "17/10/2014"
        DateTimePicker1.ShowCheckBox = False
        DateTimePicker1.Enabled = False


Otro cambio, mira el ejemplo 1


    DateTimePicker1.Checked = False
        DateTimePicker1.Enabled = False
        DateTimePicker1.Value = "17/10/2014"


El check está marcado?? Cuando he dicho que no lo estuviera


Para que saliera desmarcado tendría que poner


        DateTimePicker1.Enabled = False
        DateTimePicker1.Value = "17/10/2014"
        DateTimePicker1.Checked = False

Es un poco locura, estamos hablando de un propiedad que no parezca que tenga tanta implicación en su funcionalidad y si lo tienen

Lo peor de todo, esto es que también pasa con el evento OnValueChanged  si la primera vez que desmarcas el check no se llama al evento, prueba a poner Checked a true antes de asignarle valor


Esto es fácil si únicamente nos fijamos en la propiedad Value, porque si lo que modificas en la propiedad Text  las combinaciones se multiplican

Consejos :
1. Lo primero de todo si vas a tener un checkbox en el DateTimePicker: marca la propiedad Checked = true
2. Usa la propiedad Value: por lo menos te dirá lo que tiene el control de verdad, no el valor que se muestra en pantalla, según tengas o no activo el check

Nota:  para Windows Form Framework 4.0