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
Varios respondieron las anteriores problemas por mail, se ve que no se animan a equivocarse en un blog!!.
ResponderBorrarSe pierden los maravillosos premios que se le brindarán a los que respondan en forma correcta!!.
1) a)
ResponderBorrar2) b)
3) a)
4) a)
Diego:
ResponderBorrarLa respuesta 3) es correctisima...
Las demás.... continua participando..
1) Pues entonces quiere decir que en cada iteración del for, al final el valor de "Descripción" queda igual a cuando entró.
ResponderBorrarFor 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 ;-) )
Diego:
ResponderBorrarAhora 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)
De nuevo muestra que la forma que se hacen los updates en GX es confusa, pero en este caso no parece facil de solucionar.
ResponderBorrarEstas intentando dejar a GX mal parado? ;)
CI 421-5
Anónimo:
ResponderBorrarPorque 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.