De Oracle Forms a Oracle APEX: Casos prácticos para modernizar funcionalidades claves.


Migrar aplicaciones desde Oracle Forms a Oracle APEX es mucho más que un cambio de tecnología: es una oportunidad para modernizar, optimizar y extender las capacidades de nuestras aplicaciones empresariales. Sin embargo, uno de los mayores desafíos en este proceso es replicar comportamientos clásicos que teníamos dominados en Forms, como el manejo de registros en bloque, validaciones en tiempo real o acciones por fila, usando ahora la arquitectura web de APEX.
💡 En esta serie de 3 ejemplos prácticos, en el siguiente link:
te mostraré cómo trasladar funcionalidades clave de Forms a APEX usando herramientas modernas como JavaScript, acciones dinámicas de APEX y algunas buenas prácticas. La mayoría de estos patrones usan técnicas que se repiten en casi cualquier migración y son la base para construir interfaces ricas, funcionales y fáciles de mantener.
🧩 Los tres casos que vamos a cubrir inicialmente son:
✅ Selección de registros estilo Forms usando Interactive Grid y JavaScript
Tal como lo hacíamos en un bloque tabular de Forms, aquí veremos cómo con una columna con checkboxes (RowSelector) podemos controlar los registros seleccionados con JavaScript y cómo aplicar acciones en lote o por registro.Aplicando el concepto de RowSelector:
Crear un PageItem que almacene los registros seleccionados.
Crear un Dynamic Action y ejecutar el proceso de JavaScript
var selectedId = ""; var model = this.data.model; if (this.data.selectedRecords.length > 0) { var ids = []; this.data.selectedRecords.forEach(function(record) { var id = model.getValue(record, "ID"); ids.push(id); }); selectedId = ids.join(":"); } $s("P38_ID_SELECTED", selectedId);
🔘 Botones por fila con acciones personalizadas en Interactive Report
Ya sea para ver detalles, editar o lanzar un proceso, muchas veces en Forms usábamos un botón o un trigger por cada línea. En APEX también podemos hacerlo, con íconos, botones dinámicos o acciones JavaScript personalizadas.En este ejemplo en un Interactive Report, crearemos una columna de tipo PlainText y en donde en el HTML Formatting indicaremos que es un botón, con lo siguiente:
<button type="button" title="Disminuir el budget" aria-label="Reprocesar" class="t-Button t-Button--noLabel t-Button--icon btnReprocesar"><span aria-hidden="true" class="t-Icon fa fa-repeat"></span></button>
Usando JQuery obtendremos el registro seleccionado y ejecutaremos un proceso que en este ejemplo disminuirá el budget en uno y a la vez mostraremos el ID del registro seleccionado.
📥 Checkboxes con APEX_ITEM y colecciones dinámicas vía AjaxCallBack en un Interactive Report
En este caso veremos usando un Interactive Report como crear un checkbox usando APEX ITEM. La idea de esta funcionalidad es que al hacer click en el checkbox podamos ejecutar un proceso de AjaxCallBack y guardar toda esta información en una colección, para luego ser utilizada, puntualmente en algún proceso. En Oracle FORMS este concepto a nivel tabular se maneja de manera muy repetitiva, ya que muchas veces al seleccionar un registro usando triggers lo almacenamos en una tabla, de la misma manera este mismo concepto se maneja en Oracle APEX.Para este caso hacemos lo siguiente
En nuestro query agregamos el campo que va a servir de selección:
APEX_ITEM.hidden (p_idx => 1 , p_value => ID) || APEX_ITEM.CHECKBOX2(p_idx => 2, p_value => 'S') SELECCION_ID,
Crearemos una Dynamic Action con un JavaScript en donde en función al check o a la acción de check que se de, llamara a un proceso de tipo AjaxCallBack.
var elem = this.triggeringElement; var estaMarcado = $(elem).is(':checked'); var seqId = $(elem).parent().find("input[name='f01']").val(); apex.server.process("Ingresar_Coleccion", { x01: seqId , x02: estaMarcado } , {success: function(pdata){ console.log(pdata.mensaje); // Refrescar la región de colecciones apex.region("coleccion").refresh(); } } );
El proceso de AjaxCallBack, si se hace check ingresará a la colección y en caso que se desmarque se eliminará de la colección:
declare v_seq_id number; begin if not apex_collection.collection_exists('MARCAR_ID') then apex_collection.create_collection('MARCAR_ID'); end if; IF apex_application.g_x02 = 'true' THEN APEX_COLLECTION.ADD_MEMBER( p_collection_name => 'MARCAR_ID', p_c001 => apex_application.g_x01 ); apex_json.open_object; apex_json.write(p_name => 'mensaje', p_value=> 'Ingresado a la coleccion correctamente'); apex_json.close_object; else begin Select seq_id into v_seq_id from apex_collections where collection_name = 'MARCAR_ID' and c001 = apex_application.g_x01; end; APEX_COLLECTION.DELETE_MEMBER( p_collection_name => 'MARCAR_ID', p_seq => v_seq_id); apex_json.open_object; apex_json.write(p_name => 'mensaje', p_value=> 'Se elimino el miembro de la coleccion correctamente'); apex_json.close_object; End if; exception when others then apex_json.open_object; apex_json.write(p_name => 'mensaje', p_value=> 'Error en la coleccion'); apex_json.close_object; end;
🧩 Conclusión
Migrar desde Oracle Forms a Oracle APEX no es simplemente un ejercicio técnico, sino una oportunidad estratégica para rediseñar nuestras aplicaciones con tecnologías modernas. A través de estos tres ejemplos prácticos hemos visto cómo es posible replicar e incluso mejorar funcionalidades clásicas como la selección de registros, acciones por fila y manejo de colecciones, utilizando herramientas actuales como JavaScript, Dynamic Actions y APEX_COLLECTION.
Más allá del código, el verdadero valor está en entender los patrones que se repiten en casi cualquier migración, y en cómo podemos adaptarlos a la arquitectura web sin perder control ni productividad. Al dominar estas técnicas, no solo aseguramos una transición fluida desde Forms, sino que sentamos las bases para construir aplicaciones más ágiles, mantenibles y centradas en la experiencia del usuario.
Subscribe to my newsletter
Read articles from Karla Cornejo directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
