Jump to content
Fórum Script Brasil
  • 0

[resolvido] Duvidas Sobre Variaveis


Guest Jorge Jr
 Share

Question

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 to comment
Share on other sites

Recommended Posts

  • 0
Guest --Jonas --

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;

Link to comment
Share on other sites

  • 0
Guest jorge jr

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.

Link to comment
Share on other sites

  • 0
Guest --felipe --

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

Link to comment
Share on other sites

  • 0
Guest --Jonas --
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 ???

Link to comment
Share on other sites

  • 0
Guest jorge jr

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?

Link to comment
Share on other sites

  • 0
Guest jorge jr

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.

Link to comment
Share on other sites

  • 0
Guest --Jonas --

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.

Link to comment
Share on other sites

  • 0

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 Calculo

deve retornar 6. ai na hora de fazer a string, você pega a formula e substitui as variaveis pelo seu valor

Edited by kuroi
Link to comment
Share on other sites

  • 0
Guest --Jonas --
De acordo com o nosso colega Kuroi no seu post

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • 0
Guest --Jonas --

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.

Link to comment
Share on other sites

  • 0
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 V2

V1 = 10; V2 = 20.5; V3 = 0; V4 = 0;

Já a fórmula para este exame seria V1 +V2

para o cálculo de um exame Y você teria os valores de V1, V2 e V3

V1 = 14.5; V2 = 50.5; V3 = 15; V4 = 0;

Já a fórmula para este exame seria V1 +V2 -V3

Daí o que teria de ser feito é interpretar a fórmula e utilizar os campos. Seria algo neste sentido?

Link to comment
Share on other sites

  • 0
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 - V3

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

Link to comment
Share on other sites

  • 0
Guest --Jonas --

Vou dar uma ideia inicial de como fazer esta substituição, mas voce pode achar uma maneira melhor

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

Link to comment
Share on other sites

  • 0
Guest jorge jr

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 uso

formula := 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

Link to comment
Share on other sites

  • 0
Guest --Jonas --
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 uso

formula := 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

Posta o seu codigo que fica mais facil achar o erro ...

Link to comment
Share on other sites

  • 0
Guest jorge jr

Jonas o codigo que esta dando erro, vai abaixo,

procedure TFrmResultado.BitBtn5Click(Sender: TObject);

var

V1, 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;

begin

ZTable2.Open;

if ZTable2.locate('c_exame',DBLookupComboBox1.Text,[Locaseinsensitive]) = true then

begin

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;

Link to comment
Share on other sites

  • 0
Guest --Jonas --

Olha aonde esta o seu erro

V1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;

voce definiu V1 maiusculo

while Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo

Link to comment
Share on other sites

  • 0
Guest jorge jr

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 erro

V1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;

voce definiu V1 maiusculo

while Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo

Link to comment
Share on other sites

  • 0
Olha aonde esta o seu erro

V1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;

voce definiu V1 maiusculo

while Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo

Jonas, 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 rfIgnoreCase

Se 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:

Link to comment
Share on other sites

  • 0
Guest --Jonas --

while Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo

Jonas, 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

Link to comment
Share on other sites

  • 0
Guest --Jonas --

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);

var

V1, 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 variavel

begin

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

Link to comment
Share on other sites

  • 0
Olha aonde esta o seu erro

V1, v2,v3,v4,v5,v6,v7,v8,v9,v10, vtotal : real;

voce definiu V1 maiusculo

while Pos('v'+inttostr(i), formula) > 0 do // ele esta procurando v1 minusculo

Isto 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 string

apesar 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)

Link to comment
Share on other sites

  • 0
Guest --Jonas --

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...