Para poder hacer este ejemplo es necesario saber PL/SQL y un poco de Oracle Forms, este ejemplo espero y le pueda servir a alguien, bueno a mi me sirvio para la parte del proyecto en el que trabaje.
Paso 1.
Tenemos que construir un bloque de datos de manera manual lo llamaremos LISTA:
Mostrara un asistente como el siguiente:

Paso 2. Creado el bloque de datos LISTA, ir al apartado de Lienzos, abrir el CANVAS2 o como se llame en su proyecto, mostrara una ventana con el canvas, en la opción Canvas: seleccionar CANVAS2 y en Block: LISTA .

Paso 3: Arrastar todos los elementos: La lista es el Elemento de Lista de la barra de herramientas vertical.

Ir a la las propiedades del Elemento y en el apartado Funcional en la opción Estilo de Lista seleccionar Lista de Texto, esto se tendra que hacer para cada lista.

El diseño debe quedar parecido al de la imagen de arriba.
Paso 4. Debemos cargar Datos e nuestra Lista, se puede hacer desde la base Datos, pero por ahora no pondre esa parte, los pondremos en codigo duro.
Ir a las propiedades de la Lista principal, en el apartado Funcional seleccionar la opción Elementos de Lista , preisionar el boton More..., mostrara una ventana de List Elements, en esta podemos dar de alta los elementos y sus valores.

Paso 5. Para agregar el Trigger( Disparador, para los programan en Java un Evento) o nuestro boton debemos contar con los siguientes elementos:
Nuestro formulario debe tener los siguientes elementos:
LIST_ELEMENT
LIST_ELEMENT_END
BTN_ADD_ELEMET
BTN_ADD_ALL_ELEMET
BTN_DEL_ELEMENT
BTN_DEL_ALL_ELEMENT
BTN_UP_ELEMENT
BTN_DOWN_ELEMENT
Como se muestra en la siguiente imagen:
Ahora tenemos que agregar el disparador WHEN-BUTTON-PRESSED al boton BTN_ADD_ELEMET:
En el editor de codigo poner el siguiente codigo:
DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN
--Cuenta el numero de elementos de la lista
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT');
--Itera por cada elemento de lista
FOR i in 1..l_count LOOP
--Valida si el elemento de la lista es el seleccionado
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT',i) = :LIST_ELEMENT THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT',i);
Add_List_Element('LIST_ELEMENT_END',1,l_text,l_value);
n_index_borrar:=i;
END IF;
END LOOP;
--elimina el elemento de la lista
IF n_index_borrar <> -1 THEN
DELETE_LIST_ELEMENT ('LIST_ELEMENT',n_index_borrar);
END IF;
END;
BTN_ADD_ALL_ELEMET agregamos el disparador WHEN-BUTTON-PRESSED y en editor el siguiente codigo
DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT');
FOR i in 1..l_count LOOP
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT',i);
IF TRIM(l_text) is not null THEN
Add_List_Element('LIST_ELEMENT_END',i,l_text,l_value);
n_index_borrar:=i;
END IF;
END LOOP;
IF n_index_borrar <> -1 THEN
CLEAR_LIST('LIST_ELEMENT');
END IF;
END;
BTN_ADD_ALL_ELEMET agregamos el disparador WHEN-BUTTON-PRESSED y en editor el siguiente codigo
DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
IF TRIM(l_text) is not null THEN
Add_List_Element('LIST_ELEMENT',i,l_text,l_value);
n_index_borrar:=i;
END IF;
END LOOP;
IF n_index_borrar <> -1 THEN
CLEAR_LIST('LIST_ELEMENT_END');
END IF;
END;
BTN_ADD_ELEMET agregamos el disparador WHEN-BUTTON-PRESSED y en editor el siguiente codigo
DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
n_index_borrar INTEGER:=-1;
BEGIN
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT_END',i) = :LIST_ELEMENT_END THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
Add_List_Element('LIST_ELEMENT',1,l_text,l_value);
n_index_borrar:=i;
END IF;
END LOOP;
IF n_index_borrar <> -1 THEN
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',n_index_borrar);
END IF;
END;
Para subir un elemento de la lista LIST_ELEMENT_END se configura el siguiente disparador WHEN-BUTTON-PRESSED en el boton BTN_UP_ELEMENT con este código
DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
l_text2 VARCHAR2(100);
l_value2 VARCHAR2(100);
bandera INTEGER:=0;
BEGIN
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT_END',i) = :LIST_ELEMENT_END AND bandera=0 AND i <> 1 THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
l_text2 := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i-1);
l_value2:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i-1);
Add_List_Element('LIST_ELEMENT_END',i-1,l_text,l_value);
Add_List_Element('LIST_ELEMENT_END',i,l_text2,l_value2);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i+1);
bandera:=1;
END IF;
END LOOP;
END;
Para bajar un elemento de la lista LIST_ELEMENT_END se configura el siguiente disparador WHEN-BUTTON-PRESSED en
el boton BTN_DOWN_ELE con este código
DECLARE
l_count INTEGER;
l_text VARCHAR2(100);
l_value VARCHAR2(100);
l_text2 VARCHAR2(100);
l_value2 VARCHAR2(100);
bandera INTEGER:=0;
BEGIN
l_count := GET_LIST_ELEMENT_COUNT('LIST_ELEMENT_END');
FOR i in 1..l_count LOOP
IF GET_LIST_ELEMENT_VALUE('LIST_ELEMENT_END',i) = :LIST_ELEMENT_END AND bandera=0 AND (l_count) <> i THEN
l_text := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i);
l_value:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i);
l_text2 := GET_LIST_ELEMENT_LABEL('LIST_ELEMENT_END',i+1);
l_value2:= GET_LIST_ELEMENT_VALUE ('LIST_ELEMENT_END',i+1);
Add_List_Element('LIST_ELEMENT_END',i+1,l_text,l_value);
Add_List_Element('LIST_ELEMENT_END',i,l_text2,l_value2);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i+1);
DELETE_LIST_ELEMENT ('LIST_ELEMENT_END',i+2);
bandera:=1;
END IF;
END LOOP;
END;
Para que la lista fin este limpia (LIST_ELEMENT_END), cuando crea un nueva instancia se configura un disparador WHEN-NEW-FORM-INSTANCE con el siguiente código
CLEAR_LIST ('LIST_ELEMENT_END');
Cuando se recuperan datos desde la base de datos de tiene hacer una función para llenar la lista principal y la lista fin,en otra entrada mostrare como hacerlo.
Si ejecutamos hasta aqui nuestro pequeño proyecto ya podremos copiar un elemento de una lista a la otra:
continuara...
Se feliz, libre, sueño por un mundo mejor.......