FoxPro/Visual FoxPro - foxpro scatter memvar

   
Vista:

foxpro scatter memvar

Publicado por jordi vela jordivela007@gmail.com (2 intervenciones) el 18/01/2013 09:35:37
Tengo un programa hecho con visual foxpro v7 y al pasarla a la 9 me da error en
"SCATTER MEMVAR TO aimp"


No se como solucionarlo, soy novato en visual foxpro. Por favor, ayuda!

Código error linea 13

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
ot = CREATEOBJECT("_thermometer")
 ot.caption = "Importación de Productos"
 ot.show
 USE SHARED productos AGAIN ALIAS pro ORDER ID IN 0
 USE import\e-productos AGAIN ALIAS imp IN 0
 SELECT pro
 REPLACE activo WITH .F. ALL
 SELECT imp
 SET FILTER TO activo
 COUNT TO ot.ibasis
 ln = 1
 SCAN
    SCATTER MEMVAR TO aimp
    REPLACE pro.ft WITH {}
    IF SEEK(imp.id, "pro", "id")
       SELECT pro
       lnantstock = stock
       lnantstockmin = stockmin
       lnantstockmax = stockmax
       ldfc = fc
       ldfm = fm
       GATHER FROM aimp
       REPLACE stock WITH lnantstock
       REPLACE stockmin WITH lnantstockmin
       REPLACE stockmax WITH lnantstockmax
       REPLACE fc WITH ldfc
       REPLACE fm WITH ldfm
       REPLACE ft WITH DATE()
    ELSE
       SELECT pro
       APPEND BLANK
       GATHER FROM aimp
       REPLACE ft WITH DATE()
    ENDIF
    SELECT imp
    ot.update(ln)
    ln = ln+1
 ENDSCAN
 SELECT pro
 DELETE FOR  .NOT. activo
 USE EXCLUSIVE productos
 PACK
 REPLACE ft WITH DATE() ALL
 REINDEX
 USE
 SELECT imp
 USE
 ot.complete
 ot.release
ENDPROC
**
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

foxpro scatter memvar

Publicado por Fidel (558 intervenciones) el 18/01/2013 14:35:34
Debes decidir simplemente si el SCATTER va dirigido a una matriz ó a MEMVAR
Si es a un Array, entonces: SCATTER to gaArrayNombre y GATHER FROM ARRAY gaArrayNombre
Si es a MEMVAR, entonces: SCATTER MEMVAR y GATHER MEMVAR
Las dos juntas no funcionan. Pero tampoco tiene sentido usarlas.
De paso te comento que las más de las veces, SCATTER MEMVAR funciona más rápido que SCATTER TO gaArrayName. ( no la gran diferencia, claro).

Si tenés campos memos, tenés que agregar la cláusula MEMO.
SCATTER MEMO MEMVAR GATHER MEMVAR MEMO
SCATTER MEMO to gaArrayName GATHER FROM gaArrayName MEMO
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

foxpro scatter memvar

Publicado por juan (47 intervenciones) el 19/01/2013 02:39:06
Hola Fidel, una pregunta amigo, yo trabajo con Buffer 3, y para guardar hago:

Apend Blank
Replace campotabla With variable

y otras con

Apend Blank
Replace campotabla With thisform.textbox1.value

Pero se me hace muy engorroso ya que hay veces que colocamos otros objetos textbox a los formularios por alguna necesidad, así como tambien algunos campos a las tablas.

Si hay alguna otra mejor solucion que esta como yo hago te agradecería me explicaras amigo.
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

foxpro scatter memvar

Publicado por Fidel (558 intervenciones) el 19/01/2013 14:21:03
Para utilizar buffering, prefiero el valor 5 (optimista de tabla).
Eso te independiza de si querés modificar un solo registro o varios. En algunos casos el valor 3 funciona perfectamente porque estás agregando, modificando ó borrando un solo registro. Cuando trabajas con un tabla de detalles (secundaria) con varios registros, la cosa se complica.

Puedes trabajar con bloqueo automático con buffer (como propones) ó con bloqueo manual de registros.

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
1) Bloqueo automático con Buffer
SET MULTILOCKS ON
CURSORSETPROP("Buffering", 5, "MiTabla")
 
*************************
PROCEDURE GRABAR(lAppend)
*************************
Select MiTabla
nValorInventado=Thisform.Text16.Value
cFormula=[ Round( nValorInventado * nValorInventado1 / nValorInventado2,2) ]
if lAppend
	APPEND BLANK
endif
REPLACE Campo1 with lcVariable,;
	Campo2 with thisfom.Text2.Value,;
	Campo3 with Thisform.Propiedad3,;
	Campo4 with Thisform.gaPropiedad[3,2],;
	Campo5 with gaArray[4],;
	Campo6 with otroform.Text5.Value  ,;  && otroform es otro formulario que está  abierto
	Campo7 with nValorInventado,;
	Campo8 with Evaluate(cFormula),;
	Campo9 with EVL(Thisform.Text6.Value,"Sin Datos")
 
	etc....
nMess=Messagebox("Confirma la operación?",4,"Grabando")
if nMess=6
        TableUpdate(.t.,"mitabla")  && hace efectivos los cambios en la tabla
else
        TableRevert(.T.,"Mitabla")   && descarta todos los cambios y vuelve a lo anterior.
endif
Acá no se necesita UNLOCK ni FLUSH. De eso se encarga Visual Fox.
 
2) Bloqueo manual de registros
*************************
PROCEDURE GRABAR(lAppend)
*************************
Select MiTabla
nValorInventado=Thisform.Text16.Value
cFormula=[ Round( nValorInventado * nValorInventado1 / nValorInventado2,2) ]
if lAppend
	APPEND BLANK       && bloquea automáticamente el registro
else
	if !RLOCK()         && intenta bloquear el registro
		Messagebox("No puedo bloquear el registro")
		return
	endif
endif
REPLACE Campo1 with lcVariable,;
	Campo2 with thisfom.Text2.Value,;
	Campo3 with Thisform.Propiedad3,;
	Campo4 with Thisform.gaPropiedad[3,2],;
	Campo5 with gaArray[4],;
	Campo6 with otroform.Text5.Value  ,;  && otroform es otro formulario que está  abierto
	Campo7 with nValorInventado,;
	Campo8 with Evaluate(cFormula),;
	Campo9 with EVL(Thisform.Text6.Value,"Sin Datos")
 
	etc....
UNLOCK         && desbloqueo manual
FLUSH             && solid disk. Graba realmente en el disco.


Además de lo que indicas, trabajando con tablas nativas de Visual Fox y Buffering=5, puedes hacer operaciones directamente sobre tablas.
Con bloqueo manual también se puede, pero tiene un inconveniente insuperable. Necesitas bloquear el registro editado. Si el operador se demora o se va a su casa, tendrá que ir alguien a terminar la operación. Los otros en la red no podrán acceder a ese registro.
La norma es bloquear solamente para cambiar algo y desbloquear inmediatamente.

En este ejemplo, no es necesario poner ningún REPLACE al grabar, porque asociamos los campos de las tablas a los .ControlSource de los objetos del formulario.
Para agregar un registro con el botón de agregar, sería:
*Evento Click del botón Agregar Registro
SELECT MITABLA
APPEND BLANK
&& acá se puede aprovechar para introducir con REPLACE, uno o más valores
&& predeterminados ó recomendados para la tabla. Por ejemplo:
REPLACE FECHA WITH DATE()
THISFORM.REFRESH && (o mejor, .Refresh() solamente sobre los objetos afectados)
Thisform.Text1.SetFocus()

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
******************************************************
* OPERANDO DIRECTAMENTE SOBRE TABLAS
******************************************************
* PROCEDURE LOAD ó INIT del Formulario
***************************************
SET MULTILOCKS ON	* Esto puede estar al principio del sistema
dimension gaTablas(2)
gaTabla[1]="MiTabla"
gaTabla[2]="TablaDet"
For i=1 to alen(gatablas)
	CURSORSETPROP("Buffering", 5, gaTabla[i])
next
 
* PROCEDURE INIT del Formulario
*******************************
WITH THISFORM
	.TEXT1.CONTROLSOURCE='MiTabla.Campo1'
	.Text2.ControlSource='MiTabla.Campo2'
	.Edit1.ControlSource='MiTabla.CampoMemo1'
ENDWITH
WITH THISFORM.GRID1
	.RecordSource='TablaDet'
	.ColumnCounts=4
	.Columns[1].ControlSource='Tabladet.Campo1'
	.Columns[2].ControlSource='Tabladet.Campo2'
	.Columns[3].ControlSource='Tabladet.Campo4'
	.Columns[4].ControlSource='Tabladet.Campo8'
endwith
 
* En el formulario tendrás botones para indicar la acción ;
* agregar, MOdificar, Borrar registros, con sendos botones ;
* Para agregar un registro utilizas el APPEND BLANK, pero en el ;
* botón de "Agregar". Para borrar, usas DELETE, pero en el botón ;
* de "Borrar". Y para modificar, simplemente cambias los valores ;
* Los cuadros de edición pueden estar inicialmente como Enabled=.F. ;
* y pasan a Enabled=.T. cuando pides alguna operación.
*
* En la cuadrícula (grid1) puedes hacer cambios directamente si  ;
* .Columns[x].Readonly=.F. O bien puedes utilizar otro formulario ;
* para hacer los cambios y validación, dejando el control Grid como ;
* un punto de inspección (es lo que utilizo generalmente).
 
* Botón de Grabar + Botón de Cancelar (CommandGroup)
* En el boton de grabar los cambios, Evento Click
nMess=Messagebox("Desea Grabar Esto?",4,"Mensaje")
if nMess#6
	return
endif
dimension gaTablas(2)
gaTabla[1]="MiTabla"
gaTabla[2]="TablaDet"
For i=1 to alen(gatablas)
	TableUpDate(.T.,gaTabla[i])
NEXT
* THISFORM.RELEASE ó Código siguiente
 
* En el botón de Cancelar los cambios, Evento Click
nMess=Messagebox("Desea Cancelar Esto?",4,"Mensaje")
if nMess#6
	return
endif
dimension gaTablas(2)
gaTabla[1]="MiTabla"
gaTabla[2]="TablaDet"
For i=1 to alen(gatablas)
	TableRevert(.T.,gaTabla[i])
NEXT
* THISFORM.RELEASE ó Código siguiente


También podemos utilizar cursores y propiedades del formulario para traer valores al form. Esto es mucho más utilizado que la operación directa sobre tablas.
Trabajando con cursores que tengan igual estructura que las tablas, las actualizaciones a tablas se hacen de dos formas. Si tienes índices que reconozcan la operación en todas las tablas que se modifican, puedes utilizar esos índices.
En tablas nativas, también se utiliza el número de registro (Recno())
Los cursores pueden crearse antes de ordenar los ControlSource del form, o crear un método en el formulario donde se produzcan las asociaciones de cursores a Objetos para que se pueda llamar desde cualquier punto.
Ubicados los registros que se cambian, se puede apelar a SCATTER MEMVAR, GATHER MEMVAR para los cambios en las posiciones que correspondan.
Los cursores pueden tener más campos que las tablas de origen. Estos campos se pueden agregar con ALTER TABLE, en la medida en que las tablas sean tablas estándar de VisualFox. ALTER TABLE no soporta nombres largos de campos.
También pueden tener más campos cuando se los genera con SELECT-SQL
Por ejemplo, SELECT *,RECNO() FROM MITABLA WHERE CODIGO==lcCodigo into cursor bMitabla
El cursor tendrá en su último campo el número de registro de la tabla base.
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

foxpro scatter memvar

Publicado por jordi vela jordivela007@gmail.com (2 intervenciones) el 19/01/2013 13:39:39
pero en este caso

la linea

1
SCATTER MEMVAR TO aimp


la cambio solo por

1
SCATTER MEMVAR



Y con la variable aimp que hago?
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

foxpro scatter memvar

Publicado por Fidel (558 intervenciones) el 19/01/2013 15:05:33
Si quieres utilizar aimp, puedes hacerlo.
SCATTER TO aImp (no pones MEMVAR en la sentencia)

y luego actualizas con (como lo haces)
GATHER FROM ARRAY aImp

Esto es lo que está mal: SCATTER MEMVAR TO aimp
MEMVAR Y TO aArrayName son excluyentes. O la una o la otra.
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