Entradas

Mostrando las entradas de octubre, 2010

Fechas nulas y XML/SOAP

Imagen
Hoy cuando escribimos una fecha nula (date o datetime) en un archivo XML con GeneXus, está grabando < Fecha > 0000-00-00T00:00:00 </ Fecha > Que problemas trae esto? Esa no es una fecha válida en XML por lo que cuando esto se intenta utilizar interactuando con otros sistemas, da errores al intentar leerlo. Por ejemplo, si el xml que se esta generando es un SOAP, el mismo no pasa la validación del XML schema del mismo. Si queremos recibir un parámetro fecha con un valor nulo, hay que ponerle algún valor artificial al mismo (que simule el nulo, como DateTime mínimo o máximo) lo cual complica la programación o hay que recibir/enviar el parámetro como string y manipular el formato del mismo. Seria conveniente, que cuando aparece una fecha nula se pudiera grabar < Fecha xsi : nil = "true" > </ Fecha > que es una forma “mas correcta” de escribir estos XML. Revisando los SACs veo que hay varios que tratan el tema y es bueno que se solucione pronto...

Comentarios en el blog

Imagen
Quise poner un sistema un poco mas prolijo de comentarios en el blog.  Probe durante unos dias el de IntenseDebate . Esta se  integra con otros sistemas, tiene un editor de comentarios mejor que el de Blogger (no se necesita nada para esto).  Lo que me gustaba mas es poder responder a un comentario y que los mismos quedaran indentados correctamente.   En Blogger, todos los comentarios quedan ordenados en forma cronológica, lo cual es bastante incómodo para seguir intercambios de ideas.  Si bien tiene muchas ventajas, no encontré una forma que los comentarios estuvieran solamente en los post nuevos, sino que ocultó también los comentarios de los post antiguos.  El principal motivo que tengo para tener un Blog, es poder aprender de los comentarios de los lectores , por lo que perder los comentarios viejos, no era una opcion valida. Realicé el rollback de todos los comentarios. Por ahora, reescribí todos los comentarios de la últim...

GXwiki - Sobre websession, tiemout y cambios perdidos.

Imagen
En Concepto y en nuestros clientes tenemos varias instalaciones de GXWiki . Es una herramienta maravillosa para capturar conocimiento e ideas en grupos de trabajo. Recomiendo a todos los que tengan proyectos donde trabaje mas de 5 personas, que se instalen uno.  Es notable como se va evolucionando y los usuarios usan nuevas funcionalidades. Si todos se acostumbran a registrar sus ideas en forma mas o menos sistematica, con el correr del tiempo las buenas ideas salen a luz.. Como lei en un tweet que mando @guscarr: Para conseguir buenas ideas, alcanza con tener muchas ideas y desechar las malas Una evolución natural que he encontrado es que quienes redactaban procedimientos escritos, pasaron a grabar videos con Jing e incorporan dichos videos al Wiki, facilitando el aprendizaje a los usuarios finales. Lo que antes costaba explicar por escrito, ahora lo muestran con un video sobre la aplicación. Con el paso del tiempo, los usuarios van pidiendo mas funcionalidades. La...

PiensoPienso: Porque esta lento este programa?

Imagen
Tengo una tabla Documentos de la forma DocumentoId* N(10) Autonumber ClienteId C(10)  //Codigo de cliente DocumentoNombre C(256) DocumentoFecha Date //Fecha del documento DocumentoKBytes N(10) //Tamaño en KBytes DocumentoBlob Blob //Contenido del documento Hay un webpanel (GeneXus Xev1) que muestra todos los documentos de los clientes Documentos del Cliente:  MOOGLE    //Filtro por ese cliente Nombre Fecha Como dominar el mundo 2000/01/15 Como hacer el primer billon de dólares 2005/03/09 Haciendo un click en el nombre del documento, se puede bajar/abrir el documento en la maquina del cliente. En el evento Load de la grilla se tiene for each where ClienteId=&ClienteId &DocumentoNombre=DocumentoNombre &DocumentoNombre.Link=PathToUrl...

Sentencias lentas en SQL Server 2008.

Imagen
Una aplicación GeneXus, tenia una sentencia SQL parecida a esta: SELECT T1.[SKMovId], T1.[SKMovFch], T2.[DepositoId], T2.[DepositoTipo], T1.[ProductoId], T1.[SKMovCantidad] FROM ([SKMovimientos] T1 WITH (NOLOCK) INNER JOIN [Depositos] T2 WITH (NOLOCK) ON T2.[DepositoId] = T1.[DepositoId]) WHERE (T1.[SKMovFch] >= @AV6cFechaInicial) AND (T1.[ProductoId] = @AV9cProductoId) AND (T2.[DepositoTipo] = @AV7cDepositoTipo) Hace un join entre dos tablas SKMovimientos que tiene cientos de miles de registros y Depositos que tiene menos de 10 registros . Demoraba 24 segundos y devolvía 17 registros. Extremadamente lenta. Viendo el plan de ejecución de la sentencia pudimos ver que utilizaba un índice incorrecto en la tabla SKMovimientos. Hacer un select en la tabla SKMovimientos sola, sacando la condicion que restringe por DepositoTipo y era instantánea y utilizaba el índice adecuado. Revisando las estadísticas y tenia la creación de estadísticas y su actualización e...

Como programan los niños hoy.

Imagen
Ayer Felipe (11 años) me pidió que le instalara Alice 2.2  (el sitio se ve bien con IE, pero mal con Chrome y FF). No lo conocía y le pregunte que era. Su respuesta fue: Es un lenguaje de programacion como el Scratch , pero en 3D.  Después de instalarlo, pude ver que el entorno de programación es bastante potable y permite a los niños crear animaciones de personajes en 3D (bien al estilo Second Life) con poco esfuerzo. Esta bien resuelto la interaccion entre los personajes y los objetos del entorno. La forma de programar es a traves de "Drag and Drop". Es muy conveniente para aquellas personas que no conocen la sintaxis un lenguaje pues es mucho mas difícil cometer errores, pues la programación consiste en arrastrar objetos a la pantalla o cajitas a donde se almacena el código y luego llenar los campos que quedan libres.  Pensando en los nuevos dispositivos tipos tabletas, los ambientes de programación van a t...

Cotización de Servidor - 1997

Revisando unos papeles viejos, encontré una cotización que un proveedor me hizo llegar el 15 de abril 1997. Servidor Compaq Prosignia Procesador Intel Pentium Pro Velocidad de reloj 180 mhz Memoria RAM 64 MB ampliable a 256 MB Cache Interno 16 Kbyte Cache Secundario 512 Kbyte Two way associative Controlador de video 1 MB DRAM ampliable a 2 MB Disco duro 1.08 GB Total precio Unitario……………………………U$S 5.770 Una verdadera bicoca. A eso habia que agregarle el software Backoffice Server  U$S 2.718 y licencias para cada cliente. Muchas cosas han cambiado en estos años.

Reglas en tiempo de ejecución (runtime) en aplicaciones GeneXus (2da. Parte)

Imagen
En el post anterior , escribí sobre la posibilidad de tener reglas que puedan ser ejecutadas en runtime y modificadas por los usuarios y las ventajas de las mismas.  En los comentarios Gustavo Proto  pedía ejemplos para facilitar el entendimiento del problema, que es el primer paso para poder resolverlo. Algunas características deseables de las reglas (para la primera version): 1) Asociado a una transacción.  Las reglas/formulas que puedo escribir, son las que puedo escribir con los atributos de una transacción. Si en runtime tengo que utilizar un atributo de la extendida en las reglas, que no esta en la transacción no se puede utilizar.  2) Las reglas no acceden a la base de datos.  En una primera etapa no es necesario que la regla acceda a la base de datos. Por ahora alcanzaría que accedan a un XML que pueda generarse desde los datos de la transacción. Si por ejemplo se necesita condicio...

Encuesta Anual CUTI - 2009

Estuve analizando la encuesta de la Cámara Uruguaya de Tecnologías de la informacion del año 2009. Por primera vez en muchísimos años bajaron las exportaciones de software y tambien bajo lo generado por persona. Aumentamos en cambio la cantidad de personas ocupadas y las ventas en el mercado interno. Software en Uruguay 2008 2009 Variacion Personal Ocupado 11.700 12.700 9% ▲ Mercado Interno (Millones U$S) 330 355 8% ▲ Exportacion (Millones U$S) 220 206 -6% ▼ Total 550 561 2% ▲ U$S / Persona 47.009 44.173 -6% ▼ Es una buena medida para compararse con el resto y conocer un poco mejor la industria de software uruguaya.

Reglas en tiempo de ejecución (runtime) en aplicaciones GeneXus.

Imagen
En Concepto desarrollamos aplicaciones con GeneXus, para varios clientes. En las mismas aparecen muchas veces situaciones donde la aplicación debe tomar decisiones basadas en los datos de la misma. Algunos ejemplos de estos problemas: Documentos que hay que exigir para una determinada operación. A que oficina debe pasar el tramite dependiendo su contenido (monto, producto, etc.). Controles a aplicar a una determinada operativa Descuentos a realizar a una venta (depende del cliente, de la cantidad vendida en el año, la cantidad del pedido actual, etc.) Esto se puede resolver de varias formas. Opción 1) Una fácil, es hacer un programa de la forma (para el último ejemplo) do case case TipoCliente='IMPORTANTE' &Descuento=20 case FacturaImporte>1000 and TipoCliente='CHICO' &Descuento=10 case TipoCliente='CHICO' &Descuento=5 otherwise &Descuento=0 enddo Que problemas tiene este enfoque? Cada vez que el departamento comercial...