Tengo un formulario y un elemento de entrada debe ser único. (Es la clave principal). Cuando hago clic para agregar, aparece un mensaje de error. Está bien, pero quiero recibir este mensaje de error cuando configuro el valor del artículo, no cuando llené todos los formularios y hice clic en el botón AGREGAR.
Por ejemplo, tengo una tabla COUNTRY con una columna COUNTRY_ID. La columna COUNTRY_ID debe ser única.
Creé un elemento de página oculto: C_ID_CHECK
Creé una acción dinámica:
Evento --> cambiar
Tipo de selección --> Artículo
Artículo --> P6_COUNTRY_ID
DECLARE pk_error NUMBER; BEGIN SELECT 1 INTO pk_error FROM COUNTRY WHERE COUNTRY_ID = :P6_COUNTRY_ID; :P6_C_ID_CHECK := 'Y'; EXCEPTION WHEN others THEN :P6_C_ID_CHECK := 'N'; END;Elementos para enviar --> :P6_COUNTRY_ID
Artículos para devolver --> :P6_C_ID_CHECK
Entonces, si el nuevo COUNTRY_ID ya existe, entonces el valor de C_ID_CHECK es Y, de lo contrario, N.
Condición del lado del cliente:
Tipo --> Artículo = Valor
Artículo --> P6_C_ID_CHECK
Valor --> Y
Entonces, si la primera acción dinámica puso el valor Y en el elemento P6_C_ID_CHECK, esta acción dinámica generará una alerta si el valor es Y.
Cuando lo probé me salió este mensaje:
La llamada Ajax devolvió el error del servidor ORA-20987: APEX: intento de guardar el elemento P6_COUNTRY_ID en estado de sesión durante el procesamiento de la presentación. El nivel de protección del elemento indica: El elemento puede establecerse cuando va acompañado de una suma de comprobación de "sesión".
No se pasó ninguna suma de verificación o la suma de verificación pasada sería adecuada para un elemento con nivel de protección "(No se proporcionó ninguna suma de verificación)".
Nota: los usuarios finales reciben un mensaje de error diferente. - Póngase en contacto con el administrador de su aplicación. para ajax_set_session_state.
¿Qué puede salir mal? ¿Es esta una buena manera de recibir una notificación inmediata si intento insertar datos incorrectos o hay alguna otra manera más fácil?
Esta no es la forma correcta de manejar claves primarias en Apex. Siempre haga que la base de datos maneje sus claves primarias, ya sea (1) usando un disparador y una secuencia, esta es la forma antigua o (2) usando una columna de identidad, esta es la forma más moderna.
Luego, en su aplicación, deje que los procesos de formulario nativos hagan el trabajo por usted. Marque el elemento de clave principal en su formulario como "Clave principal" y listo.
Pruébelo en una aplicación de muestra en los datos de muestra de emp/dept. Cree una nueva página de tipo Informe interactivo y marque "incluir formulario". Utilice "EMP" como tabla. Esto generará un informe y un formulario que maneja tanto la creación de nuevos registros como la actualización de registros existentes. Nunca es necesario verificar si el PK es único.
Aquí hay un blog muy completo del equipo de desarrollo de Apex que explica la funcionalidad del formulario.
Estoy de acuerdo con Koen en que este no es un buen diseño.
Pero para responder a su pregunta, el mensaje de error dice que tiene activada la "protección de elementos". Edite su componente P6_C_ID_CHECK y establezca Value Protected en "No". Eso debería permitirle actualizarlo desde una acción dinámica.
Consulte esta pregunta similar y la documentación para los tipos de elementos "ocultos".