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)
-   -   utilizacion trigger (https://www.clubdelphi.com/foros/showthread.php?t=21944)

dmagui 01-06-2005 21:43:18

utilizacion trigger
 
Buenas tardes :


tengo un pequeño problema tengo una tabla que la cree en interbase y es las siguiente

CREATE TABLE CLIENTE
(
COD_CLIENTE INTEGER NOT NULL,
COD_VENDEDOR INTEGER NOT NULL,
NOMBRE_CLIENT VARCHAR(40) NOT NULL,
EDAD INTEGER NOT NULL,
ESTADO VARCHAR(20) NOT NULL,
DIRECCION VARCHAR(20),
TELEFONO INTEGER NOT NULL,
PRIMARY KEY (COD_CLIENTE))


y un trigger asi

CREATE TRIGGER CODCLIENT FOR CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
new.cod_cliente=gen_id(codclient,1);
end

lo que intento hacer con el trigger es que me genere el consecutivo del codigo cliente, mi problema es que quiero que lo coloque automaticamente, lo que pasa es que cuando estoy insertando datos en la tabla cliente, me pide sin embargo el codigo del cliente, aunque despues de guardarlo el codigo que yo coloco me lo cambia al consecutivo que le sigue.

necesito que no me toque digitar obligatoriamente un valor en el campo codigo cliente sino que me lo coloque automaticamente.

Gracias por la atencion prestada.

Crandel 02-06-2005 01:41:11

El código del trigger es correcto, yo cuando hago eso normalmente inserto los datos restantes por medio de un procedimiento almacenado, entonces no obtienes el error.

Podrias hacerlo asi

dmagui 02-06-2005 15:29:36

Gracias por responderme ante todo,

Mira lo que pasa es que no entiendo muy bien lo de procedimientos almacenados, si fueras tan amable de darme una luz de como deberia hacerlo.
otra cosa el procedimiento almacenado se hace directamente en la base de datos (interbase) o se hace en delphi.

Hotmago 02-06-2005 16:10:32

Hola,

yo creo q el problema lo tienes en delphi, y como te dice nuestro amigo, el trigger está bien.

Lo q debes hacer es en la IBDataSet, buscar el evento OnNewRecord y allí poner el siguiente código:

supongamos q tu IBDataset se llame IBClientes entonces el código sería:
IBClientes.Cod_Cliente.Value := 0;

Así no saldrá el error q tienes ahora, este error es causado porq el campo Cod_Cliente está como obligatorio, pero al ponerle como valor inicial un 0, no se ejecutará esta excepción y luego el trigger de IB le dará el código automático.

Espero q te sirva. Un saludo.

jachguate 02-06-2005 16:34:38

Si tenes campos persistentes, basta también con que en tiempo de diseño pongas la propiedad Required del campo a false. Si no tenes campos persistentes, podes hacerlo en runtime después de abrir la tabla.

Hasta luego.

;)

Crandel 02-06-2005 17:36:32

Cita:

Lo q debes hacer es en la IBDataSet, buscar el evento OnNewRecord y allí poner el siguiente código:

supongamos q tu IBDataset se llame IBClientes entonces el código sería:
IBClientes.Cod_Cliente.Value := 0;
Muy bueno, no se habia ocurrido, le das un valor por defecto y despues que el trigger te lo cambie.

Puedes usarlo dmagui.

Crandel 02-06-2005 17:41:41

Procedimiento almacenado
 
Como hacerlo con un procedimiento:

Código SQL [-]
CREATE PROCEDURE PROC_GUARDAR_CLIENTE (VENDEDOR INTEGER, NOMBRE VARCHAR(40), ....)
AS
BEGIN
  INSERT INTO CLIENTE(COD_VENDEDOR, NOMBRE_CLIENT, ...)
    VALUES (:VENDEDOR, :NOMBRE, ...);
END^

lo completas con todos los campo que necesitas ingresar.

Suerte

dmagui 02-06-2005 20:40:09

que pena la ignorancia pero bueno hice las dos cosas que me dijeron
bueno con el dataset

supongamos q tu IBDataset se llame IBClientes entonces el código sería:
IBClientes.Cod_Cliente.Value := 0;

hice lo que me dijiste y me geneta los siguientes errores

[Error] ejemplo.pas(34): Undeclared identifier: 'Cod_Cliente'
[Error] ejemplo.pas(34): Missing operator or semicolon
[Fatal Error] ejm.dpr(5): Could not compile used unit 'ejemplo.pas'


y con el procedimiento almacenado no veo donde le este diciendo que me genere automaticamente el codigo, porque igual lo ejecute y me toca igual darle un numero en el campo del cod_cliente asi que despues me lo cambie segun el consecutivo que le toca.
bueno el sp lo hice en interbase ahora cuando lo interactuo con delphi me sigue el inconveniente.

Gracias por la colaboracion.

dmagui 02-06-2005 20:41:09

ayuda con los sp
 
que pena la ignorancia pero bueno hice las dos cosas que me dijeron
bueno con el dataset

supongamos q tu IBDataset se llame IBClientes entonces el código sería:
IBClientes.Cod_Cliente.Value := 0;

hice lo que me dijiste y me geneta los siguientes errores

[Error] ejemplo.pas(34): Undeclared identifier: 'Cod_Cliente'
[Error] ejemplo.pas(34): Missing operator or semicolon
[Fatal Error] ejm.dpr(5): Could not compile used unit 'ejemplo.pas'


y con el procedimiento almacenado no veo donde le este diciendo que me genere automaticamente el codigo, porque igual lo ejecute y me toca igual darle un numero en el campo del cod_cliente asi que despues me lo cambie segun el consecutivo que le toca.
bueno el sp lo hice en interbase ahora cuando lo interactuo con delphi me sigue el inconveniente.

Gracias por la colaboracion.

dmagui 02-06-2005 20:42:45

disculpen lo replique dos veces, fue sin intencion, no se en lo que estaba pensando

jachguate 02-06-2005 22:10:34

Cuando te ocurre esto, podes entrar a Editar una de las respuestas para borrarla.

Hasta luego.

;)

Crandel 03-06-2005 01:22:57

Cita:

Empezado por dmagui
y con el procedimiento almacenado no veo donde le este diciendo que me genere automaticamente el codigo

El procedimiento almacenado no le dice en ningún lugarque genere el código.

Simplemente cuado intente hacer el insert se va a llamar al trigger y este le va a asignar el valor.

dmagui 03-06-2005 21:19:34

sigo con problemas.
 
Cita:

Empezado por Crandel
El procedimiento almacenado no le dice en ningún lugarque genere el código.

Simplemente cuado intente hacer el insert se va a llamar al trigger y este le va a asignar el valor.

haber ya hice el procedimiento almacenado en interbase como me lo explico en un citado anterior, luego en delphi en el dataSet le coloco en las sentencias sql lo siguiente

para el select

select cod_cliente,cod_vendedor, nombre_client, edad, estado, direccion, telefono from cliente

para el insert

insert into cliente
(cod_vendedor, nombre_client, edad, estado, direccion, telefono)
values
(:cod_vendedor, :nombre_client, :edad, :estado, :direccion, :telefono)

para el modify

update cliente
set cod_vendedor=:cod_vendedor,
nombre_client=:nombre_client,
edad=:edad,
estado=:estado,
direccion=:direccion,
telefono=:telefono
where cod_cliente=:old_cod_cliente

para el delete

delete from cliente
where cod_cliente=:old_cod_cliente

Cuando lo ejecuto me sale lo que dije en el select que me mostrara, me modifica, elimina perfectamente, pero al insertar persiste el error tengo que colocarle un valor al cod_cliente asi que me lo vaya a cambiar despues por custion del trigger o si no me va a salir el dichoso mensaje ,encionado anteriormente.

Realmente necesito ayuda, no se que hacer.
Agradezco mucho al que me pueda ayudar.

Crandel 03-06-2005 22:42:00

Vamos a aclarar algunos conceptos

Un trigger es como una función dentro de la DB que se ejecuta automáticamente cuado ocurre un evento que vos le especificas.

En cambio un procedimiento debe ser invocado para que este funcione.

Vos seguis intentando insertar de la misma forma y no utilizando el procedimiento almacenado.

Para usarlo la forma más fácil es utilizando un componente TIBStoredProc, que una vez lo enlazaste con el prodimiento, en tu código le debes pasar pasar los parámetros y ejecutarlo.

Crandel 03-06-2005 22:43:17

Un detalle más:

el TIBStoredProc se ejecuta con el método ExecProc, fijate en la ayuda que te da un ejemplo de como pasarle los parámetros y demás.

Suerte

dmagui 09-06-2005 21:21:28

No definitivamente no me sirvio le he probado muchas veces y no, si me puedes quizas dar mas parametros que me puedan ayudar a superar este inconveniente, de todas formas muchas gracias.

Crandel 10-06-2005 01:38:55

Cual es exactamente el problema actual, estas utilizando el TIBStoredProc? Como es el procedimiento almacenado que estas usando?


La franja horaria es GMT +2. Ahora son las 02:08:38.

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