FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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. |
#2
|
||||
|
||||
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
__________________
[Crandel] |
#3
|
||||
|
||||
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. |
#4
|
|||
|
|||
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. |
#5
|
||||
|
||||
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.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#6
|
||||
|
||||
Cita:
Puedes usarlo dmagui.
__________________
[Crandel] |
#7
|
||||
|
||||
Procedimiento almacenado
Como hacerlo con un procedimiento:
lo completas con todos los campo que necesitas ingresar. Suerte
__________________
[Crandel] |
#8
|
||||
|
||||
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. |
#9
|
||||
|
||||
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. |
#10
|
||||
|
||||
disculpen lo replique dos veces, fue sin intencion, no se en lo que estaba pensando
|
#11
|
||||
|
||||
Cuando te ocurre esto, podes entrar a Editar una de las respuestas para borrarla.
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#12
|
||||
|
||||
Cita:
Simplemente cuado intente hacer el insert se va a llamar al trigger y este le va a asignar el valor.
__________________
[Crandel] |
#13
|
||||
|
||||
sigo con problemas.
Cita:
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=ld_cod_cliente para el delete delete from cliente where cod_cliente=ld_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. |
#14
|
||||
|
||||
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] |
#15
|
||||
|
||||
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
__________________
[Crandel] |
#16
|
||||
|
||||
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.
|
#17
|
||||
|
||||
Cual es exactamente el problema actual, estas utilizando el TIBStoredProc? Como es el procedimiento almacenado que estas usando?
__________________
[Crandel] |
|
|
|