[Mundo Visual Foxpro] Listbox click y filtro

1,197 views
Skip to first unread message

Pablo

unread,
May 23, 2011, 11:57:58 AM5/23/11
to mundovis...@googlegroups.com
Hola amigos estoy tratando de hacer, que desde un grid que esta compuesto por una vista con dos capos, cada vez que hago clic en una opcion me filter en otras dos tablas que estan relacionadas por un campo en  comun y mostrar los datos de los campos de las tablas relaciones en textbox y una grilla pero no puedo hacer que se refrescques los txtbox ni la grilla que muestras las campos de las dos tablas relacionadas. espero haber sido explicito.

esto puse en el codigo interactivechange:

opcion=ALLTRIM(thisform.list1.List[thisform.list1.ListIndex])
SET FILTER TO vista_cabecera.expediente=opcion IN 2
thisform.grid1.Refresh
thisform.Refresh

esto en el init de mi form:

SET DATE TO FRENCH
PUBLIC expe
PUBLIC opcion
OPEN DATABASE sigedato.dbc
USE vista_todos IN 1
USE vista_cabecera IN 2
USE vista_observaciones IN 3
SELECT 3
INDEX on expediente tag expe
SET ORDER TO expe
SELECT 2
SET RELATION TO vista_cabecera.expediente  INTO 3
thisform.Refresh


osea son tres tablas de las cuales las ultimas dos estan relaciones por el campo expediente, y la primera es la que rellena el listbox, la idea que al hacer clic en cada opcion me filtre y muestre automaticamente los datos en la grilla (subordinada) y en los textbox que representan la union de tabla 2 y 3 (relacionadas)

aca imagen del formhttp://www1.picturepush.com/photo/a/5712164/640/Personales/muestra.jpg

gracias!

Pablo

unread,
May 23, 2011, 5:18:45 PM5/23/11
to mundovis...@googlegroups.com

perdón desde un list box quise decir

Alex Field

unread,
May 23, 2011, 8:48:04 PM5/23/11
to Mundo Visual FoxPro
Hay varias cosas que podrás mejorar.
Una es que si usas una Relación no necesitas un filtro.
o si usas un filtro no necesitas una relación (un filtro es mas lento
que una relación)
si lo hiciste por desesperación porque no funciona te entiendo.

Para que sea mas legible el código en vez de usar número de Areas
podes poner directamente el Nombre.

esto puse en el codigo interactivechange:

m.opcion=ALLTRIM(thisform.list1.List[thisform.list1.ListIndex])
&& en variables de memoria podes poner "m." para que no se

confunda con un campo en la tabla
SET FILTER TO vista_cabecera.expediente=opcion IN
vista_cabecera
thisform.grid1.Refresh
&& el ThisForm.Refresh ejecuta el ThisForm.grid1.Refresh.
thisform.Refresh
&& con el ThisForm.grid1.Refresh te tiene que alcanzar.

esto en el init de mi form:

SET DATE TO FRENCH podes
usarlo en el arranque del sistema y no tenes que llamarlo en todo el
sistema
PUBLIC expe
La variables usadas en un Form podes definirlas como propiedades del
Form para que no
PUBLIC opcion se
mezclen con otros Formularios o programas abiertos.

OPEN DATABASE sigedato.dbc
USE vista_todos IN 0 again alias "vista_todos" Al poner IN 0
el programa elije un área libre.
USE vista_cabecera IN 0 pero
Vos referencias con el nombre que elegiste.
USE vista_observaciones IN 0
INDEX on expediente tag expe IN vista_observaciones
SET ORDER TO expe IN vista_observaciones

SELECT vista_cabecera
SET RELATION TO vista_cabecera.expediente  INTO
vista_observaciones additive

thisform.Refresh
el init del Form hace un Show que Refresca la pantalla no lo
necesitas.
----------------------------------------------------------------------------------------

Fijate el tipo y ancho de los campos "expediente" si hay una
diferencia de largo puede no relacionar.
Como está definido en el ListBox los campos ControlSource, RowSource y
RowSourceType
estos deberían apuntar a la tabla vista_observaciones para que sea
vean los datos.

Pablo

unread,
May 23, 2011, 11:27:24 PM5/23/11
to mundovis...@googlegroups.com
agradezco tu enorme generosidad por tomarte el tiempo en comprender y detallarme cada paso, ya que hace años que no programaba y retome el tema por que en lo laboral me solicitaron, realmente valoro tu ayuda, mañana pruebo todas las mejoras... y les cuento.
Lo que no me quedo claro es eso del área de trabajo in 0, y del additive en la relación, se que es medio básico pero es que realmente no tengo tiempo para ponerme a leer todo de nuevo, si me podrías refrescar la memoria seria genial.


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.

Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com

Pablo

unread,
May 23, 2011, 11:45:53 PM5/23/11
to mundovis...@googlegroups.com
ah otra cosita que quería aclararte es que si necesito un filtro cuando hago clic en las opciones del listbox por que solamente están relacionadas las tablas 2 y 3 (vista_cabecera y vista_observaciones) por que la primera (la que llena el listbox) no esta relacionada por que ahi estan el total de los expedientes los que cumplen y los que no cumplen una la relacion....... obviamente si al hacer clic en un expediente queque no se encuentre en la relacion de la otras dos tablas no filtrar nada, es una estupidez lo se, para eso solo usuario las dos ultimas tablas y listo listbox y grilla suborodinada y listo.... pero lo quieren como les conte, y me complican.. 

por otra parte la grirlla tiene su 
recordsoucetype = 1 "alias"
recordsource= vista.observaciones
linkmaster= vista.cabecera
columncount= 2
en en el controlsource de la columna 1 y 2= los capos respectivos de vista observacines osea detalle y fecha


en el listbox de las opciones
recorsourcetype=6 "campos"
rowsource= vista.todos,expedientes,causante
columncoubt= 2
gracias!

ibania blanco

unread,
May 24, 2011, 10:22:40 AM5/24/11
to Mundo Visual FoxPro
la nueva programacion que observado en estos hilos
solamente utilizan instrucciones sql
fijate que antes yo hacia seek "0001"
hoy
local array lacodigo(1)
select codigo from tabla where codigo=thisform.txtcodigo.value into
cursor tmp
locate
m.codigo=tmp.codigo
thisform.txtmicodigo.value=tmp.codigo
if _tally=0
messagebox("No Existe",0+32+0,"Cuidado")
endif

no filter
no relacion

On 23 mayo, 21:45, Pablo <cirujatu...@gmail.com> wrote:
> ah otra cosita que quería aclararte es que si necesito un filtro cuando hago
> clic en las opciones del listbox por que solamente están relacionadas las
> tablas 2 y 3 (vista_cabecera y vista_observaciones) por que la primera (la
> que llena el listbox) no esta relacionada por que ahi estan el total de los
> expedientes los que cumplen y los que no cumplen una la relacion.......
> obviamente si al hacer clic en un expediente queque no se encuentre en la
> relacion de la otras dos tablas no filtrar nada, es una estupidez lo se,
> para eso solo usuario las dos ultimas tablas y listo listbox y grilla
> suborodinada y listo.... pero lo quieren como les conte, y me complican..
>
> por otra parte la grirlla tiene su
> recordsoucetype = 1 "alias"
> recordsource= vista.observaciones
> linkmaster= vista.cabecera
> columncount= 2
> en en el controlsource de la columna 1 y 2= los capos respectivos de vista
> observacines osea detalle y fecha
>
> en el listbox de las opciones
> recorsourcetype=6 "campos"
> rowsource= vista.todos,expedientes,causante
> columncoubt= 2
> gracias!
>
> El 24 de mayo de 2011 00:27, Pablo <cirujatu...@gmail.com> escribió:
>
>
>
>
>
>
>
> > agradezco tu enorme generosidad por tomarte el tiempo en comprender y
> > detallarme cada paso, ya que hace años que no programaba y retome el tema
> > por que en lo laboral me solicitaron, realmente valoro tu ayuda, mañana
> > pruebo todas las mejoras... y les cuento.
> > Lo que no me quedo claro es eso del área de trabajo in 0, y del additive en
> > la relación, se que es medio básico pero es que realmente no tengo tiempo
> > para ponerme a leer todo de nuevo, si me podrías refrescar la memoria seria
> > genial.
>

Pablo

unread,
May 24, 2011, 1:02:22 PM5/24/11
to mundovis...@googlegroups.com

muchísimas gracias todo salió perfecto.

Alex Field

unread,
May 27, 2011, 11:19:51 PM5/27/11
to Mundo Visual FoxPro
USE Data!Clientes IN 0
abre la tabla Clientes en el área que esté libre.
No es necesario que te acuerdes de los números de áreas.
Usa los nombres de las tablas.

USE Data!Clientes AGAIN ALIAS Cli_Fec ORDER Fecha
USE Data!Clientes AGAIN ALIAS Cli_ID ORDER ID

por ejemplo acá abrís la misma tabla dos veces ordenadas por distintos
campos y distintos nombres.
Cuando necesites una u otra haces SELECT Cli_Fec o SELEC Cli_ID

En realidad ya casi no se usan los SELECT si usas SELECT SQL
es muy potente en VFox el SELECT SQL te puedo mandar
muchos ejemplos.

El additive es para seguir agregando mas relaciones sin que quite
las que tenes hechas. si no usas additive la nueva relación reemplaza
la anterior.

Pablo

unread,
May 28, 2011, 1:06:19 AM5/28/11
to mundovis...@googlegroups.com
muchisimas gracias por la explicacion me sirvio mucho


--

ibania blanco

unread,
May 30, 2011, 2:53:27 PM5/30/11
to Mundo Visual FoxPro
alex
esta repuesta me deja algunas dudas
En realidad ya casi no se usan los SELECT si usas SELECT SQL
es muy potente en VFox el SELECT SQL te puedo mandar
muchos ejemplos

me podes sacar dudas podes dar un ejemplo
gracias por tu amabilidad

Alex Field

unread,
May 31, 2011, 7:47:18 PM5/31/11
to Mundo Visual FoxPro
Puse unos mios y otros de ayudas de VFox

En este caso se genera una tabla en memoria pero que los datos se
pueden modificar como si estuvieran
en el disco, con los nombres de los clientes y al lado una variable
para hacer Ok sobre elegidos.

Select .F. as Ok, Nombre From Datos!Clientes into cursor "cClientes"
readwrite order by 1


&& Crear un cursor en memoria donde el nombre de la tabla está
generado por un SYS(2015) en la propiedad del formulario TablaPpal

CREATE CURSOR (ThisForm.TablaPpal) ;
( Control int, Comprob n(12), nroRemito n(12), Fecha d(8), Total
n(11,2), Proveedor c(32), ;
descuento n(11,2), FP c(2), TC c(2), Balance c(1), Alic n(1), ImpProv
l(1), id int )

&& Leer datos y guardarlos en el cursor en memoria.

INSERT INTO (ThisForm.TablaPpal) ;
SELECT Compras.Control, Compras.comprob, Compras.nroRemito,
Compras.Fecha, Compras.Total, ;
NVL( Prov.descrip, "Sin Definir" ) as Proveedor, ;
Compras.descuento, IIF(Compras.FormaPago=1,"Ef","CC") as FP,
SUBSTR(TComprobantes.descrip,5,2) as TC, TComprobantes.Balance, ;
Compras.Alic, Compras.ImpProv, Compras.id ;
FROM "Compras!Compras" ;
INNER JOIN "Compras!Prov" ON Compras.idProv = Prov.id ;
INNER JOIN "Compras!TComprobantes" ON Compras.tComprob =
TComprobantes.id ;
ORDER BY 1 DESC


&& SQL Having sum()
SELECT Nombre, Domicilio, Fecha, SUM(Importe) ;
FROM Detalle ;
ORDER BY 1,2,3 GROUP BY 1, 2, 3 ;
HAVING SUM(Importe) > 4000 ;
INTO CURSOR cBigOrders

&& Update Tabla Set campo = (Select sum() from ....)

UPDATE "Compras!Clientes" ;
SET Clientes.ultPago=( Select max(Fecha) from "Pagos" where
Pagos.idCliente = Clientes.id ) ;
WHERE Clientes.activo = .T.

&& Select from with (Buffering=.T.)

SELECT SUM(Importe) FROM Compras WITH (Buffering = .T.) INTO CURSOR
cTotal

&& from ... Join (Select)
SELECT Orders.Order_ID, Customer.Company_Name AS Cust_Name, ;
Shippers.Company_Name AS Ship_Name, Orders.Order_Date ;
FROM Orders ;
JOIN (SELECT Customer_ID, MAX(Order_Date) AS Order_Date ;
FROM Orders CheckOrderDate ;
GROUP BY 1) RecentOrder ;
ON Orders.Customer_ID = RecentOrder.Customer_ID ;
AND Orders.Order_Date = RecentOrder.Order_Date ;
JOIN Customer ;
ON Orders.Customer_ID = Customer.Customer_ID ;
JOIN Shippers ;
ON Orders.Shipper_ID = shippers.Shipper_ID ;
ORDER BY Cust_Name ;
INTO CURSOR MostRecentOrders

&& Delete from ... where campo in (select from ... where )
DELETE FROM Products ;
WHERE Supplier_ID IN ( ;
SELECT Supplier_ID ;
FROM Supplier ;
WHERE UPPER(Supplier.Country) = "AUSTRALIA" )

&& Select campo, (sele campo from ...) into cursor ...
SELECT Customer.Customer_ID, Customer.Company_Name, ;
Customer.Address, Customer.City, Customer.Region, ;
Customer.Postal_Code, Customer.Phone, Customer.Fax, ;
(SELECT SUM(Quantity*Unit_Price) ;
FROM Orders ;
JOIN Order_Line_Items;
ON Orders.Order_ID = Order_Line_Items.Order_ID ;
WHERE BETWEEN(Order_Date,DATE(m.nYear,1,1),DATE(m.nYear,
12,31)) ;
AND Customer.Customer_ID=Orders.Customer_ID ) as yTotal ;
FROM Customer ;
INTO CURSOR CustomerTotal

&& UpDate ... set campo = campo from query.
UPDATE SalesByProduct ;
SET SalesByProduct.TotalSales = NVL(MonthlySales.TotalSales, $0), ;
SalesByProduct.UnitsSold = NVL(MonthlySales.UnitsSold, 0) ;
FROM SalesByProduct ;
LEFT JOIN (SELECT Order_Line_Items.Product_ID, ;
SUM(Quantity*Order_Line_Items.Unit_Price) AS TotalSales, ;
SUM(Quantity) AS UnitsSold ;
FROM Order_Line_Items ;
JOIN Orders ;
ON Order_Line_Items.Order_ID = Orders.Order_ID ;
AND (MONTH(Order_Date) = nMonth AND YEAR(Order_Date) = nYear) ;
GROUP BY 1);
AS MonthlySales ;
ON SalesByProduct.Product_ID = MonthlySales.Product_ID

&& Sql Store Procedure
TEXT TO cSQl TEXTMERGE PRETEXT 7 NOSHOW
UPDATE CLIENTE SET SALDO = ?montonuevo WHERE IDCLIENTE = ?
oCliente.IdCliente
ENDTEXT
Reply all
Reply to author
Forward
0 new messages