lunes, 15 de septiembre de 2008

Oracle Reports: No funciona Order by con parámetro

Oracle Reports: No funciona Order by con parámetro
Oracle Reports: No funciona ordenar pasando el valor por parámetro
Oracle Reports: Me ignora el order by dinámico
Oracle Reports: Como poner un order by dinámico

Situación:
Tenemos un report con una consulta normal sobre una base de datos y queremos poder ordenar el resultado según un parámetro que nos indica por que columna queremos ordenar. Si no fuera dinámico simplemente lo añadimos normal a la consulta pero si es dinámico la primera opción que pensamos es poner un "orden by :parametro_orden" pero sin saber muy bien porque es algo que a veces va y a veces no. Si el parámetro además no nos indica la columna literalmente o la posición si no otro valor no relacionado pues debemos hacer un decode pero si las columnas son de diferente tipo (numérico y carácter por ejemplo) el que pongamos como segunda parte del decode nos fallará. ¿Como lo hacemos pues?

Explicación:
En el caso de no necesitar el decode no entiendo porque a veces no va, debe ser un error más de reports.
En el caso del decode si falla puede ser por lo anterior o porque son de diferentes tipos y se hace un lio.

Solución:
No se si era la idea original o un parche que han pensado algunos y se ha vuelto una especie de estandar pero ahora mismo es lo único que me funciona sin problemas.

En primer lugar creamos una funcion que nos devuelva, segun el valor del parámetro orden, la cadena de order by:




En segundo lugar a la consulta cambiamos el order by por &nombre_de_la_funcion.



Y ya funciona :P

viernes, 5 de septiembre de 2008

Oracle forms: Cambiar atributo de un elemento del registro actual y no de todos.

Oracle forms: Cambiar atributo de un elemento del registro actual y no de todos.

Oracle forms: Cambiar atributo solo del registro actual.

Oracle forms: Cambiar visualmente un atributo y no todos los del bloque.

 

 

Situación:

Tenemos un bloque de datos del que visualizamos más de un registro a la vez (el típico listado) y queremos cambiar el valor de fondo del campo nombre en aquellos en que esté vacío. El problema es que si usamos el

 

set_item_property ('GENTE_FEA.NOMBRE',BACKGROUND_COLOR, 'r100g100b255');

 

El color se aplicará al campo nombre de todos los registros de ese bloque y solo me interesa que afecte a los vacios.

 

Explicación:

En estos casos nos molesta pero para otros (por ejemplo: no dejar poner nombres en este bloque hasta que el DNI del jefe este completo) nos sirve así que hay que utilizar otro método.

 

Solución:

Crearemos un registro visual con el color que nos interesa y luego en el trigger que utilicemos para determinar si poner o no el color al campo nombre en función de si es o no nulo cambiamos el

 

set_item_property ('GENTE_FEA.NOMBRE',BACKGROUND_COLOR, 'r100g100b255');

 

Por

 

display_item('GENTE_FEA.NOMBRE'','atr_fondo_azulao');

 

Y el cambio solo afectará al item NOMBRE del bloque GENTE_FEA del registro actual y no todos.

  

 

 

 

lunes, 28 de julio de 2008

Oracle Forms: FRM-41380: Cannot set the blocks query data source

Oracle Forms: FRM-41380: Cannot set the blocks query data source
Oracle Forms: set_block_property QUERY_DATA_SOURCE_NAME error
Oracle Forms: definir tabla de un bloque de datos
Oracle Forms: Error FRM-41380

Situación:
Tenemos un bloque de datos que lee de base de datos pero no de una tabla si no de una consulta (Query data source type = from clause query) y queremos poder redefinir este origen en función de otros parametros pero cuando lo hacemos mediante

set_block_property ('bloque de datos',QUERY_DATA_SOURCE_NAME , cadena_from);

solo nos funciona la primera vez y luego nos devuelve "FRM-41380: Cannot set the blocks query data source".

Explicación:
Otra de las tonterías de forms que nos obliga a hacer un paso previo.

Solución:
Ya lo hacemos correctamente pero antes de definir el nuevo origen hay que vaciar el bloque de datos para que tenga el estado "new".
Para hacerlo tenemos el ya mítico

go_block ('bloque_de_datos');
clear_block (no_validate);

martes, 8 de julio de 2008

Como saber el elemento actual cuando aprieto un botón

"Oracle forms" Como saber el elemento actual cuando aprieto un botón
"Oracle forms" Como puedo saber el elemento anterior

Situación:
Tenemos dos bloques de datos origen destino por ejemplo y nos interesa que al apretar un botón los datos del item actual del bloque origen pase al elemento correspondiente del bloque destino. ¿Como podemos saber que elemento es?

Explicación:
La respuesta lógica sería :system.current_item pero eso nos devuelve que el elemento actual es el botón que apretamos para pasar el campo. Entonces ¿como puedo saber cual es el anterior? Podríamos guardar en una variable el valor del último elemento mediante triggers pero eso además de laborioso es en la mayoría de casos absurdo.

Solución:
En las propiedades del boton tenemos que poner que no sea navegable ni con el ratón ni con el teclado. Así pues como no hemos ido al elemento, aunque podamos hacer click, “oracle forms” tendrá como :system.current_item el elemento anterior a presionar el botón. Así de simple :)

miércoles, 2 de julio de 2008

Mandar correo desde oracle forms 9

Oracle forms: Mandar correo con outlook o firebird
Oracle forms: Abrir correo para mandar con outlook o firebird
Oracle forms: Como puedo mandar un correo desde oracle forms
Oracle forms: No me funciona OLE2 para mandar correo

Situación:

Queremos abrir una ventana del Outlook o Firebird o el gestor de correo que tengamos instalado y usando el objeto OLE2 del Outlook me da un error que no es de oracle.

Explicación:

En google encontrareis un código para mandar correos desde forms basado en OLE2 y aunque eso funciona bien con Oracle forms 6i no lo hace con Oracle forms 9 porque se considera el OLE2 como obsoleto.
Oracle Forms 9 se basa en web así que la solución lógica es intentar mandarlo como si de HTML usando “mailto:direccion”

Solución:

Para mandarlo así solo hay que pasarlo como dirección web y el navegador ya se encarga de abrir un nuevo correo de tu gestor de correo.

Para solo tenemos que poner
web.show_document('mailto:direccion@dominio.com’,'_blank');



(la captura es del outlook si… aunque no lo recomiendo por su baja seguridad sobretodo frente a virus si el cliente quiere outlook pues outlook para el cliente… xD)

viernes, 27 de junio de 2008

Oracle forms ¿cómo quito el mensaje de guardar? o cambiar estado del registro a QUERY

Oracle forms ¿cómo quito el mensaje de guardar?

Oracle forms Desactivar mensaje de guardar

Oracle forms Cuando cambio de bloque me pide guardar

Oracle forms Cuando cambio de bloque no quiero que me pida guardar

Oracle forms: cambiar estado del registro a no modificado

Oracle forms: cambiar estado del registro a QUERY


Situación:

Cuando en un bloque de datos vinculado a la BBDD hacemos un cambio directa o indirectamente y cambiamos de bloque, de registro o ciertas opciones más automáticamente nos sale un mensaje de Oracle forms en que nos pide si queremos o no guardar los cambios.




Explicación:

Muchas veces no nos interessa eso porque el bloque nos interesa que esté vinculado a la BBDD (base de datos) para hacer las selects con las ventajas del autofiltrado pero no queremos que sirva para guardar en BBDD. Lo lógico sería hacer que no se pueda hacer insert o update (insert/update allowed) pero entonces solo nos dejaría escribir en el bloque en caso de estar en modo enter-query y claro, para crear registros pues no nos sirve.


Solución:

Una primera solución es poner el nivel de alertas a 5 aunque no se porque en ciertas versiones y ciertos casos eso no elimina el error. Intentadla por si acaso:

:system.message_level := 5;

La otra solución consiste en crear una variable auxiliar que nos indique si ese registro se ha modificado o no y manualmente cambiar el estado del registro de modificado a no modificado para que oracle forms al hacer las comprobaciones crea que no hay ningun registro modificado y por lo tanto no pedirá guardar. Lo más fácil es hacer un triger de post-change a nivel de bloque y en el interior poner algo como


begin
--si el estado del registro no es ‘QUERY’ es que lo han modificado
if get_record_property (:system.cursor_record,'blk_personas',status) <> 'QUERY' then
-- guardo en mi variable para saber que si se ha modificado
:blk_personas.modificado:=1;
--le hago creer a forms que no devolviendole al estado QUERY
set_record_property(:system.cursor_record,'per',status,query_status);
end if;
end;


martes, 10 de junio de 2008

FRM-30187: El tamaño de la columna CHAR en el grupo de registros debe estar comprendido entre 1 y 2000.

FRM-30187: El tamaño de la columna CHAR en el grupo de registros debe estar comprendido entre 1 y 2000.
Grupo de registros LOVxxx
Pantalla: xxxxxx

Situación:

Creamos una lista de valores o la editamos y al compilar nos sale este error.

Explicación:

Cuando creamos o editamos a partir de una consulta (select) y esta contiene concatenaciones, llamadas a funciones o demás factores que impiden a Oracle Forms calcular la longitud del campo varchar2 nos pone por defecto 4000. Hay quien piensa que es un error de Oracle Forms porque no tiene sentido poner 4000 y que luego te diga que el máximo es 2000 y hay quien piensa que este error te lo pone para que lo redefinas tú manualmente.

Solución:

Sea como sea hay que ir al grupo de registros (record group) sobre el que va la Lista de valores (LOV) ( lo hayamos creado antes que la LOV o mediante el LOV wizzard o asistente de LOV) y en Column Specifications le damos para abrir el popup

Y vemos que en las columnas de tipo Character nos ha puesto de longitud (length) 4000 así que los redefinimos todos y guardamos. Ya podemos compilar bien ;P

Situación 2:

Comprobamos los campos como se indica arriba y aun así sale el error.

Explicación:

Cuando creamos el Record Group y la LOV a veces en la select ponemos más campos de los que realmente usamos y aunque no salgan luego cuando miramos las columnas y tal, allá están.

Solución:

Si realmente no los necesitamos los quitamos y si los necesitamos pues tenemos que hacerlos aparecer, aunque luego los ocultemos, para poder especificar una longitud inferior a los 4000.

Que versión de Oracle Forms usas?