PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Uso de MACROS  ???
Uso de MACROS ???
Iniciado por R. Rodrigo, nov., 07 2008 3:32 PM - 8 respostas
Publicado em novembro, 07 2008 - 3:32 PM
Alguin puede aclararme lo siguiente.

En la herramienta de desarrollo que usaba antes (V-FOX), tenia las macros, que usaaba bastante en operaciones ambiguas.

Es decir, si tenemos 3 variables, A,B,C les asignamos valores y efectuamos una operaciones con ellas, que se indica en la instrucciones interna/externa, mediante macro-substitución, se evalua esta formula y nos devuelve el resultado.
Ejemplo:

A= 10 B= 20 C= 30

Formula= "A + B + C"

D = &FORMULA // mediante & indico que ejcute el contenido de FORMULA

D = 60

En Windev, mediante los signos { A }, consigo recuperar el valor de A = 10, pero en el momento que ponfo más de una variable, o asigno operaciones matemáticas me lanza error.

D = {a} // retorna el valor 10 lo cual es correcto

d= {FORMULA} // no retorna nada y genera ERROR

Como puedo conseguir lo anterior en WinDev

Gracias anticipadas

Un saludo

R. Rodrigo
Publicado em novembro, 07 2008 - 6:21 PM
Hola,

Puedes utilizar la función COMPILE. Esta función evalúa una expresión o un bloque de código.

sMiCodigo is string = "result( varA + varB + varC )"
CompilResult is string

CompilResult = Compile("DynProc", sMiCodigo)

IF "" = CompilResult THEN
Info(ExecuteProcess("DynProc", trtProcedure))
ELSE
Info(CompilResult)
END


--
saludos
pat
Publicado em novembro, 08 2008 - 6:31 PM
Muchas gracias, voy a probarlo a ver que tal resulta.



pat wrote in news message <8549e1e75baa370585c9c5df0509b41f@news.pcsoft>:
Hola,

Puedes utilizar la función COMPILE. Esta función evalúa una expresión o un bloque de código.

sMiCodigo is string = "result( varA + varB + varC )"
CompilResult is string

CompilResult = Compile("DynProc", sMiCodigo)

IF "" = CompilResult THEN
Info(ExecuteProcess("DynProc", trtProcedure))
ELSE
Info(CompilResult)
END


--
saludos
pat
Publicado em novembro, 08 2008 - 8:46 PM
La forma de trabajar es la que indica Pat pero se le ha pasado un pequeño detalle y es que las variables tambien hay que declararlas dentro del codigo que queremos evaluar.
sCompilResult is string
sMiCodigo is string = "nVarA is int=10"+CR+"nVarB is int=123"+CR+"nVarC is int=77" +CR +"result( nVarA + nVarB + nVarC )"


sCompilResult = Compile("DynProc", sMiCodigo)

IF "" = sCompilResult THEN
Info(ExecuteProcess("DynProc", trtProcedure))
ELSE
Info(sCompilResult)
END


Saludos
Publicado em novembro, 10 2008 - 4:41 PM
Pat, Salvador, gracias por contestar

Estas indicaciones, funcionan OK, pero no me soluciona el problema, tal vez debido a que no me explique con detalle.

Problema:

Tengo un fichero (PerdidasYGanancias) donde defino la composición de listado de PYG, cada linea lleva un campo llamado CUENTAS en el que defino las cuentas que intervienen para esa linea, la aplicación busca las cuentas que intervienen, y si la encuentra, en otro campo de dicho registro llamado SALDO voy acumulando estos importes y otro campo CONTROL que el que contiene la formula.

Estructura registro: campo1, campo2, .....CUENTAS,.....SALDO....CONTROL

Contenido campo : ..............................5700,5720,........ 0....A1 = 1000

Contenido campo : ..............................4300,4301,........ 0....B1 = 2000

Contenido campo : ..............................+A1+B1,........... 0....TOTALES = 3000


Tengo que aplicar la MACRO,COMPILE, ???? sobre el control TOTALES donde el contenido del campo cuentas = A1+B1, indica la operación y variables a usar, y de ejecutar este campo y obtener el resultado = 3000

Con V-Fox que es la herramienta que usaba, lo tenia sencillo.

1 - Actualizaba los campos parciales A1,B1,...... leyendo los registros de trabajo y sumando al campo SALDO creando al mismo tiempo una variable en memoria que se llama A1, 2, B1, B2......

2 - Una vez leidos y actualizados los registros del fichero, entonces como tengo definidas en memoria las variable calculadas A1, B1, etc ..... ejecutando la MACRO-SUBSTITUCION

nuevo_resultado=&CUENTAS (cuentas="+A1,+B1")

efectua la operacion +A1+B1 y obtenemos el resultado 3000 que es el buscado.


De esta forma, siempre se puede cambiar la configuracióm, lineas, formulas del fichero PYG y obtenemos el informe deseado.


Como veis es MUCHO ROLLO.

Gracias anticipadas y un saludo

R. Rodrigo
Publicado em novembro, 15 2008 - 12:56 PM
Hola,

He probado algo mejor (creo que es mejor). Puedes escribir una función llamado "macro" como así :

Procedure macro(sFormula is string)
sResult is string
sCompileResult is string
sSource is string

sSource = "RESULT (" + sFormula + ")"

WHEN EXCEPTION IN
sCompileResult = Compile("Dynamic_Proc", sSource)
SWITCH sCompileResult
CASE "": sResult = ExecuteProcess("Dynamic_Proc", trtProcedure)
CASE "ERR": sResult = "Unable to compile. "+CR+ErrorInfo()
OTHER CASE: sResult = sCompileResult
END

DO
sResult = ExceptionInfo()
END
RESULT sResult


Esa función evalúa una fórmula. Tienes que declarar todas las variables GLOBAL. Por ejemplo en el código de la ventana.

var1 is int = 10
var2 is int = 20


Entonces puedes llamar la función macro como así

Info( macro("var1 + var2") )
Info( macro("DateToDayInAlpha(today)") )


--
Saludos
pat
Publicado em novembro, 18 2008 - 12:48 AM
Pat, Salvador, gracias por las aclaraciones que nos aportais a los que empezamos y tenemos nuestras dudas.

Pienso estais haciendo una muy buena labor aclarando todas o casi todas las preguntas/dudas que se plantean en el foro.

Por eso en mi nombre y pienso que en el demuchos otros, os estoy produndamente agradecido.

Si alquin considera mi opinión, seria una buena idea adherirse a este post agradeciendo la ayuda DESINTERESADA de estas dos personas.

Un saludo
Publicado em novembro, 18 2008 - 12:48 AM
Pat, todo perfecto, pero, siempre hay un pero, :

Es posible mediante la EJECUCION de la aplicación definir NUEVAS VARIABLES GLOBALES. ????

Un saludo
Publicado em novembro, 18 2008 - 12:46 PM
Hola Rodrigo,

Desafortunadamente no se puede definir variables globales con la funcion compile. Pero puedes utilizar una variable globale de tipo arregla, o mejor arreglo asociativo (leer http://megustawindev.free.fr/index.php…).

--
Saludos
pat
http://megustawindev.free.fr