Problema con calculo de ganancias por mes SQL

175 views
Skip to first unread message

Sergio Cisak

unread,
Nov 11, 2013, 4:49:49 PM11/11/13
to publice...@googlegroups.com
Hola gente, la sitaucion es que tengo un combo cargado con los meses del anio (Enero, febrero, etc) y en base a lo que seleccione en el, tengo una secuencia CASE que me asigna el valor en numero correspondiente a ese mes. Por ejemplo, Enero, seria 01. (Ver codigo mas abajo). Todo el codigo esta en el boton Buscar, que deberia retornar la ganancia de dicho mes seleccionado nada mas. Pero no aparece ningun error, ni resultados, ni nada similar. El text en donde deberia mostrar el resultado del calculo, permanece vacio.
Aqui les dejo el codigo para que lo vean a ver si me pueden dar una mano. Gracias desde ya!

DO CASE
    CASE this.Parent.combo1.Value = 'enero'
        thisform.nro_mes='01'
    CASE this.Parent.combo1.Value = 'febrero'
        thisform.nro_mes='02'
    CASE this.Parent.combo1.Value = 'marzo'
        thisform.nro_mes='03'
    CASE this.Parent.combo1.Value = 'abril'
        thisform.nro_mes='04'
    CASE this.Parent.combo1.Value = 'mayo'
        thisform.nro_mes='05'
    CASE this.Parent.combo1.Value = 'junio'
        thisform.nro_mes='06'
    CASE this.Parent.combo1.Value = 'julio'
        thisform.nro_mes='07'
    CASE this.Parent.combo1.Value = 'agosto'
        thisform.nro_mes='08'   
    CASE this.Parent.combo1.Value = 'septiembre'
        thisform.nro_mes='09'
    CASE this.Parent.combo1.Value = 'octubre'
        thisform.nro_mes='10'
    CASE this.Parent.combo1.Value = 'noviembre'
        thisform.nro_mes='11'
    CASE this.Parent.combo1.Value = 'diciembre'
        thisform.nro_mes='12'
ENDCASE

SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.Pxmayor)) AS ganancia;
FROM detalle,maestro;
WHERE MONTH(maestro.fecha)=thisform.nro_mes AND maestro.idmaestro=detalle.idmaestro;
INTO CURSOR totales

thisform.container1.text1.Value=totales.ganancia
thisform.refresh

Fidel Charny

unread,
Nov 11, 2013, 4:59:29 PM11/11/13
to publice...@googlegroups.com
month(fecha) retorna un numérico, por lo que thisform.nro_mes debería ser numérico. Además deberías tomar el año en alguna parte. Por qué tu combo no tiene dos columnas, una con el número de mes y boundColumn=2 y tomas el Value del combo como Val(this.parent.combo.Value) (nMes)? Y no tienes que hacer ese extraño do case.

Fidel Charny

unread,
Nov 11, 2013, 5:13:27 PM11/11/13
to publice...@googlegroups.com
Aunque en realidad, si preguntas this.parent.combo1.listItemId, te va a dar el número de mes.

Yo utilizo esto, pero me parece más complicado.
thisform.NroMes=transform(month(date()))
lcMes="Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre"
LOCAL ARRAY gaMes(1)
ALINES(gaMes,lcmes,1,",")
WITH this
.Clear
.BoundColumn=2
.ControlSource='thisform.NroMes'
FOR i=1 TO 12
.AddListItem(gaMes[i],i,1)
.AddListItem(TRANSFORM(i),i,2)
NEXT
.Requery
.Refresh
ENDWITH

HernanCano

unread,
Nov 11, 2013, 5:30:47 PM11/11/13
to publice...@googlegroups.com
Hola, Sergio.

Veo una inconsistenca en este código que muestras.

Veo que los CASE inicializan una propiedad del form (nro_mes) de tipo character...

CASE this.Parent.combo1.Value = 'abril'
        thisform.nro_mes='04'

Pero estás construyendo la condición de la query con
WHERE MONTH(maestro.fecha)=thisform.nro_mes.............

Me parece que la función MONTH() nos entrega una vble de tipo numérico (entre 1 y 12; de hecho es entre 0 y 12... pero bueno)... el tip aquí es mirar el tipo de dato.

Mi conclusión es que el programa te debe estar devolviendo un error de tipos.


Si no estás recibiendo error de tipos, entonces me parece que (1) estás usando algo como una estructura TRY/CATCH, donde dentro del CATCH no hay nada, y por éso no estás recibiendo mensaje de error, o tal vez (2) tienes un objeto/clase y no tienes un método Error, o tal vez (3) tu "manejador general" de errores tiene un simple RETURN (ante este tipo de error).

Verifica en cuál de estas condiciones estás y seguimos......

Miguel Canchas

unread,
Nov 11, 2013, 5:37:30 PM11/11/13
to publice...@googlegroups.com

WHERE RIGHT('0' + ALLTRIM(STR(MONTH(maestro.fecha))),2) =  thisform.nro_mes AND maestro.idmaestro=detalle.idmaestro;

INTO CURSOR totales

 

 

Mejora tu sql, el que estas usando no es estándar….usa inner join, left join….

 

MK

Carlos Alfaro

unread,
Nov 11, 2013, 5:52:08 PM11/11/13
to publice...@googlegroups.com

Saludos estimado amigo:

 

Lo que podes hacer es asignar el valor de la propiedad ListIndex, por ejemplo:

 

SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.Pxmayor)) AS ganancia;
FROM detalle,maestro;

WHERE MONTH(maestro.fecha)= this.Parent.combo1.ListIndex AND maestro.idmaestro=detalle.idmaestro;
INTO CURSOR totales

Bendiciones.

 

Carlos Alfaro

HernanCano

unread,
Nov 11, 2013, 5:53:08 PM11/11/13
to publice...@googlegroups.com, mcan...@ximesa.com
Hola, Miguel. Permíteme te consulto.

>>>...Mejora tu sql, el que estas usando no es estándar….usa inner join, left join….

Quisiera que me ayudaras a entender: ¿por qué en este caso es muy conveniente usar JOINs?


Miguel Canchas

unread,
Nov 11, 2013, 6:02:40 PM11/11/13
to HernanCano, publice...@googlegroups.com

Antiguamente se usaba de esa manera, lo cual (yo) no le veo cierto orden ya que pones las tablas en una línea sucesiva separada por una coma y después de todo eso recién empiezas a enlazarlo, en cambio con el estándar es mas ordenado tabla que usas le das su enlace…y te das cuenta mas rápido si hubiera un error… además es lo mas recomendado… perdona estoy de salida del trabajo y además hoy es mi cumpleaños…

 

MK

mpulla

unread,
Nov 11, 2013, 9:40:12 PM11/11/13
to publice...@googlegroups.com, HernanCano, mcan...@ximesa.com
Hola Miguel.

Feliz cumpleaños.

Hernán como dice Miguel, usar el estándar es más legible, compara

SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.
Pxmayor)) AS ganancia;
FROM detalle,maestro;
WHERE MONTH(maestro.fecha)=thisform.nro_mes AND maestro.idmaestro=detalle.idmaestro;
INTO CURSOR totales

SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.Pxmayor)) AS ganancia;
FROM detalle INNER JOIN maestro ON detalle.idmaestro = maestro.idmaestro;
WHERE MONTH(maestro.fecha)=thisform.nro_mes ;
INTO CURSOR totales

Sergio, revisa que haya data que cumpla con el sql y que la variable que almacenas en thisform.nro_mes sea lo que piensas, en lo personal cambiaría la propiedad thisform.nro_mes por una variable.

Local limes as integer
limes = This.Parent.Combo1.ListIndex


SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.Pxmayor)) AS ganancia;
FROM detalle INNER JOIN maestro ON detalle.idmaestro = maestro.idmaestro;
WHERE MONTH(maestro.fecha)=limes;
INTO CURSOR totales

Saludos.
Mauricio

Daniel Sánchez

unread,
Nov 15, 2013, 8:33:55 AM11/15/13
to Comunidad de Visual Foxpro en Español
Hola Sergio, hace varios días de tu post pero recién lo leo, primero tienes mucho código por ahí por lo que te recomendaría esto

en el ini de tu combo pondrías this.additem("Enero")... así para todos los meses es decir 12 veces el additem, y en el value lo iniciaría con 1 o con month(date()) para que me seleccione el mes actual, eso depende de la necesidad que tengas, y más nada después para armar tu consulta podrías tener algo como esto

SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.Pxmayor)) AS ganancia;
FROM detalle,maestro; 
WHERE MONTH(maestro.fecha)=thisform.combomes.value AND maestro.idmaestro=detalle.idmaestro;
INTO CURSOR totales

aunque viendo tu consulta no cumple el estándar sql actual así que lo cambiaría algo como esto, ya que la misma estructura te podría servir para cualquier motor de bd

SELECT SUM(detalle.subtotal - (detalle.cantidad*detalle.Pxmayor)) AS ganancia;
FROM detalle
inner join maestro on maestro.idmaestro=detalle.idmaestro ; 

WHERE MONTH(maestro.fecha)=thisform.nro_mes
INTO CURSOR totales

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú
Reply all
Reply to author
Forward
0 new messages