Fórum Ajuda com strore procedure 2 #383173
09/08/2010
0
tenho uma lista de logins que passo como string (separando-as por ,(virgula) para essa store procedure.
Como poderia lista todos os compromissos da lista de logins passada por parâmetro.
Login := 'carlos,pedro,maria' -> desejo, no SQL que esta dentro de uma store procedude listar todos os compromissos desses logins?
SELECT
C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM
FROM
COMPROMISSO C
LEFT JOIN PESSOA_COMPROMISSO PC ON
PC.ID_COMPROMISSO = C.IDENTIFICADOR
LEFT JOIN PESSOAFISICA PF ON
PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.ID_TIPOPESSOA = 0
LEFT JOIN PESSOAJURIDICA PJ ON
PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.ID_TIPOPESSOA = 1
LEFT JOIN CONTATO_PJ C_PJ ON
C_PJ.IDENTIFICADOR = PJ.IDENTIFICADOR WHERE C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.LOGIN in Lista_de_Logins
Como posso resolver isso?
Carlos Phelippe
Curtir tópico
+ 0Posts
09/08/2010
Eriley Barbosa
FOR SELECT
C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM
FROM
COMPROMISSO C
LEFT JOIN PESSOA_COMPROMISSO PC ON
PC.ID_COMPROMISSO = C.IDENTIFICADOR
LEFT JOIN PESSOAFISICA PF ON
PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.ID_TIPOPESSOA = 0
LEFT JOIN PESSOAJURIDICA PJ ON
PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.ID_TIPOPESSOA = 1
LEFT JOIN CONTATO_PJ C_PJ ON
C_PJ.IDENTIFICADOR = PJ.IDENTIFICADOR WHERE C.DATA BETWEEN :DATA_01 AND :DATA_02 AND C.LOGIN in (:Lista_de_Logins)
Atenciosamente Eriley
Gostei + 0
09/08/2010
Carlos Phelippe
Meu problema ocorre que na terei que passar um parâmetro em forma de lista (lista de logins).
E no SQL quebrar essa lista...
C.LOGIN in (:Lista_de_Logins)
Como poderei quebrar essa lista dentro da store procedure?
Gostei + 0
09/08/2010
Eriley Barbosa
Gostei + 0
09/08/2010
Carlos Phelippe
Minha SP esta assim:
FOR SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C LEFT JOIN PESS0A_COMPROMISSO PC ON PC.ID_COMPROMISSO = C.IDENTIFICADOR LEFT JOIN PESSOAFISICA PF ON PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PF LEFT JOIN PESSOAJURIDICA PJ ON PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PJ LEFT JOIN CONTATO_PJ C_PJ ON C_PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ WHERE C.DATA BETWEEN :DATA_01 AND :DATA_02 AND COALESCE(C.TEXTO,'') CONTAINING :TEXTO_ AND COALESCE(PJ.NOME,'')||COALESCE(PF.NOME,'')||COALESCE(C_PJ.NOME,'') CONTAINING :NOME AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN IN (:C_LOGIN) INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM DO
Onde estou errando?
Gostei + 0
09/08/2010
Eriley Barbosa
Gostei + 0
09/08/2010
Carlos Phelippe
ParamByName('LOGIN').AsString := QuotedStr('ASAP'); //Login
Não dá erro nenhum. Apenas não retorna nada.
Gostei + 0
09/08/2010
Carlos Phelippe
Gostei + 0
09/08/2010
Eriley Barbosa
C.LOGIN IN (:C_LOGIN)/* Este é um parametro de entrada */
INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM
DO/* Tudo que está depois do INTO é parametro de saída */ Logo: ParamByName('C_LOGIN').AsString := QuotedStr('ASAP'); //É C_LOGIN que é parametro de entrada e não LOGIN que é parametro de saída. Atenciosamente Eriley
Gostei + 0
09/08/2010
Eriley Barbosa
FOR SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C LEFT JOIN PESS0A_COMPROMISSO PC ON PC.ID_COMPROMISSO = C.IDENTIFICADOR LEFT JOIN PESSOAFISICA PF ON PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PF LEFT JOIN PESSOAJURIDICA PJ ON PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PJ LEFT JOIN CONTATO_PJ C_PJ ON C_PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ WHERE C.DATA BETWEEN :DATA_01 AND :DATA_02 AND COALESCE(C.TEXTO,'') CONTAINING :TEXTO_ AND COALESCE(PJ.NOME,'')||COALESCE(PF.NOME,'')||COALESCE(C_PJ.NOME,'') CONTAINING :NOME AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN IN (:C_LOGIN) INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM DO
Logo você terá um parâmetro chamado C_LOGIN para passar a lista de logins, que deve ser passada assim: ParamByName('C_LOGIN').AsString := QuotedStr('ASAP') + ',' + QuotedStr('ERILEY') + ',' + QuotedStr('CARLOS'); //É C_LOGIN que é parametro de entrada e não LOGIN que é parametro de saída. Atenciosamente Eriley
Gostei + 0
09/08/2010
Carlos Phelippe
FOR SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C LEFT JOIN PESS0A_COMPROMISSO PC ON PC.ID_COMPROMISSO = C.IDENTIFICADOR LEFT JOIN PESSOAFISICA PF ON PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PF LEFT JOIN PESSOAJURIDICA PJ ON PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PJ LEFT JOIN CONTATO_PJ C_PJ ON C_PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ WHERE C.DATA BETWEEN :DATA_01 AND :DATA_02 AND COALESCE(C.TEXTO,'') CONTAINING :TEXTO_ AND COALESCE(PJ.NOME,'')||COALESCE(PF.NOME,'')||COALESCE(C_PJ.NOME,'') CONTAINING :NOME AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN IN (:C_LOGIN) INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM DO
Mas não funciona ainda...
Gostei + 0
09/08/2010
Carlos Phelippe
No IBCONSOLE faço assim e funciona:
select * from retornacompromissos(0, 1, 2, '', '', current_date, current_date, 'ASAP', 0, 1, 2)
Como passar a lista de logins usando o TIBXQuery? Acredito que é aqui que estou errando....
Gostei + 0
09/08/2010
Eriley Barbosa
FOR SELECT C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM FROM COMPROMISSO C LEFT JOIN PESS0A_COMPROMISSO PC ON PC.ID_COMPROMISSO = C.IDENTIFICADOR LEFT JOIN PESSOAFISICA PF ON PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PF LEFT JOIN PESSOAJURIDICA PJ ON PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PJ LEFT JOIN CONTATO_PJ C_PJ ON C_PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ WHERE C.DATA BETWEEN :DATA_01 AND :DATA_02 AND COALESCE(C.TEXTO,'') CONTAINING :TEXTO_ AND COALESCE(PJ.NOME,'')||COALESCE(PF.NOME,'')||COALESCE(C_PJ.NOME,'') CONTAINING :NOME AND C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03) AND C.LOGIN IN (:C_LOGIN) INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM DO
Utilize o componente IBStoredProc, configure as seguintes propriedades: Database = SeuIBDtabase Transaction = SeuIBTransaction StoredProcName = RETORNACOMPROMISSOS Feito isso clique nas reticências ao lado da propriedade Params, veja se os parametros foram adicionados senão vai ter de adicionar e configurar um a um. Para executar: IBStoredProc.ParamByName('DATA_01').asDateTime := IBStoredProc.ParamByName('DATA_02').asDateTime := IBStoredProc.ParamByName('NOME').asString := IBStoredProc.ParamByName('OPCAO_01').asInteger := IBStoredProc.ParamByName('OPCAO_02').asInteger := IBStoredProc.ParamByName('OPCAO_03').asInteger := IBStoredProc.ParamByName('C_LOGIN').asString := IBStoredProc.ExecProc; Atenciosamente Eriley
Gostei + 0
09/08/2010
Emerson Nascimento
para fazer o que você precisa, sugiro condicionar o retorno da stored procedure.
altere a instrução para:
FOR
SELECT
C.IDENTIFICADOR, C.DATA, C.HORA, C.TEXTO, C.OPCAO, C.PUBLICO, C.LOGIN, C.QUEM
FROM
COMPROMISSO C
LEFT JOIN PESS0A_COMPROMISSO PC ON
PC.ID_COMPROMISSO = C.IDENTIFICADOR
LEFT JOIN PESSOAFISICA PF ON
PF.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PF
LEFT JOIN PESSOAJURIDICA PJ ON
PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_PJ
LEFT JOIN CONTATO_PJ C_PJ ON
C_PJ.IDENTIFICADOR = PC.ID_PESSOA AND PC.TIPO_PESSOA = :TIPO_PESSOA_C_PJ
WHERE
C.DATA BETWEEN :DATA_01 AND :DATA_02 AND
COALESCE(C.TEXTO,'') CONTAINING :TEXTO_ AND
COALESCE(PJ.NOME,'')||COALESCE(PF.NOME,'')||COALESCE(C_PJ.NOME,'') CONTAINING :NOME AND
C.OPCAO IN (:OPCAO_01, :OPCAO_02, :OPCAO_03)
INTO :IDENTIFICADOR, :DATA, :HORA, :TEXTO, :OPCAO, :PUBLICO, :LOGIN, :QUEM
DO
note que acima não tem mais o condicional de login. será retornado tudo que atende às condições, independente do login.
daí, você condiciona o retorno da stored procedure, pois ela funciona da mesma forma que uma tabela comum:
select * from retornacompromissos(0, 1, 2, '', '', current_date, current_date, 0, 1, 2) -- não passa mais o login
where login in ('ASAP', 'ADMIN')
fazendo dessa forma, você pode montar a lista de logins em tempo de execução.
var
sSQL, sListaLogin: string;
nLista: word;
begin
// note que não passa mais o login
sSQL := 'select * from retornacompromissos(:param1, :param2, :param3, :param4, :param5, :param6, :param7, :param8, :param9, :param10)'
if lLoginEspecifico then
begin
sListaLogin := '';
for nLista := 0 to lstListaLogin.count-1 do
begin
if sListaLogin <> '' then sListaLogin := sListaLogin + ', ';
sListaLogin := sListaLogin + lstListaLogin.Items[nLista];
end;
sSQL := sSQL + ' where LOGIN in (' + sListaLogin + ')';
end
TIBXQuery.SQL.Text := sSQL;
TIBXQuery.Params()...
TIBXQuery.Open;
end;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)