APEX 3.1 y 3.2 solución al bug de “Post Element Text” en checkboxes, popup lovs, etc. + Ejemplo de eliminar valor en Popup Lov

A partir de la versión de APEX 3.1 si añadimos un texto en la casilla “Post Element” en ciertos elementos (checkboxes, popup lovs, etc.) veremos que el texto aparece debajo del elemento en lugar de aparecer a la derecha del elemento.

Esto es debido a un error en la especificación del CSS que define el fieldset. A partir de APEX 3.1 se ha cambiado la declaración de la clase del CSS. Según los de APEX esto no se cambiará de momento. Aquí va un workaround.

Voy a partir de un ejemplo en concreto (con el que me encontré el problema) vamos a añadir un icono para eliminar el valor de una Popup LOV. Para ello podemos añadir el siguiente código en el Post Element Text:

<img onclick="document.getElementById('#CURRENT_ITEM_NAME#_HIDDENVALUE').value='';
document.getElementById('#CURRENT_ITEM_NAME#').value=''" src="#IMAGE_PREFIX#delete.gif" alt="" />

Esto añadirá un icono con una X al lado del Popup-lov que nos permitirá eliminar el valor seleccionado. Si usamos APEX > 3.0 veremos como esta X aparece debajo del elemento en lugar de la derecha. Aquí esta el problema del CSS que he comentado. Para ello, debemos redeclarar la clase “lov”.

Añadimos el siguiente código en el HTML header de la página en concreto:

<style type="text/css">
.lov {
display:inline;
vertical-align:baseline;
}
</style>

Como veremos no quedará perfectamente alineado. Para ello podemos hacer una pequeña trampa y modifcar el Post Element Text y encapsular el código dentro de un SPAN con vertical-alignment:

<span style="vertical-align: middle;">
 
<img onclick="document.getElementById('#CURRENT_ITEM_NAME#_HIDDENVALUE').value='';
document.getElementById('#CURRENT_ITEM_NAME#').value=''" src="#IMAGE_PREFIX#delete.gif" alt="" />;
 
</span>

Más información en el post del foro de APEX:

http://forums.oracle.com/forums/thread.jspa?threadID=659658&start=0&tstart=0

APEX Printing PDF reports using COCOON instead of BI Publisher

Since I think this can be quite useful I’ll write it down in English.

I’ve followed the steps proposed by Carl Backstorm but I’m going to install it in a Linux Server (Ubuntu 8.04).

Files needed:

Cocoon 2.1.11
Tomcat 6
fop_post.zip

Download and decompress them all.

1) Download and decompress cocoon-2.1.11
2) Check JAVA is installed (I installed jdk6) and
be sure JAVA_HOME is set to your actual location:

$ export JAVA_HOME=/usr/

Go to the decompressed folder (cocoon-2.1.11/) and execute:

$ ./build.sh war

3) Notice where cocoon.war was built:

cocoon-2.1.11/build/cocoon

4) Copy cocoon.ware to tomcat in webapps directory

apache-tomcat-6.0.18/webapps/

5) Copy fop_post folder to

apache-tomcat-6.0.18/webapps/cocoon/

6) Start apache tomcat:

Before doing that, you may want to change apache port in order to avoid conflicts with APEX port.
You can change apache 8080 port to 8088 by editing conf/server.xml and replacing 8080 with 8088.

(locate to tomcat folder and run as root)

$ sudo ./bin/startup.sh

7) Check installation is right by accessing http://localhost:8088/cocoon

8) Now, let’s configure APEX in order to be able to print reports in PDF using cocoon:
8.1) Login with internal APEX account
8.2) Go to Manage Service -> Instance Settings -> Report Printing
8.3) Change to new configuration
Print Server Host Address: localhost
Print Server Port: 8088
Print Server Script: /cocoon/fop_post/

9) You may want to start cocoon automatically at startup. Then you can create a file under /etc/init.d like the following one:

/etc/init.d/cocoon.sh

1
2
3
4
#!/bin/bash
JAVA_HOME=/usr/
echo "Starting Apache Cocoon..."
/opt/apache-tomcat-6.0.18/bin/startup.sh

Make it executable

$ sudo chmod +x /etc/bin/cocoon.sh

and add it in your boot process:

$ update-rc.d cocoon.sh defaults

Hope it helps!!

Further information:
http://carlback.blogspot.com/2007/03/apex-cocoon-pdf-and-more.html

Instalar Oracle XE 10g + APEX 3.1.2 en VirtualBox 2.0.2 con Ubuntu 8.04

Después de pelearme un buen rato he conseguido instalar una máquina virtual con APEX 3.1.2 de modo que sea totalmente accesible desde la máquina host, de modo que solamente con arrancar la máquina virtual ya tengo acceso a una instalación APEX sin ensuciar mi SO host.

Instalación

1) Instalación de VirtualBox

En mi caso particular, mi equipo Host también es un Ubuntu 8.04. Podéis instalaros la VirtualBox bajándoos el .deb de la página o bién añadiendo la siguiente línea en vuestro /etc/apt/sources.list:

deb http://download.virtualbox.org/virtualbox/debian hardy non-free

luego podemos instalar desde Synaptics nuestro VirtualBox 2.0.2 (solamente es necesario descargar los módulos genéricos).

2) Creación de la máquina Virtual en VirtualBox:

Yo os aconsejaría crear dos discos virtuales:

- 8GB -> Para Instalación de Ubuntu + APEX
- 1,5GB -> Memoria SWAP (no uséis menos de 1024MB porqué sinó no podréis instalar la Oracle XE)

A continuación realizar la instalación de Ubuntu en la máquina virtual.

3) Instalación de Oracle XE:

Nos bajamos la última versión de Oracle Express Edition 10g (XE) para Linux de www.oracle.com

Suponiendo que nos hemos bajado la versión oracle-xe_10.2.0.1-1.0_i386.deb, nos ubicamos en el directorio donde esté el fichero y ejecutamos:

$ sudo dkpg -i oracle-xe_10.2.0.1-1.0_i386.deb

Una vez termine, ejecutamos los pasos de configuración:

$ sudo /etc/init.d/oracle-xe configure

Yo he dejado todos los valores por defecto.

4) Instalación de APEX 3.1.2

Nos bajamos la última versión de APEX en http://apex.oracle.com y la descomprimimos en algún sitio.
Ahora será necesario ejecutar unos scripts desde el usuario SYS mediante SQLPLUS. Si nos fijamos, la instalación nos habrá creado un nuevo tipo de usuario de SO llamado Oracle. Yo he creado un nuevo usuario de SO asociado a oracle, que he llamado también oracle (con password: oracle).

En primer lugar debemos cambiar al usuario de SO administrador de Oracle:

$ su oracle

Ahora debemos cargar las variables de entorno para conseguir un buen funcionamiento de la instalación de APEX. Para ello podemos ejecutar:

export TMP=/tmp
export TMPDIR=/tmp
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export PATH=/usr/bin:$ORACLE_HOME/opmn/bin:$ORACLE_HOME/bin:${PATH}
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export ORACLE_SID=XE
export TNS_ADMIN=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/admin

y con esto ya tenemos las variables de entorno inicializadas (si no habéis tocado ningún parámetro debería funcionaros a la perfección, sino revisad los directorios).

Importante: Nos ubicamos en el directorio donde hayamos descomprimido el ZIP de instalación de APEX. Dentro de ese directorio deben haber los ficheros apexins.sql, apxxepwd.sql, etc.
Nos conectamos a sqlplus con modo sys:

$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production ON Thu Oct 9 18:56:14 2008
 
Copyright (c) 1982, 2005, Oracle.  ALL rights reserved.
 
SQL> conn / AS sysdba
Connected.

Ejecutamos el primer script de instalación:

SQL> @apexins PASSWORD  SYSAUX SYSAUX TEMP /i/

Nota: Cambiamos PASSWORD por el password que hayamos asignado en el paso 3
Si no se ha producido ningún error continuamos con el siguiente paso, que es cambiar el password del workspace internal:

 SQL> @apxxepwd.sql

Nos pedirá un password para posteriormente poder acceder al workspace: internal con usuario admin.

El siguiente paso hace un update de las imágenes:

 SQL> @apxldimg.sql APEX_INSTALL

Nota: Cambiamos APEX_INSTALL por el directorio donde hayamos descomprimido el ZIP de instalación. Hay que poner la ruta completa.

5) Si todo ha ido bien, ya deberíamos poder acceder a nuestra nueva instalación de APEX escribiendo en un navegador la siguiente dirección:

http://localhost:8080/apex

Configuración para poder acceder remotamente

Ahora vamos a configurar nuestro entorno de modo que podamos acceder a nuestro entorno desde fuera de la máquina virtual (por ejemplo desde el SO Host).

1) Ejecutamos el siguiente comando desde sqlplus como usuario SYS (loguearnos como en el paso 4):

SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);
 
PL/SQL procedure successfully completed.

Con esto permitimos conexiones remotas a APEX.

2) Ahora apagamos nuestra máquina virtual. Una vez completamente apagada, vamos a editar el XML asociado a nuestra máquina virtual para hacer un port forwarding de los puertos que queremos redirigir de nuestra máquina guest a nuestra máquina host. Normalmente el fichero xml asociado acostumbra a estar en nuestro home: /home/usuario/.VirtualBox/Machines/NOMBRE/fichero.xml

Abrimos el fichero y añadimos las siguientes lineas dentro del tag :

<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/httpd/GuestPort" value="8080"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/httpd/HostPort" value="8080"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/oraclexe/Protocol" value="TCP"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/oraclexe/GuestPort" value="1521"/>
<ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/oraclexe/HostPort" value="1521"/>

Nota: Esto también se puede hacer por medio del comando

VBoxManage setextradata …

Volvemos a encender nuestra máquina virtual.

Una vez encendida, podemos verificar que tenemos acceso si intentamos navegar desde nuestro SO Host a la dirección:

http://localhost:8080/apex

Espero que os sirva!!!
PD: Como recibo mucho spam, si no os contesto podéis enviarme un email a: josepcoves(arroba)gmail.com

Fuentes usadas:

http://www.oracle.com/technology/products/database/application_express/html/3.1_and_xe.html

http://download.oracle.com/docs/cd/B32472_01/doc/install.300/b32468/install.htm#CHDHIJGE

http://download-east.oracle.com/docs/cd/B25329_01/doc/admin.102/b25107/network.htm#BHCBCFBA

http://www.virtualbox.org/

APEX: Obtener un contador de errores de validaciones en PLSQL

Para saber si se han producido errores de validación, podemos usar la siguiente llamada:

NVL(apex_application.g_inline_validation_error_cnt,0)

que nos devuelve un count del número de validaciones que han terminado en error.