Ver Mensaje Individual
  #3 (permalink)  
Antiguo 19/10/2010, 16:01
Avatar de gnzsoloyo
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)