![]() |
Validar registro antes de insertar
Hola a todos, estoy haciendo una aplicación para recursos humanos, trabajo con delphi 5 y sql server 2000 para la bd.
Mi pregunta es la siguiente: Quiero validar que un registro no se duplique al capturarlo , pero no se en que evento de la tabla ponerlo, ya probe con beforeinsert, beforepost, onnewrecord , pero no funciona. Este es mi código with spctblCapEmp do begin close; ParamByName('@Id_ControlCurso').Value:=tblCapEmpId_ControlCurso.value; ParamByName('@Id_Emp').Value:=tblCapEmpId_Emp.value; open; end; if not spctblCapEmp.eof then raise Exception.Create('Persona ya existe en curso') mi storeprocedure es el siguiente: CREATE PROCEDURE spctblCapEmp @Id_ControlCurso int, @id_Emp int AS BEGIN Select * from tblCapEmp where Id_ControlCurso =@Id_ControlCurso and id_Emp=@id_Emp end GO con esto trato de evitar que por un error de captura se dupliquen personas dentro del mismo curso Los campos de mi tabla son: id_capEmp llave (autonumerico) id_controlcurso (curso) id_emp (empleado) calificacion En donde puedo validarlo. Gracias a todos. |
Yo le dejaria ese trabajo a la base de datos, simplemente declaro una clave primaria que no acepte duplicidad, y capturo las excepciones que lanzaria la bd
|
Graciasr Eduarcol,
Entonces tu me sugieres que tenga 3 llaves, mi llave primaria es id_capemp (es autonumerica y es la llave de la tabla), entonces id_curso y id_emp tambien las pongo como llaves?????? Otra pregunta cómo captura las excepciones, en general esta, pues me mandaria un mensaje de duplicidad o lago así, no?? Gracias |
Pues sobre las llaves no te sabria decir como es el modelo de tu base de datos, aunque me asalta una duda, porq autonumerico si no quieres que se repita???
No se con el motor que tu utilizas con el BDE funciona asi
Seria cuestion de adaptarlo al motor |
Cita:
|
Validar Edit
Yo hice algo parecido a lo que tu quieres. Lo que valide es que si la clave(ya sea empleado o curso) se repetia entonces que me mandara un mensaje de que ya existe esa clave, a mi parecer, es mejor que le crees una clave a tu empleado y a tus cursos, puesto que los nombre de empleados se repetiran y tambien de los cursos pero los que los diferenciara sera tu clave.Espero y me haya explicado.El codigo que le introduci fue el siguiente
Código:
procedure TForm3.Button1Click(Sender: TObject); |
Vas bien Elite, estas aprendiendo rapido, esto lo digo porq apenas hace dias estabas liado, pero ya vas encaminado.
una simple sugerencia, realizar un locate no es recomendable si el sistema piensa ser escalable porq no hace falta recorrer los registros, solo capturar la excepcion debe ser suficiente, asi no saturamos la red |
asi lo haria
hala pana.
en estos dias tenia problemas paresidos al que planteas. y lo que hice en compañia de mis amigos fue: hacer un procedimiento igual al insertar con la mismas condicion para poder insertar, pero con otra variable. y en el bonton de insertar se pone una condicion que no permita que la insercion sea igual a la que ya este, en este caso seria el nombre. ejemplo:
sin olvidar que antes se debe hacer el procedimiento para insertar, (preferiblemente en una unidad de codigo aparte), al igual que la incersion de validad que es = solo con otra variable. saludos. |
jefferson utiliza TAG's cuando escribas código delphi, por favor. Este se vuelve más legible.
|
Como agregado, a lo que se ha dicho, a lo que apunta el compañero eduarcol es a que no es necesario un select, ni locate. Todo apunta a capturar la excepción adecuada.
Si se ha diseñado la tabla para que tenga un campo clave único, la base de datos nos puede advertir de cualquier intento de ingresar una clave repetida. ¿Para que darle el gusto de buscar si la misma base de datos nos va a saber decir si se puede o no?;) ¿Se entiende la idea? En vez de que viajen muchos registros por la red, sólo hacemos que viaje uno (el que deseamos insertar). Si se puede o no, ya nos dirá la base de datos. la cosa viene a ser algo así:
El ejemplo de eduarcol es más ilustrativo. Saludos, |
ok
Hola
Mira pana esta muy buena tu idea y es mejor que la que yo (principiante) aporté.... Pero savemos como es la programacion y que esta se presta para hacer las cosas de distintas maneras... No se nos haga raro que alguien aparesca con una solucion mas sencilla y eficas. Pero bueno para eso estamos. gracias por el dato. bye.:) |
La franja horaria es GMT +2. Ahora son las 12:41:23. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi