Como criar formula no Delphi sem precisar compilar
Ola pessoal, estou querendo fazer um programa de folha de pagamento aonde o cliente possa modificar as formulas de soma dos valores da folha sem precisar compilar o programa, ex: soma do inss fixo (totalproventos-salariofamilia*indiceinss) queria ver se tem como fazer um modelo aonde o proprio cliente faÇa essa modificaÇao, sem prcisar compilar o programa...criar uma tabela de formula tipo do Excel no Delphi, ai o cliente so vai ter o trabalho de modificar a tabela dentro do proprio programa.
Desde ja agradeÇo pela ajuda.
Desde ja agradeÇo pela ajuda.
Adriano_servitec
Curtidas 0
Respostas
Massuda
18/03/2005
Algumas formas possíveis para calcular expressões do tipo ´total_proventos - salario_familia * indice_inss * 0.01´ :[list:895725fd57][*:895725fd57]Nesta [url=http://www.torry.net/pages.php?id=307]página[/url] do [url=http://www.torry.net/]Torry.net[/url] tem alguns componentes que são capazes de analisar e avaliar expressões/fórmulas.[*:895725fd57]Na [url=http://homepages.borland.com/jedi/jcl/]JCL[/url] (Jedi Code Library) tem uma unit chamada JclExprEval onde você encontrará as classes TEvaluator e TCompiledEvaluator[*:895725fd57]Para uma solução mais sofisticada, tem o [url=http://www.remobjects.com/page.asp?id={9A30A672-62C8-4131-BA89-EEBBE7E302E6}]Pascal Script[/url]; com ele você poderia escrever pequenos scripts ao invés de fórmulas para fazer os cálculos[/list:u:895725fd57]
GOSTEI 0
Adriano_servitec
18/03/2005
Ola amigo Massuda, nao precisa ser exatamente assim com vc me indicou esses sites, estou mesmo eh querendo uma ideia como fazer essas formulas e gravar em um banco de dados, sei que prea fazer no form fica assi:
table1inss.value:=table1salario*7.65/100; // ex.de uma soma no form
mais como fazer para gravar essas formulas num banco de dados e quando precisar mexer nele para alterar a formula dentro do programa pelo edit, dbedit ou dbmemoedit, que seja.
nao sei se daira para incluir a formula acima dentro do edit, ou qualquer outro componente. Mais se der para fazer como uso a formula acima e gravar no banco de dados ja esta de bom tamanho, pois ai posso modificar dentro do proprio programa ex:
table1inss.value:=table1salario*7.65/100;
para
table1inss.value:=table1salario*8.65/100; sem precisar mexer em mais nada, somente dar um clique no botao gravar para alterar a nova formula.
OBS: isso eh so um exemplo de formula eh claro que nao tem nada haver com o programa, o objetivo eh enteder como se faz esse tipo de formula.
Obrigado
Agradeço pea Ajuda!
Adriano...
table1inss.value:=table1salario*7.65/100; // ex.de uma soma no form
mais como fazer para gravar essas formulas num banco de dados e quando precisar mexer nele para alterar a formula dentro do programa pelo edit, dbedit ou dbmemoedit, que seja.
nao sei se daira para incluir a formula acima dentro do edit, ou qualquer outro componente. Mais se der para fazer como uso a formula acima e gravar no banco de dados ja esta de bom tamanho, pois ai posso modificar dentro do proprio programa ex:
table1inss.value:=table1salario*7.65/100;
para
table1inss.value:=table1salario*8.65/100; sem precisar mexer em mais nada, somente dar um clique no botao gravar para alterar a nova formula.
OBS: isso eh so um exemplo de formula eh claro que nao tem nada haver com o programa, o objetivo eh enteder como se faz esse tipo de formula.
Obrigado
Agradeço pea Ajuda!
Adriano...
GOSTEI 0
Frcjf
18/03/2005
Caro colega
Sobre o assunto das formulas já consegui resolver?, sei que isto era possivel em Clipper, mas nunca fiz.. se tiver noticias e puder me passar agradeço...
Flávio
Sobre o assunto das formulas já consegui resolver?, sei que isto era possivel em Clipper, mas nunca fiz.. se tiver noticias e puder me passar agradeço...
Flávio
GOSTEI 0
Adriano_servitec
18/03/2005
Caro colega
Sobre o assunto das formulas já consegui resolver?, sei que isto era possivel em Clipper, mas nunca fiz.. se tiver noticias e puder me passar agradeço...
Flávio
Nao amigo ainda to a procura de como fazer calculos no Delphi
Cheguei a desenvolver essa procedure, mais ainda nao cheguei ao resultado esperado, nessa rotina ele calcula os operadores tipo 300,00 / 30 * 25 = 250,00
ele reconhece os operadores, mais se alguem puder me ajudar a melhorar ele eu agradeceria.
Eis a Procedure
procedure TForm5.BitBtn1Click(Sender: TObject);
var
opr,opr2, OPR3: char;
vr1,vr2,vr3, VR4, result: real;
begin
vr1:=StrToFloat(DBEdit1.Text);
vr2:=StrToFloat(DBEdit3.Text);
vr3:=strtofloat(dbedit5.text);
VR4:=STRTOFLOAT(DBEDIT9.TEXT);
opr:=DBEdit2.Text[1];
opr2:=dbedit4.text[1];
OPR3:=DBEDIT10.TEXT[1];
case opr of
´+´: result:=vr1+vr2;
´-´: result:=vr1-vr2;
´*´: result:=vr1*vr2;
´/´: result:=vr1/vr2;
else exit end;
vr1:=result;
vr2:=StrToFloat(DBEdit5.Text);
opr:=DBEdit4.Text[1];
case opr of
´+´: result:=vr1+vr2;
´-´: result:=vr1-vr2;
´*´: result:=vr1*vr2;
´/´: result:=vr1/vr2;
else exit end;
//ShowMessage(FloatToStr(result));
qry1.Edit;
qry1result.value:=result;
qry1.post;
end;
Grato pela ajuda
Adriano
GOSTEI 0
Weber
18/03/2005
Isto pode ajudar bastante:
[url]http://www.clubedelphi.net/artigos/calculadora.asp[/url]
[url]http://www.clubedelphi.net/artigos/calculadora.asp[/url]
GOSTEI 0
Beppe
18/03/2005
ele reconhece os operadores, mais se alguem puder me ajudar a melhorar ele eu agradeceria.
Serve meu trabalho em Java?
import java.io.*;
import java.util.*;
abstract public class Exp
{
protected Exp()
{
}
abstract public int Avaliar();
static private Exp Fator(StringTokenizer t)
{
if (!t.hasMoreTokens())
return null;
String sym = t.nextToken();
try
{
return new Numero(Integer.parseInt(sym));
}
catch (Exception e)
{
return new Identificador(sym);
}
}
static private Exp Termo(StringTokenizer t)
{
Exp esq = Fator(t);
while (t.hasMoreTokens())
{
String op = t.nextToken();
Exp dir = Fator(t);
esq = new OperadorBinario(esq, dir, op);
}
return esq;
}
static public Exp Compilar(String s)
{
StringTokenizer t = new StringTokenizer(s, " ");
return Termo(t);
}
static public void main(String args[]) throws Exception
{
System.out.print(Exp.Compilar((new BufferedReader(new InputStreamReader(System.in))).readLine()).Avaliar());
}
}
class Numero
extends Exp
{
private int valor;
protected Numero(int avalor)
{
super();
this.valor = avalor;
}
public int Avaliar()
{
return valor;
}
}
class Identificador
extends Exp
{
private String nome;
protected Identificador(String anome)
{
super();
this.nome = anome.intern();
}
public int Avaliar()
{
if (nome == "A")
return 1;
if (nome == "B")
return 2;
if (nome == "C")
return 3;
if (nome == "D")
return 4;
return 0;
}
}
class OperadorBinario
extends Exp
{
private String op;
private Exp esquerda, direita;
protected OperadorBinario(Exp aesquerda, Exp adireita, String aop)
{
super();
this.op = aop;
this.direita = adireita;
this.esquerda = aesquerda;
}
public int Avaliar()
{
switch (op.charAt(0))
{
case ´+´: return esquerda.Avaliar() + direita.Avaliar();
case ´-´: return esquerda.Avaliar() - direita.Avaliar();
case ´*´: return esquerda.Avaliar() * direita.Avaliar();
case ´/´: return esquerda.Avaliar() / direita.Avaliar();
default: return -1;
}
}
}
Se quiser aplica precedência, divida a rotina Termo em tantas rotinas como quiser níveis de precedência.
Se quiser saber mais sobre o assunto, pesquise por ´Recursive Descent Parser´
GOSTEI 0
Adriano_servitec
18/03/2005
Obrigado amigos pelas dicas.
Agora sera que alguem pode me explicar como funciona essa funçao?
TABELA FORMULAS
------------------------------
ID - Integer - Autoincremento
Formula - Varchar(50) - (Equivalente ao Alpha do Paradox)
CampoChave - Varchar(20)
Tabela - varchar(20)
FUNÇÂO:
function resultformulas( idformula:integer ; valorChave:variant):variant;
var
sql:string;
qry:TQuery;
begin
if not tbFormulas.Locate( ´ID´, idformula, [] ) then begin
result := ´´;
exit;
end;
sql := ´select ´+tbFormulasFORMULA.AsString+´ from ´+tbFormulasTABELA.AsString;
if not tbFormulasCampoChave.IsEmpty then begin
sql:=sql+ ´ WHERE ´+tbFormulasCAMPOCHAVE.AsString+´ =´+valorChave;
end;
qry := TQuery.Create(Nil);
Qry.DataBaseName := NomedoSeuDataBase;
Qry.SQL.Text := sql;
qry.Open;
Result := qry.Fields[0].Value;
Qry.Close;
Qry.Free;
end;
Supondo que fiz um cadastro assim na tabela de FORMULAS:
ID - 1
Formula - ´SUM(VL_UNITARIO * QUANTIDADE)´
Tabela - ´VENDAS´
então uso assim:
edit1.text := resultformulas( 1 , ´´ );
Dessa forma, no edit1 eu teria o resultado da soma dos valores unitários, multiplicados pela quantidade de algum produto da tabela de Vendas.
Nao estou conseguindo faze-la funcionar
Agora sera que alguem pode me explicar como funciona essa funçao?
TABELA FORMULAS
------------------------------
ID - Integer - Autoincremento
Formula - Varchar(50) - (Equivalente ao Alpha do Paradox)
CampoChave - Varchar(20)
Tabela - varchar(20)
FUNÇÂO:
function resultformulas( idformula:integer ; valorChave:variant):variant;
var
sql:string;
qry:TQuery;
begin
if not tbFormulas.Locate( ´ID´, idformula, [] ) then begin
result := ´´;
exit;
end;
sql := ´select ´+tbFormulasFORMULA.AsString+´ from ´+tbFormulasTABELA.AsString;
if not tbFormulasCampoChave.IsEmpty then begin
sql:=sql+ ´ WHERE ´+tbFormulasCAMPOCHAVE.AsString+´ =´+valorChave;
end;
qry := TQuery.Create(Nil);
Qry.DataBaseName := NomedoSeuDataBase;
Qry.SQL.Text := sql;
qry.Open;
Result := qry.Fields[0].Value;
Qry.Close;
Qry.Free;
end;
Supondo que fiz um cadastro assim na tabela de FORMULAS:
ID - 1
Formula - ´SUM(VL_UNITARIO * QUANTIDADE)´
Tabela - ´VENDAS´
então uso assim:
edit1.text := resultformulas( 1 , ´´ );
Dessa forma, no edit1 eu teria o resultado da soma dos valores unitários, multiplicados pela quantidade de algum produto da tabela de Vendas.
Nao estou conseguindo faze-la funcionar
GOSTEI 0
Firekiller
18/03/2005
Qual a mensagem de erro que tá aparecendo??
Você criou os campos dessa tabela (Formulas) no Fields Editor??
Você criou os campos dessa tabela (Formulas) no Fields Editor??
GOSTEI 0
Adriano_servitec
18/03/2005
Qual a mensagem de erro que tá aparecendo??
Você criou os campos dessa tabela (Formulas) no Fields Editor??
Meu amigo ele simplesmente nao compila, criei sim os campos dessa tabela no fields editor da qry
Obrigado pela atençao
GOSTEI 0
Firekiller
18/03/2005
Se não compila, aparece uma mensagem de erro... qual é a mensagem??
GOSTEI 0