Consulta de SQL para generar un balance de cliente usando tres tablas

151 views
Skip to first unread message

sistecsoft

unread,
Apr 15, 2012, 5:29:18 PM4/15/12
to Comunidad de Visual Foxpro en Español
Hola.

Tengo tres tablas que contienen los datos del cliente, factura y
detalle de los pagos realizados a cada factura, el caso es que quiero
generar un listado donde me aparescan los siguientes datos:

Codigo Cliente, Nombre, Cantidad de facturas pendiente, Balance del
Cliente

Las tablas tienen los siguientes campos o estructra

Cliente (Codigo_cli, Nombre, Direccion,telefono)

Factura (Numerofac, codigo_cli, valor,estado ) &&&& Estado= I
esta pendiente Estado= S esta salda

Detallepago (Numerofac, valorpago, descuento)



Este SQL lo uso en Visual Fox Pro 9

Gracias

MármolSoft

unread,
Apr 15, 2012, 5:45:12 PM4/15/12
to Comunidad de Visual Foxpro en Español
Si entendí bien tu consulta probá con:


Select c.código_cli, c.nombre, count(f.numerofac) as
cantidadpendientes, sum(f.valor) as saldopendiente ;
from clientes c, factura f;
where c.código_cli=c.código_cli .and. f.estado=i;
into cursor consulta

Suerte


Marcelo

sistecsoft

unread,
Apr 15, 2012, 6:26:48 PM4/15/12
to Comunidad de Visual Foxpro en Español
Gracias Marcelo, pero el caso es que en el momento de la consulta es
que se genera el balance pendiente de la factura, ya que el balance
pendiente no esta almacenado en ninguna tabla.

El balancependiente = factura.valor-(detallepago.valor
+datallepago.descuento)

Gracias por tu ayuda.

mpulla

unread,
Apr 15, 2012, 9:24:38 PM4/15/12
to publice...@googlegroups.com
Entiendo que estas trabajando con Sq

mpulla

unread,
Apr 15, 2012, 9:26:23 PM4/15/12
to publice...@googlegroups.com

Sorry se me fue el mensaje sin terminar.

Entiendo que estas trabajando con Sq Server

No tengo data para probar pero pienso que funciona

Select t.codigo_cli, c.Nombre, COUNT(t.Numerofac) As facturas_pendiente, Sum(t.nPendiente) As nPendiente
From Cliente c Inner Join
(
Select f.codigo_cli, f.Numerofac
f.Valor -
ISNULL ((Select Sum(valorpago + descuento)
          From Detallepago
           Where Detallepago.Numerofac = f.Numerofac
         )
        , 0) As nPendiente
From Factura f
Where f.estado = 'I'
) as t
Group by t.codigo_cli, c.Nombre

Saludos.
Mauricio

mpulla

unread,
Apr 15, 2012, 10:03:36 PM4/15/12
to publice...@googlegroups.com
Mil disculpas me falto On c.codigo_cli = t.codigo_cli, lo corrigo


Select t.codigo_cli, c.Nombre, COUNT(t.Numerofac) As facturas_pendiente, Sum(t.nPendiente) As nPendiente
From Cliente c Inner Join
(
Select f.codigo_cli, f.Numerofac
f.Valor -
ISNULL ((Select Sum(valorpago + descuento)
          From Detallepago
           Where Detallepago.Numerofac = f.Numerofac
         )
        , 0) As nPendiente
From Factura f
Where f.estado = 'I'
) as t
On c.codigo_cli = t.codigo_cli
Group by t.codigo_cli, c.Nombre

Espero te sirva.

Saludos.
Mauricio.

sistecsoft

unread,
Apr 16, 2012, 7:32:33 AM4/16/12
to Comunidad de Visual Foxpro en Español
Gracias Mauricio.
En realidad no se que puede estar mal, pero al momento de querer usar
la consulta me dice que hay un error de sintaxis, si prefiere puedo
enviarta las tres tablas con datos y así puede ayudarme un poco mas, y
de verdad que te agradezco lo que esta haciendo.

mpulla

unread,
Apr 16, 2012, 9:18:25 AM4/16/12
to publice...@googlegroups.com
Hola.

Si es es Sql Server tendrias que mandar la db completa.
Que version de Sql Server usas?

Saludos.
Mauricio

sistecsoft

unread,
Apr 16, 2012, 9:37:19 AM4/16/12
to Comunidad de Visual Foxpro en Español
Gracias por tu repuesta.
Uso la base de datos de visual fox.
Para el caso son 3 tablas DBF.

En este caso solo tendría que pasarte esas tres tablas.

mpulla

unread,
Apr 16, 2012, 10:33:37 AM4/16/12
to publice...@googlegroups.com

Este Sql te corre en VFP 9.0,

Debe haber formas más fáciles de hacer pero se me ocurre esta.


Select t.codigo_cli, c.Nombre, COUNT(t.Numerofac) As facturas_pendiente, Sum(t.nPendiente) As nPendiente;
From Cliente c Inner JOIN ;
(;
Select f.codigo_cli, f.Numerofac,;
f.Valor - NVL((Select Sum(valorpago + descuento);
                From Detallepago;
                 Where Detallepago.Numerofac = f.Numerofac), 0) As nPendiente;

From Factura f;
Where f.estado = 'I';
) as t;
On c.codigo_cli = t.codigo_cli;
Group by t.codigo_cli, c.Nombre

Saludos.
Mauricio

sistecsoft

unread,
Apr 16, 2012, 11:08:10 AM4/16/12
to Comunidad de Visual Foxpro en Español
Perfecto excelente funciona este código.

Gracias Mauricio.

sistecsoft

unread,
Apr 16, 2012, 12:12:04 PM4/16/12
to Comunidad de Visual Foxpro en Español
Perfecto excelente funciona este código.

Una ultima pregunta Mauricio.
Porque al agregarle mas campos (telefono, rnc) de la tabla del cliente
en la primera fila del código, sin quitar nada de lo que ya esta
puesto, entonces al correrlo me da un error de Group que dice :
SQL: GROUP BY CLAUSE IS MISSING OR INVALID

Pablo Daniel Lissa

unread,
Apr 16, 2012, 1:11:12 PM4/16/12
to Comunidad de Visual Foxpro en Español
Hola:

La cláusula GROUP BY generalmente se usa cuando existen funciones de
cálculo, como COUNT o SUM en el ejemplo que puso Mauricio. Es
necesario que GROUP BY incluya todos aquellos campos que se
seleccionen (estén luego de la cláusula SELECT) y no sean calculados
(es decir, que no se corresponden con COUNT, SUM o cualquier otra
función).

Aunque sepas coloquialmente que el cliente tiene un único teléfono, la
consulta no lo sabe, y debe asegurarse de que no existan ambigüedades
si se llega a encontrar, por ejemplo con dos teléfonos para un mismo
cliente.

En el mismo ejemplo del cliente con dos teléfonos. Si este escenario
se da, y pudiera agrupar solamente por el código, ¿cuál sería el
teléfono que debería mostrar?

Éxitos. Saludos.
------------------------------------------------------------------------------------------------

mpulla

unread,
Apr 16, 2012, 3:26:01 PM4/16/12
to publice...@googlegroups.com
Hola.

Ya te contesto Pablo,

Los campos que agregaste en la cláusula Select ponlos también en la cláusula Group By.


Saludos.
Mauricio

sistecsoft

unread,
Apr 17, 2012, 10:57:11 AM4/17/12
to Comunidad de Visual Foxpro en Español
Gracias, Resuelto este caso.
Reply all
Reply to author
Forward
0 new messages