Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   procedures y triggers (josi) (https://www.clubdelphi.com/foros/showthread.php?t=55105)

Caral 08-04-2008 14:22:03

procedures y triggers (josi)
 
Hola a todos
Estoy tratando de ayudar a Josi me parece que tiene interés pero no ha sabido plantear sus preguntas.
Me parece que ya se va entendiendo lo que quiere hacer y como lo va haciendo.
1- Base de datos sql server.
2- tabla inventario
campos
marca,modelo,cantidad,y existencia

Lo que pretende es hacer un update, pero me parece que usando procedures y tigers (se lo recomendaron en el club).

3- Lo que ha hecho:
un procedure
Código Delphi [-]
create procedure ca
as update inventario set existencia = existencia +cantidad where existencia = existencia

un tiger
Código Delphi [-]
CREATE TRIGGER [TRIGGER inv] ON [dbo].[EQUIPOS] 
after update 
AS exec ca

lo que me indica es:
Cita:

bueno gracias por ser amable y ofrecerme ayuda.



estoy tratando de hacer una aplicacion que es un trabajo final de un
curso que estoy haciendo y quizas me lo compren, el profesor nos dio
3meses y ya nos quedan 2 meses y es para un almacen de celulares.



Tengo una bd con varias tablas y son: clientes,pedidos,inventario y salida.

en la tabla de inventario tengo este procedure:



create procedure ca

as

update inventario

set existencia = existencia +cantidad where existencia = existencia

para calcular la existencia



luego lo ejecuto con este trigger

CREATE TRIGGER [TRIGGER inv] ON [dbo].[EQUIPOS]

after update

AS

exec ca



me funciona bien en el sql cuando actualizo una fila pero en delphi trato de actulizar una fila y se me actulizan todas
Cita:

1-preferi usar sql porque fue la base de datos que estudiamos en unos de los modulos que se dio en curso.
2-útilizo los procedures y trigeer por que me lo sugerieron en el foro por que no se trabajar con campos calculados en delphi.

Este es el problema:

tengo la tabla inventario con estos campo
marca,modelo,cantidad,y existencia,lo que quiero es que a la hora de modificar el campo 'cantidad' el valor se le sume a el campo 'existencia', el procedure me funciona bien cuando modifico el valor del campo 'cantidad' en el interprise manager de sql osea cuando voy directamente a las tablas del sql y solo me actualiza una linea que es lo que quiero realmente pero delphi me actualiza en vez de una linea me la actualiza todas.


gracias.
Para mi que el problema es que no especifica el campo a actualizar pero en cuanto a procedures y gatitos no puedo ayudarle (no los conozco)
Si alguno de vosotros puede darle una explicacion sencilla de como usar estos sera agradecido por Josi.
Tambien se puede hacer sin usar tigers (supongo, no conozco sql server).???

Espero que colaboremos con Josi.

Saludos

Neftali [Germán.Estévez] 08-04-2008 15:52:10

Cita:

Empezado por Caral (Mensaje 278248)
Para mi que el problema es que no especifica el campo a actualizar pero en cuanto a procedures y gatitos no puedo ayudarle (no los conozco)
Si alguno de vosotros puede darle una explicacion sencilla de como usar estos sera agradecido por Josi.
Tambien se puede hacer sin usar tigers (supongo, no conozco sql server).???

Creo que los "GATITOS" (Triggers) son buenos candidatos para este problema. No quiere decir que no se pueda hacer de otra forma (SP o desde programa), pero creo que es la situación ideal para utilizarlos.
Para cualquier alta, modificación o borrado que se haga sobre la tabla habrá que actualizar el campo (tal vez exceptuando los movimientos de "cuadrar inventario").

En cuanto a cómo hacerlo creo que entre la ayuda y los ejemplos que se pueden encontrar por internet debe ser sencillo, ya que este es uno de los casos más utilizados. Más estandard (por decirlo así) de utilización de Triggers.

jcarteagaf 08-04-2008 16:03:37

Ayudando a Josi
 
Como ya le explicaron en algun post el problema esta en tu Stored Procedure:

Código SQL [-]
create procedure ca
as update inventario set existencia = existencia +cantidad where existencia = existencia
En este caso se actualiza todos los productos ya que siempre Existencia= Existencia
Por otro lado no necesita un stored procedure para eso (aunque puede hacerlo)

Lo mejor seria hacerlo directamente en el Trigger:

Código SQL [-]
 CREATE TRIGGER [TRIGGER inv] ON [dbo].[EQUIPOS] 
after update 
AS
  UPDATE X
  SET X.EXISTENCIA = X.EXISTENCIA +  I.CANTIDAD
  FROM INVENTARIO X
  JOIN INSERTED I ON X.MARCA = I.MARCA
SQL Server crea la tabla Inserted con todos los registros que han sido insertados o actualizados durante las operaciones de inserción y actualización, en el caso de eliminacion de registros crea la tabla deleted.
Los triggers se ejecutan una sola vez por cada proceso es decir si borras 10 registros el trigger se dispara una sola vez, es por eso que se debe recorrer las tablas Inserted y Deleted para poder operar sobre todos los registros afectados por el Trigger.

Espero que sirva.

Saludos.

Caral 08-04-2008 17:57:57

Hola
Esto de los procedures y gatitos lo veo complicado.:o
Ahora pienso, si lo ve complicado el Novato1, como lo verán los demás novatos, lo entenderán??.
Hay alguna manera de hacer esto y que lo entienda un Novato?.
El enlace de Neftali esta muy bien, pero me deja dudas.
Abra algún enlace que conozcáis para un novato??, algo que indique como y para que??., no se, se me ocurre que seguiría sin entenderlo Josi.
Vamos, ya se soy un pesado, pero pues vosotros sois los que sabéis.:)
Saludos

josi 09-04-2008 00:57:27

trigeer
 
el trigger funciona pero me da el mismo problema, ejm si tengo dos filas una con valor 1 en campo 'cantidad' y otra con valor 3 en el campo 'cantidad' y le cambio el valor al campo 'cantidad' se le suma al campo 'existencia' de la primera fila y a la segunda fila vuelve y se suma el valor 3.

gracias

Caral 09-04-2008 04:45:00

Hola
Veamos a ver si aporto algo, recordad que no se procedures ni tiggers.

Tienes estos campos:
marca, modelo, cantidad, existencia

Quieres actualizar un campo determinado aumentandole a la existencia la cantidad deseada.
Supongamos que tenemos en el campo marca (jeep) y lo colocamos en un Edit para identificar que es el que queremos actualizar.
Para eso hay que usar un tigger (Como yo no se, lo haria asi):
Código Delphi [-]
QTemp.SQL.Text := 'Update inventario Set existencia = existencia + cantidad where marca = :Marc';
QTemp.Parameters[0].Value:= Edit1.Text;
QTemp.ExecSQL;

Como ves el edit contendria la palabra Jeep y la sentencia reconoceria que si el campo marca contiene la palabra Jeep actualizara la existencia sumandole la cantidad, solo de ese campo (Jeep).
Si hay otros que contengan la palabra Jeep tambien seran actualizados, por eso si se desea actualizar un campo determinado este tiene que poseer caracteristicas unicas, normalmente numericas (es lo usual).

Espero que aclare un poco mas, esperemos a algun Maestro, ya te ayudaran, no todos los dias vienen hay que tener paciencia.

Saludos

Delphius 09-04-2008 05:30:47

Veamos... hay algo que todavía no entiendo...
¿Estamos hablando de una actualización masiva?¿O por el contrario, de un único registro?

No estoy muy puesto en SQL Server, ya le he perdido un poco la mano... (como no lo tengo instalado en mi equipo). NO estoy totalmente seguro, pero creo que la mano viene por aquí:

Código SQL [-]
create trigger ActualizarInventario on Inventario 
for after update
as
  /* he asumido que la marca es el id */
  update Inventario
  set existencia = old.existencia + new.cantidad
  where marca = old.marca
end

Supuestamente se está actualizando aquel registro (old.marca) en donde se ha detectado el nuevo valor de cantidad. (new.cantidad).

Si alguien lo prueba podria decir si lo que escribí funciona o no.

Saludos,

josi 09-04-2008 05:43:57

trigeer
 
cuando verifico la sintaxis dice que la columna no admite el prefijo new y old

Delphius 09-04-2008 05:54:46

Me temía que no corriera:o
¡Pero que bestia! Debes anteponer los dos puntos a las variables!
Es decir: :New, y :Old.

Saludos,

josi 10-04-2008 02:03:08

trigger
 
cuando verifico la sintaxis dice que la columna no admite el prefijo :new y :old

Caral 10-04-2008 04:03:04

Hola
A ver:
Los campos Marca y Cantidad tienen que ser facilitados, supongamos que en dos edit.
Código Delphi [-]
QTemp.SQL.Text := 'Update inventario Set existencia = existencia + cantidad = :Cant where marca = :Marc';
QTemp.Parameters[0].Value:= Edit1.Text; // cantidad
QTemp.Parameters[0].Value:= Edit2.Text; // Marca
QTemp.ExecSQL;

Traducido a Gatitos (a mi manera):
Código Delphi [-]
create trigger ActualizarInventario on Inventario 
for after update
as
  update Inventario
  set existencia = existencia + cantidad = :cant
  where marca = :marca
end
Saludos

josi 11-04-2008 01:34:26

solucion
 
me funciona con el que planteo jcarteagaf
CREATE TRIGGER [TRIGGER inv] ON [dbo].[EQUIPOS] after update AS UPDATE X SET X.EXISTENCIA = X.EXISTENCIA + I.CANTIDAD FROM INVENTARIO X JOIN INSERTED I ON X.MODELO = I.MODELO
gracias a Caral,Delphius,carteagaf por preocuparse por el problema que plantie,


''los que aman a Dios todas las cosas les ayudan a bien'':D


Kenobi 11-05-2008 06:55:45

Segun creo
 
Hola amigos, las variables new y old eran validas en versiones anteriores de Sql server actualmente se usa es Inserted(haciendo el papel de New) y deleted(interpretando al viejo old)

Si no es asi pues, olvidenlo digamos que a esta hora me da por decir tonterias .....


P.D : creo que en oracle si se utiliza New y Old ....


La franja horaria es GMT +2. Ahora son las 18:58:11.

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