Update registros distintos

23/07/2004 - 22:44 por afranco_73 | Informe spam
Hola, estoy haciendo una conciliación bancaria entre un archivo plano
que me envia el banco subido a SQL y una tabla de transacciones
bancarias que tengo en SQL, el objetivo es comparar las dos tablas y
marcar con una bandera las transacciones que no coincidan para generar
un informe de no coincidentes.

La estructura es más o menos así:

Banco Plano
Cheque Valor Cheque Valor
1 $10 1 $10
2 $20 3 $20
3 $15 4 $12
4 $12 5 $24
5 $24 7 $30

en este caso se marcaría el cheque 2 en la tabla del banco y el 7 en
la tabla del archivo plano, eso no tiene mucho problema en hacerse,
simplemente se comparan y con un update se marcan los que coincidan y
el resto son los que no coinciden.

La instrucción para la tabla del banco sería algo así:

update banco set banco.conciliado = 'Y'
from banco inner join plano on
banco.cheque = plano.cheque and banco.valor = plano.valor

esto lo puedo hacer tambien para la otra tabla pero no se como hacerlo
para las dos en la misma instrucción, pero este no es el problema.

El problema se da en el siguiente caso:

Banco Plano
Cheque Valor Cheque Valor
1 $10 1 $10
2 $20 3 $20
2 $20 4 $12
3 $15 5 $24
4 $12 7 $30
5 $24

Puede darse el caso de que existan dos documentos con el mismo número
y el mismo valor en la tabla del banco (supuestamente es una anulación
del cheque), y cuando corro el update se comparan los dos registros de
la tabla de bancos con el registro de la tabla del archivo plano, y
necesito que se compare uno solo, para saber que sobra uno en la tabla
del banco.

Si sólo se tratara de seleccionar pues lo haria con un dinstinct pero
en un update no puedo utilizarlo.

Alguna idea? Gracias.
 

Leer las respuestas

#1 Javier Loria
24/07/2004 - 15:23 | Informe spam
Hola Andres:
No es posible actualizar dos tablas simultaneamente en una instruccion
de Update. Vas a requerir por lo menos 1 UPDATE por tabla, lo digo por el
comentario de "no se como hacerlo para las dos en la misma instrucción,".
En cuanto a la conciliacion, me extrana que el banco no envie algun tipo
de movimiento o elemento adicional de tipo de movimiento que te sirva de
guia, para saber si el Cheque se esta anulando. Si no existiera esa columna
y hubiera que asumirla entonces debes conciliar 1 movimiento del banco con
otro del banco. Esto es particularmente dificil ya que la tabla banco no
tiene llave primaria.
Es posible pero dificil. Lo primero seria conciliar/eliminar los cheques
duplicados:
=UPDATE Banco
SET Conciliado='Y'
WHERE Cheque IN (SELECT Cheque
FROM Banco
GROUP BY Cheque
HAVING COUNT(*)>0)
= Esto podria ser una sobresimplificacion, proque que deberiamos hacer si
hay 3 movimientos, conciliar 2 y dejar 1? o se concilian todos?. Yo escogi
la ultima (se concilian todos?) pero si el requerimiento es conciliar 2 y
dejar 1 es mejor cambiar el esquema de la tabla y agregar una Llave Primaria
(Identity?) para poder distinguir una fila de otra.
Una vez pasado esta nivel, es mas sencillo conciliar Bancos con Cheques,
ya que tienes garantia que solo hay un Cheque en Bancos con el mismo numero
con solo poner la condicion de Conciliado='N'
Espero te siva,


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.

Andres escribio:
Hola, estoy haciendo una conciliación bancaria entre un archivo plano
que me envia el banco subido a SQL y una tabla de transacciones
bancarias que tengo en SQL, el objetivo es comparar las dos tablas y
marcar con una bandera las transacciones que no coincidan para generar
un informe de no coincidentes.

La estructura es más o menos así:

Banco Plano
Cheque Valor Cheque Valor
1 $10 1 $10
2 $20 3 $20
3 $15 4 $12
4 $12 5 $24
5 $24 7 $30

en este caso se marcaría el cheque 2 en la tabla del banco y el 7 en
la tabla del archivo plano, eso no tiene mucho problema en hacerse,
simplemente se comparan y con un update se marcan los que coincidan y
el resto son los que no coinciden.

La instrucción para la tabla del banco sería algo así:

update banco set banco.conciliado = 'Y'
from banco inner join plano on
banco.cheque = plano.cheque and banco.valor = plano.valor

esto lo puedo hacer tambien para la otra tabla pero no se como hacerlo
para las dos en la misma instrucción, pero este no es el problema.

El problema se da en el siguiente caso:

Banco Plano
Cheque Valor Cheque Valor
1 $10 1 $10
2 $20 3 $20
2 $20 4 $12
3 $15 5 $24
4 $12 7 $30
5 $24

Puede darse el caso de que existan dos documentos con el mismo número
y el mismo valor en la tabla del banco (supuestamente es una anulación
del cheque), y cuando corro el update se comparan los dos registros de
la tabla de bancos con el registro de la tabla del archivo plano, y
necesito que se compare uno solo, para saber que sobra uno en la tabla
del banco.

Si sólo se tratara de seleccionar pues lo haria con un dinstinct pero
en un update no puedo utilizarlo.

Alguna idea? Gracias.

Preguntas similares