Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hcr

Fórmulas Insanas !!

Recommended Posts

Amigos, Preciso executar uma fórmula com IFs, só que essas fórmulas serão digitadas pelo usuário e armazenadas num campo string ( varchar(500) ). Meu problema é executar essa fórmula, já que ela é um string. Alguém sabe como solucionar esse problema?Exemplo de uma fórmula muito simples :var Formula : String; Valor : Real;... Formula := 'iif(REALIZADO<(OBJETIVO*0.8),0, REALIZADO*2)';...Real := Formula ; // Esse seria um jeito se Formula não fosse um string, já que a formula retorna um valor; Eu preciso executar essa formula dessa maneira.A função iif usada já existe, não se preocupem com ela.Será que alguém poderia me ajuda ?Desde já agradeço a atenção dispensada.Henrique

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha, sinceramente, eu acho que você vai ter de criar um algorítmo que leia a formula e a monte. Pq o Delphi não tem macrosubstituição, se tivesse era facil mas como não tem, pode ir pensando em uma lógica ai pra montar essa "calculadora".Outra alternativa era fazer o BD fazer isso pra você.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente não tem jeito, você vai ter q sair "catando" os valores e os operadores na string, e realizar o Cálculo "no Braço".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos,

 

Obrigado a quem me respondeu.

 

Essa realmente é uma questão complicada, mas pesquisando muito descobri que exite um pacote free que possui um componente que faz isso e muito mais.

Trata-se do pacote JEDI, e ele não tem esse nome por acaso, eu já tinha essa package instalada, mas não sabia que ela tinha um componente que faz exatamente o que eu preciso, o componente é o JvInterpreterProgram, esse cara é capaz de pegar um código delphi ( que pode ser editavel pelo usuário ) e executá-lo em RunTime... coisa de loko.

Esse é o meu exemplo:

M.Lines.Clear; M.Lines.Add('Unit uSE;'); M.Lines.Add('function main: string;'); M.Lines.Add('begin;'); M.Lines.Add('  Result := (SE(REALIZADO<(OBJETIVO*0.8),0,'); M.Lines.Add('      (SE(REALIZADO=OBJETIVO,MAXIMO_PONTOS,'); M.Lines.Add('      (SE(REALIZADO>OBJETIVO,+MAXIMO_PONTOS+((REALIZADO-OBJETIVO)*100)*9.43,'); M.Lines.Add('        (SE(REALIZADO<=OBJETIVO,(MAXIMO_PONTOS)-(((OBJETIVO-REALIZADO)*100))*3,0))))))))'); M.Lines.Add('end;'); M.Lines.Add(' function SE( Condicao : Boolean; Verdadeiro, Falso : Real) : Real;'); M.Lines.Add('  begin'); M.Lines.Add('      if Condicao then'); M.Lines.Add('         Result := Verdadeiro'); M.Lines.Add('      else'); M.Lines.Add('         Result := Falso;'); M.Lines.Add('  end;'); M.Lines.Add('end.'); M.Lines.Text := StringReplace( m.Lines.Text,'REALIZADO', Edit3.Text, [rfReplaceAll]); M.Lines.Text := StringReplace( m.Lines.Text,'OBJETIVO', Edit4.Text, [rfReplaceAll]); M.Lines.Text := StringReplace( m.Lines.Text,'MAXIMO_PONTOS', Edit2.Text, [rfReplaceAll]); M.Lines.Text := StringReplace( m.Lines.Text,'ESCALA', InttoStr(ComboBox1.ItemIndex+1), [rfReplaceAll]);JvInterpreterProgram1.Source := M.Lines.tEXT;JvInterpreterProgram1.Run;Resultado.Text := JvInterpreterProgram1.VResult;

Logicamente a fórmula na função Main é a única coisa que o usuário pode alterar.

Tudo isso funcionou, e o usuário altera essa fórmula da maneira que achar melhor. E esse componente consegue executar inumeras variações de códigos, desde os mais simples como '1+1' (como string mesmo) até mais complexos como o meu exemplo. Acho que vale a pena todos darem uma olhada, garanto que não vão se arrepender ( rrsrs... virei garoto propaganda do pacote ).

 

http://homepages.borland.com/jedi/jvcl/

 

Abraços a todos e obrigado.

Henrique

Compartilhar este post


Link para o post
Compartilhar em outros sites

Convém ler alguma coisa sobre consturção de pilhas. As pilhas (stack) são as estruturas ideais para tratar essas fórmulas independentemente da complexidade

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Nerdex...Fiz o download dos componentes Pascal Script mas estou com dificuldades em usá-los...você tem alguma apostila, tutorial ou dicas sobre estes componentes??Se eles realmente fazem o q foi dito seria muito bom poder usá-los!![]'s..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maker... olha... não tenho tutorial nem apostila, mas você pode conferir alguns exemplos, em artigos do mesmo site... e sim você poderá construir um Compiladorzinho com aquilo, ou um mini Excel da vida... para o usuário...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.