PiensoPienso III


Sigue la serie de Desarrollando desde la trinchera.: PiensoPienso II.






Tengo una tabla con los valores

Id* Descripcion
10 Diez
20 Veinte
30 Treinta

Hago un procedimiento GeneXus que hace

For each
   If Null(Id) //siempre va a dar falso
      Descripcion='DentroDelIF'
   Endif
   call(pActualizoDescripcion,ID,'Fijo')
Endfor


donde pActualizoDescripcion es


parm(In:Id, In: &Descripcion);
For each
   Descripcion=&Descripcion
Endfor
commit



Las preguntas son:
1) Cual es el contenido de la tabla al terminar el procedimiento?


a)
10 Fijo
20 Fijo
30 Fijo

b)
10 Diez
20 Veinte
30 Treinta

c)
10 DentroDelIf
20 DentroDelIf
30 DentroDelIf

2) Cuantos UPDATES se realizan?

a) 1
b) 3
c) 6

3) Si modifico el procedimiento comentandole el If/Endif


For each
//If Null(Id)
// Descripcion='DentroDelIF'
//Endif
   call(pActualizoDescripcion,ID,'Fijo')
Endfor


Cual es el contenido de la tabla al terminar el procedimiento?

a)
10 Fijo
20 Fijo
30 Fijo

b)
10 Diez
20 Veinte
30 Treinta

c)
10 DentroDelIf
20 DentroDelIf
30 DentroDelIf

4) Si modifico el procedimiento cambiando la condición del if


For each
   If Id=20
     Descripcion='DentroDelIF'
   Endif
   call(pActualizoDescripcion,ID,'Fijo')
Endfor


Cual es el contenido de la tabla al terminar el procedimiento?

a)
10 Fijo
20 Fijo
30 Fijo

b)
10 Diez
20 Veinte
30 Treinta

c)
10 Diez
20 DentroDelIf
30 Treinta

Comentarios

  1. Varios respondieron las anteriores problemas por mail, se ve que no se animan a equivocarse en un blog!!.

    Se pierden los maravillosos premios que se le brindarán a los que respondan en forma correcta!!.

    ResponderEliminar
  2. 1) a)

    2) b)

    3) a)

    4) a)

    ResponderEliminar
  3. Diego:
    La respuesta 3) es correctisima...

    Las demás.... continua participando..

    ResponderEliminar
  4. 1) Pues entonces quiere decir que en cada iteración del for, al final el valor de "Descripción" queda igual a cuando entró.


    For each
    If Null(Id) //siempre va a dar falso
    Descripcion='DentroDelIF'
    Endif
    call(pActualizoDescripcion,ID,'Fijo') //Aquí Descripcion es 'Fijo' en la tabla.
    // Aquí ejecuta un update con la info que tiene Descripcion actuamente ?? o sea, igual que como entró ??.
    Endfor


    2) Tienes razon, es 3 updates del procedimiento llamado y 3 de el principal.

    4) Siguiendo el razonamiento del punto 1, supongo que la respuesta es c)

    PD: Como tu dijiste, me animo a equivocarme porque así aprendo de los "veteranos" (por no decir viejos ;-) )

    ResponderEliminar
  5. Diego:
    Ahora si tenes todas las respuestas correctas.

    Al hacer un FOR EACH y dentro del mismo se hace alguna actualizacion de algun atributo, se van a actualizar todos los registros recorridos, independientemente de si hay cambios o no.

    Como decia anonimo en el PiensoPienso I, se podria implementar diferente, pero es lo que hoy sucede.

    Las respuestas correctas entonces son

    1) b) queda todo igual
    2) c) 6 updates
    3) a) Actualiza todo a 'FIJO'
    4) c) Actualiza lo que esta dentro del IF.

    Es importante tener en cuenta que en 1) y 3) que tienen codigo que a simple vista son muy parecidos (pues en ningun caso entra en el IF), el resultado es radicalmente diferente, tanto en cantidad de UPDATE, como en el resultado obtenido.

    Gracias por participar....:)

    Enrique (el viejo)

    ResponderEliminar
  6. De nuevo muestra que la forma que se hacen los updates en GX es confusa, pero en este caso no parece facil de solucionar.

    Estas intentando dejar a GX mal parado? ;)

    CI 421-5

    ResponderEliminar
  7. Anónimo:
    Porque decis que quiero dejarlo mal parado?.

    No entiendo que mostrar como funciona algo, sea para desprestigiarlo, sino ayudar a entenderlo.

    Estos problemas, son derivados de situaciones reales que hemos encontrado en aplicaciones, hecha por personas que estan capacitadas en Genexus y aun asi se producen mas locks o se actualizan mas registros de lo que el programador espera.

    Muchas veces he escuchado "las aplicaciones genexus tienen mala performance" o "Genexus es para aplicaciones chicas" y siempre son de gente que no logra entender los pequeños detalles que hacen que una aplicacion funcione bien o mal.

    Por todo lo anterior, anónimo, no solo no pretendo dejar a GX mal parado, sino todo lo contrario.

    ResponderEliminar

Publicar un comentario

1) Lee el post
2) Poné tu opinión sobre el mismo.
Todos los comentarios serán leidos y la mayoría son publicados.

Entradas más populares de este blog

El Sordo

Paleta de colores en GeneXus