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

#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.
Respuesta Responder a este mensaje
#2 afranco_73
26/07/2004 - 23:09 | Informe spam
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?

Andres

"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.
Respuesta Responder a este mensaje
#3 Javier Loria
27/07/2004 - 02:45 | Informe spam
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.
Respuesta Responder a este mensaje
#4 Javier Loria
27/07/2004 - 02:48 | Informe spam
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.
Respuesta Responder a este mensaje
#5 afranco_73
27/07/2004 - 14:58 | Informe spam
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.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida