jQuery: Poner el foco en el siguiente elemento usando una clase

Os cuento: un cliente pide que en un formulario que está rellenando, con varios campos de texto muy pequeños para un solo carácter, el foco salte de forma automática al siguiente campo cada vez que cubre uno. Es decir, en cada evento de levantar la tecla salta al siguiente. La cosa parecía simple usando la función next() de jQuery:

$(".cuadrito").keyup(function() {
  $(this).next('.cuadrito').focus();	
});

La función next() de jQuery salta al siguiente elemento “hermano” que aparezca. ¿Qué quiere decir hermano? Pues que tengan el mismo padre, esto es que estén contenidos en el mismo elemento del DOM. Y por eso esta práctica y elegante solución no me valía, porque resulta que los inputs están dentro de una tabla, de forma que al cambiar de celda cambia el “padre” en el DOM y ya no salta el foco. ¿Qué hacer entonces? Lo solucioné con la función index():

$(".cuadrito").keyup(function() {	            
  var ind = $(".cuadrito").index(this);
  $(".cuadrito").eq(ind + 1).focus();
});

¿Qué hicimos aquí? Creo que en el pasado ya vimos que jQuery nos permite tratar a los elementos como si de un array se tratase. Simplemente estoy mirando en la primera fila qué índice tendría el elemento en el que nos encontramos y, en la siguiente, poniendo el foco en el posterior sumando 1 al índice.

Anuncios

¿Cómo forzar que la instrucción “net use /delete” no nos pida confirmación para desmontar una unidad de red?

Vamos con un tip rápido sobre sistemas operativos. Si en Windows queremos desmontar una unidad de red desde un script utilizaremos el comando net use con el parámetro /delete. El problema es que este nos pedirá confirmación, por lo que si es una tarea automatizada se quedará esperando la respuesta ¿Cómo podemos forzar que se desconecte la unidad? Pues con el parámetro /y después del /delete.

La cosa sería más o menos la siguiente:

#Así para desmontar todas
net use * /delete /y

#Cambiando * por el nombre de la unidad 
#desconectamos solo esa
net use x: /delete /y

La opción /y hará que se interprete “yes” como respuesta por defecto a todas las peticiones de confirmación.

SQL-Server: Usar CASE en una cláusula ORDER BY

La ordenación de resultados en una consulta SQL suele ralentizar la respuesta de la consulta, aunque en muchos casos necesitamos tener nuestro resultado ordenado. Hoy me veía con este caso particular, en una aplicación que conecta con una base de datos de SQL-Server: en una pantalla se muestran una serie de líneas de deuda, algunas haciendo referencia a tratamientos ya realizados y otras a tratamientos pendientes. En caso de que estén realizados habría que ordenarlos por fecha de realización, en caso de que no estén realizados sería por fecha de creación.

Para eso podemos utilizar una sentencia CASE en la cláusula ORDER BY:

SELECT 
  FechaCrea,   
  Concepto,
  Precio,
  ImportePagado,
  Realizado,
  FechaRealizado 
FROM 
  vistaPagos  
WHERE 
  Precio > 0 
ORDER BY 
 CASE Realizado WHEN True THEN FechaRealizado  
 ELSE FechaCrea END;  

Veamos ahora otra posibilidad de uso del CASE: cuando queremos que la consulta reciba un parámetro con el campo por el que ordenar los resultados:

SELECT 
  FechaCrea,   
  Concepto,
  Precio,
  ImportePagado,
  Realizado,
  FechaRealizado 
FROM 
  vistaPagos  
WHERE 
  Precio > 0 
ORDER BY 
CASE @OrdenaPor 
   WHEN 'Fecha' THEN FechaCrea
   WHEN 'FReal' THEN FechaRealizado       
 END,
CASE @OrdenaPor 
   WHEN 'Precio' THEN Precio
   WHEN 'Pendiente' THEN ImportePagado   
 END
;  

¿Por qué hay dos CASE separados en el segundo ejemplo? Bueno, CASE necesita que los tipos devueltos en la expresión sean compatibles. En el primer caso devolverá fechas, en el segundo devolverá importes. En caso de que no se cumpla ninguna de las condiciones devolverá un null, así que no debería hacer fallar la consulta.

Utilizar el comando expr para hacer operaciones

El comando expr del terminal de Linux nos permite evaluar una expresión y pintar su resultado. De esta forma podemos usarlo para ejecutar operaciones aritméticas o de comparación.

$ expr 15 + 3
$ expr 15 % 3
$ expr 15 \* 3
$ expr 15 – 3
$ expr 15 / 3

En el ejemplo de arriba puedes ver los ejemplos para suma, operación de módulo, multiplicación (ese caso requiere usar el carácter \ para escapar el asterisco que usamos como símbolo de multiplicación), resta y división.

¿Limitaciones? Pues que solo nos permite operar con números enteros: únicamente acepta enteros como parámetros y tan solo devuelve enteros como resultado

Otra cosa que nos permite expr es ejecutar operaciones de comparación:

$ expr 15 = 3
$ expr 15 != 5
$ expr 15 \> 3
$ expr 15 \< 3
$ expr 15 \<= 3

Devolverá 1 en caso de que la comparación sea verdadera y 0 en el caso contrario. De nuevo el carácter \ será necesario para escapar los caracteres de mayor y menor en las comparaciones.

No solo podemos usarlo desde el terminal para operar, expr también puede resultar de utilidad invocado dentro de alguno de nuestros scripts.

Cómo ver que Apps tienen acceso a nuestra cuenta de Facebook

Ya hemos hablado de varios temas de privacidad en este blog, como cuando vimos cómo descargar nuestros datos de varias redes sociales o cuando dimos consejos para proteger nuestra privacidad tanto en facebook como en general. Muchas de las brechas de seguridad en Facebook provienen de apps de terceros con demasiados permisos. ¿Cómo podemos verlas?

Desde la web podemos hacer click en el menú desplegable a la derecha de la cabecera, ir a Configuración y allí, en el menú de la izquierda, buscar Apps y Sitios web. Si te pierdes un poco con la explicación basta con que hagas click en este enlace en un navegador donde tengas tu sesión iniciada.

Desde el app para Androidla cosa es más o menos igual: despliegas el menú, vas a Configuración y allía a Apps y Sitios Web. Una vez dentro de esa pantalla tienes que pulsar en Sesión Iniciada con Facebook. Una vez allí ya verás todas las apps conectadas, en una pantalla como la siguiente.

Apps y Sitios Web

Tanto desde el ordenador como desde la app podrás seleccionar qué apps quieres eliminar para revocarles de esta forma el acceso a tus datos. De esta forma mejorarás un poco más tu privacidad.

Algunos consejos para optimizar consultas en SQL-Server

Vamos con una serie de pequeños trucos para optimizar nuestras consultas en SQL-Server y conseguir un mejor rendimiento, como ya habíamos hecho en el pasado con MySQL.

  • Añadir al nombre de la tabla el propietario y el esquema hará más rápida nuestra consulta. Si no lo ponemos SQL-Server buscará en todos los esquemas hasta encontrar el objeto.
  • Un clásico: No usar el comodín * en las consultas, poner el nombre de las columnas que queremos traer ayudará a ahorrar tiempo y memoria.
  • Como ya dijimos en un artículo anterior, NOT EXISTS tiene un mejor rendimiento que NOT IN.
  • No uses el prefijo sp_ para nombrar tus procedimientos almacenados. Aunque suene raro, al ser el prefijo que SQL-Server usa para los procedimientos almacenados por defecto siempre que se invoque uno que empieza por sp_ primero lo buscará en la base de datos maestra.
  • Comprueba que tus índices sean eficientes y que no estén demasiado saturados. Recuerda usar las claves primarias y externas de forma adecuada y tener la bases de datos bien normalizadas
  • Recuerda que las vistas con índices, como ya comentamos en otro artículo, mejoran la velocidad de consulta pero penalizan las operaciones de borrado, lectura y escritura.
  • No uses variables de tipo table en los joins de las consultas. Una tabla temporal o una expresión de tabla común (CTE) te darán un mejor rendimiento.
  • No utilices las cláusulas Distinct, Group By y Order By si no es indispensable. Consumen mucha memoria.
  • SQL-Server siempre devuelve la cuenta del número de filas afectado por las consultas de INSERT, DELETE, UPDATE y SELECT. Utilizar la cláusula SET NOCOUNT ON evitará esto ahorrando memoria y tiempo. En una consulta simple apenas se nota, pero en consultas con muchos joins o subconsultas ahorra mucho tiempo.
  • Las funciones son uno de los puntos débiles de SQL-Server, ralentizan enormemente las consultas. La ventaja que aportan es la reutilización de código, pero tienes que ver si te compensa su uso por lo que penalizan el rendimiento. En muchos casos una subconsulta o una tabla temporal serán más rápidas.

Transformar una fecha de formato anglosajón (mm.dd.yyyy) a formato europeo (dd/mm/yyyy) con ASP clásico

Vamos con una entrada cortita. En el trabajo todavía usamos ASP clásico en uno de los proyectos y cuando usamos un campo de fecha en HTML5 en la vista hay que andar transformando de formato europeo a anglosajón y viceversa. ¿Cómo hacemos en ASP clásico esto?

Supongamos que tenemos una cadena con la fecha en formato mm.dd.yyyy, por ejemplo recibimos el 11.30.2018 de nuestro campo Date. ¿Cómo procedemos?

arFech = split(".","11.30.2018")
strFechaEuro = arFecha(1) & "/" & arFecha(0) & "/" & arFecha(2)

De esta forma la cadena strFechaEuro almacenaría el valor “30/11/2018