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',
*
*
*
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;