Calcular datos de un cursor en columnas de un grid
¿Necesito saber como hacer para calcular datos de un cursor que esta en un grid en tiempo de ejecución?
1 Respuesta
Respuesta de factorysi
1
1
factorysi, Programdor desde FoxPro DOS - FoxPro 2
Pregunta: ¿A qué te refieres con calcular datos?
A, ¿Cálculos matemáticos de la información que esta dentro del cursor?
O, cálculos de tamaño de registros, conteo de registros, ¿etc...?
A, ¿Cálculos matemáticos de la información que esta dentro del cursor?
O, cálculos de tamaño de registros, conteo de registros, ¿etc...?
Básicamente.
Una vez generado el cursor, mientras esté activo tiene el mistro tratamiento que cualquier tabla, ejemplo
Use cursor1 (Select cursor1 --> si ya esta abierto)
Sum (campo) to (variable)
Select sum(campo) For .... group by ....
... Es decir aplicando los comandos normales del VF
Una vez generado el cursor, mientras esté activo tiene el mistro tratamiento que cualquier tabla, ejemplo
Use cursor1 (Select cursor1 --> si ya esta abierto)
Sum (campo) to (variable)
Select sum(campo) For .... group by ....
... Es decir aplicando los comandos normales del VF
creo que yo no me explique bien desde un principio, por ejemplo : si bien necesito "calcular matematicamente datos de un cursor que esta en un grid en TIEMPO DE EJECUCION", con TABLAS.DBF si se puede en el TEXT de cada columna del GRID programas el calculo para que el TEXTn(n= numero) de la COLUMNAn cambie el valor. PERO en el cursor no lo puedo hacer, yo programe en el INIT del formulario la configuracion del GRID y para que este sea sobrescribible en TIEMPO DE EJECUCION, pero sinceramente al momento de poner valores en cada columna tengo que estar calculando con calculadora el valor que le corresponde a la COLUMNAn.
Según entiendo ... cargas los datos de un cursor en un grid al iniciar el formulario..
Deberías crearte un evento adicional y los llamas cada vez que desees realizar las operaciones correspondientes.. o actualices el grid...
Este es un ejemplo de un evento creado dentro de un formulario ... "suma_valores", espero sirva como idea...
*******************************
SELECT _Cursor_facturafinal
GO top
SUM fic_valor TO n_fic_valor
SUM fic_abono TO n_fic_abono
SUM fic_saldo TO n_fic_saldo
&&
Thisform.txt_valortotal.Value = n_fic_valor
Thisform.txt_abonototal.Value = n_fic_abono
Thisform.txt_saldototal.Value = n_fic_saldo
&&
Thisform. Refresh
Deberías crearte un evento adicional y los llamas cada vez que desees realizar las operaciones correspondientes.. o actualices el grid...
Este es un ejemplo de un evento creado dentro de un formulario ... "suma_valores", espero sirva como idea...
*******************************
SELECT _Cursor_facturafinal
GO top
SUM fic_valor TO n_fic_valor
SUM fic_abono TO n_fic_abono
SUM fic_saldo TO n_fic_saldo
&&
Thisform.txt_valortotal.Value = n_fic_valor
Thisform.txt_abonototal.Value = n_fic_abono
Thisform.txt_saldototal.Value = n_fic_saldo
&&
Thisform. Refresh
Bueno la verdad que no me explico bien frente a lo que quiero...:
Tengo un CURSOR que lo muestro en el GRID, ese cursor tengo campos ej: precio, cantidad, total, en tiempo de ejecución del FORMULARIO el usuario cambia valores del campo CANTIDAD del CURSOR y necesito que automáticamente haga la operación y el campo TOTAL adquiera el valor correspondiente... SIEMPRE trabajando dentro del cursor que es mostrado por el GRID... Espero haber explicado un poco más lo que realmente necesito!.. Agradeceré muchísimo !
Tengo un CURSOR que lo muestro en el GRID, ese cursor tengo campos ej: precio, cantidad, total, en tiempo de ejecución del FORMULARIO el usuario cambia valores del campo CANTIDAD del CURSOR y necesito que automáticamente haga la operación y el campo TOTAL adquiera el valor correspondiente... SIEMPRE trabajando dentro del cursor que es mostrado por el GRID... Espero haber explicado un poco más lo que realmente necesito!.. Agradeceré muchísimo !
Asumo que esta enlazada cada columna de tu grid al campo correspondiente del cursor, x ejemplo : Thisform.grd_examen.exa_nombre.ControlSource = '_Cursor_examen_consulta.exa_nombre' ....
Entonces, simplemente en el lostfocus del text de la columna cantidad deberías llamar al evento que realiza los cálculos, de esta forma se actualizaría la columna total...
O podrías en el evento value de text1 de la columna cantidad, poner
Replace orden_d.ordsub with orden_d.ordcan * orden_d.ordpvp.....
En realidad en cualquier text1 que ingrese valores... buscala la forma con la que adecues mejor tu ...
Entonces, simplemente en el lostfocus del text de la columna cantidad deberías llamar al evento que realiza los cálculos, de esta forma se actualizaría la columna total...
O podrías en el evento value de text1 de la columna cantidad, poner
Replace orden_d.ordsub with orden_d.ordcan * orden_d.ordpvp.....
En realidad en cualquier text1 que ingrese valores... buscala la forma con la que adecues mejor tu ...
Tu respuesta se aproxima a lo que quiero... pero la verdad es que yo tengo la configuración del GRID en el INIT del formulario, y ahí configuro ek RECORDSOURCE, y las columnas (el ancho de columnas, el header de c/u, si son visibles o si son de solo lectura)... en fin... ¿de este modo como tengo que hacer para hacer referencia a que COLUMNn cambie de valor cuando este en modo de ejecución?
Si deseas actualizar directamente tu cursor deberás añadir esta sentencia READWRITE al select que lo genera ... obviamente dejar la propiedad ReadOnly del grid en .F.
Y en el lotsfocus del text1 de la columna cantidad poner:
Thisform.grid.total.text1.value = Thisform.grid.cantidad.value.text1.value * Thisform.grid.valor.value.text1.value
Y en el lotsfocus del text1 de la columna cantidad poner:
Thisform.grid.total.text1.value = Thisform.grid.cantidad.value.text1.value * Thisform.grid.valor.value.text1.value
A ver si con esto queda un poco más clarito de lo que quier... pasa que mi GRID en la ventana de propiedades el COLUMNCOUNT esta en -1... la configuración de las columnas del GRID esta en el INIT del FORM... por ende programando para que cambie los valores no puedo hacer referencia a ningún TEXTn... ¿por qué no los tengo en el grid... como se hace en ese caso?
Deberías crear y utilizar un grid con las columnas exactas, utiliza la opción grid dentro del diseñador de formularios…… y fíjate en este código…
*****************************
This.grd_Ficha.RecordSource=null
&& Despliega los datos en el Grid
SELECT *;
FROM _Cursor_Ficha_facturar;
Into Cursor _Cursor_facturafinal READWRITER;
Order by fic_orden
&& La conexion la hace en el LOAD del formulario
SELECT _Cursor_facturafinal
Thisform.grd_Ficha.Readonly = .F.
Thisform.grd_Ficha.RecordSourceType = 2
Thisform.grd_Ficha.RecordSource = '_Cursor_facturafinal'
Thisform.grd_Ficha.fic_fechapedido.ControlSource = '_Cursor_facturafinal.fic_fechapedido'
Thisform.grd_Ficha.fic_factura.ControlSource = '_Cursor_facturafinal.fic_factura'
Thisform.grd_Ficha.fic_valor.ControlSource = '_Cursor_facturafinal.fic_valor'
Thisform.grd_Ficha.fic_abono.ControlSource = '_Cursor_facturafinal.fic_abono'
Thisform.grd_Ficha.fic_saldo.ControlSource = '_Cursor_facturafinal.fic_saldo'
Con esto podrás realizar cualquier operación a tu grid……
Ahora, si bien es más fácil de la forma en que tu realizas para desplegar las consultas, pero como veras se complica posteriormente manipular la información …. La definición de COLUMNCOUNT es…." Especifica el número de columnas que se van a mostrar. El valor predeterminado es -1, lo que especifica que el control cuadrícula debería contener columnas suficientes para incluir todos los campos del origen de registros de la cuadrícula. El máximo número de columnas es 255. Si crea un número específico de columnas al establecer nCol en un valor positivo, especifique los datos que se van a mostrar en una columna específica mediante la propiedad ControlSource para esa columna. (Si no se especifica ControlSource para una columna, el control cuadrícula mostrará el siguiente campo no mostrado disponible del origen de registros de la cuadrícula.)"
Es decir sino indicas un valor positivo no podrás saber exactamente que columna usar……
*****************************
This.grd_Ficha.RecordSource=null
&& Despliega los datos en el Grid
SELECT *;
FROM _Cursor_Ficha_facturar;
Into Cursor _Cursor_facturafinal READWRITER;
Order by fic_orden
&& La conexion la hace en el LOAD del formulario
SELECT _Cursor_facturafinal
Thisform.grd_Ficha.Readonly = .F.
Thisform.grd_Ficha.RecordSourceType = 2
Thisform.grd_Ficha.RecordSource = '_Cursor_facturafinal'
Thisform.grd_Ficha.fic_fechapedido.ControlSource = '_Cursor_facturafinal.fic_fechapedido'
Thisform.grd_Ficha.fic_factura.ControlSource = '_Cursor_facturafinal.fic_factura'
Thisform.grd_Ficha.fic_valor.ControlSource = '_Cursor_facturafinal.fic_valor'
Thisform.grd_Ficha.fic_abono.ControlSource = '_Cursor_facturafinal.fic_abono'
Thisform.grd_Ficha.fic_saldo.ControlSource = '_Cursor_facturafinal.fic_saldo'
Con esto podrás realizar cualquier operación a tu grid……
Ahora, si bien es más fácil de la forma en que tu realizas para desplegar las consultas, pero como veras se complica posteriormente manipular la información …. La definición de COLUMNCOUNT es…." Especifica el número de columnas que se van a mostrar. El valor predeterminado es -1, lo que especifica que el control cuadrícula debería contener columnas suficientes para incluir todos los campos del origen de registros de la cuadrícula. El máximo número de columnas es 255. Si crea un número específico de columnas al establecer nCol en un valor positivo, especifique los datos que se van a mostrar en una columna específica mediante la propiedad ControlSource para esa columna. (Si no se especifica ControlSource para una columna, el control cuadrícula mostrará el siguiente campo no mostrado disponible del origen de registros de la cuadrícula.)"
Es decir sino indicas un valor positivo no podrás saber exactamente que columna usar……
- Compartir respuesta
- Anónimo
ahora mismo