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 01-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
Exclamation 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.
Responder Con Cita
  #2  
Antiguo 02-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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]
Responder Con Cita
  #3  
Antiguo 02-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 02-06-2005
Hotmago Hotmago is offline
Registrado
 
Registrado: jun 2005
Posts: 5
Poder: 0
Hotmago Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 02-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 02-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Thumbs up

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]
Responder Con Cita
  #7  
Antiguo 02-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Post 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
__________________
[Crandel]
Responder Con Cita
  #8  
Antiguo 02-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 02-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 02-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
disculpen lo replique dos veces, fue sin intencion, no se en lo que estaba pensando
Responder Con Cita
  #11  
Antiguo 02-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 03-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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.
__________________
[Crandel]
Responder Con Cita
  #13  
Antiguo 03-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
Angry 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=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.
Responder Con Cita
  #14  
Antiguo 03-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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]
Responder Con Cita
  #15  
Antiguo 03-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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]
Responder Con Cita
  #16  
Antiguo 09-06-2005
Avatar de dmagui
dmagui dmagui is offline
Miembro
 
Registrado: may 2005
Posts: 168
Poder: 19
dmagui Va por buen camino
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.
Responder Con Cita
  #17  
Antiguo 10-06-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Cual es exactamente el problema actual, estas utilizando el TIBStoredProc? Como es el procedimiento almacenado que estas usando?
__________________
[Crandel]
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 23:58:32.


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