hcr 0 Denunciar post Postado Novembro 12, 2004 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
arrobaroger 0 Denunciar post Postado Novembro 16, 2004 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
WiCkEd 0 Denunciar post Postado Novembro 18, 2004 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
hcr 0 Denunciar post Postado Novembro 18, 2004 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
bacalhau 0 Denunciar post Postado Janeiro 14, 2005 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
NerdeX 0 Denunciar post Postado Janeiro 15, 2005 Pode-se usar também o pacote: "Pascal script" - o mesmo utilizado na confecção estrutural do compilador para scripts no Inno Setup para a geração de aplcativos instaladores... Veja aqui os componentes para script pascal no Delphi... Compartilhar este post Link para o post Compartilhar em outros sites
TheMaker 0 Denunciar post Postado Janeiro 24, 2005 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
NerdeX 0 Denunciar post Postado Janeiro 25, 2005 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
TheMaker 0 Denunciar post Postado Janeiro 25, 2005 Ok Nerdex... Vou pesquisar melhor o site... []'s http://forum.imasters.com.br/public/style_emoticons/default/joia.gif Compartilhar este post Link para o post Compartilhar em outros sites