Los mejores puntos embebidos
Los mejores puntos embebidos
por Mauricio Nicastro
Días atrás necesitaba actualizar una tabla cuando se borraba un registro en otra. El clásico ejemplo del stock: borro un registro de la tabla stock y tengo que actualizar el campo correspondiente en la tabla artículos. El hecho es que estuve un buen rato buscando el punto embebido exacto donde debía poner mi código. Finalmente lo encontré, pero me di cuenta que no era el único a quien le pasaba estas cosas, por la cantidad de preguntas similares que vi en el foro. Todos coincidimos en que Clarion es muy poderoso, pero manejar los puntos embebidos lleva su tiempo: que cuál punto elegir, qué prioridad ponerle, si va antes o después del parent call, etc. Entonces pensé, muy de vez en cuando lo hago, que lo mejor sería tenerlo escrito a modo de consulta, al menos hasta que mi memoria se acostumbre a ellos. He aquí, entonces, un listado de los puntos embebidos más útiles y frecuentes de ser utilizados.
1)Forzar la entrada de un get.
Este es sencillo, basta con poner en el Selected del entry algo así:
?NombreDelEntry{ Prop:Touched } = TRUE
2)Validar un entry.
También es fácil. Tan solo en el accepted se pone el código correspondiente a la validación. Ahhhh, pero qué pasa si no queremos que valide cuando se presiona el botón de ok? Entonces, nuestro código debería ser así:
IF NOT QuickWindow{Prop:AcceptAll} ! Nuestro código de validación END !IF
O bien, sin importar el label de la ventana
IF NOT 0{Prop:AcceptAll} ! Nuestro código de validación END !IF
De esta forma, valido cada vez que paso por el entry y evito la validación posterior al aceptar toda la ventana. Con esto evité el problema de los campos calculados. Calculaba el valor del IVA, por ejemplo, luego de ingresar el neto. Por x motivos, al llegar al campo de I.V.A. lo modificaba y al validar todo, volvía a obtener el valor original. Frustrante!
3)Al aceptar la ventana, disparo otros procedimientos.
Esto también es muy común. Termino de ingresar unos datos en una tabla y debo actualizar datos en otra (nuevamente, el stock: ingreso un registro y modifico el campo correspondiente en la tabla artículos). Para hacer esto, el mejor punto embebido es el TakeCompleted, luego del Parent Call (prioridad 5001) El código es:
IF ReturnValue <> Level:Fatal ! Código para hacer lo que quiera END !IF
Primero, como verán, verifico que se hayan grabado los datos en forma correcta
4)Evitar un borrado.
Clásico ejemplo: eliminar un registro de una tabla si previamente se cumple cierta condición. Esto va en ThisWindow.Init, con prioridad 5500, quedando así:
IF ThisWindow.Request = DeleteRecord ! Acá verifico si se puede borrar o no. IF NOT MiCondicion ThisWindow.DeleteAction = DELETE:None ReturnValue = RequestCancelled END !IF END !IF
5)Una vez borrado un registro, actualizar una tabla.
Este es el que me costó un poco. Estuve probando distintos puntos embebidos, hasta que me decidí buscar en el foro. Encontré un mensaje por allí que logró ubicarme. En ThisWindow.PrimeUpdate, con prioridad 5001 (después del Parent Call), hago:
IF ThisWindow.Request = DeleteRecord ! Se trata de un borrado IF Self.Response = RequestCompleted ! Mi código acá END !IF END !IF
6)Buscar un campo en un reporte.
Muchas veces debemos darle formato a una variable o buscar un dato en otra tabla en un reporte. Para esto, en ThisReport.TakeRecord, antes del Parent Call (prioridad 500), ponemos nuestro código.
7)Imprimir una banda condicional al finalizar un reporte.
Esta es la clásica banda con los totales, por ejemplo. Es una banda condicional con el atributo falso, pero que imprimo al terminar el reporte. Supongo que para esto tengo 2 puntos para elegir. En particular, utilizo el AskPreview, antes del Parent Call, es decir con prioridad 1300.
PRINT( RPT:MiBanda)
Aunque también puedo utilizar el ThisWindow.TakeCloseEvent, con prioridad 2500
8)Filtro y ordenamientos manuales en los reportes.
Este es fácil. En ThisWindow.OpenReport, antes del Parent Call, aplico mis filtros y ordenamientos
9)Filtro en todas las lengüetas de un browse.
Esta la pregunté hace poco. En un browse tengo un drop list y filtro de acuerdo a qué elemento del drop selecciono. Pero hete aquí que filtra en la lengüeta activa (bah, hacía eso porque mi filtro estaba en el new selection del drop list). Fue entonces cuando Leonardo G. Palomares ( a él si lo recuerdo ), me dijo que tenía que hacer:
En ThisWindow.Reset PROCEDURE, con Prioridad 3000, va mi código de filtrado. En ControlEvents, ?Sheet1, NewSelection, pongo ThisWindow.Reset(TRUE) Y en el NewSelection del drop list, también pongo ThisWindow.Reset(TRUE)
Hay muchos más puntos embebidos interesantes. Estos creo que son los que más frecuentemente se utilizan. Si alguien tiene ganas de agregar más puntos embebidos (de hecho, yo pienso hacerlo a medida que los vaya necesitando y descubriendo), es bienvenido.
Saludos a todos.
Mauricio