Mysql, Sumar en sentencia SqlExec

411 views
Skip to first unread message

Arnaldo Toledano

unread,
Jun 29, 2011, 1:30:09 PM6/29/11
to publice...@googlegroups.com
Le traslado la pregunta de un colega que a mi se  me planteo y creí que no tenia solución.
Por allí me dijeron que si.

Tengo un problema por solucionar en mysql, necesito
hacer una consulta donde se valla calculando el saldo registro a registro.
fecha debe haber saldo(no se como se hace en la consulta)
Fecha            Debe         Haber    Saldo
01/11             100                         100
02/11                                 5            95
03/11                10                         105
04/11                                  5         100
yo puedo hacer operaciones dentro del cursor y calcularlo, pero no
quiero hacelo de esa manera. Le pido ayuda al que pueda darme una mano.
Gracias a todos.
--
Arnaldo Toledano
Tesys Informática
Córdoba
Argentina

Richard Gaviria

unread,
Jun 29, 2011, 1:43:15 PM6/29/11
to publice...@googlegroups.com
Deberia ser algo asi:

finicio=ctod("01/11/2011")
ftermino=ctod("04/01/2011")=sqlexec(gnConn,'SELECT SUM (horas) FROM usuarios WHERE fecha between ?finicio and ?ftermino','MyCursor')

Saludos

Rick.


Date: Wed, 29 Jun 2011 14:30:09 -0300
From: arnaldo....@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Mysql, Sumar en sentencia SqlExec

Arnaldo Toledano

unread,
Jun 29, 2011, 2:40:45 PM6/29/11
to publice...@googlegroups.com
Pero el cursor me trae una SOLA FILA.

Y lo que necesito es tantas filas como las que respondan a la condición del Where

Arnaldo

sergio garcia

unread,
Jun 29, 2011, 2:51:08 PM6/29/11
to publice...@googlegroups.com

Pero el sum no afecta que salga solo una fila?

 

 

______________________________________

Sergio A. García
Gerencia
in...@magicsoft.com.gt

Magicsoft de Guatemala
30 Avenida A 17-80 Zona 7 Villa Linda I, Guatemala / 9 calle 7-65 Zona 1, Jutiapa
Tlf: 5527-4094 · Fax: 7844-3805
in...@magicsoft.com.gt · www.magicsoft.com.gt  skype    

magicblancopecoNo me imprimas si no es necesario. Protejamos el medio ambiente



__________ Información de NOD32, revisión 6248 (20110628) __________

Este mensaje ha sido analizado con NOD32 antivirus system
http://www.nod32.com

image001.png
image002.png
image003.gif

Hugo C.

unread,
Jun 29, 2011, 3:39:09 PM6/29/11
to Comunidad de Visual Foxpro en Español
Intenta agregando la clausula GROUP BY

....
WHERE fecha between ?finicio and ?ftermino
GROUP BY fecha ....

Saludos.

On 29 jun, 12:40, Arnaldo Toledano <arnaldo.toled...@gmail.com> wrote:
> Pero el cursor me trae una SOLA FILA.
>
> Y lo que necesito es tantas filas como las que respondan a la condici�n
> del Where
>
> Arnaldo
>
> El 29/06/2011 02:43 p.m., Richard Gaviria escribi�:
>
>
>
>
>
> > Deberia ser algo asi:
>
> > finicio=ctod("01/11/2011")
> > ftermino=ctod("04/01/2011")=sqlexec(gnConn,'SELECT SUM (horas) FROM usuarios WHERE
> > fecha between ?finicio and ?ftermino','MyCursor')
>
> > Saludos
>
> > Rick.
> >http://www.engineersoftasociados.com
>
> > ------------------------------------------------------------------------
> > Date: Wed, 29 Jun 2011 14:30:09 -0300
> > From: arnaldo.toled...@gmail.com
> > To: publice...@googlegroups.com
> > Subject: [vfp] Mysql, Sumar en sentencia SqlExec
>
> > Le traslado la pregunta de un colega que a mi se  me planteo y cre�
> > que no tenia soluci�n.
> > Por all� me dijeron que si.
>
> > /Tengo un problema por solucionar en mysql, necesito
> > hacer una consulta donde se valla calculando el saldo registro a registro.
> > fecha debe haber saldo(no se como se hace en la consulta)
> > Fecha            Debe         Haber    Saldo
> > 01/11             100                         100
> > 02/11                                 5            95
> > 03/11                10                         105
> > 04/11                                  5         100
> > yo puedo hacer operaciones dentro del cursor y calcularlo, pero no
> > quiero hacelo de esa manera. Le pido ayuda al que pueda darme una mano.
> > Gracias a todos. /
> > --
> > *Arnaldo Toledano
> > Tesys Inform�tica
> > C�rdoba
> > Argentina *
>
> --
> *Arnaldo Toledano Tesys Inform�tica C�rdoba Argentina *- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Arnaldo Toledano

unread,
Jun 29, 2011, 4:50:47 PM6/29/11
to publice...@googlegroups.com
En todos los casos lo que haría, mejor dijo lo hace, es agrupar en una fila de acuerdo a las fechas.

No encuentro la solución


Arnaldo

carlos SALCEDO

unread,
Jun 29, 2011, 4:55:11 PM6/29/11
to publice...@googlegroups.com
hola, en el modelo de tabla donde esta la hora o como es la extructura real de la tabla


Fecha            Debe         Haber    Saldo
01/11             100                         100
02/11                                 5            95
03/11                10                         105
04/11                                  5         100
Bendiciones
Carlos


Date: Wed, 29 Jun 2011 17:50:47 -0300
From: arnaldo....@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Mysql, Sumar en sentencia SqlExec

Arnaldo Toledano

unread,
Jun 29, 2011, 5:13:48 PM6/29/11
to publice...@googlegroups.com
El ejemplo no es una tabla.
Es lo que debo lograr.
La tabla es de cuenta corriente.
La estructura de la tabla es mas o menos la siguiente

CtaCodigo            Código del cliente
CtaFchCom          Fecha del comprobante
CtaFchVto            Fecha de Vencimiento
CtaTipCom            Tipo de Comprobante Recibo, factura, etc
CtaNroCom          Numero de comprobante
CtaMonCom        Monto del comprobante

Con estos datos pretendo lograr lo que mas abajo esta.

Arnaldo

carlos SALCEDO

unread,
Jun 29, 2011, 5:51:44 PM6/29/11
to publice...@googlegroups.com
con cual campo sabemos si es debito o haber o tienes una columna debe y haber




Date: Wed, 29 Jun 2011 18:13:48 -0300

Hugo Carlos Aguilar Zapata

unread,
Jun 29, 2011, 6:31:24 PM6/29/11
to publice...@googlegroups.com
Quizas te pueda servir algo de esto, la consulta puedes aplicarla a tu SQLEXEC y al cursor resultante aplicarle algun calculo.
En la imgen de muestra esta el resultado, a la columna cargo se le resta la columna abono y da un saldo, en la sig. linea al saldo se le suma el cargo y se resta el abono y asi sucesivamente


WITH this
    lstrMoneda = ""
    lstrallMN = ""
    lstrMoneda = .cbo_Moneda.Value
    IF .chk_MN.Value = 0
        lstrallMN = " AND moneda = '" + ALLTRIM(lstrMoneda) + "' "
    ENDIF
************* AQUI SE OBTIENE EL ORGIEN DE DATOS QUE SE MUESTRA EN UN GRID
    IF .optBuscacte.Value = 1
        .grdMovtos.RecordSource = "select nofac, fecha, referencia, concepto, " + ;
            "iif(tipomovto = 'C', cantidad, 000000000.00) as cargo, " + ;
            "iif(tipomovto = 'A', cantidad, 000000000.00) as abono, " + ;
            "000000000.00 as saldo, id, facid, clienteid, anticipoid, bancoid, moneda, tipocambio, tipomovto, origen, cantidad from cartera where empresaid = empresas.id " + ;
            + lstrallMN + "into cursor CurCartMov ReadWrite
"   
    ELSE
        .grdMovtos.RecordSource = "select nofac, fecha, referencia, concepto, " + ;
            "iif(tipomovto = 'C', cantidad, 000000000.00) as cargo, " + ;
            "iif(tipomovto = 'A', cantidad, 000000000.00) as abono, " + ;
            "000000000.00 as saldo, id, facid, clienteid, anticipoid, bancoid, moneda, tipocambio, tipomovto, origen, cantidad from cartera where empresaid = empresas.id " + ;
            "and clienteid = curctescartera.id " + lstrallMN + "into cursor CurCartMov ReadWrite
"   
   
    ENDIF
    SELECT (.DetailAlias)
    lnSaldom = 0
************** AQUI SE RECORRE EL CURSOR RESULTANTE Y HACES EL CALCULO DE
    SCAN
         replace saldo WITH (lnSaldom  + cargo) - abono
         lnSaldom = saldo
    ENDSCAN
    SUM cargo TO .txt_cargom.Value FOR tipomovto = "C"
    SUM abono TO .txt_abonom.Value FOR tipomovto = "A"
    GO TOP
    .txt_saldom.Value = .txt_cargom.Value - .txt_abonom.Value
    .cmd_delmov.enabled = .F.
ENDWITH
cartera.PNG

Jorge Javier Gutierrez

unread,
Jun 29, 2011, 6:41:32 PM6/29/11
to publice...@googlegroups.com, arnaldo....@gmail.com
Hola, en fíjate en este enlace http://www.sqlhacks.com/Retrieve/Calculate-Running-Balance
Uitliza MSSQL, pero a lo mejor se puede hacer con MySql.


Saludos

Arnaldo Toledano

unread,
Jun 29, 2011, 6:46:43 PM6/29/11
to publice...@googlegroups.com
CtaTipCom  , si es R o C es Crédito las demás son débitos.


Arnaldo

Arnaldo Toledano

unread,
Jun 29, 2011, 6:59:53 PM6/29/11
to publice...@googlegroups.com
Interesante.
Parece muy coherente.
No lo he probado todavía, pero la sentencia COALESCE existe en MySQL.

Lo que desconocía por completo es que se puede utilizar SELECT anidados.
Creo haberlo leído por allí, pero nunca lo aplique.
Existe alguien en el Foro que lo haya utilizado ?

Un abrazo a todos.

Arnaldo Toledano

Programas ToP

unread,
Jun 29, 2011, 7:02:28 PM6/29/11
to publice...@googlegroups.com
Suponiendo que tengas una columna con el ID del registro

SELECT id, fecha , debe, haber,
(SELECT SUM(debe-haber) FROM tabla TR2 WHERE TR2.id <= TR1.id)
FROM tabla TR1

Lo he probado con una tabla similar y funciona, incluso muy rápido.

Saludos cordiales

Manuel Tovar Ruiz
Barranquilla - COLOMBIA

Antes de imprimir este correo piensa en la contribución que puedes hacer al medio ambiente.
Please consider your environmental responsibility and commitment before printing.

mpulla

unread,
Jun 29, 2011, 11:16:44 PM6/29/11
to Comunidad de Visual Foxpro en Español
Buenas noches.

Trabajo con Sql Server

Para tener algo similar a lo que necitas:

[Select Cast(0 As SmallInt) As iNo, AF_DepreciaC.iYM As cPeriodo,
AF_DepreciaD.yValor, Sum(t.yValor) As yTotal ] + ;
[From AF_DepreciaC ] + ;
[Inner Join AF_DepreciaD On AF_DepreciaC.iAFDepreciaCId
= AF_DepreciaD.iIdAFDepreciaC ] + ;
[Inner Join (Select AF_DepreciaC.iYM,
AF_DepreciaD.yValor ] + ;
[From AF_DepreciaC ] + ;
[Inner Join AF_DepreciaD On
AF_DepreciaC.iAFDepreciaCId = AF_DepreciaD.iIdAFDepreciaC ] + ;
[Where AF_DepreciaC.iActivo = 1 ] + ;
[And AF_DepreciaD.iIdAF = 278 ] + ;
[) As t On AF_DepreciaC.iYM >= t.iYM ] + ;
[Where AF_DepreciaC.iActivo = 1 ] + ;
[And AF_DepreciaD.iIdAF = 278] + ;
[Group By AF_DepreciaC.iYM, AF_DepreciaD.yValor ] + ;
[Order By AF_DepreciaC.iYM]


Te transcribo algo que encontre la comunidad de Sql Server y es muy
bueno, mil disculpas al autor por no recordar su nombre

Imagínate que tenemos esta tabla:

create table #temp (
transactiondate datetime not null,
debito money not null,
credito money not null
)

Y ahora hacemos esta consulta:

select a.transactiondate, a.debito, a.credito,
sum(b.credito) - sum(b.debito) as saldo
from #temp a join #temp b on a.transactiondate >= b.transactiondate
group by a.transactiondate, a.debito, a.credito
order by a.transactiondate

El problema con esto es que registros con la misma fecha de
transación te enseñaran todos el mismo saldo. Pero si tienes
una columna que es única para toda la tabla, digamos 'clave',
así:

create table #temp (
clave int not null primary key,
transactiondate datetime not null,
debito money not null,
credito money not null
)

Entonces puedes hacer esto:

select a.clave,a.transactiondate, a.debito, a.credito,
sum(b.credito) - sum(b.debito) as saldo
from #temp a join #temp b
on (a.transactiondate = b.transactiondate and a.clave >= b.clave)
or a.transactiondate > b.transactiondate
group by a.transactiondate, a.clave,a.debito, a.credito
order by a.transactiondate, a.clave

Después de haber creado la última tabla #temp de arriba,
con la columna 'clave', prueba las dos consultas con estos datos:

insert #temp values (1,'20080101',1,2)
insert #temp values (2,'20080102',2,3)
insert #temp values (3,'20080103',3,4)
insert #temp values (4,'20080103',4,5)
insert #temp values (5,'20080101',5,6)
insert #temp values (6,'20080101',6,7)

... y verás lo que quiero decir.


Espero te sirva y puedas aplicarlo a MySql
Saludos.
Mauricio Pulla.
Cuenca-Ecuador

Hugo Carlos Aguilar Zapata

unread,
Jun 30, 2011, 9:56:33 AM6/30/11
to publice...@googlegroups.com
Arnaldo por si aun no lo resuelves, aqui un ejemplo con mySQL

"the problem solved for me with your old query idea, that is with the help of"

(SELECT transaction, credit, debit, credit+coalesce((SELECT sum(credit)

FROM act b WHERE b.transaction < a.transaction),0) AS sumCredit,

debit+coalesce((SELECT sum(debit) FROM act b

WHERE b.transaction < a.transaction),0) AS sumDebit,

sumCredit - sumDebit AS Balance FROM act a ORDER BY transaction; )


el post completo en esta dirección
http://www.daniweb.com/web-development/databases/mysql/threads/127644

Arnaldo Toledano

unread,
Jun 30, 2011, 8:16:37 PM6/30/11
to publice...@googlegroups.com
Despu�s de varias idas y venidas llegamos a la siguiente conclusi�n.

En Query de MySQL, funciona perfectamente la siguiente sentencia.

Set @Saldo=0;
Select Campo1,Campo2,Campo3,....,Campo2, (@Saldo:=@Saldo + Debe - Haber)
as Saldo From StpCtacte Where ......

Pero..
En VFP, nos da error.

El error lo manifiesta con el Set @saldo:=0

Alguien sabe como se hace esto ?

Arnaldo


mpulla

unread,
Jun 30, 2011, 10:26:01 PM6/30/11
to Comunidad de Visual Foxpro en Español
Arnaldo

Esta no es sintaxis de VFP.

create un SP en MySql e invocalo desde VFP.

Saludos.
Mauricio.

Arnaldo Toledano

unread,
Jul 1, 2011, 9:43:06 AM7/1/11
to publice...@googlegroups.com
Es decir que no existe otra forma si no es con un SP ?
Maldita sea.
Tendré que ponerme a leer como hacer esto.
Si alguien tiene un Link se lo agradeceré.

Arnaldo

carlos SALCEDO

unread,
Jul 1, 2011, 9:57:36 AM7/1/11
to publice...@googlegroups.com
Arnaldo el siquiente procedimiento te puede dar una idea ademas te dejo estos link

http://sentidoweb.com/2007/06/20/laboratorio-triggers-y-procedimientos-almacenados-en-mysql.php
http://www.nosolocodigo.com/procedimientos-almacenados-con-mysql-5

Bendiciones
Carlos


********************************************************
CREATE DEFINER=`root`@`localhost` PROCEDURE `Sfmanipuleo`(in fi date,ff date,vlr20 decimal(10.2),vlr40 decimal(10.2),tasa decimal(10.2))
BEGIN

declare   xfi date ;
declare   xff date ;
declare   xvlr20 decimal(10.2);
declare   xvlr40 decimal(10.2);
declare   xtasa  decimal(10.2);


set xfi = fi;
set xff = ff;
set xvlr20 = vlr20 ;
set xvlr40 = vlr40 ;
set xtasa = tasa ;


SELECT prepto.codigo,prepto.sigla,prepto.n_cont,prepto.digito,prepto.tamaño,prepto.f_ingreso,
salida.f_ingreso as fsalida,concat(prepto.motonave,' ',prepto.viaje)as buque,
IF(prepto.f_ingreso IS NULL or prepto.f_ingreso < xfi ,0,if(prepto.tamaño='20',xvlr20*xtasa,xvlr40*xtasa))AS VALORE,
IF(salida.f_ingreso IS NULL or salida.f_ingreso < xfi ,0,if(prepto.tamaño='20',xvlr20*xtasa,xvlr40*xtasa))AS VALORS
FROM prepto left outer join salida on prepto.codigo = salida.ppto
WHERE (salida.f_ingreso BETWEEN xfi and xff )
 OR (prepto.f_ingreso BETWEEN xfi and xff)
ORDER BY prepto.f_ingreso,prepto.codigo;

END

*************************************************************************************************************************************


Date: Fri, 1 Jul 2011 10:43:06 -0300

From: arnaldo....@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Mysql, Sumar en sentencia SqlExec

Programas ToP

unread,
Jul 7, 2011, 9:58:36 AM7/7/11
to publice...@googlegroups.com
Qu� m�dulos redistribuibles hay que incluir en el instalador de un
ejecutable para poder utilizar el ReportListener

Saludos cordiales

Manuel Tovar Ruiz
Barranquilla - COLOMBIA

Antes de imprimir este correo piensa en la contribuci�n que puedes hacer al medio ambiente.


Please consider your environmental responsibility and commitment before printing.


El 30/06/2011 07:16 p.m., Arnaldo Toledano escribi�:

Cesar VfpImaging

unread,
Jul 7, 2011, 11:23:45 AM7/7/11
to Comunidad de Visual Foxpro en Español
Depende,
Para que finalidad necesitas del listener ?

Normalmente, tienes que agregar los archivos:

_ReportListener.vcx / vct
_Reports.H
_FRXCursor.vcx / vct
_FRXCursor.H
FoxPro_Reporting.H
ReportListeners.H
> > Arnaldo- Ocultar texto de la cita -

Programas ToP

unread,
Jul 7, 2011, 11:24:02 AM7/7/11
to publice...@googlegroups.com
Gracias Cesar por responder, muy amable.

Utilizo el listener para generar una imagen de un reporte.
Tengo agregada la libreria de clases _ReportListener en mi proyecto pero
al ejecutar en el cliente aparece el error de
"archivo no existe".

Saludos cordiales

Manuel Tovar Ruiz
Barranquilla - COLOMBIA

Antes de imprimir este correo piensa en la contribuci�n que puedes hacer al medio ambiente.
Please consider your environmental responsibility and commitment before printing.


El 07/07/2011 10:23 a.m., Cesar VfpImaging escribi�:

mario fernandez

unread,
Jul 1, 2011, 12:04:15 PM7/1/11
to publice...@googlegroups.com
Tienes que correr primer el sqlexec(<conexion>,"Set @Saldo=0","")
 
Luego ejecutas sqlexec(<conexion>,"Select Campo1,Campo2,Campo3,....,Campo2, (@Saldo:=@Saldo + Debe - Haber)
as Saldo From StpCtacte Where ......","c_cursor")

 
Luego de mucho tiempo logre que me funcione de esta forma...y realmente con el uso de variables se resuelven monton de situaciones
 
 
Mario Fernandez


 

Date: Fri, 1 Jul 2011 10:43:06 -0300
From: arnaldo....@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Mysql, Sumar en sentencia SqlExec

Reply all
Reply to author
Forward
0 new messages