Entradas

Mostrando las entradas con la etiqueta PiensoPienso

PiensoPienso: Diseño de grillas con Descripción.

Imagen
Tengo las tablas Table Movimientos (100.000 registros) Table Structure Name Description Type Formula * ClaveAutonumber  Clave Autonumber Numeric (8) Fecha   Fecha DateTime Referencia  Referencia Numeric (4) ClaveDescripcion  Clave Descripción VarChar Table Referencia (10.000 registros) Table Structure Name Description Type Formula * Referencia Referencia Numeric (4) ReferenciaDescripcion   Referencia Descripción VarChar Tengo 2 Webpanels que muestran una grilla que tiene 20 renglones y deben mostrarse registros de la tabla de Movimientos. y se deben mostrar las mismas columnas en ambos webpanels     ClaveAutonumber ClaveDescripcion Fecha ReferenciaDescripcion (de la tabla Referencia) Se tiene 2 implementaciones:  Opcion 1)  La grilla tiene el atributo ReferenciaDescripcion en la grilla Opcion 2)  Se pone el atributo Referencia con un dy...

PiensoPienso: Atributo formula : Conviene usar procedure o count?

Imagen
Tengo una Transacción con la estructura *CabezalClave  CabezalDescripcion  CantidadDeLineas = Formula que cuenta la cantidad de líneas   (     *LineaClave      LineaDescripcion    )   Se tiene un procedure CuentoLineas que hace parm(in:&CabezalClave,out:&CantidadDeLineas); &CantidadDeLineas=0 for each    where CabezalClave=&CabezalClave      &CantidadDeLineas += 1 endfor Debo hacer un programa que liste todos los cabezales que tengan mas de 3 lineas y poner cuantas lineas tiene. CabezalClave , #LineasDelCabezal. Cual de estas opciones utilizaría ? Justifique la respuesta. Opcion 1) VARIABLE LLAMANDO A PROCEDURE for each      &CantidadDeLineas = CuentoLineas(CabezalClave)      if &CantidadDeLineas > 3            Msg(CabezalClave + "," + &CantidadDeLineas)      ...

PIENSOPIENSO: Cual es la salida de este programa?

Imagen
Temgo una tabla de Paises que esta vacia, en una KB GeneXus, generando con C# *PaisID           C(2) PaisNombre    C(100) y un procedimiento Command line //Doy de alta un registro en la tabla.  &PaisNombre='Uruguay' New    PaisID='UY'    PaisNombre=&PaisNombre EndNew //Consulto 1 Con Trim() for each     where PaisNombre=&PaisNombre.Trim()     Msg(PaisID,status) when none     Msg('No existe 1',status) endfor //Consulto 2 Sin Trim() for each     where PaisNombre=&PaisNombre     Msg(PaisID,status) when none     Msg('No existe 2',status) endfor //Consulto con Trim() en variable &PaisNombre=&PaisNombre.Trim() for each     where PaisNombre=&PaisNombre     Msg(PaisID,status) when none     Msg('No existe 3',status) endfor !) Cual es la salida de este programa en SQL Server....

PiensoPienso: Cual es la salida de este programa?

Imagen
Un procedimiento GeneXus Evo3 main, tiene el siguiente código. Cual es la salida del mismo? a) Venezuela AUN NO PERTENECE AL mercosur >>> Venezuela pertenece al mercosur Venezuela AUN NO PERTENECE AL mercosur b) Venezuela AUN NO PERTENECE AL mercosur >>> Venezuela pertenece al mercosur Venezuela pertenece al mercosur c) Venezuela pertenece al mercosur >>> Venezuela pertenece al mercosur Venezuela pertenece al mercosur Justifique la respuesta

PIENSOPIENSO: Es posible ejecutar esta reorganización?

Imagen
Tengo una KB GeneXus y en la misma tengo la transacción TransaccionNoUsada *Clave   AtributoSecundario   AtributoSecundarioNoUsado (no es referenciado en ningun objeto) Dicha transaccion tiene la propiedad de GenerateObject = False pues nadie la invoca y genera la tabla de nombre MiTabla Tengo ademas un programa, (Tipo Procedure, main, Command Line) que hace new  //Agrega registro en la tabla MiTabla     Clave = &Clave     AtributoSecundario= 'Valor' endnew Elimino el atributo AtributoSecundarioNoUsado y se genera la reorganizacion que hace: ALTER TABLE MiTabla DROP COLUMN AtributoSecundarioNoUsado; PREGUNTA: Puedo ejecutar la reorganización sin instalar nuevamente mis programas? Justifique su respuesta

PiensoPienso: Que produce esta diferencia de performance entre dos for each?

Imagen
Tengo una tabla Log con 1.000.000 de registros En la tabla hay 100.123 registros de los últimos treinta días y necesito actualizarlos. Para eso pruebo los siguientes procedimientos, que tienen codigo equivalente, pues solo cambian los valores de los mismos registros. Demora 1 segundo en actualizar los registros. Demora 186 segundos en actualizar los registros de la tabla. Porque una diferencia de performance tan grande? Justifique su respuesta. UPDATE:  En los comentarios pidieron que ponga la navegación

PiensoPienso: Cual for each tiene mejor performance? #GeneXus

Imagen
En una base de datos, se tiene la tabla  Logs * LogId   (autonumber)    LogDate    LogObservation Tiene un millón de registros y una distribución uniforme en los diferentes meses. Tiene un indice de usuario por LogDate, que es del tipo DATE. Tengo el siguiente código, en un procedure GeneXus, main, command line. &ServerDate = ServerDate() &UnMesAtras = &ServerDate - 30 Msg('Caso 1: where LogDate > ServerDate() - 30 ',status) for each where LogDate > ServerDate() - 30 do 'Algo' endfor Msg('Caso 2: where LogDate > &ServerDate - 30 ',status) for each where LogDate > &ServerDate - 30 do 'Algo' endfor Msg('Caso 3: where LogDate > &UnMesAtras ',status) for each where LogDate > &UnMesAtras do 'Algo' endfor Msg('Caso 4: if LogDate > &UnMesAtras ',status) for each If LogDate > &UnMesAtras do 'Algo' endif endfor Msg('Caso 5: if LogD...

PiensoPienso: Que devuelve este Data Provider?

Imagen
Tengo la tabla Ciudades *CiudadId         C(10)   Pobladores      N(10) Con los datos: CIUDAD1    1000 CIUDAD2    2000 CIUDAD3    3000 Y el Data Provider, que recibe como parametro &CiudadId Cual es la salida de este programa? 1) 1000      0 2) 1000      6000 3) 1000      3000 Es muy sencillo, pero tiene una pequeña trampa.

Pienso-Pienso: Eliminar tabla y foreign key por Dominio con valores enumerados.

En una aplicación GeneXus, tengo las tablas Proyectos *ProyectoID          ProyectoNombre  Char(60)  Estado (Ingresado, Cotizado,Aprobado, Suspendido, Terminado y pueden haber mas) y Estados de Proyecto *Estado               Char(3)   EstadoNombre  Char(60)   Activo                Boolean  //Indica si el proyecto esta activo o ya esta terminado En mi aplicación tengo que hacer referencias a determinados valores del Estado, para realizar determinadas acciones, por ejemplo para notificaciones y/o alarmas. Un desarrollador plantea eliminar la tabla Estados de Proyectos y sustituirla con un Dominio con valores Enumerados , con lo cual se elimina una tabla y varios joins entre la tabla de Proyectos y  Estados en las navegaciones de los programas. En la aplicación hay consultas que solo muestr...

Pienso-Pienso: Trabajar con Facturas.

Imagen
Un problema sencillo Tengo una tabla de facturas *FacturaId FacturaFecha EmpresaId  (  *ProductoId   Cantidad  ) Cada factura tiene 10 productos en promedio. Tengo que hacer un trabajar con facturas, que muestre FacturaId, FacturaFecha, EmpresaId en una grilla ( sin mostrar repetidos ) y permita filtrar por rango de fechas, por empresa y por producto. De que forma lo implementarían? Se darán puntos dobles si usan patterns (k2btools, WorkWith, WorkWithPlus, PxTools, etc) en la solución. Alcanza que cuenten como lo harían con un pseudocodigo.

PiensoPienso: Cómo implementar semáforos en GeneXus?

Imagen
Se tiene una aplicación que se ejecuta en muchas computadoras diferentes sobre la misma base de datos y comparten el file system. Hay un determinado proceso que por su consumo no puedo permitir mas que tres ejecuciones simultaneas del mismo pues la performance de  toda la aplicación se degrada hasta niveles no aceptables.  Dicho proceso, puede tener cortes o caídas que hagan que no termine en forma correcta.  Cuales son las posibles implementaciones con GeneXus para lograr un máximo de tres ejecuciones simultaneas? Se valorarán las que maximicen la concurrencia y no provoquen bloqueos. Para los que quieran les dejo el link de wikipedia sobre el tema y otro sobre mutex .

PiensoPienso: Como mejorar la permformance de este programa?

Tengo una tabla con millones de registros que son de la forma *Clave Descripcion Fecha y un webpanel  con una grilla que muestra los registros que cumplen la condicion: Clave = &Clave when not &Clave.isEmpty(); Descripcion like &Descripcion when not &Clave.IsEmpty(); &FechaInicial <= Fecha and Fecha <= &FechaFinal ; En la pantalla se muestran la cantidad de registros que tiene le grilla y en los eventos tengo: &TotPag = Grid.PageCount if Grid.Rows > 0 if Grid.PageCount <= 1 Paginado.Visible = 0 //Muestro botones de  paginado else if &nroPag = 1 anterior.Enabled = 0 primero.Enabled = 0 endif if &nroPag = Grid.PageCount siguiente.Enabled = 0 endif endif else Paginado.Visible = 0 endif Como mejorarían la performance de este programa? 

PiensoPienso: Respuesta de Paralelizando programas.

Imagen
Esto es una respuesta al post Paralelizando programas . Viendo las respuestas que brindaron los lectores (gracias!), vemos 2 tipos de soluciones: hacer submit hacer shell con la opción que no espere a que termine. de forma de hacer una llamada asincrónica (que no esperar_a que termine). El problema mayor esta en limitar la cantidad de instancias que pueden correr en forma simultanea. Según el problema había que limitar a 8 la cantidad de procesos/thread simultáneos. No estaba dicho el el problema, pero si se genera el programa en java/web, se puede utilizar el SUBMIT, con la propiedad SUBMIT_POOL_SIZE =8 en el client.cfg. SUBMIT_POOL_SIZE es una propiedad implementada solo en java/web en el 2003, que esta buena y me entere hace muy poco de su existencia. Creo que puede ser interesante implementarla para el resto de las plataformas (.NET y Ruby), pues el tema de paralelismo va a ser cada vez mas necesario. Si el programa es .NET, puede utilizarse el shell no modal ...

PiensoPienso: Paralelizando programas.

Imagen
En una KB GeneXus tengo una tabla de la forma Tabla *Clave N(10) Procesado C(1) Otros VarChar(1000) y un programa GeneXus que hace lo siguiente: for each where Procesado='N' Proceso_y_Marco(Clave) endfor El Proceso_y_Marco() es un procedimiento que demora en promedio 1 segundo, aunque algunos demoran 5 minutos y otros menos de medio segundo. Este proceso marca el registro como procesado y puedo ejecutar varias programas de estos en paralelo con diferente parametro, pues no produce bloqueos entre ellos. El proceso es bastante pesado y no pueden ejecutarse mas de 8 procesos simultáneos sin perjudicar la performance del resto del servidor donde ejecuta. Hacer un programa que ejecute el proceso_y_marco() en paralelo, no superando los 8 procesos simultáneos. Explique los cambios a realizar en el código. UPDATE: Segunda parte en Respuesta de Paralelizando Programas

Pienso-Pienso: Cual es la salida de este programa?

Imagen
(ejemplo brindado por Alejandro Rinaldi). Tengo dos tablas: Casas CasaId PersonaId Color PEPE01 MUJICA NEGRO CUQUI01 LACALLE BLANCO CUQUI02 LACALLE VERDE Autos AutoId PersonaId Color PEPE10 MUJICA BLANCO PEPE11 MUJICA NEGRO CUQUI10 LACALLE NEGRO También existen una tabla de colores y de personas, pero no son relevantes para el problema. Necesito hacer un programa que liste las casas, con sus dueños e indique si hay autos con el mismo color, no importado que los autos sean de la misma persona que la casa. Para esto hago un procedimiento (main, command line, en C#) que hace for each CasaId &Color=Color do 'BuscoAutosDelMismoColor' Msg(format( 'Casa %1 de %2 es color %3. Hay ...

PIENSOPIENSO: Porque empeora la performance de este programa?

Imagen
En la base de datos, tengo una tabla que se crea asi: Tabla1 *Campo1 N(4) Campo2  N(4) Valor C(20) Fecha Date y defino un indice de usuario por el campo Fecha. Tengo un programa (procedure GeneXus) for each order Fecha   where &FechaInicial <= Fecha and Fecha <= &FechaFinal   Msg(Valor,status) endfor que funciona muy bien. Se reorganiza desde GeneXus la base de datos y se cambia la clave de la tabla Tabla1 quedando asi: Tabla1 *Campo1 N(4) *Campo2  N(4) Valor C(20) Fecha Date Lo que se hace es agregarle un campo mas a la clave primaria. El procedure no cambia, pero sin embargo luego de reorganizar la tabla empieza a funcionar mucho mas lento que antes. Que puede haber pasado?

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

PIENSO-PIENSO: Como modelar datos acumulados

Imagen
Tengo la tabla con las ventas de mi empresa que tiene la estructura Ventas * Id Fecha Cliente    (*Producto      ImporteVenta    ) Esta tabla tiene millones de registros y no están uniformemente distribuidos (algunos clientes compran mucho y otros muy poco). Se necesitan hacer consultas por Mes Trimestre Año Producto Cliente y cualquier combinación de ellas.  Por ejemplo consultas validas son: Cuales son las ventas del cliente X en el Año Y? Cuales son las ventas del cliente X en el mes D del producto Z? Todas las consultas posibles deben ejecutarse en menos de  1 segundo . 1)  Cual seria su modelo de datos para resolver dichas consultas? 2)  Si se agrega la dimensión Pais, como se ve afectado el modelo de datos? El mejor diseño, se gana  una tableta de chocolate amargo Lindt de 300gr . Si no le gusta el chocolate amargo, puede ser una de chocolate con leche.  Si el ganador quiere se lo...

PiensoPienso: Como unificar dos objetos que se llaman diferente?

Imagen
Tengo una KB en GeneXus X Ev1. En la misma hay un objeto que esta siendo referenciado en varios (muchos) objetos en otros ambientes. Para hacer una prueba y no correr riesgos, dicho objeto es salvado con otro nombre con el comando SAVE AS.. Después de varias pruebas y asegurarse que el nuevo objeto funciona correctamente quiero dejar a este objeto como versión "oficial" del mismo. Resumiendo como ejemplo 1) Abrir el objeto MasterPage1 y hacerle SAVE AS MasterPage2 2) Modificar el objeto MasterPage2 y probarla. 3) Lograr que la MasterPage2 sustituya en todos lados a la MasterPage1 4) Borrar la MasterPage1 Hay una forma sencilla de lograr esto?.  Las soluciones que no necesiten de herramientas externas van a ser valoradas positivamente.

PiensoPienso: Cual es la salida de estos programas.

Imagen
Problema: Listar los clientes que tienen Saldo 0 Tabla Clientes *ClienteId ClienteNombre ClienteSaldo  La tabla tiene los valores ClienteId ClienteNombre ClienteSaldo 1 Gill Bates 0 2 Jeeve Stobs 10 3 Jicolas Nodal 20 Hay 2 versiones del programa que son procedure GeneXus (main y command line) con el código: //==== Version 1 ============ for each  order ClienteNombre     If ClienteSaldo = 0  Msg(Format('Cliente %1 %2 Saldo: %3 ',ClienteId, ClienteNombre, ClienteSaldo),status )   endif endfor // ==== Version 2 usando rutinas ==== for each  order ClienteNombre       do 'Mensaje' endfor Sub 'Mensaje' If ClienteSaldo =0        Msg(Format('Cliente %1 %2 Saldo: %3',ClienteId, ClienteNombre, ClienteSaldo),status ) Endif endSub Cual es la salida de ambos programas?