condição selecionavel numa stored procedure
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
[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
Curtidas 0
Respostas
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
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:
e mude sua instrução para:
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.
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
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
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)
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
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
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
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