Error al hacer un Update.

01/12/2003 - 00:07 por marcelo | Informe spam
Tengo un sistema que vienen facturas con los valores en
DOLARES y a medida que se carga se crean los mismos
registros pero en EUROS y se saca el factor de conversión
de una moneda a la otra de la tabla VALORESCAMBIO (abajo
están los scripts).
El problema es que estos factores de cambio pueden
cambiar para el pasado entonces tengo que tener la
posibilidad de recalcular los registros ya generados.
Para lo que hago el Update de acá abajo pero cuando lo
ejecuto me da el error:
The table 'FACTURAS' is ambiguous.
Esto seguro que es porque hago un Join de Facturas (fac)
con Facturas (fac2) pero este JOIN es necesario!!! Cómo
hago entonces para que NO me de error?????


UPDATE FACTURAS
SET importe = fac2.importe * cam.factor_cambio
FROM
FACTURAS fac
INNER JOIN VALORESCAMBIO cam ON fac.MonedaID =
cam.MonedaIDOrigen and fac.fecha = cam.fecha
INNER JOIN FACTURAS fac2 ON fac.FacturaID =
fac2.FacturaID and
fac.fecha = fac2.fecha and fac.MonedaID <> 1 and
fac2.MonedaID = 1
WHERE
cam.MonedaIDDestino = 1



Script de tablas y carga de Valores de ejemplo:


CREATE TABLE [dbo].[VALORESCAMBIO] (
[MonedaIDOrigen] [int] NOT NULL ,
[MonedaIDDestino] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[factor_cambio] [numeric](18, 4) NOT NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[FACTURAS] (
[FacturaID] [int] NOT NULL ,
[MonedaID] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[Importe] [numeric](18, 4) NOT NULL ,
[ClienteID] [int] NOT NULL
) ON [PRIMARY]
GO


Insert Into FACTURAS
values(12, 1, '01/12/2003', 25, 1)

Insert Into FACTURAS
values(12, 2, '01/12/2003', 31, 1)

Insert Into FACTURAS
values(21, 1, '05/12/2003', 10, 2)

Insert Into FACTURAS
values(21, 2, '05/12/2003', 18, 2)

Insert Into FACTURAS
values(58, 1, '09/12/2003', 40, 15000)

Insert Into FACTURAS
values(58, 2, '09/12/2003', 52, 15000)


Insert Into VALORESCAMBIO
values(2, 1,'01/12/2003', 2.3)


Insert Into VALORESCAMBIO
values(2, 1,'02/12/2003', 2.1)


Insert Into VALORESCAMBIO
values(2, 1,'03/12/2003', 2.4)


Insert Into VALORESCAMBIO
values(2, 1,'04/12/2003', 2.5)


Insert Into VALORESCAMBIO
values(2, 1,'05/12/2003', 2.0)


Insert Into VALORESCAMBIO
values(2, 1,'06/12/2003', 1.8)


Insert Into VALORESCAMBIO
values(2, 1,'07/12/2003', 2.5)


Insert Into VALORESCAMBIO
values(2, 1,'08/12/2003', 2.2)


Insert Into VALORESCAMBIO
values(2, 1,'09/12/2003', 2.25)

Preguntas similare

Leer las respuestas

#1 ulises
01/12/2003 - 02:04 | Informe spam
Prueba con :

UPDATE FACTURAS
SET importe = ( SELECT fac.importe * cam.factor_cambio
FROM FACTURAS fac INNER JOIN VALORESCAMBIO cam
ON fac.MonedaID = cam.MonedaIDDestino AND
fac.fecha = cam.fecha
WHERE fac.FacturaID = FACTURAS.FacturaID
AND fac.fecha = FACTURAS.fecha )
WHERE Facturas.MonedaID <> 1


pero me parece que sería más fácil y más limpio borrar todos los
registros correspondientes a la fecha que ha sido modificada y
recalcularlas de nuevo.

Saludos,
Ulises

On Sun, 30 Nov 2003 15:07:08 -0800, "marcelo"
wrote:

Tengo un sistema que vienen facturas con los valores en
DOLARES y a medida que se carga se crean los mismos
registros pero en EUROS y se saca el factor de conversión
de una moneda a la otra de la tabla VALORESCAMBIO (abajo
están los scripts).
El problema es que estos factores de cambio pueden
cambiar para el pasado entonces tengo que tener la
posibilidad de recalcular los registros ya generados.
Para lo que hago el Update de acá abajo pero cuando lo
ejecuto me da el error:
The table 'FACTURAS' is ambiguous.
Esto seguro que es porque hago un Join de Facturas (fac)
con Facturas (fac2) pero este JOIN es necesario!!! Cómo
hago entonces para que NO me de error?????


UPDATE FACTURAS
SET importe = fac2.importe * cam.factor_cambio
FROM
FACTURAS fac
INNER JOIN VALORESCAMBIO cam ON fac.MonedaID =
cam.MonedaIDOrigen and fac.fecha = cam.fecha
INNER JOIN FACTURAS fac2 ON fac.FacturaID =
fac2.FacturaID and
fac.fecha = fac2.fecha and fac.MonedaID <> 1 and
fac2.MonedaID = 1
WHERE
cam.MonedaIDDestino = 1



Script de tablas y carga de Valores de ejemplo:


CREATE TABLE [dbo].[VALORESCAMBIO] (
[MonedaIDOrigen] [int] NOT NULL ,
[MonedaIDDestino] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[factor_cambio] [numeric](18, 4) NOT NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[FACTURAS] (
[FacturaID] [int] NOT NULL ,
[MonedaID] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[Importe] [numeric](18, 4) NOT NULL ,
[ClienteID] [int] NOT NULL
) ON [PRIMARY]
GO


Insert Into FACTURAS
values(12, 1, '01/12/2003', 25, 1)

Insert Into FACTURAS
values(12, 2, '01/12/2003', 31, 1)

Insert Into FACTURAS
values(21, 1, '05/12/2003', 10, 2)

Insert Into FACTURAS
values(21, 2, '05/12/2003', 18, 2)

Insert Into FACTURAS
values(58, 1, '09/12/2003', 40, 15000)

Insert Into FACTURAS
values(58, 2, '09/12/2003', 52, 15000)


Insert Into VALORESCAMBIO
values(2, 1,'01/12/2003', 2.3)


Insert Into VALORESCAMBIO
values(2, 1,'02/12/2003', 2.1)


Insert Into VALORESCAMBIO
values(2, 1,'03/12/2003', 2.4)


Insert Into VALORESCAMBIO
values(2, 1,'04/12/2003', 2.5)


Insert Into VALORESCAMBIO
values(2, 1,'05/12/2003', 2.0)


Insert Into VALORESCAMBIO
values(2, 1,'06/12/2003', 1.8)


Insert Into VALORESCAMBIO
values(2, 1,'07/12/2003', 2.5)


Insert Into VALORESCAMBIO
values(2, 1,'08/12/2003', 2.2)


Insert Into VALORESCAMBIO
values(2, 1,'09/12/2003', 2.25)


Respuesta Responder a este mensaje
#2 Javier Loria
01/12/2003 - 05:52 | Informe spam
Hola Marcelo:
Muchas gracias por el codigo de las tablas y los inserts.
Si eliminas el alias que le asignaste a la tabla de Facturas (fac) y
reemplazas fac por Facturas debe darte el comportamiento deseado.
Pero para variar un comentario:
Yo no tendria 2 filas para cada Factura, esto te hara la vida miserable
con el mantenimiento, y hecha por la borda el rendimiento del servidor. Te
aseguro que debe ser mucho mas rapido calcular en linea el monto.
Probablemente mantener el monto en el Valor Original sea lo mas
apropiado, para no caer en problemas con redondeo. Si deseas dejar abierto
al sistema a mas monedas, no solo Dolares y Euros podrias mantener las
columnas de las tablas y creando una vista como esta:

SELECT Facturas.FacturaID,
Facturas.MonedaID,
Facturas.Fecha,
Importe/factor_cambio,
ClienteID
FROM FACTURAS JOIN VALORESCAMBIO
ON (Facturas.MonedaID=ValoresCambio.MonedaIDOrigen
AND Facturas.Fecha=ValoresCambio.Fecha)
WHERE ValoresCambio.MonedaIDDestino=@Destino
UNION ALL
SELECT Facturas.FacturaID,
Facturas.MonedaID,
Facturas.Fecha,
Importe,
ClienteID
FROM FACTURAS
WHERE Facturas.MonedaID=@Destino

Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
"marcelo" wrote in message
news:028801c3b796$ae0079b0$
Tengo un sistema que vienen facturas con los valores en
DOLARES y a medida que se carga se crean los mismos
registros pero en EUROS y se saca el factor de conversión
de una moneda a la otra de la tabla VALORESCAMBIO (abajo
están los scripts).
El problema es que estos factores de cambio pueden
cambiar para el pasado entonces tengo que tener la
posibilidad de recalcular los registros ya generados.
Para lo que hago el Update de acá abajo pero cuando lo
ejecuto me da el error:
The table 'FACTURAS' is ambiguous.
Esto seguro que es porque hago un Join de Facturas (fac)
con Facturas (fac2) pero este JOIN es necesario!!! Cómo
hago entonces para que NO me de error?????


UPDATE FACTURAS
SET importe = fac2.importe * cam.factor_cambio
FROM
FACTURAS fac
INNER JOIN VALORESCAMBIO cam ON fac.MonedaID cam.MonedaIDOrigen and fac.fecha = cam.fecha
INNER JOIN FACTURAS fac2 ON fac.FacturaID fac2.FacturaID and
fac.fecha = fac2.fecha and fac.MonedaID <> 1 and
fac2.MonedaID = 1
WHERE
cam.MonedaIDDestino = 1



Script de tablas y carga de Valores de ejemplo:


CREATE TABLE [dbo].[VALORESCAMBIO] (
[MonedaIDOrigen] [int] NOT NULL ,
[MonedaIDDestino] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[factor_cambio] [numeric](18, 4) NOT NULL
) ON [PRIMARY]


CREATE TABLE [dbo].[FACTURAS] (
[FacturaID] [int] NOT NULL ,
[MonedaID] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[Importe] [numeric](18, 4) NOT NULL ,
[ClienteID] [int] NOT NULL
) ON [PRIMARY]
GO


Insert Into FACTURAS
values(12, 1, '01/12/2003', 25, 1)

Insert Into FACTURAS
values(12, 2, '01/12/2003', 31, 1)

Insert Into FACTURAS
values(21, 1, '05/12/2003', 10, 2)

Insert Into FACTURAS
values(21, 2, '05/12/2003', 18, 2)

Insert Into FACTURAS
values(58, 1, '09/12/2003', 40, 15000)

Insert Into FACTURAS
values(58, 2, '09/12/2003', 52, 15000)


Insert Into VALORESCAMBIO
values(2, 1,'01/12/2003', 2.3)


Insert Into VALORESCAMBIO
values(2, 1,'02/12/2003', 2.1)


Insert Into VALORESCAMBIO
values(2, 1,'03/12/2003', 2.4)


Insert Into VALORESCAMBIO
values(2, 1,'04/12/2003', 2.5)


Insert Into VALORESCAMBIO
values(2, 1,'05/12/2003', 2.0)


Insert Into VALORESCAMBIO
values(2, 1,'06/12/2003', 1.8)


Insert Into VALORESCAMBIO
values(2, 1,'07/12/2003', 2.5)


Insert Into VALORESCAMBIO
values(2, 1,'08/12/2003', 2.2)


Insert Into VALORESCAMBIO
values(2, 1,'09/12/2003', 2.25)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida