PDA

Ver la Versión Completa : Crear una Vista que agregue datos con triggers


Edchar
18-12-2012, 05:02:39
Hola a todos de nuevo, quizás piensen que soy un necio y que debo de buscar y leer, pero resulta que ya lo he hecho y por mas que gasto tiempo leyendo en la red y viendo ejemplos no logro crear una vista que mediante un trigger agregue datos, aquí pongo lo que hasta el momento he hecho.

Creo la tabla así:

CREATE TABLE CLIENT_TBL (id ID_CAT, cedcte CED_CTE, name FIRST_NAME, CONSTRAINT PK_CTE PRIMARY KEY (cedcte))



Ahora tengo la vista de esta manera:

CREATE VIEW VIEW_CTEADD(CED_CTE, NOMBRE) AS SELECT cedcte, name FROM CLIENT_TBL



Y el ttrigger lo tengo así

CREATE TRIGGER TG_CTEADDVIEW FOR VIEW_CTEADD
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN
NEW.cedcte = :CED_CTE;
NEW.name = :NOMBRE;
END



Lo he intentado poniendo en el trigger

INSERT INTO CLIENT_TBL(cedcte, name) VALUES (:CED_CTE, :NOMBRE);



Pero cuando intento agregar el trigger me da diferentes errores con el nombre de campo CED_CTE o en el nombre de la tabla CLIENT_TBL.

Por favor necesito que alguien me corriga este codigo y me diga donde tengo el error, para poder probarlo.

Muchas Gracias a todos, aprecio mucho el tiempo que dedican a brindarme una mano

Saludos

Casimiro Notevi
18-12-2012, 10:45:20
Veamos, para empezar, ¿tú qué quieres hacer?, y no contestes: "quiero crear una vista que agruegue datos con triggers", sino exactamente qué quieres conseguir, explicado con palabras.

Edchar
18-12-2012, 19:16:19
Primero lo que quiero es aprender como funciona FireBird, y por lo que he leído en todos los links que uds. me han dado es que puedo crear una vista que puede agregar, actualizar o borrar registro a la vez que esta se ejecuta.

Lo que entiendo es que las vistas sirven como para extraer registros, ya lo hice con una y es esta, que los datos los paso a un DataGrid hasta aquí esta bien.
CREATE VIEW TBL_CTE
AS
SELECT * FROM CLIENT_TBL

Entonces ahora lo que quiero es aprender la otra parte, que me imagino que es que mediante una vista se puede agregar datos y generar la consulta que me presente todos los datos incluido los que acabo de introducir.

Bien ¿Estoy dando palos de ciego y la vista no tiene ese propósito? entonces ¿para que tiene la capacidad de agregar actualizar y borrar?

Agradezco que me tengan paciencia pero al iniciarme en esto tipo de bases de datos uno inicia de cero
y solo con la ayuda de los que saben como Uds uno sale adelante.

Ayúdame con este código por favor, Lo aprecio mucho.

Saludos

Casimiro Notevi
18-12-2012, 19:45:58
No recuerdo si te he recomendado este libro: la cara oculta de delphi (http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_4.pdf.zip). Es esencial, primordial, léelo.

por lo que he leído en todos los links que uds. me han dado es que puedo crear una vista que puede agregar, actualizar o borrar registro a la vez que esta se ejecuta.
¿En qué links?.
Además es que no se entiende qué quieres decir con esa frase: "una vista que puede agregar, actualizar o borrar registro a la vez que esta se ejecuta" :confused:

Entonces ahora lo que quiero es aprender...
El libro indicado es básico, tienes que leerlo... sí o sí.

Bien ¿Estoy dando palos de ciego y la vista no tiene ese propósito? entonces ¿para que tiene la capacidad de agregar actualizar y borrar?
En el libro que te aconsejo dice:

Creación de vistas
Uno de los recursos más potentes de SQL, y de las bases de datos relacionales en
general, es la posibilidad de definir tablas “virtuales” a partir de los datos almacena-
dos en tablas “físicas”. Para definir una de estas tablas virtuales hay que definir qué
operaciones relacionales se aplican a qué tablas bases. Este tipo de tabla recibe el
nombre de vista.

Por eso insisto, para no seguir perdido como estás y hacer preguntas sin sentido, lee.

Te lo digo como un consejo, ya que quieres aprender, no hay otra forma que empezar con un libro. Además este libro es muy ameno.

Casimiro Notevi
18-12-2012, 20:05:03
Para que te hagas una idea, tenemos 2 tablas y sus respectivos campos.

tbCiudades ( id, nombre )
tbClientes ( id, nombre, domicilio, telefono, id_ciudad )

En la tabla ciudades tendremos algo así:

tbCiudades
1...Madrid
2...Taiwan
3...Londres

tbClientes
1...Juanito Campos...calle 1.....3838383...1
2...Shin Lu..........jekjrfuso...4753273...2
3...Jhon Smith.......avda 3......6753222...3
4...Pepe García......calle 33....3743833...1

Ahora, por algún requerimiento de nuestro software, por ejemplo para usarlo en informes/reportes, resulta que necesitamos muy a menudo tener siempre los datos de: nombre del cliente y su ciudad.
En lugar de hacer contínuos selects, ¿qué hacemos para ahorrarnos trabajo?, creamos una vista.

create view clienteyciudad as
select cli.nombre, ciu.nombre from tbclientes cli inner join tbciudades ciu on cli.id_ciudad=ciu.id

Esto nos devuelve:
Juanito Campos...Madrid
Shin Lu..........Taiwan
Jhon Smnith......Londres
Pepe García......Madrid

Es una especie de "tabla virtual".

pd. Lee el libro ;)

Edchar
18-12-2012, 20:38:18
Ok correcto ese libro si me pasaste el link, lo baje y lo leí y lo que me mostraste eso ya lo implemente pero ahora dime una cosa a ese ejemplo que pusiste se le puede crear una vista y poner el siguiente trigger de esta forma

create view clienteyciudad(_id, _nombre) as
select cli.nombre, ciu.nombre from tbclientes cli inner join tbciudades ciu on cli.id_ciudad=ciu.id

CREATE TRIGGER tg_Cte FOR clienteyciudad
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN
INSERT INTO tbclientes(id, nombre) VALUES (:_id, :_nombre);
END


Como puedes ver lo que estoy intentando hacer es que a la vez que ejecuto una vista entonces un trigger sirve para agregar un nuevo cliente obviamente en el ejemplo faltarían los datos de las otras columnas de la tabla.

Gracias por tu ayuda.

Casimiro Notevi
18-12-2012, 21:19:26
Ok correcto ese libro si me pasaste el link, lo baje y lo leí y lo que me mostraste eso ya lo implemente
Amigo, permite que dude que hayas leido el libro.

Además es fácil, en lugar de tanto tiempo que estás perdiendo en preguntar.. ¿por qué no lo pruebas?
No tardas ni un minuto en abrir ibexpert, flamerobin o el que uses, buscas una vista y le das a "create trigger"....
Vaya, que no aparece 'create trigger' en las vistas... ¿será un olvido o será porque no se puede? ;)

Una vista es... bueno, lo que ya te he explicado antes :D

pd. Ahora bien, que a lo mejor se puede de alguna forma, puede ser, pero yo no recuerdo haberlo hecho nunca.

Edchar
18-12-2012, 22:02:27
Ok gracias, ya voy entendiendo un poco mas.

Osea que en vez de buscar, aprenda a usar ibexpert u algo así, para aprender como funcionan los códigos en la base de datos Firebird.

Y por otra parte lo que te entiendo es que lo que yo estoy pensando que es de agregar mediante una vista eso no es posible, voy a a seguir tu recomendación de aprender a usar ibexpert.

Por otro lado no entiendo entonces por que se puede usar un trigger con una vista

Saludos

Casimiro Notevi
18-12-2012, 23:01:34
Por otro lado no entiendo entonces por que se puede usar un trigger con una vista

¿Puedes poner aquí algún código o enlace a eso que dices?, a ver si es que no me entero de lo que buscas.

Edchar
19-12-2012, 01:57:55
Gracias por tu ayuda.
Este es uno de los ejemplos que he visto aquí esta la creación de la vista.

CREATE VIEW CHILD_VIEW
(
ID,
PARENT_ID,
OTHER_STUFF,
GRANDPARENT_ID
)
AS
SELECT
C.ID,
C.PARENT_ID,
C.OTHER_STUFF,
C.GRANDPARENT_ID
FROM CHILD C
join PARENT P on P.ID = C.PARENT_ID;

Y aquí esta la creación del trigger.

CREATE TRIGGER CHILD_VIEW_Save FOR CHILD_VIEW
ACTIVE BEFORE INSERT OR UPDATE POSITION 10
AS
BEGIN
IF(NEW.ID IS NULL)THEN NEW.ID = GEN_ID(GEN_Child, 1);
UPDATE OR INSERT INTO CHILD (ID, PARENT_ID, OTHER_STUFF, GRANDPARENT_ID)
VALUES(NEW.ID, NEW.PARENT_ID, NEW.OTHER_STUFF, NEW.GRANDPARENT_ID);
END

Y es aquí donde veo el UPDATE OR INSERT INTO, Por eso mi punto es que aquí se usa un trigger que agrega registros usando una vista de echo las variables que usa son las de la vista para agregarlos a la tabla CHILD y en FOR CHILD_VIEW del trigger esta el nombre de la vista.

Gracias saludos.

Casimiro Notevi
19-12-2012, 11:32:57
Ah, bien, pero el insert es a una tabla, pensé que te referías hacer un insert a más de una tabla con una sola sentencia.

Sí, bueno, ahí puedes poner lo que quieras, pero vamos, que sigo sin entender lo que quieres saber, ¿crear un trigger que haga un insert?, hombre, sí, se puede, tú mismo has puesto un código de ejemplo.
Por eso la pregunta que te hice desde primera hora es: ¿exactamente qué necesitas?
Si sólo es por saber eso, no tienes más que leer el libro que te he indicado.
Ah, bueno, que ya lo habías leido, no me acordaba.

Edchar
19-12-2012, 18:57:25
Ok gracias, pero entonces según te entiendo si se puede agregar datos así que seguiré aprendiendo y como dices leyendo.

Saludos