jueves, 29 de octubre de 2009

Configurar Oracle XE para que conecte correctamente Forms 6i

Por defecto Oracle XE se instala con el juego de caracteres AL32UTF8, con ese juego de caracteres el cliente de Oracle Forms 6i no conecta con la base de datos, para migrar ese juego de caracteres a UTF8 puro debemos de ejecutar lo siguiente:

sqlplus /nolog
SQL> connect / as sysdba
Conectado.
SQL> shutdown immediate
SQL> startup restrict
SQL> alter database character set internal_use UTF8;
SQL> shutdown immediate
SQL> startup

Hay ciertos índices que Oracle si existen no puede realizarse la conversión ya que dará el siguiente error:


ORA-00604: error occurred at recursive SQL level 1
ORA-54028: cannot change the HIDDEN/VISIBLE property of a virtual column

Podemos ver los índices incompatibles mediante esta SELECT:

SELECT owner, index_name, index_type, table_owner, table_name, status, funcidx_status
  FROM all_indexes
 WHERE index_type NOT IN ('NORMAL', 'BITMAP', 'IOT - TOP')
   AND table_name IN (SELECT UNIQUE (table_name)
                        FROM dba_tab_columns
                       WHERE char_used = 'C');

Hay que borrarlos y luego volver a crearlos una vez convertido a UTF8.

martes, 20 de octubre de 2009

Problemas de rendimiento de Forms10g con antivirus NOD32

El antivirus NOD32 tiene activado por defecto la opción analizar todo el tráfico HTTP, lo que hace ralentizar tremendamente el funcionamiento de las aplicaciones en Forms 10g (por lo menos en la versión 4.0.314.0).

Para desactivar ese control hay que abrir NOD32, ir a Configuración, pinchar en "Muestra las opciones avanzadas de configuración" y en la sección "Antivirus y antiespía" -> "Protección del tráfico de Internet" -> "HTTP, HTTPS" y desactivar la check "Activar el análisis HTTP".

Evidentemente es un fallo de NOD32 ya que Forms10g por defecto usa el puerto 7778 y los puertos que en teoría analiza por defecto son los 80, 8080 y 3128. Además si configuramos excluir algunas direcciones no soluciona nada, la única opción es desactivar totalmente el análisis http.

viernes, 17 de abril de 2009

Formas de cargar un List Item por código

Directamente desde una sql

El proceso se basa en un grupo de registros que creamos en base a una sql dinámica "v_grupo := Create_Group_From_Query('RecorG', v_sql);", para cargar la lista de elementos en base al grupo usamos la instrucción "POPULATE_LIST".

Cuando creamos el ítem del bloque podemos dejarlo sin ningún valor, pero nos va a dar una advertencia de compilación un poco molesta, pero totalmente inocua. Si queremos que no nos dé, simplemente abrimos los elementos de lista y en el primer elemento le quitamos el campo "Valor de elemento de Lista" y como el valor por inicial es NULL y ese elemento es NULL no nos va a protestar.

Ejemplo:

DECLARE
v_sql VARCHAR2(200); -- Variable para construir la SELECT dinánica.
v_grupo RecordGroup; -- Variable en donde vamos a meter el grupo de registros temporalmente.
v_estado_empresa ESTADOS.CODIGO%TYPE := 'ESPA'; -- Variable que contiene el valor que queremos mostrar por defecto.
BEGIN
/*
Construimos la SELECT. En el primer campo sacamos
lo que queremos que muestre la lista y en el segundo
campo el valor correspondiente que va a devolver
por la selección (normalmente un código).
*/

v_sql := 'SELECT INITCAP(nombre), codigo FROM estados ORDER BY nombre';


-- Asignamos el resultado de la select al grupo de registros.
v_grupo := Create_Group_From_Query('RecorG', v_sql);

-- Construimos la lista, siempre y cuando la select devolviese registros.
IF POPULATE_GROUP(v_grupo) = 0 THEN
POPULATE_LIST('B1.ESTADO', V_Grupo);
END IF;

-- Borramos el grupo, liberamos memoria que ya no nos hace falta.
DELETE_GROUP(v_grupo);

-- Asignamos el valor por defecto que queremos.
:b1.estado := v_estado_empresa;

-- Si el campo es obligatorio deberíamos de poner esto para que nos elimine el elemento en blanco.
Set_Item_Property('B1.ESTADO', REQUIRED, PROPERTY_TRUE);
END;


Elemento a elemento

Para limpiar un List-item se hace con la instrucción CLEAR_LIST('BLOQUE.CAMPO');

Para ir añadiendo elementos se hace con ADD_LIST_ELEMENT('BLOQUE.CAMPO', , , );

* : Será un número que identifica cada elemento, se comenzará a numerar en el 1.
* : Texto que visualizará en el desplegable el usuario.
* : Valor que toma el campo cuando se selecciona.


Ejemplo:


DECLARE
CURSOR cur_clientes IS
SELECT codigo_rapido, nombre
FROM clientes;

v_indice NUMBER;
v_primer_cliente CLIENTES.CODIGO_RAPIDO%TYPE;
BEGIN
Set_Item_Property('B1.CLIENTE', REQUIRED, PROPERTY_FALSE);
CLEAR_LIST('B1.CLIENTE');

FOR reg IN cur_clientes LOOP
v_indice := v_indice + 1;
Add_List_Element('B1.CLIENTE', v_indice, reg.nombre, reg.codigo_rapido);

IF v_primer_cliente IS NULL THEN
v_primer_cliente := reg.codigo_rapidol;
END IF;
END LOOP;
:b1.cliente := v_primer_cliente;
Set_Item_Property('B1.CLIENTE', REQUIRED, PROPERTY_TRUE);
END;


Instalar Forms6i para linux en Enterprise Linux 5.2

En primer lugar hay que crear el grupo dba, oinstall y el usuario oracle:

groupadd dba # group of users to be granted SYSDBA system privilege
groupadd oinstall # group owner of Oracle files
useradd -c "Oracle software owner" -g oinstall -G dba oracle
chown -R oracle.oinstall /oracle

Añadir las siguientes líneas al archivo .bash_profile:

export ORACLE_HOME=/oracle/dev6i
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/network/jre11/lib/linux/native_threads/:/usr/X11R6/lib/
export ORACLE_AUTOREG=$ORACLE_HOME/guicommon6/tk60/admin
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin

Instalar gcc: yum install gcc

Instalar los siguientes paquetes:

libXp-1.0.0-8.1.el5.i386.rpm
lesstif-0.95.0-15.el5.kb.i386.rpm
compat-glibc-7.x-2.2.4.32.6.i386.rpm
openmotif-devel-2.1.30-5_ICS.i386.rpm
openmotif-2.1.30-5_ICS.i386.rpm

Descomprimir el archivo d2k6irelease2.tar (por ejemplo en /oracle/software), pero no instalarlo.

descomprimir p3851446_600_LINUX.zip (por ejemplo en /oracle/parche) y ejecutar la instalación, para ello ejecutamos lo siguiente:

export D2K6I_R2_SHIPHOME=/oracle/software/
cd /oracle/parche/bug3851446
./d2k6ir2_install_wrapper.sh

Descomprimir el archivo p6194129_60828_LINUX (parche 19) en la carpeta /software/dev6i

Ejecutar en entorno gráfico lo siguiente:

cd /oracle/dev6i/developer6i_patch19
./patch_install.sh

Relincar:

cd $ORACLE_HOME/procbuilder60/lib; make -f ins_procbuilder.mk install
cd $ORACLE_HOME/forms60/lib; make -f ins_forms60w.mk install
cd $ORACLE_HOME/graphics60/lib; make -f ins_graphics60w.mk install
cd $ORACLE_HOME/reports60/lib; make -f ins_reports60w.mk install


domingo, 30 de noviembre de 2008

Forms 6i para Windows sobre Linux

En la versión 1.1.9 de wine (todavía versión de desarrollo) han solucionado el bug que provocaba que el runtime de forms diese un error de protección general.

Hay que decir que Forms6i tiene versión para Linux, pero los ejecutables (fmx) no son compatibles con los ejecutables de Windows, por lo que si desarrollamos en una plataforma Linux y los ejecutables los tenemos que distribuir para Windows esta es la única solución.

Lo he probado sobre Fedora 10 y la verdad es que me he quedado gratamente sorprendido por la agilidad con la que se mueve.

lunes, 22 de septiembre de 2008

Seleccionar columnas de texto en editor PL/SQL

En el editor PL/SQL si seleccionamos con el ratón manteniendo la tecla ALT pulsada podemos seleccionar columnas de texto en vez de líneas completas. Ejemplo:

Personalizar espacios al tabular en editor PL/SQL

En el editor de PL/SQL de Forms al pulsar la tecla TAB por defecto introduce 2 espacios (a mi particularmente es lo que utilizo simpre), pero si queremos cambiarlo podemos modificar (o insertar en caso de no existir) la variable DE_PREFS_TABSIZE en el regedit en HKEY_LOCAL_MACHINE\Software\Oracle.

Si se utiliza un script para lanzar el builder con las varibles de entorno configuradadas (tal como explico en el post: Configurar varios entornos de desarrollo) en el script simplemente es añadir un nuevo set de la forma: set DE_PREFS_TABSIZE=valor