Guest Jorge Jr Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 Pessoal preciso utilizar uma formula que esta numa tabela do banco de dados. Porem o sistema não consegui calcular, quando passo o valor para a variavel este valor não consegue pegar os dados de outras variaveis.varv1, v2,v3,v4 : double;vtotal : double;procedure TFrmResultado.BitBtn5Click(Sender: TObject);varBeginv1 := strtofloat(edit1.text);v2 := strtofloat(edit2.text);v3 := strtofloat(edit3.text);v4 := strtofloat(edit4.text);vtotal :=tabelaformula.value; end;Sendo que o valor de campo tabelaformula e´igual a v1+v2+v3+v4alguém sabe como posso fazer isso? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 Fica assim:var v1, v2,v3,v4 : real; vtotal : real; procedure TFrmResultado.BitBtn5Click(Sender: TObject); Begin v1 := strtofloat(edit1.text); v2 := strtofloat(edit2.text); v3 := strtofloat(edit3.text); v4 := strtofloat(edit4.text); vtotal :=v1 + v2 + v3 + v4; end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest jorge jr Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 Jonas, eu sei disso. Mais preciso buscar a formula num banco de dados. São varias formulas, uma delas é a soma das variaveis.Quando uso o campo da erro. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --felipe -- Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 como você está armazenando as informações no banco de dados??você tem que pegar o dado e elaborar uma funçãozinha pra aplica-la nas variaveis.. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 Jonas, eu sei disso. Mais preciso buscar a formula num banco de dados. São varias formulas, uma delas é a soma das variaveis.Quando uso o campo da erro.Um dos seus erros se você reparou, você estava usando double em vez de real; outra ... formulas guardadas em banco de dados eu nunca vi, mesmo porque elas se transformariam em strings; já fiz isso em clipper mas foi usando macro substituições, neste caso não sei como posso te ajudar.... como é que você guarda estas formulas ??? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest jorge jr Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 Jonas, Este é o problema. O sistema é para um laboratorio, nos resultados dos exames preciso aplicar certas formulas, que poderam ser criadas ou alteradas pelo cliente. Já consegui pegar as variaveis, agora preciso aplica-las nas formulas. Estas formulas estão armazenadas num campo da tabela formulas. Quanto tento pegar este valor ele é passado com string. Alguma sugestão? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 2, 2007 Denunciar Share Postado Agosto 2, 2007 escreva ai uma dessas formulas, coloque uma que não seja tão simples ... vou ver se consigo te ajudar . Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest jorge jr Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 Jonas, todas a formulas são simples.No caso da bilirubina total é só soma da bilirubina direta com a bilirubina indireta.No lançamento do resultado lança o valor da bil. direta num registro e da bil. indireta em outro registro. Já resolvi como pegar estes valores.Todos exames lanço sempre os valores nas variaveis V... e o resultado na vtotal, então usando a formula que esta no banco de dados, no caso a bilirubina total vtotal= v1+v2 faço o calculo.O funcionamento e sempre igual para todos os exames, é sempre um operação de adição ou subtração. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 Jorge ... isso que você esta querendo so é possivel no excel, no delphi ou voce muda a metodologia de construção dos parametros da formula ou tenta usar construção de instruções SQLs ... não vejo outra solução. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 (editado) hum, você teria que ler a string e executar o codigo, seguindo a logica da conta. seria meio complicado, mas é o jeito.bom, apesar que na verdade existem outras opcoes, talvez tenha algum componente no delphi que faca isso automaticamente. sei que tem no visual basic.alias, da uma olhada nesse tópico: http://scriptbrasil.com.br/forum/index.php...st&p=346575é sobre visual basic, mas as opcoes 1 e 4 que o graymalkin passou devem servir também pra delphi.EDITADO:ou... tava vendo o ultimo post do jonas... acho que você pode fazer por sql também, tipo:Select (3 + 3) As Calculodeve retornar 6. ai na hora de fazer a string, você pega a formula e substitui as variaveis pelo seu valor Editado Agosto 3, 2007 por kuroi Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 De acordo com o nosso colega Kuroi no seu post2 - esse eu não conhecia, mas agora que c falou, adicionei o componente, e vi que é muito facil, pra que serve exatamente esse Microsoft Script Control, ele executa qualquer codigo que eu passar pra ele em formato string?Ele executa qualquer código VBScript (e acho que já JavaScript também) que você passar para ele (o que inclui expressões para cálculo).Olhei no delphi e esse componente esta a disposição na paleta do import activex, mas não tenho ideia de como utiliza-lo, de acordo com a informação do post do Kuroi, seria usando a propriedade Eval do componente, não custa nada você dar uma pesquisada no assunto. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 Olhei no delphi e esse componente esta a disposição na paleta do import activex, mas não tenho ideia de como utiliza-lo, de acordo com a informação do post do Kuroi, seria usando a propriedade Eval do componente, não custa nada você dar uma pesquisada no assunto.bom, no visual basic, eu apenas crio um novo objeto do tipo ScriptControl. seto a linguagem pra VBScript (propriedade language), e faco os calculos com o metodo eval (passando por parametro a string contendo o calculo). ai ele retorna o resultado em string. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 Kuroi ... seguindo as suas indicações consegui resolver o misterio para o nosso colega Jorge. realmente basta escrever na propriedade language VBScript e aplicar na propriedade Eval do componente a string com as operações matematicas, deu certo. Montei um pequeno codigo para testar .... usando o componente ScriptControl1, um botao e um label....realmente muito simples vai ai o codigo:unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSScriptControl_TLB; type TForm1 = class(TForm) ScriptControl1: TScriptControl; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var s : variant; begin s := ScriptControl1.Eval('10 / 5 * 10'); label1.Caption := s; end; end. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 Jonas, todas a formulas são simples.No caso da bilirubina total é só soma da bilirubina direta com a bilirubina indireta.No lançamento do resultado lança o valor da bil. direta num registro e da bil. indireta em outro registro. Já resolvi como pegar estes valores.Todos exames lanço sempre os valores nas variaveis V... e o resultado na vtotal, então usando a formula que esta no banco de dados, no caso a bilirubina total vtotal= v1+v2 faço o calculo.O funcionamento e sempre igual para todos os exames, é sempre um operação de adição ou subtração.Acredito que o questionamento do Jonas é no sentido de você demonstrar como guarda esta informação - isto não está claro.Lendo o tópico desde o início, parece que você tem campos pré-definidos (V1, V2, V3 e V4) em uma tabela e tem outro campo que seria a fórmula, dizendo que e como usar estes campos. Por ex., para o cálculo de um exame X você teria os valores de V1 e V2V1 = 10; V2 = 20.5; V3 = 0; V4 = 0;Já a fórmula para este exame seria V1 +V2para o cálculo de um exame Y você teria os valores de V1, V2 e V3V1 = 14.5; V2 = 50.5; V3 = 15; V4 = 0;Já a fórmula para este exame seria V1 +V2 -V3Daí o que teria de ser feito é interpretar a fórmula e utilizar os campos. Seria algo neste sentido? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Agosto 3, 2007 Denunciar Share Postado Agosto 3, 2007 Daí o que teria de ser feito é interpretar a fórmula e utilizar os campos. Seria algo neste sentido?sim mas ele teria por exemplo a formula:V1 + V2 - V3guardada numa string.e ele tem declaradas as variaveis V1, V2 e V3.tdo o que ele tem que fazer é um replace que substitua o nome da variavel pelo valor dela convertido pra string. e ai passar pro eval do script control.so não passo exemplo de codigo porque não sei fazer isso em delphi. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Vou dar uma ideia inicial de como fazer esta substituição, mas voce pode achar uma maneira melhorunit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSScriptControl_TLB; type TForm1 = class(TForm) ScriptControl1: TScriptControl; Button1: TButton; Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} Procedure FindReplace (const Enc, subs: String; Var Texto: string); Var i, Posicao: Integer; Linha: string; Begin Linha := Texto; Repeat Posicao:=Pos(Enc,Linha); If Posicao > 0 then Begin Delete(Linha,Posicao,Length(Enc)); Insert(Subs,Linha,Posicao); Texto:=Linha; end; until Posicao = 0; end; procedure TForm1.Button1Click(Sender: TObject); var v1, v2,v3,v4 : real; vtotal : real; s : variant; tabelaformula : string; i : integer; begin v1 := strtofloat(edit1.text); v2 := strtofloat(edit2.text); v3 := strtofloat(edit3.text); v4 := strtofloat(edit4.text); tabelaformula := 'v1 + v2 + v3 + v4'; i := 1; while Pos('v'+inttostr(i), tabelaformula) > 0 do begin case i of 1 : FindReplace('v'+inttostr(i),floattostr(v1), tabelaformula); 2 : FindReplace('v'+inttostr(i),floattostr(v2), tabelaformula); 3 : FindReplace('v'+inttostr(i),floattostr(v3), tabelaformula); 4 : FindReplace('v'+inttostr(i),floattostr(v4), tabelaformula); end; i := i + 1; end; showmessage(tabelaformula); s := ScriptControl1.Eval(tabelaformula); label1.Caption := s; end; end. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest jorge jr Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Jonas, quase deu certo.Só que, quando tento puxar a formula no banco de dados ela da erro. Informa que o V1 não foi definido;Testei com formula := 'v1 + v2+ v3 +4' deu certo, somou direitinho. mais quando usoformula := table1formula.value, usando a formula do banco de dados da o erro acima.Tentei achar o erro e não consegui, se poder me ajudar, agradeço muito.Jorge Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Jonas, quase deu certo.Só que, quando tento puxar a formula no banco de dados ela da erro. Informa que o V1 não foi definido;Testei com formula := 'v1 + v2+ v3 +4' deu certo, somou direitinho. mais quando usoformula := table1formula.value, usando a formula do banco de dados da o erro acima.Tentei achar o erro e não consegui, se poder me ajudar, agradeço muito.JorgePosta o seu codigo que fica mais facil achar o erro ... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest jorge jr Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Jonas o codigo que esta dando erro, vai abaixo,procedure TFrmResultado.BitBtn5Click(Sender: TObject);varV1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;i: integer;f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,ftotal : string;vformula1 : string;formula : string;beginZTable2.Open;if ZTable2.locate('c_exame',DBLookupComboBox1.Text,[Locaseinsensitive]) = true thenbegin ZQuery3.First; while not zquery3.eof do begin if ZQuery3FORMULA.Value = 'FTOTAL' then vtotal := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F1' then v1 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F2' then v2 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F3' then v3 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F4' then v4 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F5' then v5 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F6' then v6 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F7' then v7 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F8' then v8 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F9' then v9 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'F10' then v10 := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'FHM' then vhm := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'FHT' then vht := ZQuery3RESULTADO.AsFloat; if ZQuery3FORMULA.Value = 'FHG' then vhg := ZQuery3RESULTADO.AsFloat; zquery3.Next; end; formula := ZTable2FORMULA.AsString; i := 1; while Pos('v'+inttostr(i), formula) > 0 do begin case i of 1 : FindReplace('v'+inttostr(i),floattostr(v1), formula); 2 : FindReplace('v'+inttostr(i),floattostr(v2), formula); 3 : FindReplace('v'+inttostr(i),floattostr(v3), formula); 4 : FindReplace('v'+inttostr(i),floattostr(v4), formula); end; i := i + 1; end; ShowMessage(formula); vformula1 := calculos.Eval(formula); ShowMessage(vformula1);end;end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Olha aonde esta o seu erroV1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;voce definiu V1 maiusculowhile Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest jorge jr Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Jonas, não é isso, troquei e continua dando o erro.O problema esta na hora de pegar a formula.Quando coloco uma string direta, funciona: formula := 'v1 + v2 + v3' e o showmessage aparece os valores das variaveis: ' 0 + 3 + 4 + 5'Quando utilizado o campo da tabela aparece a formula no showmessage: 'v1 + v2 + v3 + v4'Acho que o erro esta na hora de pegar a formula, estou usando uma variavel string do mesmo tipo do campo. Olha aonde esta o seu erroV1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;voce definiu V1 maiusculowhile Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Olha aonde esta o seu erroV1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;voce definiu V1 maiusculowhile Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculoJonas, estamos falando de pascal (a linguagem), não de C - o fato de a variável ser definida em maiúscula ou minúscula não quer dizer nada.Acho que você se refere ao fato de eventualmente o colega jorge jr ter escrito na fórmula o(s) "V" em caixa alta, daí sim haveria o tal problema.Jonas, não é isso, troquei e continua dando o erro.O problema esta na hora de pegar a formula.Quando coloco uma string direta, funciona: formula := 'v1 + v2 + v3' e o showmessage aparece os valores das variaveis: ' 0 + 3 + 4 + 5'Quando utilizado o campo da tabela aparece a formula no showmessage: 'v1 + v2 + v3 + v4'Eu estou achando estranha esta função FindReplace. Eu conheço AnsiReplace e StringReplace que poderiam ser utilizadas. Tenta com StringReplace (unit SysUtils) e veja no que dá:case i of 1 : formula := StringReplace(formula, 'v'+inttostr(i), floattostr(v1), [rfIgnoreCase]); 2 : formula := StringReplace(formula, 'v'+inttostr(i), floattostr(v2), [rfIgnoreCase]); 3 : formula := StringReplace(formula, 'v'+inttostr(i), floattostr(v3), [rfIgnoreCase]); 4 : formula := StringReplace(formula, 'v'+inttostr(i), floattostr(v4), [rfIgnoreCase]); end;Observe que com esta função também não haverá problemas com maiúscula ou minúscula, já que definimos rfIgnoreCaseSe ainda houver qualquer erro, por favor coloque a mensagem de erro original. Só vi você falar em erro, mas não achei qual o tal erro. :huh: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 while Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculoJonas, estamos falando de pascal (a linguagem), não de C - o fato de a variável ser definida em maiúscula ou minúscula não quer dizer nada.Micheus devo discordar de voce ... no while o pos esta procurando um v minusculo .... e não vai encontrar um V maiusculo ... se não acredita pode fazer um teste ( obs : ele não esta procurando variaveis e sim strings )espeirmenta isso e ve se da certo:formula := trim(ZTable2FORMULA.AsString); // eliminar os espaços em brancos da string Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Jorge ... lembrei de outra coisa, a expressão que a propriedade Eval do componente aceita é uma WideString e pode estar dando erro nisso, neste caso faça assim:procedure TFrmResultado.BitBtn5Click(Sender: TObject);varV1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;i: integer;f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,ftotal : string;vformula1 : string;formula : string;formulaX : WideString; // defina uma nova variavelbeginZTable2.Open;....formula := trim(ZTable2FORMULA.AsString); // eliminar os espaços em brancos da string formulaX := formula; vformula1 := calculos.Eval(formulaX);se não funcionar, você deve postar o erro exatamente como ele aparece. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Olha aonde esta o seu erroV1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;voce definiu V1 maiusculowhile Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculoIsto foi o que eu li. Será que desaprendi?Eu estou vendo uma declaração de variáveis onde V1 está com "V" maiúsculo, mas também estou vendo um Pos com um "v" minúsculo.Bom, quando eu leio a afirmação: "... está o seu erro | voce definiu V1 maiúsculo"eu entendo que definição neste caso seria a declaração da variável.Não consigo entender outra coisa, então desculpe se não consegui captar sua idéia.Micheus devo discordar de voce ... no while o pos esta procurando um v minusculo .... e não vai encontrar um V maiusculo ...como viu, não foi a isso que me referi.se não acredita pode fazer um teste ( obs : ele não esta procurando variaveis e sim strings )espeirmenta isso e ve se da certo:formula := trim(ZTable2FORMULA.AsString); // eliminar os espaços em brancos da stringapesar de não ser grande coisa, mas depois de mais de uma década de programação pascal, este é o tipo de dúvida que não tenho. ;) Mais uma vez, desculpe se lhe entendi mal.só para completar, pois novatos as vezes entendem o que lêem: TRIM: eliminar os espaços em brancos da string no início e no fim dela apenas (não no meio) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Jonas -- Postado Agosto 4, 2007 Denunciar Share Postado Agosto 4, 2007 Delculpe Micheus ... estava fazendo outro serviço e não li direito o que tinha escrito, e tambem foi mal por me expressar erradamente a voce e ao Jorge, não era definição de variaveis a que me referia e sim a string que talvez estivesse com V1 maiusculo ... quanto ao trim é justamente o que você se referiu ( espaços no inicio e no fim ) , mas fazendo um teste rapido aqui no meu micro o erro pode estar justamente quando ele joga a string do banco de dados para o componente que aceita um widestring.valeu .... Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Guest Jorge Jr
Pessoal preciso utilizar uma formula que esta numa tabela do banco de dados. Porem o sistema
não consegui calcular, quando passo o valor para a variavel este valor não consegue pegar os
dados de outras variaveis.
var
v1, v2,v3,v4 : double;
vtotal : double;
procedure TFrmResultado.BitBtn5Click(Sender: TObject);
var
Begin
v1 := strtofloat(edit1.text);
v2 := strtofloat(edit2.text);
v3 := strtofloat(edit3.text);
v4 := strtofloat(edit4.text);
vtotal :=tabelaformula.value;
end;
Sendo que o valor de campo tabelaformula e´igual a v1+v2+v3+v4
alguém sabe como posso fazer isso?
Link para o comentário
Compartilhar em outros sites
32 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.