GARANTIR DESCONTO

Fórum Criar condição com IF no SP - Firebird 2.0 #58509

11/07/2007

0

To tentando inventar uma SP no firebrid, mais nem sei como fazer para funcionar
CREATE PROCEDURE SPCONCATENATION ( 
    id_sal integer, 
    id_formula integer, 
    descricao varchar(80), 
    id_func integer, 
    id_gerarformula integer, 
    formula varchar(50), 
    quantia float, 
    salario numeric(15,2)) 
returns ( 
    quantia float, 
    b_calculo varchar(10)) 
as 
begin 
  if (exists(select A.id_sal, cast(A.salario as varchar(10))||B.formula||´*´||B.quantia, 
     B.id_formula, B.descricao,A.id_func, A.nome, B.id_gerarformula from salario_M A 
     left join formulas B on B.id_gerarformula = A.id_sal)) then 

  IF (:b_calculo = ´Fixo´) then 
     select A.id_sal, B.formula, B.id_formula, B.descricao, 
     A.id_func, A.nome, B.id_gerarformula from salario_M A 
     left join formulas B on B.id_gerarformula = A.id_sal 
     group by 1,2,3,4,5,6,7 order by 6 into :id_func; 

  else IF ((:b_calculo = ´Salario_Contratado´) and (:quantia = 0)) then 
     select A.id_sal, cast(A.salario as varchar(10))||B.formula, 
     B.id_formula, B.descricao,A.id_func, A.nome, B.id_gerarformula from salario_M A 
     left join formulas B on B.id_gerarformula = A.id_sal 
     group by 1,2,3,4,5,6,7 order by 6 into :id_func; 

  else IF ((:b_calculo = ´Salario_Contratado´) and (:quantia <> 0)) then 
     select A.id_sal, cast(A.salario as varchar(10))||B.formula||´*´||B.quantia, 
     B.id_formula, B.descricao,A.id_func, A.nome, B.id_gerarformula from salario_M A 
     left join formulas B on B.id_gerarformula = A.id_sal 
     group by 1,2,3,4,5,6,7 order by 6 into :id_func; 
  suspend; 
end;

Mais alem de eu nao saber como fazer esta SP ainda contem erros
[color=red:30d4671085]count of column list and variable list do not match. Dynamic SQL Error. SQL error code = -313. count of column list and variable list do not match.[/color:30d4671085]

O que eu quero eh quando o IF (bcalculo = ´´) and (quantia ...) estiver satisfazendo a condiçao mostrar o select como esta ai no SP em um dbgrid.

Esses dois campos b_calculo e quantia faz parte de uma tabela, mais nao sei se pode ser feito assim.
Bom alias nem sei fazer esta procedure.

Fiz um pequeno modelo com o CASE no query com apenas uma tabela.
select id_formula, 
case marcar when ´True´ then 
    case B_calculo  when ´Salario_Governo´ then 
            descricao || ´-´ || formula 
     end else 
     case B_Calculo  when ´Salario_Contratado´  then 
            descricao || ´-´ || formula || ´*´ || quantia  
     end 
end as CamposM_N, 
count(marcar)as quantidade //aqui nem precisa, so fiz pra saber quanto tem cfe. o case.
from formulas 
group by 1,2 order by 1
Mais este case eh soh pra eu ver, a nao ser que tenha como fazer um case como o select acima.


Adriano_servitec

Adriano_servitec

Responder

Posts

11/07/2007

Adriano_servitec

Alias postei errado o case do query o correto eh assim

select 
  id_formula, 
  case 
  when marcar=´True´ and B_Calculo = ´Salario_Governo´ then 
    descricao || ´-´ || formula 
  when marcar=´True´ and B_Calculo = ´Salario_Contratado´ then 
    descricao || ´-´ || formula || ´*´ || quantia  
  when marcar=´True´ and B_Calculo = ´Fixo´ Then
     descricao
  end as CamposM_N, 
  count(marcar)as quantidade 
from formulas 
group by 1,2 order by 1


Entao gostaria de saber se tem como unir as duas tabelas no join para msotrar como o select que estou tentando fazer na SP, ou se tem como fazer uma SP do jeito que estou precisando.


Responder

Gostei + 0

11/07/2007

Adriano_servitec

Consegui, mexendo daqui e dali, chegeui ao resultado que eu precisava fazer case no query mesmo.

Entao ficou assim (caso alguem precise de algum exemplo pra query tai)
select 
  A.id_empresa, 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,5


Bom tai, caso resolvido


Responder

Gostei + 0

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

Aceitar