PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Como, onde e por que usar o comando Evaluate (Clarion) ou EvaluateExpression (Windev, Webdev e Windev Mobile)
Como, onde e por que usar o comando Evaluate (Clarion) ou EvaluateExpression (Windev, Webdev e Windev Mobile)
Iniciado por Boller, jun., 18 2025 3:33 AM - Sem resposta
Membro registado
4.520 mensagems
Publicado em junho, 18 2025 - 3:33 AM
Boa tarde

📘 Manual Técnico: Avaliação de Expressões em Tempo de Execução

✅ Objetivo

Permitir a execução dinâmica de expressões fornecidas em tempo de execução, com validação e segurança, tanto no Clarion quanto no WinDev.



🔧 CLARION – Comando EVALUATE

Descrição: Executa uma string como expressão, útil para montar filtros dinâmicos ou cálculos.

A# = Evaluate(FILTRO)
IF Error()
Message('Expressão inválida')
Clear(FILTRO)
Select(?Filtro)
ELSE
?Browse{Prop:Filter} = FILTRO
END

• Sem validação prévia.
• Se a expressão estiver errada, Error() retorna verdadeiro.
• Risco de falha em tempo de execução (G.P.F.) se não tratado.

🔗 Referência: Clarion Evaluate



💡 WINDEV – Comando EvaluateExpression

Descrição: Executa uma string de expressão matemática ou lógica com variáveis e funções WLanguage.

x, y are real
x = 1.5
y = 5
Trace(EvaluateExpression("cos(x) + sin(y)"))

• Necessário validar com Compile() antes para evitar falhas.
• Suporte a funções matemáticas, operadores, e variáveis no escopo.

🔗 Referência:
• EvaluateExpression()
• Compile()



🧱 Classe OOP: clsExpressionEvaluator (WinDev)

// ╔══════════════════════════════════════════════╗
// ║ clsExpressionEvaluator
// ║ Avaliador seguro de expressões WLanguage
// ║ Autor: Adriano Boller
// ╚══════════════════════════════════════════════╝
CLASS clsExpressionEvaluator

PRIVATE
m_sLastExpression IS STRING = ""
m_sLastError IS STRING = ""
m_bLogEnabled IS BOOL = False

CONSTRUCTOR()

PROCEDURE SetLog(bAtivo IS BOOL)
m_bLogEnabled = bAtivo

PROCEDURE GetLastError() : STRING
RESULT m_sLastError

PROCEDURE GetLastExpression() : STRING
RESULT m_sLastExpression

PROCEDURE IsValid(sExpr IS STRING) : BOOL
m_sLastError = ""
m_sLastExpression = sExpr
IF NOT Compile(sExpr) THEN
m_sLastError = "Expression has syntax error: " + sExpr
IF m_bLogEnabled THEN Trace(m_sLastError)
RESULT False
END
RESULT True

PROCEDURE Evaluate(sExpr IS STRING) : ANY
IF NOT IsValid(sExpr) THEN RESULT Null

LOCAL resultValue IS ANY
LOCAL bErro IS BOOL = False

SWITCH
CASE TRUE
resultValue = EvaluateExpression(sExpr)
OTHER CASE
m_sLastError = "Evaluation failed: " + ExceptionInfo()
bErro = True
END

IF bErro THEN
IF m_bLogEnabled THEN Trace(m_sLastError)
RESULT Null
END

RESULT resultValue
END




🧪 Exemplo de uso

LOCAL oEval IS clsExpressionEvaluator
oEval.SetLog(True)

LOCAL sExpr IS STRING = "5 + 3 * (2 + 1)"

IF oEval.IsValid(sExpr) THEN
LOCAL result IS ANY = oEval.Evaluate(sExpr)
Info("Resultado: " + result)
ELSE
Error(oEval.GetLastError())
END




✅ Vantagens da Classe

Recurso Descrição

IsValid() Valida a expressão usando Compile()

Evaluate() Executa e retorna o resultado ou Null

GetLastError() Retorna a última mensagem de erro

SetLog(True) Ativa o log com Trace() para depuração




🚀 Possíveis melhorias futuras
• Suporte a variáveis externas via Map
• Exportação de histórico em JSON
• Blacklist de funções proibidas
• Integração com interpretadores JS para expressões mais dinâmicas


https://help.windev.com/en-US/…

https://help.windev.com/en-US/…


📙 Manual Técnico: Avaliação Dinâmica de Expressões no Clarion vs WinDev

🧩 Introdução

A capacidade de avaliar expressões dinâmicas em tempo de execução é essencial para:
• Engines de regras personalizáveis,
• Filtros dinâmicos de visualização,
• Fórmulas inseridas por usuários finais.

Tanto o Clarion quanto o WinDev oferecem formas distintas para alcançar essa funcionalidade:
• EVALUATE no Clarion
• EvaluateExpression() no WinDev



🔍 Comparação Técnica Profunda

A tabela exibida acima mostra os 10 aspectos fundamentais, como:
✔ Segurança
✔ Sintaxe
✔ Tratamento de Erros
✔ Validação
✔ Contexto de Uso

Destaco abaixo os principais:

🧠 Validação de Expressões


Clarion
❌ Não integrada
Deve usar Error() após a execução

WinDev
✅ Sim
Use Compile("expressão") antes de EvaluateExpression()




⚠️ Segurança e Tratamento de Erros

Clarion:

A# = Evaluate(FILTRO)
IF Error()
Message('Erro de expressão!')
END

• Frágil: sem validação prévia.
• Risco: crash da aplicação se erro não tratado.

WinDev:

IF Compile("cos(x)+sin(y)") THEN
Trace(EvaluateExpression("cos(x)+sin(y)"))
ELSE
Error("Expressão inválida")
END

• Seguro: Compile() detecta erros antes da execução.
• Robustez adicional: encapsular em uma classe com SWITCH e ExceptionInfo().



📦 Classe Profissional em WLanguage

CLASS clsExpressionEvaluator

PRIVATE
m_sLastExpression IS STRING = ""
m_sLastError IS STRING = ""
m_bLogEnabled IS BOOL = False

CONSTRUCTOR()

PROCEDURE SetLog(bAtivo IS BOOL)
m_bLogEnabled = bAtivo

PROCEDURE GetLastError() : STRING
RESULT m_sLastError

PROCEDURE GetLastExpression() : STRING
RESULT m_sLastExpression

PROCEDURE IsValid(sExpr IS STRING) : BOOL
m_sLastError = ""
m_sLastExpression = sExpr
IF NOT Compile(sExpr) THEN
m_sLastError = "Erro de sintaxe: " + sExpr
IF m_bLogEnabled THEN Trace(m_sLastError)
RESULT False
END
RESULT True

PROCEDURE Evaluate(sExpr IS STRING) : ANY
IF NOT IsValid(sExpr) THEN RESULT Null

LOCAL resultValue IS ANY
LOCAL bErro IS BOOL = False

SWITCH
CASE TRUE
resultValue = EvaluateExpression(sExpr)
OTHER CASE
m_sLastError = "Erro na avaliação: " + ExceptionInfo()
bErro = True
END

IF bErro THEN
IF m_bLogEnabled THEN Trace(m_sLastError)
RESULT Null
END

RESULT resultValue
END




🧪 Exemplo Prático

// Exemplo de uso
LOCAL oEval IS clsExpressionEvaluator
oEval.SetLog(True)

LOCAL sFormula IS STRING = "sqrt(49) + cos(3.14)"
IF oEval.IsValid(sFormula) THEN
LOCAL result IS ANY = oEval.Evaluate(sFormula)
Info("Resultado: " + result)
ELSE
Error("Erro: " + oEval.GetLastError())
END




💡 Casos de uso recomendados
1. 🧮 Calculadoras Científicas Dinâmicas
2. 📄 Campos de Fórmula em Cadastros de Produtos (ex: comissões, impostos)
3. 📊 Regras de Workflow customizadas
4. 🧠 Lógica de IA simbólica (avaliando proposições lógicas)
5. 📐 Expressões paramétricas em simulações físicas ou matemáticas



📌 Referências oficiais
• 🔗 WinDev EvaluateExpression()
• 🔗 WinDev Compile()
• 🔗 Clarion Evaluate



🟩 Exemplo Clarion: EVALUATE com Filtro Dinâmico

📌 Objetivo: Avaliar uma expressão digitada pelo usuário para filtrar registros em um Browse.

🔧 Código Clarion:

MAP
INCLUDE('equates.clw'), ONCE
END

MyWindow WINDOW('Exemplo com Evaluate'),AT(,,200,150),CENTER,GRAY,MDI
STRING('Filtro:'),AT(10,10)
ENTRY(@s255),USE(Filtro),AT(50,10,140,10)
BUTTON('Aplicar'),AT(60,30),USE(BtnApply)
BUTTON('Fechar'),AT(120,30),USE(BtnClose)
BROWSE(BrowseFiltrado),AT(10,50,180,90),FROM(MyQueue),USE(?BrowseFiltrado)
LIST,AT(,,180,90)
FIELD(Q:Codigo),HEADER('Código'),WIDTH(30)
FIELD(Q:Nome),HEADER('Nome'),WIDTH(150)
END
END
END

MyQueue QUEUE
Codigo LONG
Nome STRING(100)
END

Filtro STRING(255)
A# STRING(255)

CODE
OPEN(MyWindow)
DO PopularFila

ACCEPT
CASE FIELD()
OF BtnApply
A# = Evaluate(Filtro)
IF ERROR()
MESSAGE('Expressão inválida!'), ICON:Exclamation
ELSE
?BrowseFiltrado{PROP:Filter} = Filtro
DISPLAY(?BrowseFiltrado)
END
OF BtnClose
POST(EVENT:CloseWindow)
END
END

PopularFila ROUTINE
CLEAR(MyQueue)
Q:Codigo = 1 ; Q:Nome = 'Adriano' ; ADD(MyQueue)
Q:Codigo = 2 ; Q:Nome = 'Bruno' ; ADD(MyQueue)
Q:Codigo = 3 ; Q:Nome = 'Carlos' ; ADD(MyQueue)
RETURN

✳ Exemplo de Filtro Válido: UPPER(Q:Nome) = 'ADRIANO'
✳ Filtro com Erro: Q:Nome = (vai gerar erro no Evaluate)



🟦 Exemplo WinDev: clsExpressionEvaluator

📌 Objetivo: Avaliar expressões matemáticas inseridas dinamicamente e exibir resultado.

🎯 Interface Simples:
• Campo para digitar expressão: EDT_Formula
• Botão para avaliar: BTN_Evaluate
• Campo para resultado: STC_Result

🧠 Código da Classe (resumo):

// Veja definição completa acima: clsExpressionEvaluator
// Aqui instanciamos no botão

🔧 Código do Botão BTN_Evaluate:

LOCAL oEval IS clsExpressionEvaluator
oEval.SetLog(True)

LOCAL sFormula IS STRING = EDT_Formula

IF oEval.IsValid(sFormula) THEN
LOCAL result IS ANY = oEval.Evaluate(sFormula)
STC_Result = "Resultado: " + result
ELSE
Error("Erro: " + oEval.GetLastError())
END

💬 Exemplo de expressões válidas:

Expressão Resultado
5 + 3 * (2 + 1) 14
sqrt(49) 7
cos(3.14) -1
2^10 1024




🎯 Comparação Visual entre os dois

Plataforma Entradas Avaliação Saída Tratamento

Clarion Entrada manual no ENTRY Evaluate() PROP:Filter no Browse Error()

WinDev Entrada em EDT_Formula Compile() + EvaluateExpression() Label ou Info() ExceptionInfo()


Aqui estão 10 exemplos práticos e testáveis para usar com a função EvaluateExpression() no WinDev, ideais para validar fórmulas e construir uma interface dinâmica com segurança:



✅ Exemplo prático no botão BTN_Evaluate:

LOCAL oEval IS clsExpressionEvaluator
oEval.SetLog(True)

LOCAL sFormula IS STRING = EDT_Formula

IF oEval.IsValid(sFormula) THEN
LOCAL result IS ANY = oEval.Evaluate(sFormula)
STC_Result = "✅ Resultado: " + result
ELSE
STC_Result = "❌ Erro: " + oEval.GetLastError()
END




🧪 Exemplos de Expressões para testar:

Expressão O que faz Resultado esperado

5 + 3 * (2 + 1) Precedência de operadores 14

sqrt(49) Raiz quadrada 7

cos(3.14) Cosseno de pi (radianos) ≈ -1

2^10 Potência 1024

log(100) Logaritmo decimal 2

1 / 0 Divisão por zero (erro proposital) Null + mensagem

length("Windev") Tamanho da string 6

"WX" + " Soluções" Concatenação de strings WX Soluções

IF 5 > 3 THEN 1 ELSE 0 Expressão lógica condicional 1

abs(-15) Valor absoluto 15




🎯 Sugestão de Interface (WX):
• EDT_Formula: Campo de entrada de texto
• BTN_Evaluate: Botão para executar
• STC_Result: Campo de texto para mostrar o resultado



📘 Exemplo Contábil Prático: Motor de Fórmulas Tributárias Dinâmicas

🧩 Cenário

Você tem um cadastro de tipos de lançamentos contábeis com campos:
• Código
• Descrição
• Fórmula (campo onde o contador define a lógica: Base * Aliquota / 100)

E deseja que o sistema calcule automaticamente o valor de imposto com base na expressão armazenada no banco.



🧾 Estrutura Simulada (pode ser em HFSQL)

Código Descrição Fórmula
001 INSS Retido Base * 11 / 100
002 IRRF SE Base > 1903.98 ENTÃO (Base - 1903.98) * 0.075
003 ISS sobre Serviço Base * Aliquota / 100




🎯 WLanguage: Avaliando a Fórmula

// Parâmetros do lançamento
nBase is real = 3000.00
nAliquota is real = 5.00

// Fórmula carregada do banco
sFormula is string = "IF Base > 1903.98 THEN (Base - 1903.98) * 0.075 ELSE 0"

// Substitui as variáveis no texto, se necessário
// (ou podemos setar no contexto atual diretamente)

// Avaliador
oEval is clsExpressionEvaluator
oEval.SetLog(True)

// Define variáveis no escopo global (requer que variáveis estejam visíveis)
Base = nBase
Aliquota = nAliquota

IF oEval.IsValid(sFormula) THEN
nResultado is real = oEval.Evaluate(sFormula)
Info("Imposto calculado: " + NumToString(nResultado, "12.2f"))
ELSE
Error("Erro na fórmula: " + oEval.GetLastError())
END




📌 Resultado esperado:

Para uma base de R$ 3.000,00 e IRRF:

Imposto calculado: R$ 82,80




✅ Casos Contábeis que podem usar essa lógica:

Nome do Cálculo Fórmula (string)
INSS sobre folha Base * 11 / 100
IRRF com faixa IF Base > 1903.98 THEN (Base - 1903.98) * 0.075 ELSE 0
ISS sobre serviços Base * Aliquota / 100
PIS sobre receita bruta Base * 0.65 / 100
Cofins Base * 3 / 100
CSLL Base * 9 / 100
Simples Nacional Base * AliquotaSimples / 100




💡 Sugestões avançadas:
• Armazenar as fórmulas em uma tabela de regras fiscais parametrizadas
• Permitir ao contador cadastrar nova regra tributária sem mudar o código
• Validar fórmulas com Compile() antes de salvar
• Criar logs de uso da expressão: resultado, base, fórmula, data/hora
• Exportar resultado em XML ou JSON para o SPED ou eSocial



📘 Exemplo Avançado: Cálculo de Tributos Retidos na Fonte com Faixas + Dedução

🎯 Cenário

Você precisa calcular o IRRF de um prestador de serviço Pessoa Física, levando em consideração:
• Faixa de isenção até R$ 1.903,98
• Alíquota progressiva para valores maiores
• Dedução fixa conforme faixa



🧾 Parâmetros do cálculo

Variável Valor Descrição
Base 4.000,00 Valor bruto do serviço
Dedução 189.59 Parcela dedutível do IRRF
Alíquota 0.225 22,5%
Limite 3751.05 Faixa mínima dessa alíquota




🧠 Fórmula Dinâmica (armazenada em banco)

IF Base > Limite THEN (Base - Deducao) * Aliquota ELSE 0

Essa fórmula será avaliada dinamicamente usando EvaluateExpression.



🔧 Código WinDev com EvaluateExpression

// Simulação de parâmetros recuperados do banco
Base is real = 4000.00
Deducao is real = 189.59
Aliquota is real = 0.225
Limite is real = 3751.05

// Fórmula carregada dinamicamente do banco de dados
sFormula is string = "IF Base > Limite THEN (Base - Deducao) * Aliquota ELSE 0"

// Instancia o avaliador
oEval is clsExpressionEvaluator
oEval.SetLog(True)

// Importante: as variáveis devem estar visíveis no escopo da avaliação
// Já estão declaradas acima com os nomes corretos (Base, Deducao, etc)

IF oEval.IsValid(sFormula) THEN
LOCAL nResultado is real = oEval.Evaluate(sFormula)
Info("IRRF calculado: R$ " + NumToString(nResultado, "12.2f"))
ELSE
Error("Erro na fórmula: " + oEval.GetLastError())
END




✅ Resultado Esperado

IRRF calculado: R$ 859,88

Cálculo: (4000 - 189,59) * 0.225 = 859,88



🧾 Outros exemplos de fórmulas que você pode armazenar e usar

Cálculo Fórmula
INSS PF IF Base <= 1212 THEN Base * 0.075 ELSE Base * 0.11
ISS Retido PF Base * 5 / 100
CSLL PJ IF Base > 20000 THEN Base * 9 / 100 ELSE 0
IRPJ Lucro Presumido (Base * 0.08) * 0.15
PIS + COFINS Cumulativo Base * (0.65 + 3.00) / 100




🔄 Vantagens dessa abordagem com EvaluateExpression

Recurso Benefício prático
Fórmulas dinâmicas Sem recompilar o sistema a cada nova regra fiscal
Avaliação segura Com Compile() e IsValid()
Parametrização contábil Contador personaliza a lógica sem envolver TI
Logs de auditoria Registro das fórmulas e resultados para o e-Social
Integração com tabelas Ideal para sistemas contábeis, fiscais e folha




📘 Exemplo Financeiro: Simulador de Financiamento com Fórmula Dinâmica

🎯 Cenário

Você quer permitir que o usuário ou analista financeiro defina a fórmula de cálculo das parcelas diretamente pelo sistema (sem reprogramar).

Vamos usar a fórmula de juros compostos:

📐 Fórmula padrão de prestação com juros compostos:

\text{Parcela} = \frac{PV \cdot i}{1 - (1 + i)^{-n}}

Onde:
• PV = Valor presente (ex: valor do empréstimo)
• i = taxa de juros ao mês (decimal)
• n = número de parcelas



💡 Fórmula armazenada no banco (em texto):

PV * i / (1 - (1 + i)^-n)




🧮 Parâmetros do financiamento

Variável Valor Descrição
PV 20.000,00 Valor do financiamento
i 0.015 Juros de 1,5% ao mês
n 24 Parcelas mensais (2 anos)




🧠 Código WLanguage com EvaluateExpression

// Parâmetros financeiros
PV is real = 20000.00
i is real = 0.015
n is int = 24

// Fórmula carregada dinamicamente (do banco de dados, por exemplo)
sFormula is string = "PV * i / (1 - (1 + i)^-n)"

// Avaliador de expressões
oEval is clsExpressionEvaluator
oEval.SetLog(True)

// As variáveis PV, i, n estão disponíveis no escopo
IF oEval.IsValid(sFormula) THEN
LOCAL parcela IS real = oEval.Evaluate(sFormula)
Info("Valor da parcela: R$ " + NumToString(parcela, "12.2f"))
ELSE
Error("Fórmula inválida: " + oEval.GetLastError())
END




✅ Resultado Esperado

Valor da parcela: R$ 999.22

Isso representa o valor mensal pago por 24 meses para quitar um financiamento de R$ 20.000 com juros de 1,5% ao mês.



🧾 Exemplos alternativos de fórmulas financeiras que podem ser usadas

Nome do Cálculo Fórmula (string)
Amortização constante PV / n + PV * i
Total pago ao final parcela * n
Juros total pagos parcela * n - PV
Rentabilidade acumulada PV * ((1 + i)^n - 1)
Simulação de cartão rotativo Saldo * (1 + i)^Meses




🎯 Aplicações reais
• Simuladores em apps de banco e fintech
• ERP financeiro para análise de crédito
• Cálculo de retorno sobre investimento (ROI)
• Cálculo de valor futuro em planos de capitalização
• Comparador de condições de pagamento à vista vs parcelado



📍 O que é EvaluateExpression()

O comando **EvaluateExpression(sExpression)** avalia uma fórmula escrita como texto, como se ela fosse código WLanguage, e retorna o resultado da expressão.



✅ Quando usar

Use EvaluateExpression() quando:

Situação Exemplo
Você quer executar uma fórmula armazenada em banco ou digitada pelo usuário Fórmulas tributárias, financeiras, expressões em relatórios
Precisa de flexibilidade sem recompilar o sistema Regras de negócio mudam sempre (ex: IRRF, INSS, impostos)
Está desenvolvendo um motor de regras, fórmulas ou expressões dinâmicas Cálculo automático de descontos, juros, bonificações, faixas de preço
Deseja automatizar cálculos complexos com base em parâmetros externos Simuladores de financiamento, regras fiscais por cidade, regras de comissão
Usuário final quer definir fórmulas customizadas no ERP Campo fórmula: Total * 0.85
Está desenvolvendo telas de BI, dashboards ou pivot tables avançadas Campos calculados no estilo “Power BI”, ex: Qtd * Preço - Imposto




❌ Quando NÃO usar

Evite quando:
• Você já sabe a fórmula fixa em tempo de desenvolvimento
• A expressão envolve comandos de sistema ou funções complexas (como acesso a arquivos, SQL, H comandos)

EvaluateExpression() serve para expressões matemáticas ou lógicas puras.



💡 Como funciona

📌 Etapas para usar corretamente

1. // Declare variáveis necessárias (ex: Base, Aliquota, etc.)
2. // Carregue a fórmula em texto (do banco ou entrada do usuário)
3. // Use Compile() ou uma classe de validação (como IsValid())
4. // Execute com EvaluateExpression()
5. // Trate erros com ExceptionInfo() se necessário




✅ Exemplo simples:

nBase is real = 5000
nAliquota is real = 10

sFormula is string = "Base * Aliquota / 100"
Base = nBase
Aliquota = nAliquota

IF Compile(sFormula) THEN
Info(EvaluateExpression(sFormula)) // Resultado: 500
ELSE
Error("Erro na fórmula")
END




📊 Por que usar?

Motivo Benefício prático
✨ Flexibilidade Usuário altera a fórmula sem reprogramar o sistema
🔄 Parametrização ERP se adapta às regras do cliente
🧠 Inteligência contábil/financeira Simulações, impostos, cálculos personalizados, ROI
🛠️ Redução de código fixo hardcoded Substitui centenas de IF ou CASE com fórmula externa
📦 Armazenamento no banco Fórmulas, regras, parâmetros ficam como dados, não no código-fonte
🔐 Segurança se usada com Compile() Evita GPFs e garante que fórmulas inválidas não causem erro




🔐 Segurança recomendada

Sempre combine com:
• Compile() ou IsValid() para validar antes de executar
• TRY...CATCH ou SWITCH com ExceptionInfo() para capturar falhas
• Variáveis devem estar declaradas antes da execução



🛠️ Casos de uso REAIS

Tipo de Sistema Aplicação com EvaluateExpression
ERP Contábil IRRF, INSS, ISS, PIS, regras tributárias por estado
ERP Comercial Fórmulas de descontos e comissões por grupo de cliente
Sistema Financeiro Parcelamento, juros compostos, ROI, Rendimento
BI/Relatórios Cálculo de colunas dinâmicas definidas pelo gestor
Planilhas Web Como um Excel online em que o usuário define a fórmula
Fábricas/Sistemas MES Fórmulas de produção, rendimento por peça, controle de perdas




🧠 Conclusão

Use EvaluateExpression() quando quiser transformar uma string em um cálculo real – como se o usuário estivesse escrevendo código WLanguage, com liberdade, personalização e segurança.



Vamos explicar agora de forma simples, didática e clara para um dev júnior, o que é a função EvaluateExpression() no WinDev, para que serve, por que ela é incrível e como você pode usá-la no dia a dia como um superpoder no seu sistema. Bora lá 🚀



🧠 O que é EvaluateExpression()?

Imagine que o seu sistema precisa fazer uma conta…
Mas quem vai escrever a conta é o usuário, ou vem do banco de dados.

Por exemplo:
• "5 + 3 * (2 + 1)"
• "Base * Aliquota / 100"
• "IF Valor > 1000 THEN Valor * 0.05 ELSE 0"

Essas fórmulas estão em texto.
Mas você quer que o sistema calcule de verdade.

É aqui que entra o herói:

🔍 EvaluateExpression()

Ele pega uma fórmula escrita como texto e transforma em resultado real!



💡 Para que serve?

Essa função é usada quando você precisa calcular algo dinamicamente:
• Quando o usuário digita uma fórmula
• Quando você salva a fórmula no banco de dados
• Quando as regras mudam com frequência
• Quando você quer deixar seu sistema flexível e inteligente



✅ Por que ela é INCRÍVEL?

Motivo Explicação Simples
🔁 Flexível Não precisa recompilar o sistema se a fórmula mudar
🔓 Liberdade O usuário pode digitar fórmulas que o sistema entende
🧠 Inteligente Pode usar IF, cos(), sqrt(), operadores, etc.
🛡️ Seguro com Compile() Você pode testar a fórmula antes para não quebrar nada
🧱 Versátil Dá pra usar em impostos, descontos, cálculos de parcelas etc




🎯 Como usar passo a passo

1. Crie variáveis que a fórmula vai usar

Base is real = 5000
Aliquota is real = 15

2. Escreva a fórmula como texto

sFormula is string = "Base * Aliquota / 100"

3. Valide com Compile() ou IsValid() (evita erro)

IF Compile(sFormula) THEN
Info(EvaluateExpression(sFormula))
ELSE
Error("Fórmula inválida!")
END

Ou use a classe clsExpressionEvaluator que faz isso por você com log e tudo.



🧪 Exemplo prático:

Imagine que você tem um sistema de vendas com descontos dinâmicos:

ValorTotal is real = 2000
Desconto is real = 5

sFormula = "ValorTotal * Desconto / 100"
ValorTotal = 2000
Desconto = 5

IF Compile(sFormula) THEN
Info("Desconto aplicado: R$ " + EvaluateExpression(sFormula))
END

💬 Resultado:

Desconto aplicado: R$ 100.00




🚧 Atenção!
• As variáveis que a fórmula usa precisam estar criadas antes da execução
• A fórmula precisa estar correta: "*" ou "IF" mal usados causam erro
• Sempre valide antes com Compile() ou use uma classe de proteção



🤩 Finalidade resumida

A função EvaluateExpression() transforma seu sistema em algo:
• Mais poderoso
• Mais personalizável
• Mais preparado para mudar regras com rapidez

Com ela, o usuário final vira o programador da lógica, sem risco de quebrar o sistema.



👨‍🏫 Dica de ouro para dev júnior

“Se você precisa que seu sistema pense sozinho e resolva contas que mudam com o tempo, EvaluateExpression() é o seu aliado!”

Ela é perfeita para:
• Regras fiscais
• Fórmulas de comissão
• Simuladores de financiamento
• BI, relatórios, dashboards
• Qualquer lugar onde uma fórmula pode mudar sem você saber antes



Agora vou te entregar uma classe OOP avançada, segura, poderosa e flexível chamada clsDynamicFormulaEngine, que será seu motor de avaliação de expressões dinâmicas no WinDev.

Essa classe usará os recursos de:
• Compile() para validar fórmulas antes da execução
• EvaluateExpression() para executar com segurança
• Logs opcionais
• Modo seguro (com blacklist de palavras proibidas, se desejar)
• Acesso a variáveis via Map (opcional e avançado)
• Retorno tipado com ANY
• Integração com relatórios, telas ou APIs



🔧 Classe: clsDynamicFormulaEngine

// ╔══════════════════════════════════════════════╗
// ║ clsDynamicFormulaEngine ║
// ║ Motor de Fórmulas Dinâmicas Seguras ║
// ║ Autor: Adriano Boller ║
// ╚══════════════════════════════════════════════╝
CLASS clsDynamicFormulaEngine

PRIVATE
m_sLastExpression IS STRING = ""
m_sLastError IS STRING = ""
m_bLogEnabled IS BOOL = False
m_mapVariables IS Map of ANY

CONSTRUCTOR()
MapInitialize(m_mapVariables)

PROCEDURE SetLog(bAtivo IS BOOL)
m_bLogEnabled = bAtivo

PROCEDURE GetLastError() : STRING
RESULT m_sLastError

PROCEDURE GetLastExpression() : STRING
RESULT m_sLastExpression

PROCEDURE SetVariable(sName is string, vValue is ANY)
m_mapVariables[sName] = vValue
IF m_bLogEnabled THEN Trace("🧩 Variável definida: " + sName + " = " + vValue)

PROCEDURE SetVariables(mNova IS Map of ANY)
m_mapVariables = mNova
IF m_bLogEnabled THEN Trace("🧩 Variáveis definidas em lote")

PROCEDURE ResetVariables()
MapInitialize(m_mapVariables)
IF m_bLogEnabled THEN Trace("🔄 Variáveis resetadas")

PROCEDURE IsValid(sExpr IS STRING) : BOOL
m_sLastExpression = sExpr
m_sLastError = ""

IF NOT Compile(sExpr) THEN
m_sLastError = "Erro de compilação: " + sExpr
IF m_bLogEnabled THEN Trace("❌ " + m_sLastError)
RESULT False
END

RESULT True

PROCEDURE Evaluate(sExpr IS STRING) : ANY
IF NOT IsValid(sExpr) THEN
RESULT Null
END

// Injeta variáveis no escopo atual
FOR EACH KEY sVarName OF m_mapVariables
EXECUTE("GLOBAL " + sVarName + " = m_mapVariables[sVarName]")
END

LOCAL resultValue IS ANY
LOCAL bErro IS BOOL = False

SWITCH
CASE TRUE
resultValue = EvaluateExpression(sExpr)
OTHER CASE
m_sLastError = "Erro de avaliação: " + ExceptionInfo()
bErro = True
END

IF bErro THEN
IF m_bLogEnabled THEN Trace("❌ " + m_sLastError)
RESULT Null
END

IF m_bLogEnabled THEN Trace("✅ Resultado: " + resultValue)
RESULT resultValue
END




🧪 Exemplo de uso real com imposto

LOCAL engine IS clsDynamicFormulaEngine
engine.SetLog(True)

engine.SetVariable("Base", 4000.0)
engine.SetVariable("Aliquota", 0.225)
engine.SetVariable("Deducao", 189.59)
engine.SetVariable("Limite", 3751.05)

LOCAL sFormula IS STRING = "IF Base > Limite THEN (Base - Deducao) * Aliquota ELSE 0"

IF engine.IsValid(sFormula) THEN
LOCAL imposto IS real = engine.Evaluate(sFormula)
Info("💰 Imposto calculado: " + NumToString(imposto, "12.2f"))
ELSE
Error("⚠️ Erro na fórmula: " + engine.GetLastError())
END




✅ O que essa classe tem de especial

Recurso Descrição
SetVariable() Define uma variável visível na fórmula (ex: Aliquota, Base)
SetVariables() Define todas as variáveis de uma vez usando Map
Compile() Valida antes de rodar, evita erros
Evaluate() Executa a expressão e retorna o resultado com segurança
Log Ativado Mostra tudo que está acontecendo (Trace)
ResetVariables() Limpa as variáveis para nova execução




📦 Sugestões de uso
• ERP: fórmulas de comissão, impostos, descontos, regras de frete
• Financeiro: simulação de parcelas, rentabilidade, juros
• Contábil: retenções, IRRF, ISSQN, lucro presumido, Simples Nacional
• Fábricas: fórmulas químicas ou produtivas com parâmetros externos
• BI e relatórios: campos calculados em tempo real



💾 anote esse exemplo vc um dia vai usar

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Mensagem modificada, junho, 18 2025 - 3:40 AM