Fórum Somar valor de uma formula? Firebird 2.0 #58535
20/07/2007
0
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;
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
Curtir tópico
+ 0Posts
22/07/2007
Emerson Nascimento
Gostei + 0
23/07/2007
Adriano_servitec
Amigo, vc nao teria um exemplo de como se usa o [b:2fb73a9624]comando [i:2fb73a9624]execute statement[/i:2fb73a9624][/b:2fb73a9624]
Grato
Adriano.
Gostei + 0
23/07/2007
Adriano_servitec
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^
Gostei + 0
23/07/2007
Adriano_servitec
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
Gostei + 0
24/07/2007
Cn.sistemas
Gostei + 0
24/07/2007
Adriano_servitec
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
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.
Gostei + 0
24/07/2007
Emerson Nascimento
não conhecemos o conteúdo das suas tabelas...
dê um exemplo dos registros da tabela FORMULAS.
Gostei + 0
24/07/2007
Adriano_servitec
http://adrianoservitec.fotos.uol.com.br/DELPHI
Gostei + 0
24/07/2007
Adriano_servitec
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
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]
Entao pessoal, pode ser um erro bobo, mais ta me tirando o sono.
Grato a ajuda de todos.
Adriano.
Gostei + 0
24/07/2007
Adriano_servitec
1º criei uma Procedure para filtrar a SQL cfe. a condição do where
Depois chameia procedure dentro da Função
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.
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.
Gostei + 0
25/07/2007
Adriano_servitec
{$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.
Gostei + 0
25/07/2007
Emerson Nascimento
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.
Gostei + 0
25/07/2007
Adriano_servitec
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]
Gostei + 0
26/07/2007
Emerson Nascimento
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
Gostei + 0
26/07/2007
Adriano_servitec
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)