FoxPro/Visual FoxPro - funciones avanzadas

   
Vista:

funciones avanzadas

Publicado por leo (2 intervenciones) el 04/04/2013 03:46:53
Buen día, tengo una curiosidad en mi país existe un software llamado profit (nomina) una de las versiones esta en fox, dicho software trabaja a base de variables y concepto este no es mas que funciones, las cuales están almacenadas en una tabla campo memo...

ejemplo:
1) var a001 sueldo mesual = 3000
2) concepto a001 sueldo diario = var a001 / 30 = 100

este fue un concepto sencillo existen concepto con anidaciones:

concepto a002 sueldo quincenal = concepto a001 * 15 = 1500

otro seria (no espero que comprenda esto es solo para que tenga idea de lo complejo que puede ser un concepto)

concepto q023 monto base la retencion impuesto lph =
(iif(tcontrato='91',concepto('A300','Vacaciones')+concepto('A301','Vacaciones en Festivos y Descansos')+concepto('A303','Días de Sueldo Pendiente'),iif(constante('S017','Aplicar Retenciones al final del Mes (S)')='S', concepto_valor_acumulado('A001', IIF(EMPTY(campo_var('V001','Fecha Mes Anterior/Base Salario Integral Prestaciones')),inicio_primera_semana(tfecini_nom, tfecfin_nom),campo_var('V001','Fecha Mes Anterior/Base Salario Integral Prestaciones')+1), tfecfin_nom), concepto('A001','Sueldo'))+concepto('A002','Día de Descanso')+concepto('A005','Feriado Legal')-concepto('D006','Vacaciones Pagadas')))

las funciones la puedes ir armando y testeando en tiempo de ejecución

mi interrogante es como pudieron hacer para que foxpro le pueda procesar estas funciones en tiempo ejecución, como seria el codigo para leer y procesar los antes descrito las anidaciones...

lo unico que se me viene a la mente es el EXECSCRIPT( ) ... pero realmente ni idea
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

funciones avanzadas

Publicado por Fidel (558 intervenciones) el 04/04/2013 16:27:19
Por lo que se ve ahí, se trata de una fórmula, en la cual se emplean funciones de usuario.
el valor lo traerá seguramente la función Evaluate()
Por ejemplo:
lcFormula=" a + b * h "
a=100
b= 0.25
h= 30

lnValor=Evaluate(lcFormula) && 100 + 0.25 * 30

Nota: también funciona;
lnValor = &lcFormula && Evaluate() es más rápida


ExecScript() permite crear un procedimiento al vuelo y ejecutarlo sin que tenga que estar el código escrito en un método o procedimiento. Por ejemplo:
TEXT TO vProcedure NOSHOW
CREATE CURSOR PEPE ("FECHA" D,"IMPORTE" N(12,2))
nImporte=0
FOR i=1 to 5
nImporte=nImporte + i * 5000
insert into pepe (fecha,importe) values (date(),nImporte)
next
select pepe
go top
BROWSE
ENDTEXT

ExecScript(vProcedure)

En algunos casos puedes tener procedimientos almacenados en campos memo de una tabla.
En otros casos, se puede combinar BindEvent() con un cDelegate único que en realidad ejecuta un ExecScrip() para una variable de texto creada con TEXT ENDTEXT. Con esto logras que el cDelegate sea variable.

Ejemplo de combinación BindEvent() y ExecScript()
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
* Clase Custom de una vcx
*-------------------------------------------------------------------------
* Procedure BuscarText (método de la clase Custom)
* -------------------------------------------------------------------------
* Comandos Varios (se genera un cursor [Filenco] con información que se muestra)
* Se crea un formulario con un grid para mostrar la información
* Se agrega un botón al formulario de consulta para indicar una acción a seguir
* El botón no tiene código, se lo enlaza a traves de BindEvent()
 
ADDPROPERTY(this,"ObjGri")     && Agrega una propiedad a la custom
&& crea un form con 1 GRid desde la Clase Form "FrmGrid" de MzGRid.vcx
this.objgri=NEWOBJECT("FrmGrid","MzGrid")
 
* Actualiza propiedades de MyGrid1 (Custom)
WITH this.objgri.myGrid1
	.fileUsed="Filenco"
	.FrmCaption="Buscando Textos en "+xcListaTablas
	.qRows=10
	.ttcol="TABLA,CAMPO,PALABRA,REGISTRO,TEXTO"
	.tthea="Tabla,Campo,Buscado,Regis,Texto"
	.ttwid="60,60,120,60,350"
	.GetGrid()  && genera el control Grid del form This.objGri (método de la clase)
ENDWITH
this.objGri.MyGrid1.AddAccion()  && Agrega un Commandbutton de la clase (método de la clase)
 
ADDPROPERTY(this,"TxScript","")  && Agrega una propiedad a al Custom
 
* Programa al vuelo *************
TEXT TO this.TxScript NOSHOW
	lnRegistro=filenco.registro
	lcTabla=ALLTRIM(filenco.Tabla)
	SELECT (lcTabla)
	GO lnRegistro
ENDTEXT
this.objGri.Show()	&& Muestra el formulario creado
 
* Enlaza un código al botón agregado al Form This.objGri
 
BINDEVENT(this.objGri.CmAccion1,"Click",this,"Ejeprog")
 
* ENDPROC
* --------------------------------------------------------
 
* -----------------
* PROCEDURE EJEPROG (método de la Clase Custom)
* -----------------
ExecScript(this.txScript)	&& Ejecuta el programa al vuelo
this.objGri.release 		&& libera el formulario del Grid
 
IF VARTYPE(this.frmbusca)="O"	&& libera un formulario si existe
	this.frmBusca.release
ENDIF
* ENDPROC
* ----------------------------------------------------------------
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

funciones avanzadas

Publicado por leo (2 intervenciones) el 04/04/2013 18:05:45
Excelente, mucha 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