Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Calcular ganancias por Mes

Estas en el tema de Calcular ganancias por Mes en el foro de Visual Basic clásico en Foros del Web. Hola a todos! Vuelvo a recurrir a ustedes con la esperanza de que puedan ayudarme con una duda que me quita el sueño Resulta que ...
  #1 (permalink)  
Antiguo 27/11/2009, 19:57
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Calcular ganancias por Mes

Hola a todos!
Vuelvo a recurrir a ustedes con la esperanza de que puedan ayudarme con una duda que me quita el sueño

Resulta que deseo calcular las ganancias del mes. Tengo una tabla llamada 'ventas' de donde voy a sacar la información para poder realizarlo.
Dentro de la tabla 'ventas', tengo un campo para introducir la Fecha y otro para introducir el Precio.

La idea es sumar todos los valores del campo Precio y tener en cuenta el campo Fecha para mostrar las ganancias totales por meses.

Así luce la tabla 'ventas':
Fecha
12/12/2009
20/11/2009
20/11/2009
20/11/2009
21/11/2009
21/11/2009
21/11/2009
21/11/2009
25/11/2009

Precio
$ 4,00
$ 1.000,00
$ 1.320,00
$ 1.320,00
$ 100,00
$ 2.000,00
$ 4.995,00
$ 1.500,00
$ 99,00

Como verán, en el mes de Diciembre se hizo solo una venta, mientras que en el mes de Noviembre se realizaron ocho ventas. Mi idea es mostrar en un Formulario que las ganancias de Diciembre fueron de $4,00 y que, en tanto, las ganancias de Noviembre fueron de $12.334,00 (que es el resultado de la suma de todos los valores del mes de Noviembre).

Estoy trabajando sobre un MSFlexgrid, ya sé cómo sumar las filas de una columna, lo hago de la sig. manera:
Código:
ganancias = 0
For i = 1 To MSFlexGrid1.Rows - 1
ganancias = Val(MSFlexGrid1.TextMatrix(i, 8)) + ganancias
Next i
Label3 = ganancias
Pero lo que realmente me gustaría saber es cómo agrupar las ganancias por mes.

¿Creen que es posible realizar esta función?
Desde ya, miles de gracias por su ayuda!
  #2 (permalink)  
Antiguo 28/11/2009, 06:31
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

Te voy a dar una idea que luego la puedes ir desarrollando pero resulta muy simple y además práctica para posteriores cálculos.

Necesitas una Matriz de 12 elementos

Dim Mensuales(12) as Currency

Tomas del elemento Fecha del Grid el mes en una variable

Mes = Month(Grid.TextMatrix(Fila, Columna))

Después sumas el Valor que contiene el Grid en Importe en la Matriz

Mensuales(Mes)=Mensuales(Mes) + Grid.TextMatrix(Fila, Columna)

Si por otra parte tienes una matriz de Labels, en un simple Bucle asignas los valores

For Mes = 1 to 12
Label(Mes)=Mensuales(Mes)
Next

Pretendo sólo darte una idea para que lo veas claro y así analices un poco tus posibles soluciones, sin embargo cualquier duda comentala y la solucionamos.

Saludos
  #3 (permalink)  
Antiguo 28/11/2009, 06:50
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Calcular ganancias por Mes

Y para ser mas simple ¿porque no pones en la misma tabla la venta con el precio?

tabla
id fecha precio
1 12/12/2009 $ 4,00
2 20/11/2009 $ 1.000,00
3 20/11/2009 $ 1.320,00
4 20/11/2009 $ 1.320,00
5 21/11/2009 $ 100,00
6 21/11/2009 $ 2.000,00
7 21/11/2009 $ 4.995,00
8 21/11/2009 $ 1.500,00
9 25/11/2009 $ 99,00


De este modo, puedes selecionar lo que se ha hecho en un mes.
La consulta sql puede ser

Suma el total del precio de noviembre
SELECT sum(precio) FROM tabla WHERE WHERE month(fecha)=11

Lo mismo para diciembre
SELECT sum(precio) FROM tabla WHERE WHERE month(fecha)=12

Un saludo
  #4 (permalink)  
Antiguo 28/11/2009, 13:59
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

Miles de Gracias a ambos por su ayuda!
erbuson: Utilicé el código que me proporcionaste, lo edité un poco y me quedó así:
Código:
Private Sub Command5_Click()
mes = Month(MSFlexGrid1.TextMatrix(i, 6))
Mensuales(mes) = Mensuales(mes) + MSFlexGrid1.TextMatrix(i, 9)
End Sub
Luego quisiera mostrar el resultado en un textbox de nombre 'Text2', para ello hice lo siguiente:
Código:
Private Sub Command5_Click()
mes = Month(MSFlexGrid1.TextMatrix(i, 6))
Mensuales(mes) = Mensuales(mes) + MSFlexGrid1.TextMatrix(i, 9)
Text2(mes) = Mensuales(mes)
End Sub
Como verás, agregué al final una linea para que muestre el resultado dentro del Text2. Pero me marca el sig. error:


gogupe: Gracias por el código, pero lo que no entiendo es cómo mostrar el resultado en un Label o en un Textbox. Hice lo siguiente; dentro de un Command puse esto:
Código:
Private Sub Command4_Click()
    gananciasxmes = "Select sum(PrecioTotal) from ventas where month(Fecha)=11"
    conexion_tablas.Open gananciasxmes, conexion_basedatos
Label1= ???
conexion_tablas.Close
End Sub
No sé que poner en al lado del Label1... Yo siempre uso este codigo para obtener valores desde una base de datos:
Código:
Label1 = conexion_tablas!Codigo
Pero en este caso, el valor no lo obtengo de la base de datos y por eso no sé como hacer para mostrar el resultado en un Label o Textbox.

De nuevo, gracias a ambos y mil disculpas por las molestias.
Un saludo!!
  #5 (permalink)  
Antiguo 28/11/2009, 15:26
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

Si solamente tienes que mostrarlo en Text2 y no se trata de una matriz de controles, tienes que quitar lo que pones de Text2(mes) y dejarlo sólo como Text2 ya que si no el elemento no existe y te produce el error.

Si no tienes claro lo que es una matriz de Controles, me lo dices y te pongo un ejemplo

Saludos
  #6 (permalink)  
Antiguo 28/11/2009, 15:58
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

Exacto, intentaré dejando solo Text2 a ver que pasa.
Y no, no tengo claro lo que es una matriz de controles...
Gracias erbuson, siempre estas ahi
Un saludo
  #7 (permalink)  
Antiguo 28/11/2009, 16:35
 
Fecha de Ingreso: julio-2008
Mensajes: 205
Antigüedad: 15 años, 10 meses
Puntos: 1
Sonrisa Respuesta: Calcular ganancias por Mes

Hola. Es primera vez que respondo aquí y espero hacerlo bien.. Te diré una forma de hacerlo.

Puedes guardar las ventas por mes. Ejempo: Que en un texto se guarde el mes, luego haces una consulta sencilla. Cuando se haga la consulta para el reporte colocas en un combo todos los meses y asi es fácil ya que filtras todas las ventas del mes seleccionado.

Otra forma mas completa es está:

Colocas dos DTPicker y un boton, haces una consulta para eso. Asi seria más completo ya que trabajarias con el año.. Ejemplo de la consulta:

Código:
sql = "Select * From ventas WHERE " & _
            "Fecha Between " & _
                "# " + Fecha_Inicial + " # And # " + Fecha_Final + " #"
Con eso te filtr todas las ventas que se hicieron por ejemplo: desde 12/01/2009 hasta 12/31/2009. Primero mes/día/año.

Espero te sirva. Suerte.
  #8 (permalink)  
Antiguo 28/11/2009, 16:56
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

Te cuento el tema de las matrices de controles.

Cuando estas creando un nuevo proyecto normalmente haces click en el control que quieres situar sobre el proyecto y lo dibujas ahí directamente.

De manera automática el VB te crea controles independientes por ejemplo Text1 Text2 Text3 y asi sucesivamente.

Sin embargo si tu creas un Text1 y para crear el siguiente haces Copiar sobre el mismo que tienes en tu proyecto y le haces Pegar el VB te pregunta si deseas crear una matriz de controles.

Lo que haces cuando creas una matriz de Controles es asignar a la Propiedad Index del control el número tal como corresponderia a un Array Normal como un Dim Importes(12) as Currency pero son controles

Esto te da la posibilidad de tratarlos en un bucle.

Por ejemplo tu creas una Label y le pones de nombre Eti, veras que en la ventana de propiedades de india simplemente Eti informándote que se trata de un Label, sin embargo te vas a la propiedad Index del mismo y le pones 0 (Cero es el primer indice que se puede crear en una matriz) verás que en Propiedades te indica ahora Eti(0) y es a este (0) al que yo me refería en mi ejemplo de tu programa.

Si lo piensas un poco veras las infinitas posibilidades de una matriz de controles, por ejemplo si creas una matriz de TextBox que sean importes, podrías sumarlos todos en un Bucle

Count es una propiedad del control que indica el numero de controles, sin embargo al empezar por 0 debemos restarle 1 ya que si tenemos en Count el valor 5 controles, significa que tenemos los numeros de indice 0, 1, 2, 3 y 4

For Indice = 0 To TextBox.Count -1
Total = Total + val(TextBox(Indice))
Next

Bueno, creo que por ahora tienes suficiente para empezar a asimilar el tema de las matrices de controles. Piensa que sirve para OpcionButton, CommandButton, ...

Seguimos en contacto si lo crees necesario.

Saludos
  #9 (permalink)  
Antiguo 29/11/2009, 00:41
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

principefreddy: Sinceramente no entendí muy bien el código, no sé con exactitud por qué cosa debo reemplazar los #. De todas maneras, miles de gracias por tu ayuda!

erbuson: Muchas gracias por esa excelente explicación, nunca pensé que la matriz de controles fuese tan útil. Me ha quedado claro de que se trata.
Ahora bien, después de crear mi primera matríz me pasa algo muy curioso. Al ejecutar el programa, si bien me calcula el total de ganancias de cada mes, me sale el siguiente error:

Estoy utilizando el siguiente código, dentro de un CommanButton:
Código:
For i = 1 To MSFlexGrid1.Rows - 1
Mes = Month(MSFlexGrid1.TextMatrix(i, 6))
Mensuales(Mes) = Mensuales(Mes) + MSFlexGrid1.TextMatrix(i, 9)
Text2(Mes) = Mensuales(Mes)
Next i
Cuando le doy a 'Depurar', me marca la siguiente línea:
Código:
Mes = Month(MSFlexGrid1.TextMatrix(i, 6))
¿El error puede deberse a que en el MSFlexGrid solamente tengo cargados valores para los meses de Noviembre y Diciembre?
EDITO: No, el error no se debe a eso. Agregué un valor a cada mes y el error persiste.

Agradezco a todos sus ganas de ayudar. La verdad, como digo siempre, es un gusto tratar con gente como ustedes.

Última edición por ASelo182; 29/11/2009 a las 01:00
  #10 (permalink)  
Antiguo 29/11/2009, 01:10
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

Probablemente este error se deba a una cosa que yo no he tenido en cuenta y es en el como pones los datos en el Grid.

Cuando en tu primer mensaje hablas de una Tabla, te refieres a que estas utilizando Bases de Datos ?

Es que el error que indicas parece deberse a que el Grid.TextMatrix(i,6) en donde te produce el mismo podría no tener una Fecha o una fecha correcta.

Debes averiguar en que linea del Grid se produce el error y entonces indícame de que fecha se trata para intentar ayudarte.

Modifica el código de la siguiente manera:

On Error Goto Errores
For i = 1 To MSFlexGrid1.Rows - 1
Mes = Month(MSFlexGrid1.TextMatrix(i, 6))
Mensuales(Mes) = Mensuales(Mes) + MSFlexGrid1.TextMatrix(i, 9)
Text2(Mes) = Mensuales(Mes)
Next i
Exit Sub
Errores:
Msgbox "Se ha producido error al procesar la fecha " & MSFlexGrid1.TextMatrix(i, 6)

Saludos
  #11 (permalink)  
Antiguo 29/11/2009, 01:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

Efectivamente estoy utilizando una Base de datos Acces.
Este es el resultado de usar el código que me proporcionaste:
No muestra ninguna fecha, es como si faltara algúna. Pero como verás en la imagen, está todo en orden. No falta ninguna fecha y todas tienen una estructura correcta.

Pero parece que este error, hasta ahora, no afecta en nada.
  #12 (permalink)  
Antiguo 29/11/2009, 01:53
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

Probablemente el error se produce después de procesar el ID nº 14 ya que el siguiente está en blanco.

No Proceses hasta MSFlexGrid.Rows-1 sino hasta que hasyas procesado todos los registros. La fecha que te produce el error está en blanco.

Deberías hacer antes una comparación y si la fila está en blanco salir del bucle.

Saludos

Última edición por erbuson; 29/11/2009 a las 01:54 Razón: Habia puesto Columna en blanco lo correcto es Fila en blanco
  #13 (permalink)  
Antiguo 29/11/2009, 02:12
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

Perfecto erbuson! Muchas gracias maestro!!
Lamentablemente he detectado otro pequeño error, y es que si tengo un registro en la tabla ventas del mismo mes pero de distinto años lo suma igual. Es decir, si tengo un registro del tipo 02/11/2009 y 06/11/2008 suma los valores de ambos cuando en realidad debería considerar cada año aparte.

¿Existe la posibilidad de usar algo así como Año = Year(MSFlexGrid1.TextMatrix(i, 6))? Si es así, ¿podría agrupar las ganancias también por año?

Un saludo erbuson!!!!

Última edición por ASelo182; 29/11/2009 a las 02:21
  #14 (permalink)  
Antiguo 29/11/2009, 02:26
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Veo que aprendes rápido, efectivamente lo que quieres hacer es correcto ahora la solución es un poco diferente porque lo que no puedes hacer es crear infinitas matrices, bueno poder hacerlo puedes pero no resultará práctico.

Pienso que deberías tener en un textbox por ejemplo el valor del año que quieres calcular y entonces al efectuar el proceso poner el condicionante del año

If Year(MSFlexGrid1.TextMatrix(i, 6)) = TextBoxAño then

.... obtener el mes y seguir grupo de calculos


End If

Tambien podrías hacer antes un proceso de Bucle y comprobar que años tienes en la tabla para permitir al usuario elegir que año desea o forzar su respuesta en un ComboBox desplegable



Saludos
  #15 (permalink)  
Antiguo 29/11/2009, 17:06
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

Gracias maestro, ídolo, capo!
Te cuento que me he inclinado por hacer un Combobox que permite seleccionar el año, luego busca si hay registros para ese año en el Flexgrid y los muestra en la matriz de controles que tan bien me explicaste.

Estuve probando y funciona excelente, solo que hay un pequeño, muy inconveniente y es que si selecciono un año en el que no existen registros, se muestra el mensaje "No hay registros para el mes seleccionado" tantas veces como años hay cargados en el ComboBox.
Si selecciono un año en el que sí hay registros, me muestra el mensaje anteriormente detallado sólo una vez y luego procede a hacer el cálculo y da los valores en los Textbox.

Este es el código que uso
Cita:
Private Sub Command5_Click()
On Error GoTo Errores
For i = 1 To MSFlexGrid1.Rows - 1
If Year(MSFlexGrid1.TextMatrix(i, 6)) = Combo1 Then
Mes = Month(MSFlexGrid1.TextMatrix(i, 6))
Mensuales(Mes) = Mensuales(Mes) + MSFlexGrid1.TextMatrix(i, 9)
Text2(Mes) = Mensuales(Mes)
Else
MsgBox "No hay registros para el mes seleccionado"
End If
Next i
Exit Sub
Errores:
MsgBox "Se ha producido error al procesar la fecha " & MSFlexGrid1.TextMatrix(i, 6)
End Sub
Supongo que el mensaje entra en un bucle, pero esto no debería pasar si la condicion Year(MSFlexGrid1.TextMatrix(i, 6)) = Combo1 no se cumple... por eso mismo había puesto el Else

Voy a ver como lo soluciono!
Muchas gracias por todo erbuson, se nota que te pasiona mucho el tema y que, además, cuentas con una gran experiencia y sabiduría.

Un saludo!
  #16 (permalink)  
Antiguo 29/11/2009, 17:20
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

Este problema se produce porque en tu código muestras el mensaje por cada lectura, deberías utilizar un indicar para saber si encontraste registros o no a fin mostrar el mensaje si es necesario.

Te copio tu código y te modifico como lo haría yo.

Código:
Private Sub Command5_Click()
On Error GoTo Errores
For i = 1 To MSFlexGrid1.Rows - 1
If Year(MSFlexGrid1.TextMatrix(i, 6)) = Combo1 Then
Mes = Month(MSFlexGrid1.TextMatrix(i, 6))
Mensuales(Mes) = Mensuales(Mes) + MSFlexGrid1.TextMatrix(i, 9)
Text2(Mes) = Mensuales(Mes)
HalladoAlguno = True  ' Aunque sólo se halle 1 esta variable sera True
end if
Next i
if Not HalladoAlguno then MsgBox "No hay registros para el período seleccionado"

Exit Sub
Errores:
MsgBox "Se ha producido error al procesar la fecha " & MSFlexGrid1.TextMatrix(i, 6)
End Sub
Respecto a lo que te comentaba de cargar en el Combo sólo los años que tengan valor, puedes crear la siguiente rutina que es ademas reutilizable para cualquier combo:

Código:
' Si se cree oportuno, definir estas 2 propiedades en el combo así
' Style = 2 'DropDown List   ' Para forzar a elegir un elemento de la lista
' Sorted = True              ' Para que salgan Ordenados los Items
Private Sub ComboAdd(Combo As ComboBox, Dato As String)
  ' Añade Dato al Combo si ya no está en el
  Dim Item As Integer
  For Item = 0 To Combo.ListCount - 1
    If Combo.List(Item) = Dato Then Exit Sub
  Next
  Combo.AddItem Dato
End Sub
Previamente en un bucle puedes poner asi de facil en el combo los años que encontrarás en el Grid

For i = 1 To MSFlexGrid1.Rows - 1
ComboAdd Combo1, str$(Year(MSFlexGrid1.TextMatrix(i, 6)))
Next

Cualquier duda me comentas y por cierto gracias por tus halagos, pero personalmente pienso que en esto de la programación como en muchas otras cosas lo importante es que te guste lo que estás haciendo.

Saludos
  #17 (permalink)  
Antiguo 29/11/2009, 19:51
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Calcular ganancias por Mes

Excelente código erbuson, realmente genial. Sólo que al utilizarlo, surge el inconveniente de que si, por ejemplo, selecciono el año 2008 para calcular los valores y luego selecciono el año 2009, los valores de éste último se suman a los del año anteriormente seleccionado.
Antes del código, lo que hice fue añadir una línea de código que borrara el contenido de la matriz de controles Text2. Para ello, utilicé:
Código:
 Text2(1) = ""
-y así sucesivamente hasta llegar al Text2(12)-

También usé:
Código:
Text2(mes)=""
Además usé:
Código:
Text2=""
Pero ninguno funcionó... yo pienso que se debe a que se trata de una matríz. Porque si fuese un Text2 común y corriente como con los que he estado trabajando hasta ahora sería muy sencillo vaciar el contenido, utilizando un Text2=""

En fin, mientras tanto voy a ver si puedo eliminarlo de otra forma.
Muchísimas gracias erbuson
Un abrazo!
  #18 (permalink)  
Antiguo 30/11/2009, 00:33
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Calcular ganancias por Mes

Hola:

El problema puede ser que tengas que borrar mensuales. Como no veo todo el código no se en que parte tienes hecho el DIM

Dim Mensuales(12) as currency

Si lo tienes antes de los Sub la variable es compartida para el formulario y no se borra.

Debes hacerlo con un Bucle

For i = 1 to 12
Mensuales(i)=0
Text2(i) = ""
Next

Es conveniente que borres Text2 porque caso de que tuvieras algun mes sin valores, verias los del proceso anterior.

Debes poner este Bucle justo despues de la sentencia On Error y antes del Bucle de cálculo

Saludos
  #19 (permalink)  
Antiguo 30/11/2009, 22:01
 
Fecha de Ingreso: marzo-2009
Mensajes: 61
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular ganancias por Mes

Gracias erbuson!!!! Usted tiene respuestas para todo Un excelente profesional.
Espero algún día saber tanto como usted y ser yo quien ayude a los demás en vez de estar plantenado dudas

Seguramente me verán por aquí muy pronto
Nuevamente, muchas gracias por todo!
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 00:10.