FoxPro/Visual FoxPro - Listado por condiciones de selección en grid

 
Vista:
sin imagen de perfil

Listado por condiciones de selección en grid

Publicado por Antonio (12 intervenciones) el 14/10/2016 12:24:51
Buenos días.
Estoy realizando un pequeño programa de facturación y estoy realizando un formulario de cambios de precios, en el cual se pueden cambiar precios por cantidad o porcentajes. Y se cambiarían según la condición de selección en familias, subfamilias, modelos , ...

Podréis apreciar en la imagen los formularios, en el cual al seleccionar aparece otro formulario donde he creado una serie de variables globales que al finalizar el formulario se destruyen.

Las variables son tipo array para que guarde la selección que realizo en el grid con un campo check.

Al seleccionar y darle a aceptar realiza un select guardando en la variable tipo Array los seleccionados.

Ahora el problema es como sacar de la tabla artículos todos los que cumplan las condiciones de lo seleccionado en uno o varios grids.


He pensado en varias soluciones como crear un cursor e ir añadiendo a este con append from o un select recorriendo la variable array todos los que vayan cumpliendo la condición pero no me termina de cuadrar.

Por favor les agradecería me diesen ideas si han realizado algo parecido.

Muchas gracias.


Cambio
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 59
Ha disminuido 1 puesto en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Listado por condiciones de selección en grid

Publicado por Juan R. (114 intervenciones) el 14/10/2016 17:29:07
Buenas Antonio

Perdona, pero hoy debo estar algo torpe, pero no entiendo lo de los grids? Cuantos grids distintos puedes tener?

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Listado por condiciones de selección en grid

Publicado por A. (12 intervenciones) el 14/10/2016 18:07:50
he creado un grid para seleccionar Familias, otro para el de subfamilias, otro para modelos y marcas. El de proveedores posiblemente lo quite o realice otra función con el.

Cada grid guarda en una variable tipo array las opciones seleccionadas. Aunque estoy dándole vueltas que si selecciona algunos grid otros se desabiliten por que veo que con ese solo grid puede acceder a la información q se quiera.... o quizás acotarlo mas.

Pero principalmente lo que quisiera saber aunque tuviese un solo grid en el cual se guarda una variable aMarca[n] donde....

aMarca[1,1]= "Ford"
aMarca[2,1]="Mercedes"
aMarca[3,1]="Renault"

Como sacaría un listado de la tabla articulos donde existe un campo con nombre marca cuya condición sea las q esten en el array.

Un saludo y gracias por contestar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Listado por condiciones de selección en grid

Publicado por Fidel José (657 intervenciones) el 15/10/2016 01:24:23
Nada más para darte una idea fijate en las siguientes posibilidades:

Supongamos que tenemos un archivo de productos llamado PRODUC.DBF con un campo llamado "MARCA".

A)
1) Obtener un array de marcas a partir del archivo de productos Produc.dbf
SELECT distinct marca FROM produc WHERE !EMPTY(marca) INTO ARRAY laMarca

2) Obtener un cursor con todos los productos cuya marca se encuentra en el array LaMarca
SELECT *,RECNO() as ph_rec FROM produc WHERE ASCAN(laMarca,marca,1,0,0,7)>0 INTO CURSOR curProMar readwrite

B)
lcList_Marcas=",YPF,OSRAM,PHILIPS,"
SELECT *,RECNO() AS PH_REC FROM PRODUC WHERE AT(CHR(44)+TRIM(MARCA)+CHR(44),m.lclist_marcas)>0 INTO CURSOR curByMar readwrite

C)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LOCAL ARRAY LaMarca(3)
laMarca[1]="OSRAM"
laMarca[2]="YPF"
laMarca[3]="FORD"
 
* Se construye un script para la clásula Where porque los valores de IN (Set_value ) necesitan estar calificados.
lcList = ""
lnTimes = ALEN(laMarca)
FOR i= 1 TO m.lnTimes
	lcList = m.lcList ;
		+ CHR(34)+TRIM(laMarca[i])+CHR(34) ;
		+ IIF(i=m.lnTimes,"",CHR(44))
NEXT
 
lcWhere = "Marca In ("+lcList+")"
 
SELECT *,RECNO() as ph_rec FROM produc WHERE &lcWhere INTO CURSOR CurByMar READWRITE
SELECT curbymar
BROWSE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Listado por condiciones de selección en grid

Publicado por A. (12 intervenciones) el 15/10/2016 09:02:08
Gracias por las respuestas amigo, me pongo a probar y te cuento cómo salió.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Listado por condiciones de selección en grid

Publicado por Antonio (12 intervenciones) el 16/10/2016 10:40:48
Muchas gracias por la respuesta, salió justamente lo que necesitaba, no había trabajado con arrays y estaba un poco perdido.

Ya por curiosidad por que otra de las cosas que le ocurre al grid de selección es que me cuenta cuantos tengo seleccionados cada vez que puso con el ratón encima del check, pero cuando lo hago con la tecla espaciadora para seleccionar y quitar selección falla no cuenta bien.

Lo he probado tanto en el evento clic como en el cambio interactivo.

1
2
3
4
reg = RECNO()
COUNT FOR marcado TO _marcado
thisform.Caption = "Buscar Marca     "+TRANSFORM(_marcado,"99,999,999")+" Registros seleccionados"
GOTO reg

Me aparece el mensaje pero no cuenta bien. El campo marcado es uno lógico con el que se crea el cursor de lectura/escritura que se muestra en el grid y se supone que al cambiar el valor se guarda solo.


Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Listado por condiciones de selección en grid

Publicado por Fidel José (657 intervenciones) el 16/10/2016 16:28:12
Lo que ocurre ahí es que el valor en el cursor se actualiza en el Evento LostFocus del objeto, y el Evento LostFocus ocurre después del interactiveChange.

Para solucionar este tema, tienes dos formas:
1) Crear una clase checkbox con un par de propiedades ( al menos)
Una que pueda recibir la referencia de objeto del grid
Otra para que pueda recibir el método que debe ejecutar cuando se produce el evento, mediante RAISEEVENT

2) Utilizar BindEvent()
Mirá el ejemplo que sigue, que crea un cursor y un form, a éste le agrega un control grid y un textbox para la cuenta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
*<Metodo_Sample_grid_BindEvent>
LOCAL lcCursor,lnFields,i,lnWidth
LOCAL ARRAY laFields(1)
 
lnWidth = 0
 
*<CrearCursor>
lcCursor = "Curclien"
SELECT nombre,cuit,idclien,monto,.f. as incluye ;
	 FROM clientes ;
	 WHERE !EMPTY(monto) ;
	 INTO CURSOR curclien READWRITE
*</CrearCursor>
 
IF _tally > 0
 
	*<CrearForm>
	ADDPROPERTY(_screen,"oform",NEWOBJECT("Form"))
 
 
	lnFields = AFIELDS(lafields,lcCursor)
	WITH _screen.oform
		.top = SYSMETRIC(9)
		.left = 20
		.BackColor = RGB(184,201,197)
	ENDWITH
	*</CrearForm>
 
	*</AgregarObjetoGrid>
	_Screen.oform.NewObject("grdClien","Grid")
	WITH _Screen.oform.grdclien
		.RecordSource = m.lcCursor
		.columnCount = m.lnFields
		.deletemark = .f.
		.Fontsize = 8
		.AllowCellSelection = .T.
		.top = 3
		.left = 3
		.setall("Readonly",.t.,"Column")
 
		.width = 500
		.height = 300
		.visible = .t.
		FOR i = 1 TO m.lnFields
			.columns[i].ControlSource = m.lcCursor+"."+laFields[i,1]
			.Columns[i].Header1.Caption = PROPER(laFields[i,1])
			.fontSize = 8
			DO CASE
				CASE laFields[i,2] = "C"
 
				CASE laFields[i,2] = "N"
					.Columns[i].Format = "Z"
					.cOLUMNS[i].InputMask = REPLICATE("999",CEILING(laFields[i,3]/3));
						+ IIF(EMPTY(laFields[i,4]),"","."+REPLICATE("9",lafields[i,4]))
 
				CASE laFields[i,2] = "D"
					.Format = "D"
 
				CASE laFields[i,2] = "L"
					IF !PEMSTATUS(.Columns(i),"Check1",5)
						.Columns(i).newobject("Check1","Checkbox")
						WITH .columns(i).Check1
							.Caption = ""
							.Autosize = .t.
							.alignment = 2
							.backstyle = 0
							.SpecialEffect = 0
							.visible = .t.
						ENDWITH
						.Columns(i).sparse = .f.
					ENDIF
					.Columns(i).Currentcontrol="Check1"
			ENDCASE
		NEXT
		.AUTOFIT()
 
		FOR i = 1 TO .columncount
			lnWidth = m.lnWidth + .Columns(i).Width + 1
		ENDFOR
 
		lnWidth = m.lnWidth ;
			+ IIF(.recordMark,10,0) ;
			+ IIF(.Scrollbars > 1,SYSMETRIC(5),0) ;
			+ 4
		.Width = m.lnWidth
 
	ENDWITH
	*</AgregarObjetoGrid>
 
	*<AgregarTextBoxContador>
	_Screen.oform.NewObject("txt_Cuenta","Textbox")
	WITH _Screen.oform.txt_Cuenta
		.format = "Z"
		.InputMask = "999,999"
		.width = 65
		.height = 21
		.FontSize = 8
		.DisabledForecolor= 0
		.DisabledBackColor = RGB(255,255,255)
		.Enabled = .f.
		.SpecialEffect = 0
		.Top = _Screen.oform.grdClien.top + _Screen.oform.grdClien.height
		.Left = _Screen.oform.grdClien.left + _Screen.oform.grdClien.Width - .Width
		.Visible = .t.
	ENDWITH
	*</AgregarTextBoxContador>
 
 
	WITH _Screen.oform
		.width = .grdClien.Width + .grdClien.left * 2
		.Height = .grdClien.Height + .txt_Cuenta.Height + .grdClien.top * 2
		.grdClien.anchor = 15
	ENDWITH
 
	*<BindEvent>
	lnColumns = _Screen.oform.grdClien.columncount
	lcCurrentControl = _Screen.oform.grdClien.Columns(m.lnColumns).CurrentControl
	_Screen.oform.grdClien.columns(m.lnColumns).REadonly = .f.
	BINDEVENT(_Screen.oform.grdClien.Columns(m.lnColumns).&lcCurrentControl.,"InteractiveChange",thisform,"dlg_grdclien")
 
	*</BindEvent>
 
	_screen.oform.show()
 
 
ENDIF
*</Metodo_Sample_grid_BindEvent>
 
 
*<Metodo_Delegate_InteractiveChange>
* dlg_grdClien * Método del formulario
LOCAL lnEvents,loObj,lcCursor,lcfield
LOCAL ARRAY laEvent(1),laCount(1)
 
lnEvents = AEVENTS(laEvent,0)
IF m.lnEvents > 0
	loObj = laEvent[1]
	lcCursor = GETWORDNUM(loObj.parent.ControlSource,1,".")
	lcField = GETWORDNUM(loObj.parent.ControlSource,2,".")
 
	SELECT (m.lcCursor)
	replace (m.lcField) WITH loObj.Value
 
	SELECT CNT(*) ;
		FROM (lcCursor) ;
		WHERE incluye ;
		INTO ARRAY laCount
	IF _tally > 0 AND VARTYPE(_screen.oform)="O"
		_SCreen.oform.txt_cuenta.value = laCount[1,1]
	ENDIF
ENDIF
*</Metodo_Delegate_InteractiveChange>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Listado por condiciones de selección en grid

Publicado por Antonio (12 intervenciones) el 17/10/2016 01:41:26
Gracias por todo el tiempo que me has dedicado. Pruebo y te cuento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar