Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-04-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 08-04-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Caral Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 08-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 08-04-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Esto de los procedures y gatitos lo veo complicado.
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
Responder Con Cita
  #5  
Antiguo 09-04-2008
Avatar de josi
josi josi is offline
Miembro
 
Registrado: feb 2008
Posts: 100
Poder: 17
josi Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 09-04-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 09-04-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 09-04-2008
Avatar de josi
josi josi is offline
Miembro
 
Registrado: feb 2008
Posts: 100
Poder: 17
josi Va por buen camino
trigeer

cuando verifico la sintaxis dice que la columna no admite el prefijo new y old
Responder Con Cita
  #9  
Antiguo 09-04-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Me temía que no corriera
¡Pero que bestia! Debes anteponer los dos puntos a las variables!
Es decir: :New, y :Old.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 10-04-2008
Avatar de josi
josi josi is offline
Miembro
 
Registrado: feb 2008
Posts: 100
Poder: 17
josi Va por buen camino
trigger

cuando verifico la sintaxis dice que la columna no admite el prefijo :new y ld
Responder Con Cita
  #11  
Antiguo 10-04-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 11-04-2008
Avatar de josi
josi josi is offline
Miembro
 
Registrado: feb 2008
Posts: 100
Poder: 17
josi Va por buen camino
Talking 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''

Responder Con Cita
  #13  
Antiguo 11-05-2008
Kenobi Kenobi is offline
Miembro
 
Registrado: mar 2007
Posts: 191
Poder: 18
Kenobi Va por buen camino
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 ....
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Terminar con Procedures. alexxino Varios 3 28-01-2007 22:40:57
Ocultar código de Stored Procedures y Triggers en FireBird... jncrls Firebird e Interbase 4 08-01-2007 16:51:52
Procedures con Interbase BlueSteel Firebird e Interbase 3 29-06-2006 19:47:31
SQLCOD TRIGGERS + PROCEDURES firebir 1.5 ASAPLTDA Firebird e Interbase 1 28-07-2005 22:19:13
Lio con Procedures!!! diegofhernando Varios 8 12-11-2003 16:54:43


La franja horaria es GMT +2. Ahora son las 13:17:25.


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