FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
No duplicar datos al hacer inserciones...
Disculpen ustedes esta pregunta, en una tabla de departamento lo que se requiere es que no se agrege otro departamento con el mismo nombre, mi select es "select id, departamento from departamentos" y ya tengo dadas de alta tres departamentos (contabilidad, produccion, admin) si alguien vuleve a dar de alta un departamento con el nombre de admin ya no puede por que ya esta dada de alta, y para eso me surgio crear un store priocedure.
CREATE EXCEPTION Excep_depto "Ya hay un registo asi..." CREATE PROCEDURE BuscarDepto (v_depto varchar(20)) AS DECLARE VARIABLE resul_depto varchar(20); BEGIN for SELECT departamento FROM departamentos WHERE departamento = :v_depto INTO :resul_depto; do begin if (:resul_depto=v_depto) then begin EXCEPTIO Excep_depto; SUSPEND; end; end end donde v_depto es el parametro que se le pasara del control dbedit al store procedure. Se puede hacerlo asi para no usar lo llamadado Locate . . . y para ejecutarlo seria asi se le de la orden de que al grabar los datos confirme que no haiga otro departamento con el mismo nombre. IBbUSCARdep.ExecProc; MODULO.IBDEPTOSID.VALUE := ParamByName('v_depto').AsString := dbEdit1.Text; Gracias. Me despido de todos ustedes. Saludo |
#2
|
||||
|
||||
Yo acostumbro a hacer algo parecido a esto:
CREATE PROCEDURE BuscarDepto (v_depto varchar(20)) AS BEGIN IF ( EXISTS ( SELECT departamento FROM departamentos WHERE WHERE departamento = :v_depto )) THEN begin EXCEPTIO Excep_depto; end end |
#3
|
||||
|
||||
Porque no declaras un indice único sobre el campo, y dejas que sea este el que prevenga la duplicidad?
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#4
|
|||
|
|||
envio el error que me da la aplicacion
ok, gracias.
Pues bien, realice el procedure desde la base de datos como menciona Osorio, es decir cree mi store procedure para la tabla afectada (Departmentos), mi pregunta es como llamar ese procedure desde la aplicacion. Primero que nada asigne este componente al Datamodule y lo prepare con las siguientes propiedades: Database=baseMain Transaction=IbtranMain storeprocedureName=buscarDepto params=lo deje en blanco active=false Si le asigno a true en active me da un error que dice: use execproc for procedure; use Tquery for select procedures Pero como se le pasaria el valor para que se ejecute si tengo componentes persistentes para capturar los datos, un dbedit que esta ligado al Ibdataset. busque en la ayuda y venia un ejemplo asi sp1.params[0].Asstring:=Edit1.text; sp1.prepare; Sp1.execproc; Ahora como se le asignaria el dbedit1 al edit1.text componente normal ya que el dbedit no tiene una propiedad como Text, no se me ocurre algo. Y gracias por lo referente a crear un indice para que prevenga la duplicidad como lo menciona jachguate pero lo que quiero es que lo ejecute desde el programa Bueno les agradesco si me pudieran ayudar en esto. gracias . |
#5
|
||||
|
||||
la mamera mas facil en un indice sobre ecampo nombre pero. Puede ocurrir
que DEPART <> Depart esto se soluciona con la opcion de comparacion de caracteres aunque nunca he podido hacer(disculpen no recuerdo el nombre). Pero edto te puede ayudar. crea un trigger para antes de insertar //nombre trigger Código:
as declare variable "N" Integer; begin Selec count(*) upper("Nombre") = Upper(New."Nombre") Into :"N"; If ("N" <> 0) Then exception "Msg"'El dato esta duplicado'; end |
#6
|
||||
|
||||
Opino igual que Juan Antonio, la mejor forma es creando un índice único en el campo para evitar su duplicidad.
Si quieres que la aplicación se de cuenta y pueda tratar cuando se intenta insertar un registro duplicado, simplemente pón la inserción / modificación del registro dentro de un try ... except. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
|
|