miércoles, 26 de septiembre de 2012

Instalación de Forms 11 en Windows con tarjeta gráfica NVIDIA

En la última instalación que hice sobre un Windows de 64 bits se quedaba el proceso colgado creando el dominio, después de muchas pruebas encontré que el problema era que el driver de la tarjeta gráfica  NVIDIA  había metido en el PATH del sistema operativo la ruta "C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;" al quitar esa ruta y volver a instalar Forms 11 el proceso se completó correctamente.

domingo, 17 de junio de 2012

Instalación de Forms 11 R2 en Windows 8 de 64 bits

En esta entrada voy a explicar como instalar un entorno de desarrollo y de pruebas de Forms 11 sobre un Windows 8 de 64bits, los pasos son idénticos a la instalación sobre Windows 7 de 64 bits.

Mi intención es hacer una guía paso a paso sin entrar en demasiados detalles en cada uno de los pasos de la instalación.

Antes de nada tenemos que tener instalado el JDK de 64 bits, para verificar que lo tenemos correctamente configurado abrimos una consola "CMD" y ejecutamos "java -versión", nos debería de salir un mensaje similar a este:



En primer lugar hay que instalar Weblogic 10.3, que se puede descargar del OTN de la siguiente dirección (simplemente hay que tener una cuenta de OTN, que se puede obtener sencillamente y totalmente gratuita): http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html. La versión que se necesita para hacer la instalación en 64 bits es la genérica, es decir, el archivo, wls1036_generic.jar.

Para arrancar la instalación, desde una consola de comandos, una vez que nos hemos situado en la carpeta en donde se encuentra el archivo wls1036_generic.jar ejecutamos: java -jar wls1036_generic.jar


Aparecerá la siguiente pantalla de bienvenida


Pulsamos "Siguiente" y aparecerá la pantalla para indicar el directorio raíz de la instalación. Propone C:\Oracle\Middledware, particularmente me parece una buena ubicación para la instalación.



Una vez pulsamos "Siguiente", nos aparece la pantalla para solicitar la cuenta de Oracle Support para obtener las actualizaciones de seguridad, esta pantalla va aparecer repetidamente durante el proceso de instalación. Para un equipo de desarrollo y pruebas no lo veo necesario, pero si fuese una instalación en un entorno de producción sería muy recomendable cubrirlos.



Luego nos pregunta el tipo de instalación, para el caso concreto de la instalación para albergar Forms 11, con la instalación Típica va perfectamente.


En la siguiente pantalla se solicita que se indique el directorio de la máquina virtual de Java que queremos usar:



Es importante seleccionar el directorio donde está el JDK de 64bits, normalmente la ruta será similar a : C:\Program Files\Java\jdk1.6.0_33


A continuación se nos solicita que concretemos las rutas para "WebLogic Server" y "Oracle Coherence", lo normal es dejar las rutas que nos propone por defecto:



Antes de comenzar la instalación se muestra un resumen de lo que va a ser instalado:



Una vez terminada la instalación muestra una pantalla indicando que la instalación ha finalizado. En esta pantalla desactivamos la check "Ejecutar Quickstart" y pulsamos "Listo".



El primer paso de la instalación ya está realizado, ahora sobre la instalación de Weblogic que se acaba de realizar, hay que instalar Forms 11R2. La versión de Forms11R2 también se puede obtener del OTN, en la siguiente dirección: http://www.oracle.com/technetwork/developer-tools/forms/downloads/index.html, el archivo que se necesita es el de la versión de 64 bits "ofm_frmrpts_win_11.1.2.0.0_64_disk1_1of1.zip", una vez descomprimido nos generará 3 carpetas (Disk1, Disk2 y Disk3), en la carpeta Disk1 ejecutamos el archivo "setup.exe" y aparecerá la pantalla de bienvenida en la que pulsamos "Siguiente":


Nos vuelve a solicitar los datos para las actualizaciones de Software, al igual que hicimos al instalar Weblogic las omitimos y pulsamos "Siguiente".


A continuación nos indica si queremos únicamente instalar el software o aparte de instalar el software queremos realizar la configuración. Yo soy partidario de instalar únicamente el software y luego arrancar manualmente el proceso de configuración (en caso de producirse algún error lo tenemos más localizado, si es en la instalación del software o es un problema en la configuración).


En la siguiente pantalla hace una comprobación de requisitos, al estar haciendo la instalación en Windows 8, que no es un sistema operativo certificado da un error, pero podemos seguir la instalación pulsando el botón "Continuar" y luego en "Siguiente".

A continuación nos pide la ubicación para la instalación de los programas de Forms, en este caso también podemos dejar los valores que propone por defecto:



Otra vez nos solicita los datos de Oracle Support para las actualizaciones de seguridad, también las omitimos:


Por último muestra una pantalla con el resumen de la instalación que se va a realizar:


Pulsamos el botón de "Instalar", la instalación comienza mostrando una pantalla con el progreso, una vez finalizado pulsamos el botón "Siguiente".


Al final nos muestra la pantalla informando de que la instalación ha terminado:


Una vez instalado el software de Forms11R2 hay que proceder a realizar la configuración del dominio de Weblogic. Para ello ejecutamos el archivo "config.bat" que se encontrará en la ruta "C:\Oracle\Middleware\Oracle_FRHome1\bin". Una vez ejecutado aparecerá la siguiente pantalla en la que pulsamos "Siguiente"


En la siguiente pantalla se nos pregunta si la instalación la queremos hacer para despliegue de aplicación o para desarrollo. La mejor opción es indicar que es para despliegue ya que vamos a disponer de igual manera las herramientas de desarrollo, pero además podremos ejecutarlas.


Por última vez nos pregunta sobre introducir los datos de Oracle Support que volvemos a omitir.



En la siguiente pantalla nos solicita la ubicación del directorio del servidor de Weblogic y en donde queremos instalar la Instancia de Oracle, dejamos los valores que propone por defecto:


A continuación crearemos un dominio en el servidor de Weblogic, en usuario dejamos "weblogic", introducimos una contraseña y un nombre para el Dominio, en este caso le he llamado LIBRA, pero se le puede dar el nombre que quiera cada uno.


Luego nos pide los componentes a configurar. Para disponer de un entorno de desarrollo activaremos todas las checks:



En las siguientes dos pantallas dejamos los valores por defecto:





Al pulsar siguiente nos solicita el "Almacén de identidades", desmarcamos la check "Usar Almacén de Identidades de Aplicación".


Pulsamos "Siguiente" y nos mostrará un resumen de la configuración que va a realizarse:




Al pulsar "Siguiente" comienza el proceso de configuración:



En la siguiente pantalla ya indica que la configuración ha finalizado:



Para comprobar el funcionamiento de forms abrimos la siguiente dirección en el navegador: http://nombreequipo:9001/forms/frmservlet



Para comprobar el funcionamiento de reports abrimos la siguiente dirección en el navegador: http://nombreequipo:9002/reports/rwservlet


Para entrar en la consola de Weblogic accedemos mediante la dirección: http://localhost:7001/console con el usuario weblogic y la contraseña indicada durante la instalación.

Al terminar la instalación estas páginas funcionan correctamente ya que durante el proceso de instalación se arrancan todos los servicios, pero una vez reiniciamos el ordenador debemos de arrancar manualmente, tanto Weblogic, Forms y Reports.

Para arrancar Weblogic ejecutamos el archivo: startWebLogic.cmd que se encontrará en la ruta C:\Oracle\Middleware\user_projects\domains\NOMBRE_DOMINIO\bin, en el caso de la instalación realizada la ruta es: C:\Oracle\Middleware\user_projects\domains\LIBRA\bin

Al arrancar solicita usuario y contraseña, meteremos el usuario "weblogic" y la contraseña indicada durante la instalación (en futuras entradas mostraré como almacenar ese usuario y contraseña en archivos para que no sea necesario introducirla en cada arranque).


Sabremos que ha finalizado el proceso de arranque cuando aparezca "Server started in RUNNING mode". Esta ventana es importante que la dejemos abierta, ya que si se cierra estaremos parando los servicios de WebLogic.



Para arrancar Forms, desde una línea de comandos "CMD", ejecutamos (cambiar LIBRA por el nombre del dominio indicado durante la instalación).

  • cd C:\Oracle\Middleware\user_projects\domains\LIBRA\bin
  • startManagedWebLogic.cmd WLS_FORMS
También nos pedirá el usuario y contraseña, introducimos las mismas credenciales que durante el arranque de WebLogic.

Para arrancar Reports, también, desde una línea de comandos ejecutamos (cambiar LIBRA por el nombre del dominio indicado durante la instalación).
  • cd C:\Oracle\Middleware\user_projects\domains\LIBRA\bin
  • startManagedWebLogic.cmd WLS_REPORTS
Al igual que al arrancar Forms y Weblogic solicita usuario y contraseña.


domingo, 5 de febrero de 2012

Agilizar la entrada de datos en campos de tipo DATE

Si tenemos un campo de tipo DATE y que tiene la máscara DD/MM/YYYY el usuario puede introducir la fecha 05022012 y automáticamente se transforma en 05/02/2012, pero en muchos casos puede ser útil permitir al usuario lo siguiente:

  • Introducir 1 ó 2 dígitos, por ejemplo, teclear 5 y asumir el mes y año del SYSDATE transformando ese 5 tecleado por el usuario en la fecha 05/02/2012.
  • Introducir 4 dígitos, asumiendo los 2 primeros el día, los 2 dígitos siguientes el mes y el año obtenerlo del SYSDATE.
  • Introducir 6 dígitos y asumiendo los 2 primeros el día, los 2 siguientes el mes y los 2 últimos el año en formato de 2 dígitos, es decir, se le debe de sumar 2000, de forma que si el usuario teclea 050212 se asuma la fecha 05/02/2012.
Para hacerlo lo que haremos será capturar el error de conversión de máscara de formato FRM-50026 en el disparador ON-ERROR de la siguiente forma:

DECLARE
v_errtyp    VARCHAR2(3):= ERROR_TYPE;
v_errnum    NUMBER := ERROR_CODE;
v_errtxt    VARCHAR2(1000) := ERROR_TEXT;
v_fecha       DATE;
v_dia         VARCHAR2(2);
v_mes         VARCHAR2(2);
v_anho        VARCHAR2(4);
v_error       BOOLEAN := TRUE;
v_valor_campo VARCHAR2(30);
v_mascara     VARCHAR2(30);
BEGIN
  IF v_errtyp = 'FRM'
  AND v_errnum = 50026
  AND Get_Item_Property(:system.trigger_item, DATATYPE) = 'DATE'
  AND UPPER(Get_Item_Property(:system.trigger_item, FORMAT_MASK)) = 'DD/MM/YYYY' THEN
  -- Capturamos el FRM-50026 en campos de tipo DATE y con máscara DD/MM/YYYY
  BEGIN
   v_valor_campo := NAME_IN(:system.trigger_item);

      IF LENGTH(v_valor_campo) = 1 THEN
      -- El usuario sólo teclea un dígito
      v_dia := v_valor_campo;
      ELSIF LENGTH(v_valor_campo) IN (2, 4, 6) THEN
     -- Obtenemos el día de lo que ha tecleado el usuario
     v_dia := SUBSTR(v_valor_campo, 1, 2);
    END IF;

      IF LENGTH(v_valor_campo) IN (4, 6) THEN
      -- Obtenemos el mes, sólo si el usuario ha tecleado algo de 4 ó 6 dígitos
      v_mes := SUBSTR(v_valor_campo, 3, 2);
      END IF;

      IF LENGTH(v_valor_campo) = 6 THEN
      -- Obtenemos el año, sólo si el usuario ha tecleado algo 6 dígitos
      v_anho := TO_CHAR(TO_NUMBER(SUBSTR(v_valor_campo, 5, 2)) + 2000);
      END IF;

      -- Obtenemos el mes y el año de SYSDATE en caso de que haber sido tecleado por el usuario
      v_mes := NVL(v_mes, TO_CHAR(SYSDATE, 'MM'));
      v_anho := NVL(v_anho, TO_CHAR(SYSDATE, 'YYYY'));
      v_fecha := TO_DATE(v_dia || '/' || v_mes || '/' || v_anho, 'DD/MM/YYYY');
      -- El comando COPY únicamente está preparado para asignar un valor VARCHAR2,
      -- con variables de tipo DATE debemos de asegurar la máscar de formato
      -- con la que hará conversión.
      v_mascara := Get_Application_Property(BUILTIN_DATE_FORMAT);
      Set_Application_Property(BUILTIN_DATE_FORMAT, 'DD/MM/YYYY');
      COPY(TO_CHAR(v_fecha, 'DD/MM/YYYY'), :system.trigger_item);
      Set_Application_Property(BUILTIN_DATE_FORMAT, v_mascara);
      v_error := FALSE;
    EXCEPTION
      WHEN OTHERS THEN
        -- Ante cualquier error dejamos el mensaje original de error
        NULL;
    END;  
  END IF;

  IF v_error THEN
    -- No se ha podido transformar lo tecleado por el usuario en una fecha válida
    MESSAGE(v_errtyp || '-' || TO_CHAR(v_errnum) || ': ' || v_errtxt); 
    RAISE Form_Trigger_Failure;
  END IF;
END;

jueves, 12 de mayo de 2011

Cambiar icono de Java en Forms 10g y 11g

Vía: http://blog.edisa.com/2011/05/cambiar-icono-de-java-en-forms-10g-y-11g/

Cuando se ejecuta una aplicación en Forms 10g ó 11g en una ventana independiente del navegador, es decir, con separateframe=true, el icono que se le asigna a la ventana en la barra de tareas es el de la taza de café de Java.

Este icono se puede modificar para poner uno personalizado. Ejemplo:



Para cambiar el icono hay que utilizar el procedimiento WebUtil_SeparateFrame.SetIcon de la librería WEBUTIL.PLL.

Ejemplo: WebUtil_SeparateFrame.SetIcon(‘/forms/java/libra_menu.gif’);

El icono que se indica por parámetro debe de tener formato GIF o JPG y debe de encontrarse en la carpeta en donde están los jar de Java ($ORACLE_HOME/forms/java). En caso de no encontrar el archivo en esa carpeta dará el siguiente error: “WUB-603: No se ha podido cargar la imagen del icono …..

El icono quedará guardado en la caché de Java para futuras ejecuciones:

jueves, 14 de abril de 2011

Maximizar Ventana MDI en Forms 11

Fuente: http://blog.edisa.com/2011/04/maximizar-ventana-mdi-en-forms-11/

En Forms 11 una de las novedades es la integración con JavaScript y eso se puede aprovechar para forzar el maximizado completo de la ventana MDI cuando que ejecuta en una ventana separada del navegador, es decir, cuando se ejecuta con el parámetro separateframe=true
Al ejecutar SET_WINDOW_PROPERTY(forms_mdi_window, window_state, maximize); el maximizado no es completo, hace un ajuste según el tamaño de la pantalla, pero no es equivalente a que si el usuario pulsa el botón de maximizado.
Para que sea equivalente a que el usuario pulse el botón de maximizar hay que realizar lo siguiente:
  • En el archivo formsweb.cfg añadir la siguiente línea a la sección de la configuración (El nombre que se le asigne a la variable es indiferente, pero tiene que ser el mismo dos sitios que están resaltados en negrita):
    • applet_name=OracleApplet
  • Desde Forms ejecutar:
    • web.javascript_eval_expr(‘document.OracleApplet.getFrame().setExtendedState(6)’);
Ejemplo con SET_WINDOW_PROPERTY(forms_mdi_window, window_state, maximize);


Resultado con SET_WINDOW_PROPERTY(forms_mdi_window, window_state, maximize);


Ejemplo ejecutando web.javascript_eval_expr(‘document.OracleApplet.getFrame().setExtendedState(6)’);



Otro ejemplo similar se puede ver en: http://blog.avanttic.com/2010/07/30/integracion-forms-11g-con-javascript-maximizar-forms_mdi_window/

sábado, 17 de abril de 2010

Forms6: Cerrar Report Background por código

Hace tiempo comenté aquí la forma de cerrar el Report Background Engine cada vez que se ejecuta un informe Forms6: Forzar cierre report background, en ese momento comenté que no me parecía muy optimo el cierre del Report Background Engine cada vez que se lanza un informe, pero alguna vez se me dio la necesidad de hacerlo por dos motivos:

  • El usuario tenía que ejecutar dos programas en Forms con distinta configuración de NLS_LANG, uno con SPANISH_SPAIN.UTF8 y otro con SPANISH_SPAIN.WE8ISO8859P15, de forma que al ejecutar un informe se abría el Report Background con la configuración de NLS_LANG del programa que lo llamaba y el otro programa al tener abierto el Report Background no cogía bien la configuración del NLS_LANG, en ese caso lo mejor es forzar que se cierre el Report Background por cada informe.
  • Conexiones remotas por Terminal Server con un programa publicado en Forms. Al lanzar un informe se abre el Report Background y queda abierto y al salir del programa se mantiene la conexión de Terminal Server por culpa del Report Background cuando en realidad ya no va a ser utilizado, en ese caso lo mejor sería forzar cerrar el Report Background al salir del programa, para ello podemos forzar que el Report Background se cierre ejecutando lo siguiente en el disparador KEY-EXIT del programa:
DECLARE
  pl_id ParamList; 
BEGIN 
  pl_id := Get_Parameter_List('CERRAR_RBE'); 

  IF NOT Id_Null(pl_id) THEN 
    Destroy_Parameter_List( pl_id ); 
  END IF; 

  pl_id := Create_Parameter_List('CERRAR_RBE'); 

  Add_Parameter(pl_id, 'PARAMFORM', TEXT_PARAMETER, 'NO');
  Add_Parameter(pl_id, 'ORACLE_SHUTDOWN', TEXT_PARAMETER, 'Yes');

  Run_Product(REPORTS, 'cerrar_rbe', SYNCHRONOUS, RUNTIME, FILESYSTEM, pl_id, NULL);
  Destroy_Parameter_List( pl_id );
END;

El informe 'cerrar_rbe' no es necesario que exista, simplemente se intenta ejecutar un informe pasándole el parámetro para forzar el cierre del Report Background.

martes, 19 de enero de 2010

¿Las claves foráneas producen bloqueos en Forms?

La respuesta es que si no hacemos bien las cosas es SI. Vamos a verlo mejor con un ejemplo con las típicas tablas de formación que utiliza Oracle,  DEPT y EMP:

CREATE TABLE dept (
  deptno  NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,
  dname   VARCHAR2(14),
  loc     VARCHAR2(13));

CREATE TABLE emp (
  empno    NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,
  ename    VARCHAR2(10),
  job      VARCHAR2(9),
  mgr      NUMBER(4),
  hiredate DATE,
  sal      NUMBER(7,2),
  comm     NUMBER(7,2),
  deptno   NUMBER(2) CONSTRAINT emp_ref_dept_fk
                     REFERENCES dept(deptno));


Insertamos un departamento:

INSERT INTO dept (deptno, dname, loc)
  VALUES (23, 'CONTABILIDAD', 'VIGO');

COMMIT;


Ahora insertamos un empleado:

INSERT INTO emp (empno,ename,job,mgr,
                 hiredate,
                 sal,comm,deptno)
  VALUES (1234, 'MARIOBROS', 'FONTA', 10,
          TO_DATE('16/05/1975', 'DD/MM/YYYY'),
          50000, 2000, 23);


Antes de hacer el commit, al ver los bloqueos veremos que están la tabla EMP y la DEPT bloqueadas.

SELECT lk.sid, lk.TYPE lock_type, lk.lmode,
       (SELECT o.object_name
          FROM dba_objects o
         WHERE o.object_id = lk.id1) object_name
  FROM gv$lock lk
 WHERE lk.TYPE IN ('TM', 'UL');


Lo que nos devolverá será esto:

   SID LO     LMODE OBJECT_NAME
------ -- --------- ----------------
   311 TM         3 EMP
   311 TM         3 DEPT


El bloqueo de la tabla EMP es por el registro que acabamos de insertar pero que todavía no está commitado, pero la tabla DEPT se bloquea por la clave foránea, ya que en el momento de insertar el registro en EMP existía el departamento 23 en DEPT, pero como no hemos comitado el insert en EMP tiene que bloquear el registro del departamento 23 para evitar que otra sesión borre ese registro o modifique el código del departamento.

Hasta aquí todo normal, el problema viene cuando otra sesión quiere modificar el nombre del departamento:

UPDATE dept
   SET dname = 'FINANCIERO'
 WHERE deptno = 23;


Con esta update nos dejará modificarlo sin problema, pero si en vez de hacer un update que únicamente modifica el nombre del departamento hacemos este otro (el resultado final de los datos en la tabla serán los mismos):

UPDATE dept
   SET deptno = 23,
       dname = 'FINANCIERO',
       loc = 'VIGO'
 WHERE deptno = 23;


El registro quedaría con los mismos datos, pero ya tenemos el bloqueo montado ya que le estamos diciendo que actualice el campo DEPTNO, pero la modificación de ese campo afectaría a registros introducidos por otra sesión y que todavía no están comitados, por lo que se quedará bloqueado.

Esta es la explicación del motivo, pero ¿porqué ocurre en Forms?. La respuesta la encontramos en la propiedad "Actualizar Sólo Columnas Cambiadas" a nivel de bloque, por defecto esa propiedad está a "No" con lo que para hacer un update actualizará todos los campos, incluso los que no ha modificado el usuario.

Lo recomendable para evitar bloqueos es poner esa propiedad al valor "Si".