Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2004
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 19-06-2004
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 251
Poder: 22
Osorio Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 19-06-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 23-06-2004
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
Post 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 .
Responder Con Cita
  #5  
Antiguo 29-06-2004
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 30-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:23:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi