Problemas con un aplicación de Power Builder: Ejecuto un update y no me ingresa información
Como esta, lo que pasa es que cuando ejecuto el update() da un datawindow, y uno de sus campo no se ingreso información, y este no graba valores nulos me genera un error, donde me dice que tal campo no puede grabar valores nulos, la pregunta es como puedo controlar este error, osea si no ingrese datos en un determinado campo en vez de que me salga este error "anti estético", yo pueda mandar otro mensaje más amigable, como puedo hacer eso.
Espero puedan ayudarme, At. Carlos
1 Respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
El error que te presenta en pantalla es reflejado directamente por la base de datos, lo que sucede es que tienes un campo que no permite nulos y este no permite nulos, tal es el caso de un campo que forma parte de una llave primaria. Para poder interceptar el error de la base de datos en un datawindow utiliza el evento DBERROR() en este evento podrás prevenir que la base de datos trate de pintar su propio error. Los parámetros que recibes son: Sqlcode = el numero de error por ejemplo el que mencionas este normalmente tendrá un numero de error el cual puedes evaluar aquí sqlerrtext = la descripción directamente de la base de datos, del error que fue cometido. Sqlsintax = el scrpit en texto de lo que intento hacer, por ejemplo un insert, update, delete, etc. Dwbuffer = el simbolo del buffer en donde fue provocado el error (ver en ayuda online las posibilidades) Row = la linea en el datawindow, que provoco el error Para evitar que el error sea pintado en la pantalla tal cual viene de la base de datos, deberás retornar un valor numérico en este evento las posibilidades son 0 = despliega el error 1 = no despliega el error Aun así, todo esto puede ser evitado, no esperando el error critico de la base de datos, simplemente evalúas los valores ingresados cada vez que el usuario los ingresa, o/y en el momento antes de actualizar, Utilizando los eventos Itemchanged() Itemerror() Los dos eventos pueden retornar un valor tipo numérico y en los 2 funciona igual, 0 = valor por omision, aceptar el valor 1 = rechazar el valor y no permitir cambiar de foco 2 = rechazar el valor y permitir cambiar de foco El evento itemchanged() Es disparado en el justo instante en que el usuario presiona enter sobre el campo o pasa con TAB, y es aquí donde puedes interceptar el proceso y evaluar el valor ingresado. Este evento te da varios valores: Dwo = el objeto datawindow que tiene el foco y esta siendo editado row = la fila en que se encuentra el datawindow data = el valor nuevo que aun no ha sido integrado en el objero del datawindow, en formato string Puedes por ejemplo preguntar por el nombre del objeto a través del dwo. Name Por ejemplo INTEGER li_return = 0 DECIMAL{2} ldc_valor CHOOSE CASE LOWER(dwo.name) CASE 'codigo' IF (ISNULL(data) OR data = '') THEN li_return = 1 messagebox('error', 'deberá ingresar un valor en el codigo', StopSign!) END IF CASE 'valor' ldc_valor = DEC(data) IF (ISNULL(ldc_valor) OR ldc_valor = 0) THEN li_return = 1 messagebox('error', 'no puedo permitir el valor en cero', StopSign!) ELSEIF (ldc_valor < 0) THEN li_return = 1 messagebox('error', 'no puedo permitir el valor en negativo', StopSign!) END IF END CHOOSE RETURN( li_return) Esto tiene un inconveniente y es que cuando pasas con el ratón el campo no es evaluado, por ejemplo llenas un campo y luego haces click en el botón de grabar, el resto de los campos no fueron evaluados porque no fue disparado el evento. Para eso utilizas la función ACCEPTTEXT() la cual devuelve un valor 1 todo ok, -1 hay un problema, el cual fue evaluado por el evento itemchanged() y el error que es pintado es exactamente el que tu determinaste en el evento itemchanged(), dejo entonces a tu criterio la decisión.