Aplicacion de PAGO a Saldos (me trae frito !!!!)

10/09/2003 - 02:22 por Isaías | Informe spam
Si, es un query que debo crear y me trae frito, ya que
nunca he realizado este tipo que queries.

Tengo una Tabla (CLIENTE), donde tengo

cCuenta char(20),
iSaldo30 numeric(9,2)
iSaldo60 numeric(9,2)

Me envian un archivo texto con movimientos de PAGOS, que
subo mediante BULK INSERT

cCuenta char(20),
iPago numeric(9,2)

Debo APLICAR, el pago, primero al iSaldo60 y si queda
remanente del PAGO, aplicarlo a iSaldo30.

Se que alguien en este foro ya lo hizo, pregunta, ¿Se
podra hacer en un solo Query o debo seguir desarrollando
mis CURSORES?.

Gracias por sus aportaciones

PD: Por eso es que ya no he estado con "ustedes" SNIF !!!

Preguntas similare

Leer las respuestas

#1 Javier Loria
10/09/2003 - 05:25 | Informe spam
Hola Isaías:
Asumiendo que cCuenta es Llave Primaria o Unique not Null en ambas
tablas, y que todos los saldos son no nulos, creo que seria asi:
/* Codigo de Actualizacion */
UPDATE CLIENTE
SET iSaldo60= CASE WHEN iSaldo60<iPago THEN 0
ELSE iSaldo60-iPago
END,
iSaldo30 ÊSE WHEN iSaldo60<iPago
THEN
iSaldo30-(iPago-iSaldo60)
ELSE iSaldo30
END
FROM Cliente JOIN Pagos ON
Cliente.cCuenta=Pagos.cCuenta
/* Fin de codigo de Actualizacion */
La restriccion de requerir Llave Primaria sobre la tabla de Pagos puede ser
excesiva, en ese caso tendras que reemplazar el JOIN Pagos ON con

JOIN (SELECT cCuenta, SUM(iPago) AS iPago
FROM Pagos
GROUP BY cCuenta) ON


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.
Isaías escribio:
Si, es un query que debo crear y me trae frito, ya que
nunca he realizado este tipo que queries.

Tengo una Tabla (CLIENTE), donde tengo

cCuenta char(20),
iSaldo30 numeric(9,2)
iSaldo60 numeric(9,2)

Me envian un archivo texto con movimientos de PAGOS, que
subo mediante BULK INSERT

cCuenta char(20),
iPago numeric(9,2)

Debo APLICAR, el pago, primero al iSaldo60 y si queda
remanente del PAGO, aplicarlo a iSaldo30.

Se que alguien en este foro ya lo hizo, pregunta, ¿Se
podra hacer en un solo Query o debo seguir desarrollando
mis CURSORES?.

Gracias por sus aportaciones

PD: Por eso es que ya no he estado con "ustedes" SNIF !!!
Respuesta Responder a este mensaje
#2 Isaías
10/09/2003 - 17:39 | Informe spam
Javier

Muchas gracias por responder, pondre en practica tu
recomendacion y te dire como es que quedaron las pruebas.

Como siempre, muchas gracias.
Respuesta Responder a este mensaje
#3 Isaías
11/09/2003 - 02:01 | Informe spam
Hola Javier

Oye tengo duda en el segundo CASE, no deberia estar asi:

/* Inicio de codigo de Actualizacion */
UPDATE CLIENTE
SET iSaldo60= CASE WHEN iSaldo60<iPago THEN 0
ELSE iSaldo60-iPago
END,
iSaldo30 ÊSE WHEN iSaldo60 < (iPago-iSaldo60)
THEN
iSaldo30 -(iPago-iSaldo60)
ELSE iSaldo30
END
FROM Cliente JOIN Pagos ON
Cliente.cCuenta=Pagos.cCuenta
/* Fin de codigo de Actualizacion */
Respuesta Responder a este mensaje
#4 Isaías
11/09/2003 - 03:10 | Informe spam
Hola Javier (las 20:27 y yo trabajando)

Resulta ser que si salieron mas de UN PAGO (AJUSTE) por
cuenta, entonces, rectificando tu observacion, tendre que
substituir este codigo.

JOIN (SELECT cCuenta, SUM(iPago) AS iPago
FROM Pagos
GROUP BY cCuenta) ON

¿Unicamente ese codigo, Cierto?, Gracias
Respuesta Responder a este mensaje
#5 Javier Loria
11/09/2003 - 03:11 | Informe spam
Hola Isaías:
Podria ser, no estoy seguro.
La logica que trate de implementar para el segundo CASE
a) Si pago mas que el Saldo a 60 Dias entonces abone la diferencia al
Saldo de 30.
b) Si pago menos deje el Saldo igual.
Ejemplos:
a) Abono menor que el Saldo de 60
Saldo3000, Saldo60 00, AbonoP0
El primer CASE usa el ELSE porque 2000<500 es Falso.
ISaldo60 00-50000
El Segundo CASE usa tambien el ELSE porque 2000<500 es Falso.
ISaldo3000.
b) Abono Mayor o igual que el Saldo de 60.
Saldo3000, Saldo60 00, Abono%00
El primer CASE usa el primer then porque 2000<2500 es Verdadero,
ISaldo60=0
El Segundo CASE usa el primer then porque 2000<500 es
Verdadero.ISaldo3000-(2500-2000)P0

Un caso que no contemple es la posiblidad de que el Abono sea mayor que los
Saldos de 30 y 60. En ese caso debes decidir si quieres dejar el saldo de 30
en 0 o en negativo. Asi como esta lo deja en negativo.

Tambien es posible que el Saldo de 30 incluya dentro de sus montos el saldo
de 60 en cuyo caso NO es necesario el CASE, simplemente restas el pago.
iSaldo30 =iSaldo30-iPago
Espero haber entendido,


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.
Isaías escribio:
Hola Javier

Oye tengo duda en el segundo CASE, no deberia estar asi:

/* Inicio de codigo de Actualizacion */
UPDATE CLIENTE
SET iSaldo60= CASE WHEN iSaldo60<iPago THEN 0
ELSE iSaldo60-iPago
END,
iSaldo30 ÊSE WHEN iSaldo60 < (iPago-iSaldo60)
THEN
iSaldo30 -(iPago-iSaldo60)
ELSE iSaldo30
END
FROM Cliente JOIN Pagos ON
Cliente.cCuenta=Pagos.cCuenta
/* Fin de codigo de Actualizacion */
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida