GARANTIR DESCONTO

Fórum Somar valor de uma formula? Firebird 2.0 #58535

20/07/2007

0

Pessoal, tem como criar uma formula nesta SQL?

dm.qRestrFolha.sql.clear;
  dm.qRestrFolha.sql.text:=´ select A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao, A.id_func, A.nome, B.id_gerarformula, ´+
   ´ case ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Fixo´´ and B.valor = ´´False´´ Then ´+
         ´ A.salario ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar (10))||B.formula ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´  then ´+
         ´ B.vl_Informado ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar (10))||B.formula ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´  then ´+
         ´ B.vl_informado ´+
   ´ end as CamposM_N ´+
   ´ from salario_m A left join formulas B on B.id_gerarformula = A.id_sal ´+
   ´ WHERE (B.marcar = ´´True´´)order by 1,6 ´; //--condiçao se nao tiver marcado gera restricao
  dm.qRestrFolha.open;

Bom explicando a SQL
Ela mostra nome funcionario, id_empresa, salario etc...
Bom mais no caso tem a coluna [b:f15d788b1a]CamposM_N[/b:f15d788b1a] que mostra o resultado do case desta SQL
Que nada mais eh do que uma formula de expressao, esta tudo certo cfe. os funcionarios de cada empresa, mostra a formula corretamente + salario * quantia etc e tal... como podem ver acima.

Ou seja fica + ou - assim:
[b:f15d788b1a]CamposM_N[/b:f15d788b1a]
900.00/30
900.00*30/100
900.00*50/100
...
...
*********************************************
Gostaria de saber se tem como calcular esta formula em mais um campo no SQL.

Nao sei se tem como converter estas ´Ta como string´ em resultado de uma formula, e mostrar assim
[b:f15d788b1a]CamposM_N*********Resultado[/b:f15d788b1a]
900.00/30*15.....................450.00
900.00*30/100...................270.00
900.00*50/100...................450.00
...
...
Tenho um modelo feito em piradox com duas tabelas
function ResultFormulas( IdFormula:Integer; ValorCHave:String ; db:TDatabase):Variant;
var
  qry:TQuery;
  sql:String;
begin
  qry := TQuery.Create(Nil);
  qry.DatabaseName := db.DatabaseName;
  qry.SQL.Text := ´Select * from FORMULAS where ID=:ID´;
  qry.ParamByName(´ID´).AsInteger := IdFormula;
  qry.Open;
  if qry.RecordCount = 0 then begin
    Showmessage(´Formula Não Encontrada!´);
    qry.Close;
    qry.Free;
    Result := ´´;
    Exit;
  end;
  sql := ´SELECT (´+qry.FieldByName(´FORMULA´).AsString+´) AS RESULTADO FROM ´+qry.FieldByName(´TABELA´).AsString;
  if ValorChave <> ´´ then
    sql := sql + ´ WHERE ´+qry.FieldByName(´CAMPOCHAVE´).AsString+´=´+ValorChave;
  qry.Close;
  qry.SQL.Text := sql;
  qry.Open;
  Result := qry.FieldByName(´RESULTADO´).Value;
  qry.Close;
  qry.Free;
end;
Mais nao me serve essa funçao apesar que calcula certinho as formulas.

Bom eh isso ai pessoal, se eu conseguir fazer assim vai me poupar um bom trabalho de linhas e linhas de codigo no programa, alem de facilitar depois na manutençao.
Se alguem puder me ajudar!!! Fico grato.
Adriano


Adriano_servitec

Adriano_servitec

Responder

Posts

22/07/2007

Emerson Nascimento

acho que você só consegue isso numa stored procedure, usando o comando [i:2d7b1c2df4]execute statement[/i:2d7b1c2df4]


Responder

Gostei + 0

23/07/2007

Adriano_servitec

acho que você só consegue isso numa stored procedure, usando o comando [i:2fb73a9624]execute statement[/i:2fb73a9624]


Amigo, vc nao teria um exemplo de como se usa o [b:2fb73a9624]comando [i:2fb73a9624]execute statement[/i:2fb73a9624][/b:2fb73a9624]

Grato
Adriano.


Responder

Gostei + 0

23/07/2007

Adriano_servitec

Nao tenho nem ideia como fazer esta SP

Nao sei como usar este comando, pra que ele serve, por isso fico cego na SP
CREATE PROCEDURE ESSQLFUNC (
    id_empresa integer,
    b_calculo varchar(80),
    valor numeric(15,2),
    salario numeric(15,2),
    marcar varchar(10),
    quantidade varchar(10),
    vl_informado numeric(15,2),
    id_gerarformula integer,
    id_sal integer)
returns (
    salcontratformulas numeric(15,2),
    salgovformulas numeric(15,2),
    salariofixo numeric(15,2),
    salvlinformado numeric(15,2))
as
declare variable sqles varchar(1050) character set win1252;
begin
   SQLES = ´select A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao, A.id_func, A.nome, B.id_gerarformula,
    case
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Fixo´´ and B.valor = ´´False´´ Then
          A.salario
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´  then
          cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´  then
          cast(A.salario as varchar (10))||B.formula
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´  then
          B.vl_Informado
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´  then
          cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´  then
          cast(A.salario as varchar (10))||B.formula
      when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´  then
          B.vl_informado
    end as CamposM_N
    from salario_m A left join formulas B on B.id_gerarformula = A.id_sal
    WHERE (B.marcar = ´´True´´)order by 1,6´;
    for execute statement
    SQLES
    into

    do
    begin
       SELECT COALESCE(SUM(A.Salario),0) FROM salario_m A INTO :SalarioFixo;
      suspend;
end^



Responder

Gostei + 0

23/07/2007

Adriano_servitec

Assim eu obtenho o resultado da SQL
begin
with dm.qRestrFolha do
  begin
    Sql.Text:=´select ´+dm.qRestrFolha.FieldByName(´CamposM_N´).asString+´ from rdb$database´;
    open;
  end;
end;

Mais nao mostra em uma nova coluna do lado do campo [b:b793245525]CamposM_N[/b:b793245525]

E nao estou conseguindo fazer a SP


Responder

Gostei + 0

24/07/2007

Cn.sistemas

coloca as tabelas pra fazer teste e ter um bom intendimento


Responder

Gostei + 0

24/07/2007

Adriano_servitec

coloca as tabelas pra fazer teste e ter um bom intendimento
Olah amigo, obrigado por responder, bom as tabelas estao certinhas. Pelo menos mostram o resultado que eu quero no grid.

Fiz uma funçao (Nao sei se esta correta, mais compila) :D Se puderem analizar ela tambem!!!
{$R *.dfm}
function ResultFormulas(Id_GerarFormula: Integer):Variant;
var
  sql: String;
begin
   dm.qRestrFolha.sql.clear;
   dm.qRestrFolha.sql.text:=´ select A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao, A.id_func, A.nome, B.id_gerarformula, ´+
   ´ case ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Fixo´´ and B.valor = ´´False´´ Then ´+
         ´ A.salario ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar (10))||B.formula ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´  then ´+
         ´ B.vl_Informado ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´  then ´+
         ´ cast(A.salario as varchar (10))||B.formula ´+
     ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´  then ´+
         ´ B.vl_informado ´+
   ´ end as CamposM_N ´+
   ´ from salario_m A left join formulas B on B.id_gerarformula = A.id_sal ´+
   ´ WHERE (A.id_empresa between :pEini and :pEfin) and (A.id_func between :pFini and :pFfin) and (B.marcar = ´´True´´)order by 1,6 ´; //--condiçao se nao tiver marcado gera restricao
   //--passando os parametros dos edits
   dm.qRestrFolha.parambyname(´pEini´).asInteger := EIni;
   dm.qRestrFolha.parambyname(´pEfin´).asInteger := EFin;
   dm.qRestrFolha.parambyname(´pFini´).asInteger := FIni;
   dm.qRestrFolha.parambyname(´pFfin´).asInteger := FFin;
   dm.qRestrFolha.open;
   if dm.qRestrFolha.RecordCount = 0 then begin
      Showmessage(´Formula Não Encontrada!´);
      dm.qRestrFolha.Close;
      dm.qRestrFolha.Free;
      Result := ´´;
      Exit;
   end;
   Sql :=´select (´+dm.qRestrFolha.FieldByName(´CamposM_N´).asString+´)as resultado from rdb$database´;

   dm.qRestrFolha.Close;
   dm.qRestrFolha.SQL.Text := sql;
   dm.qRestrFolha.Open;
   Result := dm.qRestrFolha.FieldByName(´RESULTADO´).Value;
   dm.qRestrFolha.Close;
   dm.qRestrFolha.Free;
end;


E a principio tentei passar o resultado da funçao em um listbox
procedure TFAutoCalc.Button1Click(Sender: TObject); var vresultado : String; begin listbox1.clear; dm.qRestrFolha.DisableControls; dm.qRestrFolha.First; while not dm.qRestrFolha.Eof do begin //passa para o listbox o valor do dbgrid [color=red:b745e59fb9]vResultado := ResultFormulas( dm.qRestrFolha.FieldByName(´ID_GerarFormula´).AsInteger );[/color:b745e59fb9] listbox1.Items.Add(dm.qRestrFolha.FieldByName(´descricao´).AsString+´-´+vResultado); dm.qRestrFolha.Next; end; dm.qRestrFolha.enablecontrols; end;
Mais esta mostrando erro na linha em vermelho, nao na hora de compilar e sim na hora de executar.

Erro:
[b:b745e59fb9]´QRestrFolha: field ´ID_GerarFormula´ not found[/b:b745e59fb9] Bom nao sei eh pq nao coloquei este campo no fields do query pois carrego o Query somente dentro da unit e nao no componente query.

Se eu fazer assim
[b:b745e59fb9]vResultado := ResultFormulas( dm.qRestrFolhaID_GerarFormula.AsInteger );[/b:b745e59fb9]
Nao compila
Erro:
[color=red:b745e59fb9][Error] uAutocalc.pas(803): Undeclared identifier: ´qRestrFolhaID_GerarFormula´[/color:b745e59fb9]

Alguem pode me dizer o que esta acontecendo?
Grato Adriano.


Responder

Gostei + 0

24/07/2007

Emerson Nascimento

nos ajude a te ajudar...

não conhecemos o conteúdo das suas tabelas...
dê um exemplo dos registros da tabela FORMULAS.


Responder

Gostei + 0

24/07/2007

Adriano_servitec

Nao sei se consegue ver a imagem do grid corretamente, mais esta SQL acima me mostra o resultado desta imagem abaixo neste link

http://adrianoservitec.fotos.uol.com.br/DELPHI


Responder

Gostei + 0

24/07/2007

Adriano_servitec

Pode ser ´caso a funçao esteja correta´ algum erro bobo de conversao de variavel

Pq quando aperto no button para confirmar e passar para um listbox apareçe o erro
[color=red:80fdab2901]´´ is not a valid integer value´[/color:80fdab2901]
E aponta para a linha em vermeho abaixo
procedure TFAutoCalc.Button1Click(Sender: TObject); var [b:80fdab2901]vresultado : Integer;[/b:80fdab2901] begin dm.qRestrFolha.Open; listbox1.clear; dm.qRestrFolha.DisableControls; dm.qRestrFolha.First; while not dm.qRestrFolha.Eof do begin //passa para o listbox o valor do dbgrid [color=red:80fdab2901]vResultado := ResultFormulas(vResult); //variavel global que recebe o resultado da função[/color:80fdab2901] listbox1.Items.Add(dm.qRestrFolha.FieldByName(´descricao´).AsString+´-´+IntToStr(vResultado)); dm.qRestrFolha.Next; end; dm.qRestrFolha.enablecontrols; end;
A variavel eu ja tentei como string, real, currency e integer e o erro eh o mesmo.

a variavel [b:80fdab2901]VResult[/b:80fdab2901] deixei como global que faz parte da funçao, tembem ja deixei como string, real, currency e esta como integer no momento.
A funçao joguei o [b:80fdab2901]Result[/b:80fdab2901] para a variavel [b:80fdab2901]VResult[/b:80fdab2901]
{Funçao de Calculos de Formulas} function TFAutoCalc.ResultFormulas(Id_GerarFormula: Integer):Variant; var sql: String; begin EIni:=StrToInt(e1.text); //-variavel recebendo valor do edit EMPRESAS EFin:=StrToInt(e2.text); //-variavel recebendo valor do edit EMPRESAS FIni:=StrToInt(e3.text); //-variavel recebendo valor do edit FUNCIONARIOS FFin:=StrToInt(e4.text); //-variavel recebendo valor do edit FUNCIONARIOS dm.qRestrFolha.sql.clear; dm.qRestrFolha.sql.text:=´ select A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao, A.id_func, A.nome, B.id_gerarformula, ´+ ´ case ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Fixo´´ and B.valor = ´´False´´ Then ´+ ´ A.salario ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar (10))||B.formula ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´ then ´+ ´ B.vl_Informado ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar (10))||B.formula ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´ then ´+ ´ B.vl_informado ´+ ´ end as CamposM_N ´+ ´ from salario_m A left join formulas B on B.id_gerarformula = A.id_sal ´+ ´ WHERE (A.id_empresa between :pEini and :pEfin) and (A.id_func between :pFini and :pFfin) and (B.marcar = ´´True´´)order by 1,6 ´; //--condiçao se nao tiver marcado gera restricao //--passando os parametros dos edits dm.qRestrFolha.parambyname(´pEini´).asInteger := EIni; dm.qRestrFolha.parambyname(´pEfin´).asInteger := EFin; dm.qRestrFolha.parambyname(´pFini´).asInteger := FIni; dm.qRestrFolha.parambyname(´pFfin´).asInteger := FFin; dm.qRestrFolha.open; if dm.qRestrFolha.RecordCount = 0 then begin Showmessage(´Formula Não Encontrada!´); dm.qRestrFolha.Close; dm.qRestrFolha.Free; Result := ´´; Exit; end; Sql :=´select (´+dm.qRestrFolha.FieldByName(´CamposM_N´).asString+´)as resultado from rdb$database´; dm.qRestrFolha.Close; dm.qRestrFolha.SQL.Text := sql; dm.qRestrFolha.Open; {Result eh o resultado do campo ´CamposM_N´ cfe select acima} [b:80fdab2901]Result := dm.qRestrFolha.FieldByName(´resultado´).Value;[/b:80fdab2901] //--pasando o resultado para uma variavel global [color=blue:80fdab2901]VResult := Result;[/color:80fdab2901] dm.qRestrFolha.Close; dm.qRestrFolha.Free; end; //********************final da funcao de calculo de formulas********


Entao pessoal, pode ser um erro bobo, mais ta me tirando o sono.
Grato a ajuda de todos.
Adriano.


Responder

Gostei + 0

24/07/2007

Adriano_servitec

Fuçando daqui, fuçando dali, fazendo alguns testes cheguei a este resultado. Ou seja mudei a função.

1º criei uma Procedure para filtrar a SQL cfe. a condição do where
var FAutoCalc: TFAutoCalc; [b:641a32f57e]{As variaveis globais}[/b:641a32f57e] Eini, Efin, Fini, Ffin : Integer; //variaveis dos edits deixei como global edtDt : TDate; //variavel tipo data VResult : Integer; //variavel da funçao ResultFormulas implementation uses uDM, uRestricaoFolha, UFGerarFolhaMes; {$R *.dfm} [b:641a32f57e]Procedure TFAutoCalc.SQLFormulas;[/b:641a32f57e] // A procedure begin FIni:=StrToInt(e3.text); //-variavel recebendo valor do edit FUNCIONARIOS FFin:=StrToInt(e4.text); //-variavel recebendo valor do edit FUNCIONARIOS dm.qRestrFolha.sql.clear; dm.qRestrFolha.sql.text:=´ select A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao, A.id_func, A.nome, B.id_gerarformula, ´+ ´ case ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Fixo´´ and B.valor = ´´False´´ Then ´+ ´ A.salario ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar (10))||B.formula ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´ then ´+ ´ B.vl_Informado ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´ then ´+ ´ cast(A.salario as varchar (10))||B.formula ´+ ´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´ then ´+ ´ B.vl_informado ´+ ´ end as CamposM_N ´+ ´ from salario_m A left join formulas B on B.id_gerarformula = A.id_sal ´+ ´ WHERE (A.id_func between :pFini and :pFfin) and (B.marcar = ´´True´´)order by 1,6 ´; //--condiçao se nao tiver marcado gera restricao //--passando os parametros dos edits dm.qRestrFolha.parambyname(´pFini´).asInteger := FIni; dm.qRestrFolha.parambyname(´pFfin´).asInteger := FFin; dm.qRestrFolha.open; if dm.qRestrFolha.RecordCount = 0 then begin Showmessage(´Formula Não Encontrada!´); dm.qRestrFolha.Close; dm.qRestrFolha.Free; Exit; end; end;


Depois chameia procedure dentro da Função
{Funçao de Calculos de Formulas} function TFAutoCalc.ResultFormulas(Id_GerarFormula: Integer):Variant; var sql: String; begin [b:641a32f57e]SQLFormulas; //Procedure que filtra a SQL das tabelas[/b:641a32f57e] {SQL para calcular o resultado da Formula do campo ´CamposM_N´} Sql :=´select (´+dm.qRestrFolha.FieldByName(´CamposM_N´).asString+´)as resultado from rdb$database´; dm.qRestrFolha.Close; dm.qRestrFolha.SQL.Text := sql; dm.qRestrFolha.Open; Result := dm.qRestrFolha.FieldByName(´resultado´).Value; //--pasando o resultado para uma variavel global [b:641a32f57e]VResult := Result;[/b:641a32f57e] Variavel globar resebendo o valor do resultado dm.qRestrFolha.Close; dm.qRestrFolha.Free; end;


E depois como ainda nao sei do jeito de fazer outra coluna para receber a soma do campo aonde estao as formulas tentei passar para um ListBox, somente pra ver o resultado.

procedure TFAutoCalc.Button1Click(Sender: TObject); var vresultado : String; begin SQLFormulas; // Procedure da SQL Formulas listbox1.clear; dm.qRestrFolha.DisableControls; dm.qRestrFolha.First; while not dm.qRestrFolha.Eof do begin //passa para o listbox o valor do dbgrid listbox1.Items.Add(dm.qRestrFolha.FieldByName(´camposM_N´).AsString); vResultado := ResultFormulas(vResult); //variavel global que recebe o resultado da função Listbox1.Items.Add(vResultado); //passando o calculo da formula no listbox na segunda linha dm.qRestrFolha.Next; end; dm.qRestrFolha.enablecontrols; end;


Bom entao fiu para o resultado.
Primeiro eu filtro por codigo de funcionarios, e esta filtrando como eu quero e depois aperto neste button para jogar para o listbox apareçe aquela mensagem [b:641a32f57e]Access violation adress[/b:641a32f57e], e soh joga o primeiro resultado filtrado, que no caso fica somente assim no listbox

500.00/30*2.0000
33,32 //aqui cheou a calcular e jogar o resultado, mais depois disso nao joga mais nada do filtro e o dbgrid fica fechado.

Pareçe que nao esta aceitando o loop na tabela e jogar o resultado da formula.


Responder

Gostei + 0

25/07/2007

Adriano_servitec

Consegui passar no listbox usando esta funçao aqui

{$R *.dfm}
function Calcular(SMyExpression: string; digits: Byte): string;
  // Funçao para calcular uma simples operação matematica
var
  z: Char;
  ipos: Integer;

  function StrToReal(chaine: string): Real;
  var
    r: Real;
    Pos: Integer;
  begin
    Val(chaine, r, Pos);
    if Pos > 0 then Val(Copy(chaine, 1, Pos - 1), r, Pos);
    Result := r;
  end;

  function RealToStr(inreal: Extended; digits: Byte): string;
  var
    S: string;
  begin
    Str(inreal: 0: digits, S);
    realToStr := S;
  end;

  procedure NextChar;
  var
    s: string;
  begin
    if ipos > Length(SMyExpression) then
    begin
      z := #9;
      Exit;
    end
    else
    begin
      s := Copy(SMyExpression, ipos, 1);
      z := s[1];
      Inc(ipos);
    end;
    if z = ´ ´ then nextchar;
  end;

  function Expression: Real;
  var
    w: Real;

    function Factor: Real;
    var
      ws: string;
    begin
      Nextchar;
      if z in [´0´..´9´] then
      begin
        ws := ´´;
        repeat
          ws := ws + z;
          nextchar
        until not (z in [´0´..´9´, ´.´]);
        Factor := StrToReal(ws);
      end
      else if z = ´(´ then
      begin
        Factor := Expression;
        nextchar
      end
      else if z = ´+´ then Factor := +Factor
      else if Z = ´-´ then Factor := -Factor;
    end;

    function Term: Real;
    var
      W: Real;
    begin
      W := Factor;
      while Z in [´*´, ´/´] do
        if z = ´*´ then w := w * Factor
      else
        w := w / Factor;
      Term := w;
    end;
  begin
    w := term;
    while z in [´+´, ´-´] do
      if z = ´+´ then w := w + term
    else
      w := w - term;
    Expression := w;
  end;
begin
  ipos   := 1;
  Result := RealToStr(Expression, digits);
end;

Procedure TFAutoCalc.SQLFormulas; // A procedure
begin
FIni:=StrToInt(e3.text); //-variavel recebendo valor do edit FUNCIONARIOS
FFin:=StrToInt(e4.text); //-variavel recebendo valor do edit FUNCIONARIOS
dm.qRestrFolha.sql.clear;
dm.qRestrFolha.sql.text:=´ select A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao, A.id_func, A.nome, B.id_gerarformula, ´+
´ case ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Fixo´´ and B.valor = ´´False´´ Then ´+
´ A.salario ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´ then ´+
´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´ then ´+
´ cast(A.salario as varchar (10))||B.formula ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Contratado´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´ then ´+
´ B.vl_Informado ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´True´´ and B.valor = ´´False´´ then ´+
´ cast(A.salario as varchar(10))||B.formula||´´*´´||B.quantia ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´False´´ then ´+
´ cast(A.salario as varchar (10))||B.formula ´+
´ when B.marcar = ´´True´´ and B.B_Calculo = ´´Salario_Governo´´ and B.quantidade = ´´False´´ and B.valor = ´´True´´ then ´+
´ B.vl_informado ´+
´ end as CamposM_N ´+
´ from salario_m A left join formulas B on B.id_gerarformula = A.id_sal ´+
´ WHERE (A.id_func between :pFini and :pFfin) and (B.marcar = ´´True´´)order by 1,6 ´; //--condiçao se nao tiver marcado gera restricao
//--passando os parametros dos edits
dm.qRestrFolha.parambyname(´pFini´).asInteger := FIni;
dm.qRestrFolha.parambyname(´pFfin´).asInteger := FFin;
dm.qRestrFolha.open;
if dm.qRestrFolha.RecordCount = 0 then begin
Showmessage(´Formula Não Encontrada!´);
dm.qRestrFolha.Close;
dm.qRestrFolha.Free;
Exit;
end;
end;


E chamando no ListBox assim
procedure TFAutoCalc.Button1Click(Sender: TObject);
var
vresultado : String;
begin
SQLFormulas; // Procedure da SQL Formulas
listbox1.clear;
dm.qRestrFolha.DisableControls;
dm.qRestrFolha.First;
while not dm.qRestrFolha.Eof do
begin
//passa para o listbox o valor do dbgrid
vResultado := dm.qRestrFolha.FieldByName(´camposM_N´).AsString; //pegando o resultado da formula
vResultado := Calcular(VResultado, 2); //variavel global que recebe o resultado da função
Listbox1.Items.Add(dm.qRestrFolha.FieldByName(´camposM_N´).AsString+´  -  ´+vResultado); //passando o calculo da formula no listbox na segunda linha
dm.qRestrFolha.Next;
end;
dm.qRestrFolha.enablecontrols;

end;


Agora funcionou no ListBox, mais infelismente nao consegui abrir uma nova coluna e passar o resultado no DBGrid.

Mais ja ta bom assim.

Valeu pela ajuda pessoal
Adriano.


Responder

Gostei + 0

25/07/2007

Emerson Nascimento

a melhor opção realmente é stored procedures.
mas para dar uma solução mais próxima da sua necessidade, eu gostaria que você publicasse alguns registros da sua tabela FORMULAS.

mais uma vez: alguns registros da sua tabela FORMULAS. não o resultado dessa sua instrução. preciso conhecer o conteúdo e o tipo dos campos da tabela FORMULAS para poder fazer um stored procedure que lhe seja satisfatória.


Responder

Gostei + 0

25/07/2007

Adriano_servitec

a melhor opção realmente é stored procedures. mas para dar uma solução mais próxima da sua necessidade, eu gostaria que você publicasse alguns registros da sua tabela FORMULAS. mais uma vez: alguns registros da sua tabela FORMULAS. não o resultado dessa sua instrução. preciso conhecer o conteúdo e o tipo dos campos da tabela FORMULAS para poder fazer um stored procedure que lhe seja satisfatória.


A DLL eh esta
[code]CREATE TABLE FORMULAS (
ID_SEQ INTEGER NOT NULL,
ID_FORMULA INTEGER NOT NULL,
ID_GERARFORMULA INTEGER NOT NULL,
DESCRICAO VARCHAR(60),
FORMULA VARCHAR(80),
P_D CHAR(1),
MARCAR VARCHAR(10),
QUANTIDADE CHAR(10),
VALOR CHAR(10),
QUANTIA FLOAT,
B_CALCULO VARCHAR(60),
VL_INFORMADO NUMERIC(15,2),
INSS CHAR(10),
IRRF CHAR(10),
FGTS CHAR(10),
SFAMILIA CHAR(10),
DINSS CHAR(10),
DIRRF CHAR(10),
DFGTS CHAR(10),
DSFAMILIA CHAR(10),
REPETE VARCHAR(10)
);

[code]


Responder

Gostei + 0

26/07/2007

Emerson Nascimento

acho que esta stored procedure funciona para o que você precisa. note que eu não coloquei nenhum parâmetro de entrada, pois não sei qual a sua real necessidade (talvez você faça o cálculo por funcionário e seja necessário um parâmetro de entrada).
CREATE PROCEDURE ESSQLFUNC 
returns (
    id_empresa integer,
    salario numeric(15,2),
    id_sal integer,
    id_formula integer,
    descricao varchar(100),
    id_func integer,
    nome varchar(50),
    id_gerarformula integer,
    calculo varchar(100),
    resultado numeric(15,2))
as
declare variable b_calculo varchar(50);
declare variable valor varchar(50);
declare variable quantidade varchar(50);
declare variable formula varchar(50);
declare variable quantia varchar(50);
declare variable vl_informado varchar(50);
begin
    for  
        select
            A.id_empresa, A.salario, A.id_sal, B.id_formula, B.descricao,
            A.id_func, A.nome, B.id_gerarformula, b.b_calculo, b.valor,
            b.quantidade, b.formula, b.quantia, b.vl_informado
        from
            salario_m A
        left join
            formulas B on B.id_gerarformula = A.id_sal
        where
            (B.marcar = ´True´)
        order by
            a.id_empresa, a.id_func
    into :id_empresa, :salario, :id_sal, :id_formula, :descricao,
         :id_func, :nome, :id_gerarformula, :b_calculo, :valor,
         :quantidade, :formula, :quantia, :vl_informado
    do
    begin
        if (b_calculo = ´Fixo´) then
            calculo = salario;
        else
        begin
            if (quantidade = ´True´) then
               calculo = cast(salario as varchar(10)) || formula || ´*´ || quantia;
            else
            begin
                if (valor = ´True´) then
                    calculo = vl_informado;
                else
                    calculo = cast(salario as varchar (10)) || formula;
            end
        end

        --- *** Aqui será executada a fórmula ***
        execute statement ´select ´ || calculo || ´ from rdb$database´ into resultado;

        suspend;
    end
end



Responder

Gostei + 0

26/07/2007

Adriano_servitec

Emerson, testei aqui e ficou do jeito que eu postei, mais tem como fazer esta SP usando a soma em vez da coluna RESULTADO assim Proventos ----- Descontos e somar cfe. o campo P_D da tabela formula?


Responder

Gostei + 0

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

Aceitar