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.

Preguntas similare

Leer las respuestas

#6 Carlos Sacristan
27/07/2004 - 15:06 | Informe spam
Las desventajas son las que te comenta Javier (rendimiento,
escalabilidad y mantenimiento). Ten en cuenta que el motor de una base de
datos está pensado para trabajar con conjunto de registros y obligarle a
procesar cada registro de forma individual es ir "contra natura". Los
cursores existen para solucionar situaciones muy puntuales, pero en la mayor
parte de los casos, lo que hace un cursor lo puede hacer una sentencia T-SQL
(más compleja de construir, de acuerdo) con un rendimiento muy superior.

Los cursores facilitan la vida al desarrollador, no al motor, y no se
trata de eso...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Andres" escribió en el mensaje
news:
Y de dónde salen todas esas desventajas que mencionas, si fueron
diseñados para ese fin no debería ser la solución ideal? digo yo...

:-O

Andres

"Javier Loria" wrote in message


news:...
> Hola:
> Si es posible hacerlo con cursores, de hecho fueron disenados para


este
> tipo de situaciones. Si quieres codigo lento, poco escalable y dificil


de
> mantener hazlo con cursores. :D
> Saludos,
>
> 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:
> > Primero gracias por la respuesta.
> >
> > yo podría generar ese índice al momento de importar el archivo plano a
> > SQL, pero se me ocurre que también podría diferenciar los registros de
> > la consulta creando un cursor, en realidad nunca he utilizado uno
> > entonces no se si estaré diciendo alguna estupidez, pero es posible
> > hacerlo con cursores?
> >
> >
> > "Javier Loria" wrote in message
> > news:...
> >> 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.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida