|
GRUPOS DE DISCUSSÃO PROFISSIONAL WINDEV, WEBDEV 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.
⸻
Claro, Adriano! 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
⸻
-- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 99949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/ |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|