Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

problema con una consulta contable

Estas en el tema de problema con una consulta contable en el foro de Bases de Datos General en Foros del Web. compañeros soy un poco nuevo en lo que se refiere a programacion en php y me salio el siguiente dilema tengo que seleccionar solamente los ...
  #1 (permalink)  
Antiguo 19/10/2010, 15:10
 
Fecha de Ingreso: octubre-2010
Mensajes: 4
Antigüedad: 14 años, 1 mes
Puntos: 0
Exclamación problema con una consulta contable

compañeros soy un poco nuevo en lo que se refiere a programacion en php y me salio el siguiente dilema tengo que seleccionar solamente los registros no duplicados de una una base de datos contable, no importa si estan los registros al debe o al haber, mi problema es que cuando se paga el programa original agrega una linea nueva con los mismos datos pero cargando la informacion al contrario del registro anterior.ejemplo

CHN Cheque no Garantizado 7391 02-07-2009 0:00:00 CHEQUES EN CARTERA 07-08-2009
0:00:00 21 145478 (debe) 0
CHN Cheque no Garantizado

7391 08-08-2009 0:00:00 CHEQUES EN CARTERA 07-08-2009 0:00:00 21 0 145478 (haber).

si se fijan hay el registro contablemente cuadra y hay 2 registros en donde se refleja lo adeudado y lo pagado.

el problema que al haber 2 registros en donde las columas debe y haber no son iguales al utilizar la clausula distinct me muestras las 2 ya que no son iguales y no he podido lograr que me muestre lo que deseo.

lo que deberia mostrar es algo asi

tabla original
campo1 debe haber
222 1 0
223 1 0
224 0 1
222 0 1

consulta

solo mostrar

campo1 debe haber
223 1 0
224 0 1

ya que el registro 222 ya esta cuadrado al cruzar el debe de la linea 1 con el haber de la linea 4 ya que contablemente hay estaria pagado y mi consulta no lo deberia mostrar..


adjunto la instruccion sql que estoy usando.


SELECT TIDOC_DB.NOMBRE,DOCU_DB.NUMFACT,fecha,sum(debe)as deb,sum(haber)as hab, sum((DOCU_DB.DEBE - DOCU_DB.HABER))as total
FROM CLIEN_DB INNER JOIN DOCU_DB
ON CLIEN_DB.NREGUIST = DOCU_DB.NRUTFACT
INNER JOIN
TIDOC_DB ON DOCU_DB.TDOCNETEO = TIDOC_DB.NUM

WHERE (DOCU_DB.NRUTFACT = '4990') and (FECHA BETWEEN '01/01/2005' AND '31/12/2010')


group by numfact,codigo,nombre,fecha
having sum((DOCU_DB.DEBE - DOCU_DB.HABER)) <> 0
order by TIDOC_DB.CODIGO,DOCU_DB.NUMFACT.

espero que me puedan guiar en esta consulta ya que como es un sistema contable simpre va ha realizar de esta forma los pagos y necesito mostrar lo pendiente fuera del sistema ya que mi jefe de local no sabe contabilidad y se enrreda y ya esta dejando la zorra con las cobranzas.
  #2 (permalink)  
Antiguo 19/10/2010, 15:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Tema movido desde PHP a Bases de Datos
  #3 (permalink)  
Antiguo 19/10/2010, 16:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: problema con una consulta contable

Yo veo dos formas básicas de lograrlo.
1) Con una cláusula poco usada que es la de OR exclusivo: XOR. Esta cláusula solo da TRUE cunado uno solo de los dos parámetros es TRUE.
En este caso podría ser:
Código MySQL:
Ver original
  1.   TIDOC_DB.NOMBRE,
  2.   DOCU_DB.NUMFACT,
  3.   fecha,
  4.   SUM(debe) deb,
  5.   SUM(haber) hab,
  6.   SUM((DOCU_DB.DEBE - DOCU_DB.HABER)) total
  7.   CLIEN_DB INNER JOIN DOCU_DB ON CLIEN_DB.NREGUIST = DOCU_DB.NRUTFACT
  8.   TIDOC_DB ON DOCU_DB.TDOCNETEO = TIDOC_DB.NUM
  9.   (DOCU_DB.NRUTFACT = '4990')
  10.   AND
  11.   (FECHA BETWEEN '01/01/2005' AND '31/12/2010')
  12.   AND
  13.   (DOCU_DB.DEBE XOR DOCU_DB.HABER)
  14. GROUP BY  numfact, codigo, nombre, fecha
  15. HAVING SUM((DOCU_DB.DEBE - DOCU_DB.HABER)) <> 0
  16. ORDER BY TIDOC_DB.CODIGO,DOCU_DB.NUMFACT

2) Puedes usar el mismo HAVING que usas, pero agregando una condición:
Código MySQL:
Ver original
  1.   TIDOC_DB.NOMBRE,
  2.   DOCU_DB.NUMFACT,
  3.   fecha,
  4.   SUM(debe) deb,
  5.   SUM(haber) hab,
  6.   SUM((DOCU_DB.DEBE - DOCU_DB.HABER)) total
  7.   CLIEN_DB INNER JOIN DOCU_DB ON CLIEN_DB.NREGUIST = DOCU_DB.NRUTFACT
  8.   TIDOC_DB ON DOCU_DB.TDOCNETEO = TIDOC_DB.NUM
  9.   (DOCU_DB.NRUTFACT = '4990')
  10.   AND
  11.   (FECHA BETWEEN '01/01/2005' AND '31/12/2010')
  12. GROUP BY  numfact, codigo, nombre, fecha
  13. HAVING SUM((DOCU_DB.DEBE - DOCU_DB.HABER)) IN(0,1)
  14. ORDER BY TIDOC_DB.CODIGO,DOCU_DB.NUMFACT
o bien:
Código MySQL:
Ver original
  1.   TIDOC_DB.NOMBRE,
  2.   DOCU_DB.NUMFACT,
  3.   fecha,
  4.   SUM(debe) deb,
  5.   SUM(haber) hab,
  6.   SUM((DOCU_DB.DEBE - DOCU_DB.HABER)) total
  7.   CLIEN_DB INNER JOIN DOCU_DB ON CLIEN_DB.NREGUIST = DOCU_DB.NRUTFACT
  8.   TIDOC_DB ON DOCU_DB.TDOCNETEO = TIDOC_DB.NUM
  9.   (DOCU_DB.NRUTFACT = '4990')
  10.   AND
  11.   (FECHA BETWEEN '01/01/2005' AND '31/12/2010')
  12. GROUP BY  numfact, codigo, nombre, fecha
  13. HAVING (DOCU_DB.DEBE + DOCU_DB.HABER)<=1
  14. ORDER BY TIDOC_DB.CODIGO,DOCU_DB.NUMFACT
En fin, hay mchos juegos aritmético-lógicos que se pueden inventar para obtener el filtrado, lo que debes hacer es analizar qué condición se cumple exclusivamente con los registros que debes eliminar, y usar esa condición para excluirlos...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 22/10/2010, 07:37
 
Fecha de Ingreso: octubre-2010
Mensajes: 4
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: problema con una consulta contable

muchas gracias si funciona pero le encontrado algunas fallas pero es con lo que deseo que muestre.... estoy trabajando en el resultado final ya queel filtrado funciona correctamente pero estoy haciendo mal el calculo de lo que debe mostrar...

eso ya es diferente.

jajaj.

muy buenos aportes dan en este foro...

gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:26.