Updatear otra tabla en triger insert

26/11/2006 - 03:30 por Norberto Kelijman | Informe spam
Estimados:

Uso SQL Server 2005.
Esquemáticamente,

La tabla PuntosDeVenta tiene los campos idPuntoDeVenta y
UltimoNumeroAsignado.

La tabla Comprobantes tiene los campos idComprobante, idPuntoDeVenta,
NumeroDeComprobante.

La tarea, puesta en español, es que cada vez que se inserta un Comprobante,
voy a la tabla PuntosDeVenta, le agrego 1 a UltimoNumeroAsignado (según el
punto de venta) y el nuevo valor lo pongo en NumeroDeComprobante de la tabla
Comprobantes.

Estoy tratando de hacer un trigger Insert. Ya sé que el trigger se ejecuta
una vez por sentencia, y efectivamente a veces hago INSERT SELECT. También
sé de la existencia de la tabla Inserted.

Mi problema es cómo hacer para updatear la tabla PuntosDeVenta para obtener
un NumeroDeComprobante *en cada registro*. Supongo que de alguna manera
tengo que recorrer cada registro de la tabla Inserted, pero no sé como.

Si hay una forma mejor que el trigger también la aceptaré gustoso.

Gracias.
Norberto
 

Leer las respuestas

#1 BitOne®
26/11/2006 - 06:06 | Informe spam
Hola Norberto Kelijman:

Solucion 1:

Si lo deseas hacer con un trigger solo tienes que hacer algo como esto
OJO: Ejecutar en base de prueba

Use AdventureWorks

/**********
* Creacion de Tablas de Prueba
*
*/
if object_id('PuntosDeVenta','U') is not null
drop table PuntosDeVenta
go

create table PuntosDeVenta (
idPuntoDeVenta int,
UltimoNumeroAsignado int
)
go

if object_id('Comprobantes','U') is not null
drop table Comprobantes
go
create table Comprobantes(
idComprobante int,
idPuntoDeVenta int,
NumeroDeComprobante int
)

Comprobante,
el
tabla

if object_id('trg_incremento','tr') is not null
drop trigger trg_incremento
go
/******
* Creacion de solucion Trigger
*
*/
go
print '<< Este trigger se dispara y agrega un incremento de acuerdo a la >>'
print '<< cantidad de registros insertadas para el punto de venta >>'
print char(13)
print char(13)
go
CREATE TRIGGER trg_incremento
ON Comprobantes
FOR INSERT
as
update a
set UltimoNumeroAsignado = UltimoNumeroAsignado + (select count(*) from
inserted ins where ins.idPuntoDeVenta = a.idPuntoDeVenta)
from PuntosDeVenta a
go
set nocount on
go
/***********
* Inserta registros en punto de venta para diferente punto
*
*/
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 100,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 110,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 120,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 130,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 140,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 150,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 160,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 170,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 180,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 190,21)
insert into PuntosDeVenta (idPuntoDeVenta, UltimoNumeroAsignado) values
( 200,21)
go
set nocount off
go

print '<< registros con numero de comprobande 21 inicialmente todos >>'
select * from PuntosDeVenta

go

print 'Inserta un registro nuevo para cualquier compronte'
insert into Comprobantes values ( 10, 100, 10010)
go
print 'Resultado comprobante incrementado'
select * from PuntosDeVenta

go
if object_id('tempdb..#VariosRegistros','U') is not null
drop table #VariosRegistros
go
create table #VariosRegistros (
idComprobante int,
idPuntoDeVenta int,
NumeroDeComprobante int
)
go
set nocount on
go
insert into #VariosRegistros values ( 10, 100, 10010)
insert into #VariosRegistros values ( 20, 100, 10020)
insert into #VariosRegistros values ( 30, 100, 10030)
insert into #VariosRegistros values ( 40, 100, 10040)
insert into #VariosRegistros values ( 50, 100, 10050)
insert into #VariosRegistros values ( 60, 100, 10060)
insert into #VariosRegistros values ( 70, 100, 10070)
insert into #VariosRegistros values ( 80, 100, 10080)
insert into #VariosRegistros values ( 90, 100, 10090)
go
set nocount off
go
print '<< registros con numero de comprobande 21 inicialmente todos >>'
select * from PuntosDeVenta

go
Print '<< Operacion con insert into >>'
insert into Comprobantes
select *
from #VariosRegistros
go
Print '<< Muestra resultado del incremento realizado >>'
select * from PuntosDeVenta
go



Segunda solucion:

Coloca todo en una transaccion de manera que en esta puedas manejar este
tipo de evento.

Saludos,

BitOne®



"Norberto Kelijman" wrote in message
news:
Estimados:

Uso SQL Server 2005.
Esquemáticamente,

La tabla PuntosDeVenta tiene los campos idPuntoDeVenta y
UltimoNumeroAsignado.

La tabla Comprobantes tiene los campos idComprobante, idPuntoDeVenta,
NumeroDeComprobante.

La tarea, puesta en español, es que cada vez que se inserta un


Comprobante,
voy a la tabla PuntosDeVenta, le agrego 1 a UltimoNumeroAsignado (según el
punto de venta) y el nuevo valor lo pongo en NumeroDeComprobante de la


tabla
Comprobantes.

Estoy tratando de hacer un trigger Insert. Ya sé que el trigger se ejecuta
una vez por sentencia, y efectivamente a veces hago INSERT SELECT. También
sé de la existencia de la tabla Inserted.

Mi problema es cómo hacer para updatear la tabla PuntosDeVenta para


obtener
un NumeroDeComprobante *en cada registro*. Supongo que de alguna manera
tengo que recorrer cada registro de la tabla Inserted, pero no sé como.

Si hay una forma mejor que el trigger también la aceptaré gustoso.

Gracias.
Norberto


Preguntas similares