martes, 1 de abril de 2008

Oracle Forms 6i en Windows de 64 bits

Oracle Forms para Windows no está certificado para ninguna versión de 64 bits (Windows Vista, Microsoft 2003/2008 Server). Qué no esté certificado no quiere decir que no funcione, simplemente que Oracle en caso de problema no va a proporcionar ningún tipo de soporte.

Windows Vista de 32 bits no está certificado pero a mi en concreto desde un principio me ha dado menos problemas que Forms10g, pero Oracle Forms 6i en 64 bits a partir del parche 4 no funcionan las llamadas a los reports que se realizan desde forms, tampoco funciona desde Forms Builder ejecutar el formulario que estamos diseñando.

Como he dicho antes el problema surge a partir de parche 4 de forms, con el parche 3 o anterior funciona perfectamente, pero hay casos como el mío en donde ya estaba usando el parche 17 donde no podemos plantear volver al 3 ya que nos fallarían muchas más cosas.

El problema en concreto se encuentra en las librerías nn60.dll y nnb60.dll que se encuentran en la carpeta BIN. Estas librerías creo que gestionan la comunicación entre aplicaciones de Forms, forms con reports, builder con debugger, etc.

En mi caso he instalado el parche 17 y he metido esas librerías del parche 3 y funciona todo correctamente.

En los siguientes enlaces dejo las librerías del parche 3, de forma que si teneis problemas simplemente renombrais las que teneis instaladas y copiais estas:

nn60.zip
nnb60.zip

NOTA 29/10/2009: PROBLEMAS DETECTADOS
  • Graphics no funciona
  • Los reports que tienen filtros con listas de valores no funcionan bien.

Parche 3 de Oracle Forms 10.1.2 (10.1.2.3)

Desde el 19 de Marzo está disponible en el Metalink la actualización del servidor de aplicaciones IAS 10.1.2 en donde viene incluido Oracle Forms 10g. De momento solo está disponible para Microsoft Windows y Solaris, pero no creo que tarde mucho la de Linux.

En esta versión como principal novedad es la certificación de Windows Vista.

Más información en la página del OTN http://www.oracle.com/technology/products/forms/index.html

domingo, 16 de marzo de 2008

Developer Suite 10g en Windows Vista

En primer lugar debemos de cambiar la memoria el modo de funcionamiento virtual de Windows Vista durante la instalación, luego la dejaremos como estaba.

Vamos a Inicio -> en el icono Equipo pulsamos con el botón derecho y vamos a propiedades. En la ventana que nos abre pulsamos en "Cambiar la configuración".

En la pestaña "Opciones avanzadas" pulsamos el botón "Configuración" de la sección "Rendimiento"

En la ventana que se abre vamos a la pestaña "Opciones avanzadas" y pulsamos en el botón "Cambiar" de la sección "Memoria Virtual".

En la ventana que se abre quitamos la check "Administrar automáticamente el tamaño del archivo de paginación para todas las unidades" y ponemos un tamaño para el archivo de paginación personalizado y luego pulsamos el botón "Establecer" y luego en "Aceptar".

Nos pedirá reiniciar, reiniciamos.

Para ejecutar la instalación de setup.exe, primero pulsamos con el botón derecho y en la pestaña "Compatibilidad" activamos "Ejecutar en modo de compatibilidad para: Windows XP (Service Pack 2)".

A partir de aquí instalamos de forma normal y una vez finalizada la instalación podemos volver a poner como estaba la configuración de la memoria virtual.

viernes, 1 de febrero de 2008

Forms6: Forzar cierre report background

Puede no tener mucho sentido el cerrar el report background una vez se lanza un informe, ya que la siguiente vez que se intente lanzar otro informe tiene que volver a abrirse con la consiguiente pérdida de tiempo, pero hay casos en que puede ser util.

Para forzar el cierre del report background en cuando termine con el informe hay que añadir a la lista de parámetros que se le pasa al report el siguiente parámetro:

ADD_PARAMETER (, 'ORACLE_SHUTDOWN', TEXT_PARAMETER, 'Yes');

jueves, 24 de enero de 2008

Abrir varias ventanas del Editor PL/SQL

Cuando en el navegador de objetos hacemos doble click sobre una unidad de programa (paquete, función, disparador) nos cierra el Editor PL/SQL que teníamos abierto y abre el nuevo, para hacer que no cierre el lo que teníamos abierto y abra una nueva ventana simplemente al hacer doble click pulsamos la tecla MAYUSCULAS.

viernes, 5 de octubre de 2007

Forms 6 y Forms 10g: Generar archivo excel (XLS)

En Jakarta hay un proyecto que consiste en un API para manipular y generar documentos de Office sin necesidad de tener Office instalado, luego los documentos resultantes se pueden abrir con cualquier suite ofimática, como por ejemplo OpenOffice.

http://poi.apache.org/trans/es/index.html

En el momento de escribir esto la última versión era la 3.0.1 y las clases necesarias se encuentran en el archivo poi-3.0.1-FINAL-20070705.jar

Para poder usar estas clases en un programa de forms tenemos que hacer los siguientes pasos:

Forms 10g:

  • En esta ventana seleccionamos las clases:
    • org.apache.poi.hssf.usermodel.HSSFWorkbook
    • org.apache.poi.hssf.usermodel.HSSFRow
    • org.apache.poi.hssf.usermodel.HSSFSheet
    • org.apache.poi.hssf.usermodel.HSSFCell
    • java.io.FileOutputStream (posiblemente tengamos que añadir al CLASSPATH el archivo rt.jar
  • Una vez importadas las clases nos crea paquetes PL/SQL para poder interactuar con ellas, por lo que ahora simplemente hay que escribir el código PL/SQL normal.
  • Para poder ejecutar el programa hay que añadir el archivo poi-3.0.1-FINAL-20070705.jar al CLASSPATH en el servidor. Para ello miramos en el archivo formsweb.cfg que se encuentra en $ORACLE_HOME/forms/server la variable envFile, y al archivo que apunta es donde tenemos que modificar la variable CLASSPATH.
Forms 6i:

  • Hay que usar una máquina virtual de Java versión 1.4.2 o superior, lo he probado con la 1.4.2_06 y con 1.6.0_02.
  • Añadir a la variable de entorno PATH las carpetas: (Sustituir c:\program files\java\jdk1.6.0_02 por la carpeta en que tengamos instalado el jdk, si no lo configuramos correctamente nos dará el error: "PDE-UJI001 Fallo al crear JVM." al intentar importar las clases)
    • C:\Program Files\Java\jdk1.6.0_02\bin
    • C:\Program Files\Java\jdk1.6.0_02\jre\bin
    • C:\Program Files\Java\jdk1.6.0_02\jre\bin\client
  • Al igual que en Forms 10g hay que añadir a la variable CLASSPATH el archivo poi-3.0.1-FINAL-20070705.jar
  • Añadir también al CLASSPATH el archivo importer.jar que se encuentra en $ORACLE_HOME\tools\common60\java
  • Al igual que en Forms 10g, en el programa que se quiera usar hay que importar las mismas clases Java que se indican en el apartado para Forms 10g (esas son necesarias para los ejemplos, pero seguramente que en un caso real tengamos que importar más), para ello vamos al menú "Programa" y luego a "Importar Clases Java...".


Ejemplos:

Ejemplo New Workbook de Jakarta POI

HSSFWorkbook wb = new HSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Equivalente en Forms

DECLARE
v_wb      ORA_JAVA.JOBJECT;
v_fileout ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Ejemplo New Shet de Jakarta POI


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet1 = wb.createSheet("new sheet");
HSSFSheet sheet2 = wb.createSheet("second sheet");
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Equivalente en Forms:

DECLARE
v_wb       ORA_JAVA.JOBJECT;
v_fileout  ORA_JAVA.JOBJECT;
v_sheet1   ORA_JAVA.JOBJECT;
v_sheet2   ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_sheet1 := hssfworkbook.createsheet(v_wb, 'new sheet');
v_sheet2 := hssfworkbook.createsheet(v_wb, 'second sheet');
v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Ejemplo Creating Cells de Jakarta POI


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");

// Create a row and put some cells in it. Rows are 0 based.
HSSFRow row = sheet.createRow((short)0);
// Create a cell and put a value in it.
HSSFCell cell = row.createCell((short)0);
cell.setCellValue(1);

// Or do it on one line.
row.createCell((short)1).setCellValue(1.2);
row.createCell((short)2).setCellValue("This is a string");
row.createCell((short)3).setCellValue(true);

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

Equivalente en Forms:

DECLARE
v_wb         ORA_JAVA.JOBJECT;
v_fileout    ORA_JAVA.JOBJECT;
v_sheet      ORA_JAVA.JOBJECT;
v_row        ORA_JAVA.JOBJECT;
v_cell       ORA_JAVA.JOBJECT;
BEGIN
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_row := hssfsheet.createrow(v_sheet, 0);
v_cell := hssfrow.createcell(v_row, 0);
hssfcell.setcellvalue(v_cell, 1);
v_cell := hssfrow.createcell(v_row, 1);
hssfcell.setcellvalue(v_cell, 1.2);
v_cell := hssfrow.createcell(v_row, 2);
hssfcell.setcellvalue(v_cell, 'This is a string');
v_cell := hssfrow.createcell(v_row, 3);
hssfcell.setcellvalue(v_cell, TRUE);
v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);
END;

Ejemplo para enviar el contenido de un bloque a una excel:

DECLARE
v_wb               ORA_JAVA.JOBJECT;
v_fileout          ORA_JAVA.JOBJECT;
v_sheet            ORA_JAVA.JOBJECT;
v_row              ORA_JAVA.JOBJECT;
v_cell             ORA_JAVA.JOBJECT;
v_fin              BOOLEAN := FALSE;
v_bloque           VARCHAR2(30) := :system.cursor_block;
v_record_anterior  NUMBER := :system.cursor_record;
v_item_anterior    VARCHAR2(61) := :system.cursor_item;
v_item             VARCHAR2(30);
v_num_celda        NUMBER;
v_num_fila         NUMBER;
BEGIN
v_wb := hssfworkbook.new();
v_sheet := hssfworkbook.createsheet(v_wb, 'new sheet');
v_num_fila := 0;

FIRST_RECORD;

WHILE NOT v_fin LOOP
v_row := hssfsheet.createrow(v_sheet, v_num_fila);
v_num_fila := v_num_fila + 1;
v_item := Get_Block_Property(v_bloque, FIRST_ITEM);
v_num_celda := 0;

WHILE v_item IS NOT NULL LOOP
v_cell := hssfrow.createcell(v_row, v_num_celda);
hssfcell.setcellvalue(v_cell, NAME_IN(v_bloque || '.' || v_item));
v_item := Get_Item_Property(v_bloque || '.' || v_item, NEXTITEM);
v_num_celda := v_num_celda + 1;
END LOOP;

IF :system.last_record = 'TRUE' THEN
v_fin := TRUE;
ELSE
NEXT_RECORD;
END IF;
END LOOP;

v_fileout := fileoutputstream.new('workbook.xls');
hssfworkbook.write(v_wb, v_fileout);
fileoutputstream.close(v_fileout);

GO_RECORD(v_record_anterior);
GO_ITEM(v_item_anterior);
END;

NOTA 15/12/2009: Las versiones recientes de las librerías de Jakarta POI están compiladas para usar una máquina virtual de java superior a la que tiene Forms 10g. Al importar en Forms10g sale este mensaje: "Se ha producido una excepción: java.lang.UnsupportedClassVersionError: org/apache/poi/hssf/usermodel/HSSFWorkbook (Unsupported major.minor version 49.0)". Con la versión 3.0.1 de las librerías funciona perfectamente. Esta versión se puede descargar de aqui: http://sites.google.com/site/elfeme/files/poi-3.0.2-FINAL-20080204.zip?attredirects=0&d=1

domingo, 30 de septiembre de 2007

Forms10g: Modificar apariencia

En el archivo formsweb.cfg se dispone del parámetro lookAndFeel para modificar la apariencia de la aplicación, los valores que puede tomar son:
  • generic: Apariencia típica de Windows
  • oracle: Apariencia por defecto definida por Oracle. Dentro de esta apariencia se puede usar el parámetro colorScheme para modificar el conjunto de colores usados. Los valores que puede tomar son:
    • teal
    • red
    • titanium
    • blue
    • khaki
    • olive
    • purple
    • blaf: Este en concreto no está soportado oficialmente por Oracle fuera de Oracle Applications.
Podemos modificar estos parámetros en el archivo formsweb.cfg o también a través de la url, por ejemplo: http://direccionequipo:8889/forms/frmservlet?config=prueba&lookandfeel=generic