PDA

Ver la Versión Completa : No duplicar datos al hacer inserciones...


uper
18-06-2004, 23:16:32
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
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

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.