Gráfico en formulario

Como puedo hacer para realizar un gráfico en un formulario en base a una varios registro de una base.
Necesito mostrar gráficamente la composición de una fórmula que esta en una tabla que actualizaría cada vez que llamo al formulario y que seria lo único que tendría a saber.
Porcentaje, nombre del componente.
Gracias.
Diego
Respuesta
1
Perdón por la demora, tenia mucho trabajo, ahora si te respondo, copia este código en algún botón de un formulario, luego ejecutalo y vas a ver que se abre un nuevo formulario con un gráfico, en el mismo código te voy explicando que es lo que hago en cada paso, espero que te sirva. Lo probé y funciona bien. Suerte
&& declaro una variable publica
public pantalla
&& A la variable publica le asigno un nuevo formulario
pantalla = createobject("form")
&& Al formulario le agrego un olecontrol (el msgraph, sirve para hacer graficos, igual al de excel)
pantalla.addobject("objeto", "olecontrol", "msgraph.chart.8")
&& Desde que posición superior se comienza a dibujar el grafico dentro del formulario
pantalla.objeto.top = 0
&& Desde que posición izquierda se comienza a dibujar el grafico dentro del formulario
pantalla.objeto.left = 0
&& Le doy al grafico el mismo alto que el formulario
pantalla.objeto.height = pantalla.height
&& Le doy al grafico el mismo ancho que el formulario
pantalla.objeto.width = pantalla.width
&& Hago visibble el formulario
pantalla.visible = .t.
&& Hago visible el grafico
pantalla.objeto.visible = .t.
pantalla.lockscreen = .t.
&& Elijo el tipo de grafico
&& Podes cambiar el valor por alguno de estos: del valor 51 hasta el 112, tambien el 5 o el -4100
pantalla.objeto.object.application.chart.charttype = 106
******** Creo una matriz (muy parecido a usar una hoja de excel) ********
*************************************************************************
&& Agrego los encabezados de las filas de la matriz
pantalla.objeto.object.application.datasheet.range("00").value = ""
pantalla.objeto.object.application.datasheet.range("01").value = "Pedro"
pantalla.objeto.object.application.datasheet.range("02").value = "Luis"
&& Agrego los encabezados de las columnas de la matriz
pantalla.objeto.object.application.datasheet.range("A0").value = "Enero"
pantalla.objeto.object.application.datasheet.range("B0").value = "Febrero"
&& Agrego los valores de la matriz, de acuerdo a la fila y columna
pantalla.objeto.object.application.datasheet.range("A1").value = 25
pantalla.objeto.object.application.datasheet.range("A2").value = 40
pantalla.objeto.object.application.datasheet.range("B1").value = 35
pantalla.objeto.object.application.datasheet.range("B2").value = 55
&& Este tipo de grafico tiene por defecto 4 columnas, como estoy por usar solo 2,
&& entonces borro las filas y columnas de los items que no voy a mostrar,
&& si comentas las 4 filas de codigo que siguen y ejecutas todo el codigo
&& te vas a dar cuenta de lo que te quiero explicar
pantalla.objeto.object.application.datasheet.rows("4").delete
pantalla.objeto.object.application.datasheet.rows("5").delete
pantalla.objeto.object.application.datasheet.columns("4").delete
pantalla.objeto.object.application.datasheet.columns("4").delete
&& Habilito e ingreso un titulo para el grafico
pantalla.objeto.object.application.chart.hastitle = .t.
pantalla.objeto.object.application.chart.charttitle.text = "Mi gráfico"
pantalla.lockscreen = .f.
Mi base Composicoion.dbf tiene dos datos, Descrip y porctc, que genero cada vez que quiero ver un gráfico.
¿En tu código como sería la implementación?
¿Qué numero sería el gráfico de torta?
Gracias
Así sería para que puedas mostrar un gráfico de torta, en el código te mando comentado como podes crear otro tipo de gráfico en torta distinto al del ejemplo.
El código sería este:
&& declaro una variable publica
public pantalla
&& A la variable publica le asigno un nuevo formulario
pantalla = createobject("form")
&& Le doy el tamaño de alto al formulario
pantalla.height = 400
&& Le doy el tamaño de ancho al formulario
pantalla.width = 500
&& Hago que el formulario se ejecute centrado
pantalla.autocenter = .T.
&& Al formulario le agrego un olecontrol (el msgraph, sirve para hacer graficos, igual al de excel)
pantalla.addobject("objeto", "olecontrol", "msgraph.chart.8")
&& Desde que posición superior se comienza a dibujar el grafico dentro del formulario
pantalla.objeto.top = 0
&& Desde que posición izquierda se comienza a dibujar el grafico dentro del formulario
pantalla.objeto.left = 0
&& Le doy al grafico el mismo alto que el formulario
pantalla.objeto.height = pantalla.height
&& Le doy al grafico el mismo ancho que el formulario
pantalla.objeto.width = pantalla.width
&& Hago visibble el formulario
pantalla.visible = .t.
&& Hago visible el grafico
pantalla.objeto.visible = .t.
pantalla.lockscreen = .t.
&& Elijo el tipo de grafico
&& Podes cambiar el valor por alguno de estos: del valor 51 hasta el 112, tambien el 5 o el -4100
&& Si pones como valor -4102 vas a tener el grafico en torta cerrado
&& Si pones como valor 70 vas a tener el grafico en torta abierto (en porciones)
pantalla.objeto.object.application.chart.charttype = 70
******** Creo una matriz (muy parecido a usar una hoja de excel) ********
*************************************************************************
&& Agrego los encabezados de las filas de la matriz
pantalla.objeto.object.application.datasheet.range("00").value = ""
pantalla.objeto.object.application.datasheet.range("01").value = "Porcentaje"
pantalla.objeto.object.application.datasheet.range("02").value = "Porcentaje"
&& Agrego los encabezados de las columnas de la matriz
pantalla.objeto.object.application.datasheet.range("A0").value = "Composicion 1"
pantalla.objeto.object.application.datasheet.range("B0").value = "Composicion 2"
&& Agrego los valores de la matriz, de acuerdo a la fila y columna
pantalla.objeto.object.application.datasheet.range("A1").value = 25
pantalla.objeto.object.application.datasheet.range("A2").value = 40
pantalla.objeto.object.application.datasheet.range("B1").value = 35
pantalla.objeto.object.application.datasheet.range("B2").value = 55
&& Este tipo de grafico tiene por defecto 4 columnas, como estoy por usar solo 2,
&& entonces borro las filas y columnas de los items que no voy a mostrar,
&& si comentas las 4 filas de codigo que siguen y ejecutas todo el codigo
&& te vas a dar cuenta de lo que te quiero explicar
pantalla.objeto.object.application.datasheet.rows("4").delete
pantalla.objeto.object.application.datasheet.rows("5").delete
pantalla.objeto.object.application.datasheet.columns("4").delete
pantalla.objeto.object.application.datasheet.columns("4").delete
&& Habilito e ingreso un titulo para el grafico
pantalla.objeto.object.application.chart.hastitle = .t.
pantalla.objeto.object.application.chart.charttitle.text = "Mi gráfico"
pantalla.lockscreen = .f.
Si necesitas mostrar más de 2 datos o en tu caso si en la tabla podes llegar a tener más de 2 composiciones, habría que cambiar el código para recorrer la tabla y de acuerdo a los registros que tengas, agregar nuevos datasheet al gráfico, sería como que en excel agregues nuevas filas.
Espero que sea de ayuda. Suerte.
Claro, una composición puede tener 1 o 15 componentes...
¿Cómo recorrería la tabla para hacer lo que me decís?
Muchas gracias.
Diego
El ejemplo para tu caso sería el siguiente, lo único que tendrías que cambiar sería el nombre de la tabla y de los campos en el caso que no sean estos los nombres, en el ejemplo la tabla se llama composición y los campos descrip y porctc.
Una vez que pegues el código en algún botón, no te olvides de poner en el entorno de datos del formulario la tabla.
Otra cosita, si quieres ver como queda conformada la matriz con los datos, una vez que ejecutes el formularios y le des click al botón de graficar, cuando se abra el formulario con el gráfico, le das doble click al gráfico y se va a abrir la ventana con la matriz (parecida a excel).
Bueno, eso es todo. Suerte, aquí va el código:
&& declaro una variable publica
public pantalla
&& A la variable publica le asigno un nuevo formulario que contendrá el grafico
pantalla = createobject("form")
&& Agrego el caption (titulo de la ventanta del formulario)
pantalla.caption = "Gráfico de la Fórmula"
&& Le doy el tamaño de alto al formulario
pantalla.height = 400
&& Le doy el tamaño de ancho al formulario
pantalla.width = 500
&& Hago que el formulario se ejecute centrado
pantalla.autocenter = .T.
&& Al formulario le agrego un olecontrol (el msgraph, sirve para hacer graficos, igual al de excel)
pantalla.addobject("objeto", "olecontrol", "msgraph.chart.8")
&& Desde que posición superior se comienza a dibujar el grafico dentro del formulario
pantalla.objeto.top = 0
&& Desde que posición izquierda se comienza a dibujar el grafico dentro del formulario
pantalla.objeto.left = 0
&& Le doy al grafico el mismo alto que el formulario
pantalla.objeto.height = pantalla.height
&& Le doy al grafico el mismo ancho que el formulario
pantalla.objeto.width = pantalla.width
&& Hago visibble el formulario
pantalla.visible = .t.
&& Hago visible el grafico
pantalla.objeto.visible = .t.
pantalla.lockscreen = .t.
&& Elijo el tipo de grafico
&& Podes cambiar el valor por alguno de estos: del valor 51 hasta el 112, tambien el 5 o el -4100
&& Si pones como valor -4102 vas a tener el grafico en torta cerrado
&& Si pones como valor 70 vas a tener el grafico en torta abierto (en porciones)
pantalla.objeto.object.application.chart.charttype = 70
******** Creo una matriz (muy parecido a usar una hoja de excel) ********
*************************************************************************
&& Este tipo de grafico tiene por defecto 4 columnas y 4 filas,
&& como estoy por usar solo 1 fila (para el porcentaje) y la cantidad de columnas
&& como componenetes tenga en la tabla, entonces borro las filas que no voy a necesitar.
pantalla.objeto.object.application.datasheet.rows("2").delete
pantalla.objeto.object.application.datasheet.rows("3").delete
pantalla.objeto.object.application.datasheet.rows("4").delete
&& Agrego el encabezado de cada fila de la matriz.
&& la 1º fila (00) no tiene encabezado y la 2º fila (01) tiene como encabezado Porctc
pantalla.objeto.object.application.datasheet.range("00").value = ""
pantalla.objeto.object.application.datasheet.range("01").value = "Porctc"
&& Agrego los encabezados de las columnas de la matriz.
&& cada columna tendrá como encabezado un componente de la tabla
letraascii = 65
sele composicion
go top
do while !eof()
rango = chr(letraascii) + "0"
ejecutar = 'pantalla.objeto.object.application.datasheet.range("' + rango + '").value = "' + alltrim(composicion.descrip) + '"'
&ejecutar
letraascii = letraascii + 1
sele composicion
skip
enddo
&& Agrego los porcentajes en la matriz, de acuerdo al valor de cada componente
letraascii = 65
sele composicion
go top
do while !eof()
rango = chr(letraascii) + "1"
ejecutar = 'pantalla.objeto.object.application.datasheet.range("' + rango + '").value = ' + str(composicion.porctc,5,2)
&ejecutar
letraascii = letraascii + 1
se le composición
skip
enddo
&& Habilito e ingreso un titulo para el grafico
pantalla.objeto.object.application.chart.hastitle = .t.
pantalla.objeto.object.application.chart.charttitle.text = "Mi gráfico"
pantalla.lockscreen = .f.
Te envíe la respuesta más arriba, por favor de puntuar si crees que evacue tus dudas.
Disculpa mi tardanza, estuve en cama hasta hoy por una enfermedad, hoy por la tarde lo veo y te respondo.
Muchas gracias.
Bien.
Te enviado un email para ver si terminamos el tema y luego te puntúo, seguramente el máximo por todas las molestias que te has tomado.
Muchas gracias.
Diego
No me llego ningún mail todavía, mi correo es [email protected], espero tu mail.
Ayer te lo volví a mandar.
Gracias
Bueno lo veo y te contesto.
Te cuento que ya solucione tu problema, en el botón graficar esta comentado la parte que modifique, que es la primera parte del código de ese botón.
Tu problema se daba porque a la tabla composición le borras todos los registros cuando haces click en el botón graficar, pero ese borrado que haces es solo lógico, o sea que los registros siguen estando en la tabla, entonces cuando más abajo en el código comenzás a armar el gráfico te da un error porque se comienzan a agregar filas en la matriz de acuerdo a la cantidad de componentes, por ejemplo si tienes 3 componentes en la tabla composición se agregaran las filas A1, B1, C1; como en la tabla tenias más de 128 registros contando los eliminados lógicamente a la hora de agregar las filas en el gráfico comenzaba bien pero al llegar a la fila Z1 la agrega bien pero la letra que sigue es donde te daba error, porque la letra de cada fila que agrego la hago a través de código assci, el código assci comienza con el valor 65 que es la letra A en código assci, de allí voy sumando 1 al código assci hasta llegar al valor 90 que es la letra Z, entonces al tener más de 26 registros en la tabla (entre el 65 y el 90 tienes las 26 letras del alfabeto) cuando llega al código assci 91 te da el error porque intenta agregar la fila [1 que no existe, las filas tienen que comenzar con una letra.
O sea que vos vas a poder graficar fórmulas que tengan no más de 26 componentes, que según lo que me comentaste las fórmulas tienen menos de 26 componentes.
Con la modificación que hice en el botón graficar funciona bien, lo que hice fue hacer un ZAP de la tabla, o sea borrar físicamente todos los registros de la tabla composición. Otra de las modificaciones que hice fue en el entorno de datos del formulario, en las propiedades de la tabla composición cambie a .T. la propiedad exclusive para que te permita borrar físicamente los registros de la tabla, para poder hacer un ZAP la tabla se debe abrir de forma exclusiva, con ese cambio ya esta listo para el borrado físico.
Eso es todo, pruébalo y después contame.
Suerte.
Copie todo el archivo a mi directorio, compile y me da erro en el zap, diciendo que tiene que estar abierto exclusivo, siendo que el cursor en el dataenvironment tiene exclusive true.
¿Por qué da error?
Si borro físicamente manualmente la base funciona.
Otra cuestión. Como achico la letra de la descripción de componentes y agrandar el gráfico.
Gracias.
Me olvidaba, funciona si le saco el zap y teniendo en la base solo una composición.
Ademas, ¿por qué tiene en cuenta los archivos borrados logicamentesi el sistema en si cuando lo corro no los tiene?
Más gracias.
Con respecto al zap, seguro que tienes la misma tabla en el entorno de datos del formulario principal, a mi me pasaste solo una pantalla que va dentro de un form principal, fíjate a ver si es así, de ser así tendrías que sacar la tabla del formulario donde gráficas y solo dejarla en el form principal, recordá que la tabla en el entorno de datos tiene que estar con la propiedad exclusive en .T.
Con respecto a como achicar la fuente del gráfico y agrandar el gráfico, no tengo idea de como hacerlo, lo que podrías intentar es agrandar más toda la pantalla, en la parte que dice:
pantalla.height = 400
pantalla.width = 500
El formulario que te pase esta contenido en el form principal de la aplicación que no tiene en el entorno de datos la tabla composición.
Esta tabla esta en el entorno de datos del formulario aformulas nada más y tiene la propiedad exclusive en true.
¿Qué otra cosa podemos probar?
Proba con esto:
if used("mi_tabla")
sele mi_tabla
Use
Endif
Use mi_tabla in 0 exclusive
sele mi_tabla
Zap
Cópialo tal cual y modifica la cadena que dice mi_tabla por el nombre de la tabla que quieres borrar, creo que se llamaba composición, ya no tengo tu formulario por eso no recuerdo bien el nombre de la tabla, esta parte de código que te pase reemplázalo por la donde estaba el zap de la tabla.
Si no llega a funcionar con esto, me envías un mail con el formulario y las tablas tal cual como lo tienes y lo miro, pero primero proba con esto.
Me dice que la tabla esta en uso, te mando el form de vuelta.
Gracias
Le hice esos cambios y lo probé y no tuve ningún problema, no hace falta poner toda la ruta para encontrar la tabla, si al llamar al ejecutable pones el directorio predeterminado por defecto al llamar a la tabla la tiene que abrir sin necesidad de poner la ruta completa.
Si no te llega a funcionar, proba entrando a Visual Fox Pro y luego te vas al menu Herramientas y luego a opciones, de allí a la pestaña datos y fíjate que la opción que dice Abrir en modo exclusivo este tildada.
De seguir el problema, me avisas y probamos de otra manera, que sería creando un cursor temporal cada vez que llames al botón graficar, pero antes proba con lo que te digo.
Cuando lo ejecuto luego de compilarlo sigue diciendo error de sintaxis.
Si lo hago desde el Fox me sale que la base ya esta en use en el tercer use o sea acá:
Use composición in 0 exclusive
¿Podemos probar con un cursor?
Gracias
En herramientas/datos esta tildada la opción de abrir exclusivo.
Ok, después te envío un ejemplo usando u cursor temporal.
Te cuento que ya están hecho los cambios, los adjunto al mail.
Los cambios los hice en el botón Command1 (Gráfica composición), precisamente el el procedimiento click, esta resaltada la parte que modifique.
También agregue un par de linea en el procedimiento Destroy del formulario.
Y el ultimo cambio que hice fue sacar del entorno de datos la tabla composición, ya que desde ahora en vez de usar esa tabla vas a usar un cursor temporal que se crea en el botón Command1 (Gráfica composición).
Eso es todo, suerte.
Desde el fox funciona perfecto, pero una vez compilado sigue saliendo el cartel de "Error de sintaxis"
Diego
Y ya no puedo ayudarte en eso, no se que en que parte te puede estar saliendo el error, ni cual puede ser el formulario que este ocasionado el problema. A mi solo me pasaste el formulario en donde querías que salga el gráfico, no todo el proyecto. Es por eso que no puedo llegar a probar de compilar todo el proyecto, como para ver donde esta el error.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas