Tengo una forma en forms 6i. La forma tiene un bloque de datos que se muestra en forma tabular para ir llenado allí los datos.
Necesito que en una de las columnas, cuando el usuario ingrese el dato, la forma revise si ese dato ya existe en esa columna y me lo diga.
Si trato de recorrer el bloque en cualquier trigger de la columna me va a decir que no puedo recorrer así la columna además de perder el foco del dato que quiero.
¿Hay alguna función que me permita solucionar mi requerimiento?
RESPUESTA1:
No hay ninguna función para esto oracle lo controla cuando haces el commit si tienes un PORQUE o una UK, te salta el error que puedes capturarlo con el ON-ERROR.
La única forma es comprobar si el dato ya existe en el POST_FORMS_COMMIT , ya esta guardado el registro en base de datos y podemos hacer select contra la tabla en la base de datos, y sacar un error y volverlo atras.
Además la solución buena es hacer un trigger en la tabla post insert o post update que lo valide y no permita su guardado.
RESPUESTA2:
La mejor forma es crearse un record group, validar contra el RG e irlo rellenando con los códigos en el when-validate-item.
Te paso un ejemplo de una función wue busca un valor en un RG y te devuelve en que posición esta o 0 si no lo encuentra.
FUNCTION Is_Value_In_List( the_value VARCHAR2,
the_rg_name VARCHAR2,
)
RETURN NUMBER IS
the_Rowcount NUMBER;
rg_id RecordGroup;
gc_id GroupColumn;
col_val VARCHAR2(80);
Exit_Function Exception;
BEGIN
/*
** Determine if record group exists, and if so get its ID.
*/
rg_id := Find_Group( the_rg_name );
IF Id_Null(rg_id) THEN
Message('Record Group '||the_rg_name||' does not exist.');
RAISE Exit_Function;
END IF;
/*
** Make sure the column name specified exists in the
** record Group.
*/
/*
** Get a count of the number of records in the record
** group
*/
the_Rowcount := Get_Group_Row_Count( rg_id );
/*
** Loop through the records, getting the specified column's
** value at each iteration and comparing it to 'the_value'
** passed in. Compare the values in a case insensitive
** manner.
*/
FOR j IN 1..the_Rowcount LOOP
col_val := GET_GROUP_CHAR_CELL( the_rg_name||'.'||'tu_columna', j );
/*
** If we find a match, stop and return the
** current row number.
*/
IF UPPER(col_val) = UPPER(the_value) THEN
RETURN j;
END IF;
END LOOP;
/*
** If we get here, we didn't find any matches.
*/
RAISE Exit_Function;
EXCEPTION
WHEN Exit_Function THEN
RETURN 0;
END;
Fuentes.
Artículo: "Preguntar si un dato ya existe en el bloque" Publicado en https://www.todoexpertos.com/ por odalliscastro el 03/06/2011. Consultado el 04/03/2023.
No hay comentarios:
Publicar un comentario