Selección de elementos de un grid

Estoy desarrollando un sistema en Visual FoxPro 7.0, ya tengo la base de datos (en foxpro) y las clases creadas (formularios, pageframes, botones, grids, etc), ahora estoy integrando en mi primer formulario las clases necesarias y ya tengo la interfaz casi completa.
En mi grid (que ya esta vinculado a una tabla y muestra los datos en tiempo de ejecución) quiero que quede de solo lectura, es decir tengo:
AllowAddNew: .F.
ReadOnly: .T.
Pero que me permita que al dar un click (seleccionar) sobre cualquier parte de un elemento (row) me seleccione toda la fila, para eso tengo las propiedades:
Highlight: .T.
HighlightRow: .T.
Y que al dar doble click sobre una fila (cualquier elemento del row) me abra un formulario que realice una consulta con el valor de la primera columna de la fila seleccionada del grid, es decir, que al seleccionar con doble click una fila me abra un formulario (que ya lo tengo) con los valores "detallados". He estado investigando sobre esto y he encontrado la siguiente solución:
Que dentro del código de cada subelemento del grid (grdDatos. ColCodigo.text1...) en su método dblClick llame al formulario (Do FORM frmDatos).
Lo que no se es como poner la condición where en la consulta haciendo referencia al valor que contiene la columna 1 de la fila seleccionada que contiene mi ID.
Otra situación es que a diferencia de los métodos que he encontrado, no quiero hacer la codificación de elemento por elemento (que me toque programar cada text del gird) ya que es un grid dinámico que va a estar en constante modificación y si se crea un nuevo elemento quiero que automáticamente quede configurado para que tenga la funcionalidad deseada, es decir, sin importar que elemento sea, quiero que haga lo mismo.
De hecho la aplicación va a quedar sin registros, ya que se tiene contemplada una migración de datos y por eso ahora solo me interesa que quede listo para que al ingresar los registros a la tabla, todos sean capaces de llamar al frmDatos con sus datos detallados respectivamente.
Funcionalidad:
El grid que te comento tiene los datos de origen en una tabla de la BD, voy a insertar datos desde el browse o a importarlos de excel o de otra manera (ya veré cual es más eficiente dependiendo del numero de datos). El usuario final tendrá la facultad de insertar registros (por medio de SQL desde un botón). Como cada registro tiene un identificador único (primera columna) quiero que se asigne automáticamente al insertar un nuevo dato. Pero en el grid no se muestran todos los campos (atributos de la tabla), unicamente los principales, y si el usuairo desea ver detalladamente la informacion del registro tendrá que dar doble click para que se abra el formulario de consulta (que es un formulario con un text por cada campo de la tabla y en lugar de asignarle datos, los va a leer de la BD; por ejemplo si tengo el grid x, muestra 6 atrbutos, pero se alimenta de una tabla de la BD de 8 campos, solo muestro los mas relevantes, pero si el usuario desea ver los demas campos tiene que abrir el registro (me gustaria que fuera con DBlClick para facilitar la interaccion con el sistema), para que se muestre un formulario (frmDatos) que contiene 8 labels y 8 text deshabilitados (cada uno muestra la informacion de un campo de la tabla, quiero que lo haga por medio de una consulta SQL: "select * from bd!tabla where tabla.id = valor_primera_columna_grid_del_elemento_Seleccinado)".
Ya si el usuario desea modificar el elemento mostrado en frmDatos, tendrá que presionar un commandbutton ubicado en frmDatos, el cual solo habilita los text (excepto el id) y permite al usuario escribir en los campos que contienen la información del registro abierto y posteriormente dar click en un botón "guardar" que realiza un update en la BD con los nuevos datos del frmDatos.
Te agradezco muchísimo tu atención y espero me puedan ayudar, dejo mi correo personal para cualquier situación [email protected]
PD. Aunque tengo experiencia programando, soy algo nuevo en Visual FoxPRO, por lo cual te ruego me ayudes casi con "peras y manzanas" (con conceptos generales de programación, es decir, que no sean tan avanzados ni exclusivos de foxpro)

1 respuesta

Respuesta
1
Bien, pues según lo que entiendo, no creo que sea necesario que realices una consulta SQL para mostrar los datos en el formulario "frmDatos" ya que los puedes obtener desde la misma tabla que está ligada al "grid". Lo cual es posible porque cuando tú seleccionas una celda en el "grid", la tabla se posiciona en el registro que contiene esa celda, es decir, puedes obtener todos los datos de esa fila tan solo con hacer referencia al nombre del campo cuyo dato quieres obtener.
Por ejemplo, si la tabla se llamara "Datos", que es la que está ligada con el "grid", al seleccionar la fila 3, puedes acceder a todos los datos de esa fila, incluso si no se muestran en el "grid".
Datos.ID && Para obtener el "ID" de la fila seleccionada
Así podrías fácilmente llenar los datos en el formulario "frmDatos" sin necesidad de realizar ninguna consulta ni realizar ningún proceso en especial, ya que cuando el usuario de doble clic en una celda, la tabla quedará posicionada en el registro correspondiente.
Ahora en cuanto a lo segundo, sí se puede, sólo que requiere explicar un par de cosas y, si te es posible, existe una mejor solución ya implementeda en la versión 9 de Visual FoxPro. En caso que si puedas cambiar de versión, solamente tendrías que establecer la propiedad "AllowCellSelection" del "grid" a falso (.F.) Y definir el código de doble clic en el evento "DblClick" del "grid" y eso afectaría a cualquier columna en la cual se haga doble clic, así de sencillo. Si no te es posible, entonces dime para tratar de enviarte el ejemplo que haría más o menos lo que quieres en Visual FoxPro 7.
Muchas gracias por tu atención y tiempo. La respuesta para la primera parte ha sido excelente, es decir, ya logré consultar los datos en frmDatos por medio de un botón y sin consulta SQL. Eso me ha ahorrado bastante trabajo.
Ahora solo resta:Que al seleccionar (un click) un elemento del grid me seleccione todo el row. Y que al hacer doble click haga la misma función que tengo en el botón que ya funcionó (instancia la clase del frmDatos y que se llene los text)
Estoy viendo la posibilidad de cambiar de versión a la 9, pero aún no es seguro, aunque existe la posibilidad. Pero por lo pronto no se si es mucha molestia que me comentes del otro método que se ajusta a la versión 7, ya que tampoco es un hecho la actualización.
Te mantengo al tanto de que suceda, hoy mismo tengo la respuesta sobre el VFP9.
De verdad que me ha sido de gran utilidad la respuesta. Espero me puedas seguir ayudando, ya que de las respuestas que había conseguido para este problema, la tuya ha sido la más precisa, sencilla y practica.
Muchas gracias, estamos en contacto
Saludos
Hola de nuevo!
Ya tengo instalado el VFP 9 y ya pude hacer que me seleccione toda la fila del grid con la propiedad "AllowCellSelection" = .F.
Por último y para concluir con tu valiosa ayuda:
Como te comenté, el frmDatos es una clase y la instancio en dos momentos: uno cuando uso el dblClick del grid (mostrar datos, consulta en los text) y otra cuando voy a insertar un nuevo registro, es decir, requiero la misma interfaz para insertar y para consultar unicamente con la diferencia de los text habilitada o deshabilitada respectivamente. El "problema" esta en que si en la clase padre le pongo el controlsource con el nombre de la tabla y el campo, en la ejecución si me muestra la información deseada, pero en ambos procedimientos (insertar-consultar), por eso he intentado modificar la propiedad controlsource en tiempo de ejecución, antes de mostrar una de las instanciaciones de la clase:
Por ejemplo, en el botón insertar hago esto, si tengo la clase con controlsource habilitado:
LOCAL frmInsert_sistUser
frmInsert_sistUser= NewObject("frmins_sistuser",dir_path+"Class\formus")
**Habilitar campos
frmInsert_sistUser.SetAll("Enabled", .T., "Txt_frmcons")
frmInsert_sistUser.txtId.Enabled= .F.
frmInsert_sistUser.SetAll("Enabled", .T., "Lst")
frmInsert_sistUser.SetAll("Enabled", .T., "Datepick")
frmInsert_sistUser.SetAll("Enabled", .T., "Btnguardar")
frmInsert_sistUser.SetAll("Enabled", .F., "Btnmodif")
**
frmInsert_userList.txtId.controlSource = null
*!*frmConsul_userList.txtNombre.controlSource = null
*!*frmConsul_userList.txtAPat.controlSource = null
*!*frmConsul_userList.txtAMat.controlSource = null
*!*frmConsul_userList.txtDepa.controlSource = null
*!*frmConsul_userList.txtObs.controlSource = null
**Propiedades Form
frmInsert_sistUser.caption = "Inserción de Usuario al sistema"
frmInsert_sistUser.icon = dir_path+"media\icos\point09.ico"
frmInsert_sistUser.Show()
Y tambien intenté con la clase sin controlsource y en el momento de ejecutarla que se le asigne el CS:
*!*frmConsul_userList.txtAPat.controlSource = Users_list.A_paterno
*!*frmConsul_userList.txtAMat.controlSource = Users_list.A_materno
*!*frmConsul_userList.txtDepa.controlSource = Users_list.Departamen
*!*frmConsul_userList.txtObs.controlSource = Users_list.Observacio
algo asi.
No se si me explico, quiero que una clase se use en dos acciones distintas y unarequieren los campos habilitados y la otra deshabilitados (hecho), asimismo una requiere que los text tengan un origen de datos de la tabla asociada al grid pero la otra acción, no.
¿Cómo puedo hacer que la MISMA CLASE se pueda usar en los dos casos? Como puedo llamar a la propiedad
Muchas gracias, espero puedas ayudarme con este detalle.
De lo demás, todo va muy bien, ya he conseguido lo deseado. Gracias por todo!
Saludos
Mm, parece una forma algo diferente de hacer las cosas en Visual FoxPro, pero bien funciona. Según lo que entiendo, creo que una buena opción podría ser que definieras un método, en tu clase, en donde ligaras todos los campos a la tabla (con la propiedad "ControlSource"). Así, sólo se mostrarían los datos cuando mandes llamar a ese método y cuando no, no se mostrarían.
** El método podría quedar algo así (dentro de la definición de la clase):
PROCEDURE LigarDatos
This.txtAPat.ControlSource = "Users_list.A_paterno"
This.txtAMat.ControlSource = "Users_list.A_materno"
...
ENDPROC
** Después de instanciar tu clase, solamente llamas al método "LigarDatos" (cuando sea consulta)
LOCAL frmInsert_sistUser
frmInsert_sistUser= NewObject("frmins_sistuser",dir_path+"Class\formus")
frmInsert_sistUser.LigarDatos()
En caso de que sea para insertar, simplemente no la llamas y no se mostraran los datos. Ya no es necesario asignarle "null" a la propiedad "ControlSource" en ningún control.
Que tal experto, creo que es todo. Ya tengo que hacer por un rato, así que por lo pronto no te molestaré más... por lo pronto, espeor no te moleste si vuelvo a recurrir a ti, pero como te comenté tu respuesta fue concisa y ya había recibido otras (incluso en todoexpertos.com) y pues no eran lo que buscaba.
Muchas gracias por tu tiempo y paciencia. Hasta luego
Buen día. Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas