FoxPro/Visual FoxPro - Calcular saldos

   
Vista:

Calcular saldos

Publicado por JOSE ERNESTO (15 intervenciones) el 05/02/2014 16:30:08
QUIERO CALCULAR SALDOS POR CODIGOS, TRATO DE USAR ESTE PROGRAMA, PERO ME GENERA EL ERROR SIGUIENTE: "THISFORM, sólo puede usarse en un método"

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
close all
set date to dmy
set talk off
Use movimientos1 excl
index on alltrim(codigo)+dtos(fecha) tag codigo
go top
xfecha = thisform.text1.value
Do while !eof()
   if !empty(codigo) &&& Si el codigo del articulo no esta vacio que ingrese
	   xsaldo = 0    &&& a este ciclo
	   marticulo = alltrim(codigo)
	   Do while !eof() and marticulo==alltrim(codigo)
	       if movimientos1.fecha>= xfecha
	          Replace saldo with xsaldo + entradas - salidas
		   	  xsaldo = saldo
	   	   else    &&& Necesitamos saber la existencia anterior antes de empezar a calcular nuevo rango.
			   xsaldo = saldo
	   	   endif
	   	   Skip
	   Enddo
   else
   		skip
   endif
 
Enddo
=messagebox("Calculo Finalizado con Exito",16,"aaaa")
brow nomodi fields  codigo,fecha,entradas,salidas,saldo

MUCHO LES AGRADECE QUE ME AYUDEN.-
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

Calcular saldos

Publicado por Fidel José (558 intervenciones) el 05/02/2014 23:33:44
Ese código no es genérico y no puede más que estar en un método del formulario, o en una clase custom que se agrega al formulario manualmente o por código.

Si por algún motivo tenés que tenerlo en una función dentro de un prg y necesitas el dato de la fecha, tienes dos opciones:
1) pasar la fecha como parámetro al procedimiento
Si la función se llama CalculeSaldo(), sería así:
Desde el formulario
CalculeSaldo(thisform.text1.value)
En el prg
PROCEDURE CalculeSaldo
LPARAMETERS xdFecha


2) pasar como parámetro la referencia de objeto del formulario,
CalculeSaldo( thisform )

En el prg
PROCEDURE CalculeSaldo
LPARAMETERS xoForm
LOCAL LDFECHA
ldFecha=xoForm.Text1.Value

3) Pasar la referencia de objeto del objeto que tiene la fecha (en este ejemplo, text1)
En el form
CalculeSaldo(thisform.Text1)

En el prg
PROCEDURE CalculeSaldo
LPARAMETERS xoObjeto
LOCAL ldFEcha
ldFecha=xoObjeto.Value

Para el caso que planteas, lo más simple:
Crea un método en el formulario que uses, por ejemplo, "CalcularSaldo" y cuando quieres correr la rutina pones Thisform.CalcularSaldo()

Observaciones
1) Movimientos1 es una tabla temporal?. De lo contrario indexar cada vez que se abre no parece una buena idea.
2) Este código nunca debería estar en un método o función. Puedes correrlo al evento Load del formulario, aunque Close All no es recomendable, salvo para la rutina de cierre. A los sumo, CLOSE DATA.
close all
set date to dmy
set talk off

3) Te recomiendo que emprolijes el tema de las variables
LOCAL ldFecha,lcArticulo
Si omites la definición LOCAL, las variables se crean como PRIVATE y son vistas y modificables por cualquier procedimiento inferior hasta que se cierra el procedimiento que las define. Generan ambigüedad.

El prefijo se utiliza más o menos así
1er letra te dice si la variable es local , public o private, o si es un parámetro
L=Local, P=Publica, V=private, X=parámetro
2da Letra te dice el tipo contenido (n=numerico, c=Character, l=Logico, d=date, t=datetime, etc)

No utilices una m como prefijo porque confunde. Una variable de memoria se puede diferenciar claramente de un campo de tabla, con el prefijo m.variable
Así
lcArticulo=alltrim(codigo)
if alltrim(codigo)==m.lcArticulo
*** lo que sea
endif
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