sp que renumere

13/04/2009 - 12:55 por -=Joselitux=- | Informe spam
Hola

Tengo una tabla de facturas a la que accede una aplicación desarollada por un consultor externo y ahora hace falta que
al realizar un update del número de factura de un cliente, todas las facturas de ese cliente se renumeren de forma
correlativa. Es decir, si cojo la factura 143 de un cliente y la renumero con el numero 5, todas las facturas
subsiguientes (144, 145, 146...) pasarían a ser 6, 7, 8

Como la aplicacion no se puede tocar para implementar esto (nos cobran un buen dinero y no estamos para alegrias) he
pensado hacer un Stored Procedure que cuando hagamos la renumeracion de una sola factura, se desencadene y renumere
todas las demás. He capturado el UPDATE que hace la aplicación con una TRAZA y el problema es que es un chorro como este:

exec sp_executesql N'UPDATE "FACTURACION".."FACTURAS_C" SET
"CODIGO_OFICINA"=@P1,"CODIGO_EMPRESA"=@P2,"NCLIENTE"=@P3,"NUMFAC"=@P4,"FECHA"=@P5,"CAPITAL"=@P6,"RESERVA"=@P7,"GASTOS_BANCO"=@P8,"PROV_SEGURO"=@P9,"BASE_IMP"=@P10,"IVA"=@P11,"TOT_FACTURA"=@P12,"INTERESES"=@P13,"TOT_IVA"=@P14,"TIPOFRA"=@P15,"CONTAB"=@P16,"Descripcion"=@P17
WHERE "IDFA"=@P18 AND "CODIGO_OFICINA"=@P19 AND "CODIGO_EMPRESA"=@P20 AND "NCLIENTE"=@P21 AND "NUMFAC"=@P22 AND
"FECHA"=@P23 AND "CAPITAL"=@P24 AND "RESERVA"=@P25 AND "GASTOS_BANCO"=@P26 AND "PROV_SEGURO"=@P27 AND "BASE_IMP"=@P28
AND "IVA"=@P29 AND "TOT_FACTURA"=@P30 AND "INTERESES"=@P31 AND "TOT_IVA"=@P32 AND "TIPOFRA"=@P33 AND "CONTAB" IS NULL
AND "Descripcion"=@P34',N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 datetime,@P6 varchar(4),@P7 varchar(1),@P8 varchar(4),@P9
varchar(1),@P10 varchar(6),@P11 varchar(1),@P12 varchar(6),@P13 varchar(4),@P14 varchar(5),@P15 int,@P16 varchar(1),@P17
varchar(25),@P18 int,@P19 int,@P20 int,@P21 int,@P22 int,@P23 datetime,@P24 varchar(1),@P25 varchar(1),@P26
varchar(4),@P27 varchar(1),@P28 varchar(6),@P29 varchar(1),@P30 varchar(6),@P31 varchar(4),@P32 varchar(5),@P33 int,@P34
varchar(25)',0,124,6551,7,'2009-01-05 00:00:00:000','0,00','0','0,00','0','679,22','7','726,77','0,00','47,55',2,'
','Entrega a cuenta',4961,0,124,6551,1301,'2009-01-05
00:00:00:000','0','0','0,00','0','679,22','7','726,77','0,00','47,55',2,'Entrega a cuenta'


Sinceramente, no sé ni por donde cogerlo. Tengo algunas cuestiones:
¿cómo identifico que se está haciendo un update del numero de factura y no otra cosa?
¿cómo hago que el SP se desencadene sólo ante esa condición (update del número de factura)?
¿cómo hago un update correlativo de un campo?(UPDATE N_factura+1 no me ha funcionado)


gracias

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
13/04/2009 - 13:41 | Informe spam
Lo primero de todo, deberías indicarnos qué versión de SQL Server estás
trabajando, porque dependiendo de eso la solución será distinta. Supondré
que al menos lo estás haciendo con la versión 2005. Tampoco nos muestras la
estructura de la tabla, algo que suele ser muy útil para problemas como el
que planteas.

Respondiendo a tus preguntas:

Sinceramente, no sé ni por donde cogerlo.


La traza te está permitiendo ver que la forma de actualizar la tabla de
facturas es por medio del procedimiento almacenado sp_executesql, y en
realidad todo esa cadena no es más que los parámetros que se le pasan a ese
procedimiento para poder hacer el UPDATE. Realmente no es una buena práctica
hacerlo así, pero como la aplicación no es vuestra poco vais a poder hacer
al respecto.

¿cómo identifico que se está haciendo un update del numero de factura y no
otra cosa?


La única forma de conocer eso, tal y como lo tenéis implementado, es
comprobándolo por medio de un trigger. La instrucción COLUMNS_UPDATED() te
permite saber qué columnas se han modificado. En
http://technet.microsoft.com/es-es/...86329.aspx tienes más
información al respecto.

¿cómo hago que el SP se desencadene sólo ante esa condición (update del
número de factura)?


Si no tienes acceso al código de la aplicación no veo cómo vas a poder
modificarla para que ese UPDATE se haga por medio de tu procedimiento
almacenado. A menos, claro, que te esté entendiendo mal y que sí que se
pueda modificar ese código...

¿cómo hago un update correlativo de un campo?(UPDATE N_factura+1 no me ha
funcionado)


Suponiendo que tengas SQL Server 2005, puedes usar la función ROW_NUMBER()
para numerar cada uno de las filas del resulset en base a una condición. Por
ejemplo, algo como

SELECT ROW_NUMBER() (PARTITION BY NCLIENTE ORDER BY FECHA) AS NUMFAC,
NCLIENTE, FECHA, IDFA
FROM FACTURAS_C

te mostraría ordenadas por fecha las facturas de todos los clientes. A
partir de ahí (si las condiciones de ordenamiento de las facturas es
correcto), por un lado deberías hacer un simple UPDATE (suponiendo que el
campo IDFA es la clave primaria de la tabla) para que te actualizara al
número de factura correcto:

UPDATE FACTURAS_C
SET NUMFAC = t.NUMFAC_2
FROM FACTURAS_C AS f
INNER JOIN (SELECT ROW_NUMBER() (PARTITION BY NCLIENTE ORDER BY FECHA) AS
NUMFAC_2, NUMFAC, NCLIENTE, FECHA, IDFA FROM FACTURAS_C) t ON f.IDFA =
t.IDFA

Y por otro lado, para que los número de facturas se numeren correctamente,
una solución podría ser implementar un trigger de tipo INSTEAD OF
(http://technet.microsoft.com/es-es/...89799.aspx) para, en caso de
que la columna NUMFAC se modifique, generar la instrucción que corrija ese
valor o, si no se modifica, lanzar el UPDATE original.




"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil. si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba

"-=Joselitux=-" escribió en el mensaje
news:
Hola

Tengo una tabla de facturas a la que accede una aplicación desarollada por
un consultor externo y ahora hace falta que al realizar un update del
número de factura de un cliente, todas las facturas de ese cliente se
renumeren de forma correlativa. Es decir, si cojo la factura 143 de un
cliente y la renumero con el numero 5, todas las facturas subsiguientes
(144, 145, 146...) pasarían a ser 6, 7, 8

Como la aplicacion no se puede tocar para implementar esto (nos cobran un
buen dinero y no estamos para alegrias) he pensado hacer un Stored
Procedure que cuando hagamos la renumeracion de una sola factura, se
desencadene y renumere todas las demás. He capturado el UPDATE que hace la
aplicación con una TRAZA y el problema es que es un chorro como este:

exec sp_executesql N'UPDATE "FACTURACION".."FACTURAS_C" SET
"CODIGO_OFICINA"=@P1,"CODIGO_EMPRESA"=@P2,"NCLIENTE"=@P3,"NUMFAC"=@P4,"FECHA"=@P5,"CAPITAL"=@P6,"RESERVA"=@P7,"GASTOS_BANCO"=@P8,"PROV_SEGURO"=@P9,"BASE_IMP"=@P10,"IVA"=@P11,"TOT_FACTURA"=@P12,"INTERESES"=@P13,"TOT_IVA"=@P14,"TIPOFRA"=@P15,"CONTAB"=@P16,"Descripcion"=@P17
WHERE "IDFA"=@P18 AND "CODIGO_OFICINA"=@P19 AND "CODIGO_EMPRESA"=@P20 AND
"NCLIENTE"=@P21 AND "NUMFAC"=@P22 AND "FECHA"=@P23 AND "CAPITAL"=@P24 AND
"RESERVA"=@P25 AND "GASTOS_BANCO"=@P26 AND "PROV_SEGURO"=@P27 AND
"BASE_IMP"=@P28 AND "IVA"=@P29 AND "TOT_FACTURA"=@P30 AND "INTERESES"=@P31
AND "TOT_IVA"=@P32 AND "TIPOFRA"=@P33 AND "CONTAB" IS NULL AND
"Descripcion"=@P34',N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 datetime,@P6
varchar(4),@P7 varchar(1),@P8 varchar(4),@P9 varchar(1),@P10
varchar(6),@P11 varchar(1),@P12 varchar(6),@P13 varchar(4),@P14
varchar(5),@P15 int,@P16 varchar(1),@P17 varchar(25),@P18 int,@P19
int,@P20 int,@P21 int,@P22 int,@P23 datetime,@P24 varchar(1),@P25
varchar(1),@P26 varchar(4),@P27 varchar(1),@P28 varchar(6),@P29
varchar(1),@P30 varchar(6),@P31 varchar(4),@P32 varchar(5),@P33 int,@P34
varchar(25)',0,124,6551,7,'2009-01-05
00:00:00:000','0,00','0','0,00','0','679,22','7','726,77','0,00','47,55',2,'
','Entrega a cuenta',4961,0,124,6551,1301,'2009-01-05
00:00:00:000','0','0','0,00','0','679,22','7','726,77','0,00','47,55',2,'Entrega
a cuenta'


Sinceramente, no sé ni por donde cogerlo. Tengo algunas cuestiones:
¿cómo identifico que se está haciendo un update del numero de factura y no
otra cosa?
¿cómo hago que el SP se desencadene sólo ante esa condición (update del
número de factura)?
¿cómo hago un update correlativo de un campo?(UPDATE N_factura+1 no me ha
funcionado)


gracias
Respuesta Responder a este mensaje
#2 -=Joselitux=-
13/04/2009 - 14:12 | Informe spam
Respondiendo a tus cuestiones:

Lo primero de todo, deberías indicarnos qué versión de SQL Server estás
trabajando, porque dependiendo de eso la solución será distinta. Supondré
que al menos lo estás haciendo con la versión 2005.



Si, estoy con SQL Server 2005

Tampoco nos muestras la
estructura de la tabla, algo que suele ser muy útil para problemas como el
que planteas.



idfac,codigo_oficina,codigo_empresa,ncliente,numerofactura,fecha,capital,reseerca,gastos_banco,prov_seguro,base_imponible,totalfactura,descripcion


¿cómo hago que el SP se desencadene sólo ante esa condición (update del
número de factura)?


Si no tienes acceso al código de la aplicación no veo cómo vas a poder
modificarla para que ese UPDATE se haga por medio de tu procedimiento
almacenado. A menos, claro, que te esté entendiendo mal y que sí que se
pueda modificar ese código...



No puedo modificar el código.
Lo que quiero es que después de modificar el número de la factura (lo hace el programa) el Trigger modifique el número
de todas las que van después exclusivamente para ese cliente. El programa hace su parte, y el trigger hace la suya.
Por eso un INSTEAD OF no me sirve.
Respuesta Responder a este mensaje
#3 Carlos Sacristan
13/04/2009 - 14:38 | Informe spam
Ehm, Joselitux, lo que has posteado es la lista de columnas de la tabla,
pero eso no sirve de mucho. Faltan los tipos de datos, las restricciones,
índices, etc.

En cuanto a tu pregunta, si lo que quieres es modificar el nº de la factura
de todas las que van después de la que el programa modifique, entonces
tendrás que crear un trigger after para que ejecute una instrucción parecida
a la que te pasé, pero introduciendo un par de condiciones. Por ejemplo,
podrías probar el código siguiente (dentro del trigger after):

UPDATE FACTURAS_C
SET NUMFAC = t.NUMFAC_2
FROM FACTURAS_C AS f
INNER JOIN (SELECT ROW_NUMBER() (PARTITION BY NCLIENTE ORDER BY FECHA) AS
NUMFAC_2, NUMFAC, NCLIENTE, FECHA, IDFA FROM FACTURAS_C) t ON f.IDFA =
t.IDFA
INNER JOIN inserted i ON f.FECHA > i.FECHA AND f.NCLIENTE = i.NCLIENTE



"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil. si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba

"-=Joselitux=-" escribió en el mensaje
news:%

Respondiendo a tus cuestiones:

Lo primero de todo, deberías indicarnos qué versión de SQL Server estás
trabajando, porque dependiendo de eso la solución será distinta. Supondré
que al menos lo estás haciendo con la versión 2005.



Si, estoy con SQL Server 2005

Tampoco nos muestras la
estructura de la tabla, algo que suele ser muy útil para problemas como
el que planteas.



idfac,codigo_oficina,codigo_empresa,ncliente,numerofactura,fecha,capital,reseerca,gastos_banco,prov_seguro,base_imponible,totalfactura,descripcion


¿cómo hago que el SP se desencadene sólo ante esa condición (update del
número de factura)?


Si no tienes acceso al código de la aplicación no veo cómo vas a poder
modificarla para que ese UPDATE se haga por medio de tu procedimiento
almacenado. A menos, claro, que te esté entendiendo mal y que sí que se
pueda modificar ese código...



No puedo modificar el código.
Lo que quiero es que después de modificar el número de la factura (lo hace
el programa) el Trigger modifique el número de todas las que van después
exclusivamente para ese cliente. El programa hace su parte, y el trigger
hace la suya.
Por eso un INSTEAD OF no me sirve.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida