lunes, 23 de marzo de 2009

Scroll en resoluciones bajas

Esta vez va de diseño,

El escenario es un buscador telefónico para un partner en otro país. El principal problema que nos hemos encontrado los programadores es que no conocemos la resolución con la que se está visualizando nuestra aplicación Web. Esto, junto a los dictados de la moda actual para el diseño de páginas centraditas y con amplios y limpios márgenes a ambos lados, nos dio el resultado de que en resoluciones bajas (1024) la página queda descentrada hacia la derecha al tener valores absolutos para las medidas de las tablas.

La solución de pasar a valores relativos, aparte de costosa en tiempo, nos suponía destrozar literalmente la armonía del conjunto. En vez de eso nos propusimos engañar al navegador, modificando los valores de la barra horizontal de scroll para que la situase en el centro exacto de nuestro conjunto.

La manipulación del scroll, la haremos por código de cliente, por JavaScript mismo, fabricando la siguiente función, que llamará a la propiedad scrollBy de Windows a la cual le pasaremos los pixeles desde la izquierda y desde arriba:


function CenterScroll()
{
window.scrollBy(512,0)
}


Con esta función adecuadamente llamada, por ejemplo, en el onLoad del BODY, conseguiremos que nuestro diseño centrado esté perfecto para resoluciones normales y que cuando la aplicación sea ejecutada en resoluciones más bajas de monitor, no perdamos el tiempo con las dichosas barritas.

Un placer y ¡¡hasta la próxima!!

miércoles, 28 de enero de 2009

Comilla or not Comilla

Buenas, 

Voy a exponer un caso de bricolaje constructivo en Transact SQL. Un compañero de la empresa necesitaba ejecutar una consulta pasándole el nombre de la tabla por una variable. Todos sabemos que eso es imposible, sin embargo hay una manera bastante común que es darle la vuelta a la consulta, meterla en una variable y luego ejecutarla en un exec:

Declare @Tabla as nvarchar (15)
Declare @Consulta as nvarchar(100)
Select @Consulta='Select * from '+@Tabla
Exec(@Consulta)

Los problemas empiezan cuando la consulta de mi amigo no cabe en un campo de texto normal y tampoco podemos recurrir a los campos binarios de Text, NText o Image porque no se pueden declarar variables de esta manera (No reservan espacios en memoria, generan pequeños archivos completos en local y almacenan punteros en memoria posteriormente). Este segundo escollo lo superamos incrustando el código directamente en el Exec:

Declare @Tabla as nvarchar (15)
Exec('Select * from '+@Tabla)

Pero desgraciadamente un tercer problema nos tuvo un pequeño rato entretenidos, necesitamos meter un where fijo sobre un campo de texto (la porra de las comillas ataca de nuevo), lo más fácil sería pensar en un +Char(39) + Peeero el problema es que el comando Exec no admite que le metamos esa funcioncita, dando un error de sintaxis. 
Pues bien, la solución es tan sencilla como absurda, se trata de timar al sistema haciendole creer que le vamos a pasar otra variable. Solo que esa variable contendrá nuestra ansiada comilla simple:

Declare @Tabla as nvarchar (15)
Declare @Comilla as char (1)
Select @Comilla=Char(39) 
Exec('Select * from '+@Tabla+' where [ID]='+@Comilla+'3'+@Comilla)

Con esto solucionamos el problema de la absurda restricción del comando EXEC

Un saludo.







viernes, 4 de julio de 2008

Compartir ficheros AIX vs WINDOS con WinSCP

Un día entero me llevó conseguir esto... y lo realmente fácil que es.

Hasta el mes pasado estábamos descargando unos ficheros manualmente desde un servidor AIX a uno de nuestros servidores de aplicación Windows 2003. Usábamos un cliente de WinSCP y, pese a que la tarea era manual, esta rutina solo se llevaba a cabo una vez por semana.
El problema vino cuando, para un nuevo proyecto, necesitamos que los datos sean descargados para su posterior proceso todos los días y además de madrugada. El caso es que no nos apetecía descargar los ficheros a manubrio (obviamente) y el lío en si es la diferencia de formatos de almacenamiento entre un LINUX y WINDOWS, con lo que no se podía programar una tarea de transporte de ficheros a pelo. Había que transformarlos de alguna manera.
Buscando y buscando al fin volví al punto de partida (el bendito WinSCP) y su ¿lenguaje? para hacer Scritping. Gloria a eso ahora hemos diseñado un pequeño script que nos sincroniza cada día las carpetas que necesitamos. Simplemente después hay que ejecutar en un CMD el script por medio de su motor y ¡A volar!
La programación de la ejecución de terminal la podéis hacer, como por ejemplo la hemos hecho nosotros, por medio de un SQLServer y su gestor de paquetes.

El Script, simplemente abrid un bloc de notas y guardadlo como un txt normalillo:


# Para que sepa ejecutarlo en batch
option batch on
# Quitamos el alert de confirmación de movimiento
#(en un batch no tiene sentido tener confirmaciones)
option confirm off
# Conexión: Usuario:contraseña@IpServidor
open yomismo:12345@12.123.45.789
# Cambio al directorio deseado
cd /directorio/subdirectorio
# Sincronizo las carpetas deseadas
# Parte izquierda Windows, parte derecha AIX
synchronize both c:\cosas\Cosa2\ /varetisdf/cc_collectsource
# Desconecto
close
# Y salgo
exit

Tras todo esto, simplemente hacemos la llamada desde el terminal, o desde cualquier programa utilizando un shell. En este caso he puesto el script en la misma ruta que el ejecutable del WinSCP.

winscp.exe /console /script=miScript.txt

Como Siempre, espero os haya servido de ayuda y ya sabeis, si teneis alguna duda poned un comentario y se intentará exprimir un poco más nuestra experiencia.

lunes, 21 de abril de 2008

Vamos a empezar por algo sencillo, algo de javascript.

Para un proyecto en ColdFusion necesitabamos que el usuario mediante la pulsación de una combinación de teclas fuese capaz de dar el foco a un determinado campo de un formulario. Con un keypress capturamos el código de la tecla y lo almacenamos en un array, cuando los dos elementos de dicho array sean las dos teclas que queremos, dispararemos la acción, en este caso un focus.


-- Función Keypress

<script language="JavaScript" type="text/javascript">

var KPAry=new Array();
function KeyPress(e)
{
KPAry[KPAry.length]=e;
if (KPAry.length==2){
if (KPAry[0]==16&&KPAry[1]==65)
{
document.Suche.nam.focus();
}

KPAry=new Array();
}
}

document.onkeydown=function(evt){ KeyPress(evt?evt.keyCode:event.keyCode); }

</script>




Espero que os haya sido de utilidad.

Un saludo.

P.D: Un buen ejemplo de página: Información de Galapagar

domingo, 20 de abril de 2008

Introducción

Es increíble lo que ha avanzado la programación en los últimos años. A día de hoy tenemos múltiples y variados lenguajes de programación para hacer una misma cosa (y no digamos plataformas). Esta diversidad nos lleva más rápida y fácilmente a nuestros objetivos, sin embargo hemos de pagar el precio de la ignorancia. Hoy en día los programadores somos una herramienta multilenguaje, somos unos políglotas del código y unos humanistas del método... sabios en general, ignorantes en particular.

Con la llegada de Internet, los plazos de programación se acortan y aquella romántica concepción del estudio y análisis de los proyectos que nos enseñaron en la carrera, queda atrás como un Framework de sabiduría compartimental olvidado entre las nuevas versiones de conocimiento.

Buena parte del tiempo de mi jornada como trabajador lo paso buscando trozos de código (da igual el lenguaje) que me ayuden a acortar los plazos de entrega para poder ir a tomar un café al bar con mis colegas de oficina. Dichos fragmentos de código, la mayoría de las veces, son confusos y no se acercan para nada a lo que se necesita. Los hardcoders que cohabitan en los foros de Internet no hacen más que intentar demostrar su valía en un determinado lenguaje, sin importar si el que los lee, realmente quiere saber tan en profundidad la complejidad del algoritmo que han diseñado durante sus horas de sueño.

En este minúsculo rincón perdido de la red global intentaré mostrar las soluciones que día a día mis colegas del departamento de desarrollo de mi empresa y yo, hemos ido consiguiendo y diseñando para nuestros propios casos reales, de una manera asequible (espero).

Salu2.