Fórum Como criar formula no Delphi sem precisar compilar #273138

18/03/2005

0

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.


Adriano_servitec

Adriano_servitec

Responder

Posts

18/03/2005

Massuda

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]


Responder

Gostei + 0

03/06/2005

Adriano_servitec

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...


Responder

Gostei + 0

26/08/2005

Frcjf

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


Responder

Gostei + 0

01/10/2005

Adriano_servitec

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


Responder

Gostei + 0

01/10/2005

Weber

Isto pode ajudar bastante:

[url]http://www.clubedelphi.net/artigos/calculadora.asp[/url]


Responder

Gostei + 0

01/10/2005

Beppe

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´


Responder

Gostei + 0

04/10/2005

Adriano_servitec

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


Responder

Gostei + 0

04/10/2005

Firekiller

Qual a mensagem de erro que tá aparecendo??

Você criou os campos dessa tabela (Formulas) no Fields Editor??


Responder

Gostei + 0

04/10/2005

Adriano_servitec

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


Responder

Gostei + 0

04/10/2005

Firekiller

Se não compila, aparece uma mensagem de erro... qual é a mensagem??


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar