condição selecionavel numa stored procedure

Firebird

28/03/2006

olá caros colegas, uso FB 1.5 e estou com um problema pra montar essa SP, a questão é q quero montar um select q eu possa manipular os parametros de pesquisa, tipo: sempre consulto por periodo, mais tenho mais duas condições, historico e filial, q hora consulto com historico, hora com filial e hora com os dois, naum tava querendo fazer com if e 3 ou 4 selects, no delphi eu faço assim:

[b:64b681f10c]vincremento : String;
vincremento := ´ and ID_Historico = ´+QuotedStr(0001´ );
select * from
from
caixa
where
(Data between :vData_Inicio and :vDATA_FINAL)+
QuotedStr(vincremento)[/b:64b681f10c]

//na SP está assim e preciso mudar
[b:64b681f10c]select * from
from
caixa
where
(Data between :vData_Inicio and :vDATA_FINAL)
and
(ID_Historico = :vid_historico)
and
ID_Filial = :vid_filial[/b:64b681f10c]

essa SP está no banco e tem como parametro de entrada DataInicio e DataFinal, o q tentei e naum consegui foi colocar uma var vincremento varchar(100) e usar na pesquisa, ele naum aceitou uma variável no meio do select...
agradeço a atenção


Camilo

Camilo

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

28/03/2006

A única maneira de fazer isso sem apelar para o IF seria usar EXECUTE STATEMENT que permite montar a SQL em tempo de execução.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/03/2006

coloque quatro parâmetros na sua sp: datainicial, datafinal, historico e filial

crie duas variáveis na sp: chistorico e cfilial, ambos varchar (você define o tamanho)

faça:
  if historico = -1
  then cHistorico = ´¬´;
  else cHistorico = cast(historico as varchar(tamanhoquevcdefiniu));

  if filial = -1
  then cFilial = ´¬´;
  else cFilial = cast(filial as varchar(tamanhoquevcdefiniu));


e mude sua instrução para:
select
  *
from 
  caixa 
where 
  (Data between :vData_Inicio and :vDATA_FINAL) 
  and (ID_Historico LIKE :cHistorico) 
  and (ID_Filial LIKE :cFilial)

daí você pode passar os parâmetros histórico e filial ou ignorá-los
(passe -1 para a sp para ´ignorar´ os parâmetros)

não sei no IB/FB, mas no SQL Server funciona perfeitamente.


GOSTEI 0
Camilo

Camilo

28/03/2006

entendi, mais assim naum funciona, pq se eu tiver dois historicos, ´1´ e ´11´, quando mandar o select historico=´1´ ele vai pegar o 11 tb, pq tem o like...


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

28/03/2006

você testou?

porque sua afirmação está INcorreta...

se eu passar

LIKE ´1´ ele vai me trazer somente o que for = ´1´
LIKE ´1¬´ vai me trazer o que iniciar por ´1´ (1, 11, 101, 12, 14)


GOSTEI 0
Camilo

Camilo

28/03/2006

emerson, desculpe naum ter testado antes de falar, tinha pensado essa logica, mais nem tinha testado pq como eu tinha dito anteriormente achava q furava o filtro por causa do like, mais o x eh q naum tinha o ¬ apos o valor, então eh uma pesquisa exata, obrigado, vc eh o cara em procedures, jah me ajudou de monte no msn, quero agradecer por tudo... obrigado mesmo.. e desculpa ae denovo rsrsrs, e v se aparece no msn, rsrsrs valew :D


GOSTEI 0
Camilo

Camilo

28/03/2006

iii, esqueci, funcionou legal, vou postar aqui como ficou, alguem pode precisar... e emerson me ajudou desde o inicio dessa SP, pq de SP naum manjava nadinha, mais nadinha mesmo....
PRA ENTENDIMENTO, O vID_Filial e o vID_Loja passo o valor ou o ´¬´ com if no delphi e pra chamar a SP fica assim

SELECT * FROM p_caixa ( ´+
QuotedStr(FormatDateTime(´DD.MM.YYYY´,dpkInicio.Date)) +´,´+
QuotedStr(FormatDateTime(´DD.MM.YYYY´,dpkFinal.Date))+´,´+
QuotedStr(vID_Filial)+´,´+
QuotedStr(vID_Historico)+
´)´;

CREATE PROCEDURE P_CAIXA (
VDATA_INICIO DATE,
VDATA_FINAL DATE,
vID_Filial varchar(10),
vID_Historico varchar(10)
)
RETURNS (
R_ANT_DINHEIRO NUMERIC(18,2),
D_ANT_DINHEIRO NUMERIC(18,2),
R_DIA_DINHEIRO NUMERIC(18,2),
D_DIA_DINHEIRO NUMERIC(18,2),
R_ANT_CHEQUE NUMERIC(18,2),
D_ANT_CHEQUE NUMERIC(18,2),
R_DIA_CHEQUE NUMERIC(18,2),
D_DIA_CHEQUE NUMERIC(18,2),
R_ANT_CARTAO NUMERIC(18,2),
D_ANT_CARTAO NUMERIC(18,2),
R_DIA_CARTAO NUMERIC(18,2),
D_DIA_CARTAO NUMERIC(18,2))
AS
DECLARE VARIABLE VR_ANT_DINHEIRO NUMERIC(18,2);
DECLARE VARIABLE VD_ANT_DINHEIRO NUMERIC(18,2);
DECLARE VARIABLE VR_DIA_DINHEIRO NUMERIC(18,2);
DECLARE VARIABLE VD_DIA_DINHEIRO NUMERIC(18,2);
DECLARE VARIABLE VR_ANT_CHEQUE NUMERIC(18,2);
DECLARE VARIABLE VD_ANT_CHEQUE NUMERIC(18,2);
DECLARE VARIABLE VR_DIA_CHEQUE NUMERIC(18,2);
DECLARE VARIABLE VD_DIA_CHEQUE NUMERIC(18,2);
DECLARE VARIABLE VR_ANT_CARTAO NUMERIC(18,2);
DECLARE VARIABLE VD_ANT_CARTAO NUMERIC(18,2);
DECLARE VARIABLE VR_DIA_CARTAO NUMERIC(18,2);
DECLARE VARIABLE VD_DIA_CARTAO NUMERIC(18,2);
BEGIN
select
--DINHEIRO
sum((case when nat = ´C´ and Conta = ´DINHEIRO´ then (Valor) end)),
sum((case when nat = ´D´ and Conta = ´DINHEIRO´ then (Valor) end)),
--CHEQUE
sum((case when nat = ´C´ and Conta = ´CHEQUE´ then (Valor) end)),
sum((case when nat = ´D´ and Conta = ´CHEQUE´ then (Valor) end)),
--CARTAO
sum((case when nat = ´C´ and Conta = ´CARTAO´ then (Valor) end)),
sum((case when nat = ´D´ and Conta = ´CARTAO´ then (Valor) end))

from
caixa
where
(Data < :vData_Inicio)
and
(ID_Historico like :vID_historico)
and
(ID_Loja like :vid_filial)
into :vR_Ant_Dinheiro,
:vD_Ant_Dinheiro,

:vR_Ant_CHEQUE,
:vD_Ant_CHEQUE,

:vR_Ant_CARTAO,
:vD_Ant_CARTAO;

if (:vR_Ant_Dinheiro is null) then vR_Ant_Dinheiro = 0.00;
if (:vD_Ant_Dinheiro is null) then vD_Ant_Dinheiro = 0.00;

if (:vR_Ant_CHEQUE is null) then vR_Ant_CHEQUE = 0.00;
if (:vD_Ant_CHEQUE is null) then vD_Ant_CHEQUE = 0.00;

if (:vR_Ant_CARTAO is null) then vR_Ant_CARTAO = 0.00;
if (:vD_Ant_CARTAO is null) then vD_Ant_CARTAO = 0.00;

R_Ant_Dinheiro = vR_Ant_Dinheiro;
D_Ant_Dinheiro = vD_Ant_Dinheiro;

R_Ant_CHEQUE = vR_Ant_CHEQUE;
D_Ant_CHEQUE = vD_Ant_CHEQUE;

R_Ant_CARTAO = vR_Ant_CARTAO;
D_Ant_CARTAO = vD_Ant_CARTAO;

select
--DINHEIRO
sum((case when nat = ´C´ and Conta = ´DINHEIRO´ then (Valor) end)),
sum((case when nat = ´D´ and Conta = ´DINHEIRO´ then (Valor) end)),
--CHEQUE
sum((case when nat = ´C´ and Conta = ´CHEQUE´ then (Valor) end)),
sum((case when nat = ´D´ and Conta = ´CHEQUE´ then (Valor) end)),
--CARTAO
sum((case when nat = ´C´ and Conta = ´CARTAO´ then (Valor) end)),
sum((case when nat = ´D´ and Conta = ´CARTAO´ then (Valor) end))

from
caixa
where
(Data between :vData_Inicio and :vDATA_FINAL)
and
(ID_Historico like :vid_historico)
and
(ID_Loja like :vid_filial)
into :vR_DIA_DINHEIRO,
:vD_DIA_DINHEIRO,

:vR_DIA_CHEQUE,
:vD_DIA_CHEQUE,

:vR_DIA_CARTAO,
:vD_DIA_CARTAO;

if (:vR_DIA_DINHEIRO is null) then vR_DIA_DINHEIRO = 0.00;
if (:vD_DIA_DINHEIRO is null) then vD_DIA_DINHEIRO = 0.00;

if (:vR_DIA_CHEQUE is null) then vR_DIA_CHEQUE = 0.00;
if (:vD_DIA_CHEQUE is null) then vD_DIA_CHEQUE = 0.00;

if (:vR_DIA_CARTAO is null) then vR_DIA_CARTAO = 0.00;
if (:vD_DIA_CARTAO is null) then vD_DIA_CARTAO = 0.00;

R_DIA_DINHEIRO = vR_DIA_DINHEIRO;
D_DIA_DINHEIRO = vD_DIA_DINHEIRO;

R_DIA_CHEQUE = vR_DIA_CHEQUE;
D_DIA_CHEQUE = vD_DIA_CHEQUE;

R_DIA_CARTAO = vR_DIA_CARTAO;
D_DIA_CARTAO = vD_DIA_CARTAO;

suspend;
end


GOSTEI 0
POSTAR