Fala galera, estou com a seguinte situacao, e jah quebrei a cuca e nada
rsrsrs ... será que alguem pode me ajudar?

Tenho uma tabela de SERVICOS e uma de ITENS_SERVICOS, preciso exibir apenas
o ultimo item de cada servico.

isso eu faço atravez do SQL:


select C.ID_SERVICO, C.SERVICO,
I.ID_ITEM_SERVICO, I.DESCRICAO_ITEM_SERVICO,
I.DATA_LANCAMENTO
from SERVICOS C,
ITENS_SERVICOS I
where C.ID_SERVICO = I.ID_SERVICO and
I.DATA_LANCAMENTO = (select max(DATA_LANCAMENTO) from ITENS_SERVICOS B where
B.ID_SERVICO = C.ID_SERVICO)

funciona corretamente.

porem eu tenho uma tabela de PESSOAS -> FUNCIONARIOS -> RESPONSAVEIS ->
SERVICOS e preciso saber os responsaveis por cada SERVICO.

isso eu faço atravez do seguinte SQL:

select NOME from PESSOAS
inner join FUNCIONARIOS on FUNCIONARIOS.ID_FUNCIONARIO = PESSOAS.ID_PESSOA
inner join RESPONSAVEIS_SERVICOS on RESPONSAVEIS_SERVICOS.ID_FUNCIONARIO =
FUNCIONARIOS.ID_FUNCIONARIO
where RESPONSAVEIS_SERVICOS.ID_SERVICO = :ID_SERVICO

fuinciona corretamente.

Porem surgiu a necessidade de fazer a exibicao servico, do ultimo_item e
adicionar nessa listagem, um campo com os responsaveis pelo servico
CONCATENADOS em um unico campo. Resolvi utilizar uma procedure para tal.

set term ^ ;

create or alter procedure servicos_itens_responsaveis
returns (
ID_SERVICO integer,
SERVICO varchar(100),
ID_ITEM_SERVICO integer,
DESCRICAO_ITEM_SERVICO varchar(100),
DATA_LANCAMENTO date,
RESPONSAVEIS varchar(100)
)
as
declare variable NOME varchar(100);
begin
for select C.ID_SERVICO, C.SERVICO,
I.ID_ITEM_SERVICO, I.DESCRICAO_ITEM_SERVICO,
I.DATA_LANCAMENTO
from SERVICOS C,
ITENS_SERVICOS I
where C.ID_SERVICO = I.ID_SERVICO and
I.DATA_LANCAMENTO = (select max(DATA_LANCAMENTO) from ITENS_SERVICOS B where
B.ID_SERVICO = C.ID_SERVICO)
into :ID_SERVICO, :SERVICO, :ID_ITEM_SERVICO, :DESCRICAO_ITEM_SERVICO,
:DATA_LANCAMENTO
do
begin
RESPONSAVEIS = '';
for select NOME from PESSOAS
inner join FUNCIONARIOS on FUNCIONARIOS.ID_FUNCIONARIO = PESSOAS.ID_PESSOA
inner join RESPONSAVEIS_SERVICOS on RESPONSAVEIS_SERVICOS.ID_FUNCIONARIO =
FUNCIONARIOS.ID_FUNCIONARIO
where RESPONSAVEIS_SERVICOS.ID_SERVICO = :ID_SERVICO into :NOME
do
begin
RESPONSAVEIS = RESPONSAVEIS || ' - ' || NOME;
end
RESPONSAVEIS = RESPONSAVEIS || ' - ' || :ID_SERVICO;
suspend;
end
end^

set term ; ^

O problema ocorre no parametro :ID_SERVICO, ele tem seu valor exibido
corretamente no retorno do primeiro for select, porem o segundo for select
nao retorna valor nenhum, como se o parametro nao possuisse valor ou se o
valor nao existisse na tabela de responsaveis. O que nao ocorre se eu
substituí-lo por algum valor existente na tabela de SERVICOS.

Digamos que os SERVICO 1, 2 e 3 tenham RESPONSAVEIS associados a eles, mesmo
o primeiro for select retornando os valores 1, 2 e 3 para o :ID_SERVICO, nao
é gerado nenhum registro no segundo for select, porem se eu escrever o valor
1 no lugar de :ID_SERVICO, é retornado corretamente os RESPONSAVEIS pelo
SERVICO 1.

Alguem tem alguma ideia de onde estou fazendo *agada?

Obrigado.


[As partes desta mensagem que não continham texto foram removidas]

Responder a