Filtrar en un grid con 3 combobox en VFP

Respuesta de
Usuario
Buenos días, soy nuevo en VFP, me podrías colaborar filtrando en un Grid con 3 combobox, tengo 3 tablas (Clientes, Almacenes y Zonas). Gracias por tu colaboración, mi correo es
Avatar
Experto
¿Podrías hacer el favor de explicarme un poco más detalladamente el inconveniente?
Usuario
Buenos días, disculpa por no ser tan explicito, tengo tres tablas relacionadas (Almacenes, Zonas y Clientes,), lo que pretendo hacer es que cuando elija en un combobox un almacen en otro combobox me filtre las zonas que tiene ese almacen y cuando elija una de las zonas me filtre los clientes que tiene esa zona y los muestre en un datagrid, osea que en el datagrid quedarían los registros filtrados por Almacen, Zona y Clientes, me podrías enviar un ejemplo de como hacer esto. Gracias por tu colaboración.
Avatar
Experto
Listo, por favor descríberme la estructura de las tablas para plantearte una solución.
Usuario
Buenos días, la estructura de las tablas es la siguiente:
Tabla ALMACENES con los compos: CIA, COD_ALMACEN, NOM_ALMA
Tabla ZONAS con los campos: CIA, COD_ALMACEN, COD_ZONA, NOM_ZONA
Tabla CLIENTES con los campos: CIA, COD_ALMACEN, CLIENTE, NOMBRE, COD_ZONA, RAZÓN, NIT, TIPO, DIR1, TELÉFONO
Necesito que en el primer combobox pueda elegir un almacen, luego en el segundo combobox me filtre las zonas que maneja ese almacen y que cuando elija una zona en el tercer combobox me filtre los clientes que se encuentren en esa zona, y por último al elegir un cliente del tercer combobox me aparezca la información de ese único cliente en un datagrid. Espero haya sido lo suficientemente explicito, Gracias por tu colaboración.
 
Avatar
Experto
Bueno creas un formulario a agregas los respectivos controles.
En el primer control combobox estableces lo siguiente:
Establece las propiedades BoundColumn y Style a valor 2.
Escribe el siguiente código en el evento Destroy:
If Used("cAlmacen")
  Use in cAlmacen
Endif
Escribe el siguiente código en el evento InteractiveChange:
If !Empty(This.Value)
  Select nom_zona, cod_zona From Zonas Where Zonas.cod_almacen = This.Value Into Cursor cZonas
  Thisform.CboZonas.RowSource = "cZonas"
Endif
Establece la propiedad Name a valor CboAlmacen.
Establece la propiedad RowSource con el siguiente código:
Select cod_almacen, nom_alma from Almacenes Order By  nom_alma Into Cursor cAlmacen
Establece la propiedad RowSourceType a Valor 3 (Instrucción SQL)
En el segundo control combobox estableces lo siguiente:
Establece las propiedades BoundColumn, RowSourceType y Style a valor 2.
Escribe el siguiente código en el evento Destroy:
If Used("cZonas")
  Use in cZonas
Endif
Escribe el siguiente código en el evento InteractiveChange:
If !Empty(This.Value)
  &&Suponiendo que NIT es el campo clave principal de la tabla clientes hacemos lo siguiente, de lo contrario cambiar por el campo clave principal:
  Select nombre, Nit From Clientes Where Clientes.cod_zona = This.value Into Cursor cClientes
  Thisform.CboClientes.RowSource = "cClientes"
Endif
Establece la propiedad Name a valor CboZonas.
En el tercer control combobox estableces lo siguiente:
Establece las propiedades BoundColumn, RowSourceType y Style a valor 2.
Escribe el siguiente código en el evento Destroy:
If Used("cClientes")
  Use in cClientes
Endif
Escribe el siguiente código en el evento InteractiveChange:
If !Empty(This.Value)
   Local lcCommand
   Select Cia, Cliente, Nombre, Razon, Nit, Tipo, Dir1, telefono From Clientes Where Clientes.Nit = This.Value Into Cursor cClientesInfo
   Thisform.GrdClientes.RowSource = "cClientesInfo"   
Endif
Establece la propiedad Name a valor CboClientes.
Con el control grid haces lo siguiente:
 
Establece las propiedades AllowCellSelection y DeleteMark a valor .F.
Escribe el siguiente código en el evento Destroy:
If Used("cClientesInfo")
  Use in cClientesInfo
Endif
Establece la propiedad Name a valor GrdClientes
Establece la propiedad ReadOnly a .T.
Establece la propiedad RowSourceType a valor 2 (Alias)
Esa es una posible solución al problema, espero que te sirva de ayuda.