Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   No duplicar datos al hacer inserciones... (https://www.clubdelphi.com/foros/showthread.php?t=11619)

uper 18-06-2004 23:16:32

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

Osorio 19-06-2004 04:04:38

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

jachguate 19-06-2004 06:10:43

Porque no declaras un indice único sobre el campo, y dejas que sea este el que prevenga la duplicidad?

uper 23-06-2004 21:05:05

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 .

rastafarey 29-06-2004 21:37:12

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


guillotmarc 30-06-2004 12:47:25

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.


La franja horaria es GMT +2. Ahora son las 04:00:32.

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