Procedure só funciona de vez em quando !
Colegas..
tenho uma procedure que só funciona de vez em quando, ela gera um relatório de OS em aberto, e hora sai em branco e hora sai com as OS´s alguém sabe o pq ??
segue a procedure :
este é o select do relatório
Agradeço a todos antecipadamente.
tenho uma procedure que só funciona de vez em quando, ela gera um relatório de OS em aberto, e hora sai em branco e hora sai com as OS´s alguém sabe o pq ??
segue a procedure :
CREATE PROCEDURE CRIA_RELATORIO_OS_EM_ABERTO( I_DATA_PREVISAO DATE) AS DECLARE VARIABLE V_COD_OS CHAR(15); begin V_COD_OS = ´´; execute procedure DELETE_TE0300; for select distinct C_COD_OS from CM0100 where C_DATA_PREVISAO <= :I_DATA_PREVISAO and C_DATA_EXECUCAO is null into :V_COD_OS do begin execute procedure INSERT_TE0300(:V_COD_OS); end end
CREATE PROCEDURE DELETE_TE0300 AS begin delete from TE0300; end
CREATE PROCEDURE INSERT_TE0300( I_COD_OS CHAR(15)) AS begin insert into TE0300(C_COD_OS) values (:I_COD_OS); end
este é o select do relatório
CREATE PROCEDURE SELECT_TE0300( I_ORDER VARCHAR(100)) RETURNS ( C_COD_OS CHAR(15), C_COD_GRUPO_PAT CHAR(15), C_COD_SUB_GRUPO_PAT CHAR(15), C_COD_CONJUNTO CHAR(15), C_COD_INSUMO CHAR(15), C_COD_COLABORADOR CHAR(15), C_DESC_SOLICITACAO VARCHAR(200), C_DESC_GRUPO_PAT VARCHAR(100), C_DESC_SUB_GRUPO_PAT VARCHAR(100), C_DESC_CONJUNTO VARCHAR(100), C_DESC_INSUMO VARCHAR(100), C_NOME_COLABORADOR VARCHAR(150), C_DATA_PREVISAO DATE, C_TIPO_MANUT CHAR(1)) AS begin for select TE0300.C_COD_OS, OS0100.C_COD_GRUPO_PAT, OS0100.C_COD_SUB_GRUPO_PAT, OS0100.C_COD_CONJUNTO, OS0100.C_COD_INSUMO, OS0100.C_COD_COLABORADOR, OS0100.C_DESC_SOLICITACAO, GP0100.C_DESC_GRUPO_PAT, GP0200.C_DESC_SUB_GRUPO_PAT, GP0300.C_DESC_CONJUNTO, CA0500.C_NOME_COLABORADOR, CM0100.C_DATA_PREVISAO, CM0100.C_TIPO_MANUT from TE0300, OS0100, GP0100, GP0200, GP0300, CA0500, CM0100 where TE0300.C_COD_OS = OS0100.C_COD_OS and OS0100.C_COD_GRUPO_PAT = GP0100.C_COD_GRUPO_PAT and OS0100.C_COD_SUB_GRUPO_PAT = GP0200.C_COD_SUB_GRUPO_PAT and GP0100.C_COD_GRUPO_PAT = GP0200.C_COD_GRUPO_PAT and OS0100.C_COD_CONJUNTO = GP0300.C_COD_CONJUNTO and GP0300.C_COD_GRUPO_PAT = GP0100.C_COD_GRUPO_PAT and GP0300.C_COD_SUB_GRUPO_PAT = GP0200.C_COD_SUB_GRUPO_PAT and OS0100.C_COD_COLABORADOR = CA0500.C_COD_COLABORADOR and CM0100.C_COD_OS = OS0100.C_COD_OS order by :I_ORDER into :C_COD_OS, :C_COD_GRUPO_PAT, :C_COD_SUB_GRUPO_PAT, :C_COD_CONJUNTO, :C_COD_INSUMO, :C_COD_COLABORADOR, :C_DESC_SOLICITACAO, :C_DESC_GRUPO_PAT, :C_DESC_SUB_GRUPO_PAT, :C_DESC_CONJUNTO, :C_NOME_COLABORADOR, :C_DATA_PREVISAO, :C_TIPO_MANUT do begin if (C_TIPO_MANUT = ´P´) then select IN0100.C_DESC_INSUMO from IN0100, OS0100 where OS0100.C_COD_INSUMO = IN0100.C_COD_INSUMO and OS0100.C_COD_OS = :C_COD_OS into :C_DESC_INSUMO; suspend; end end
Agradeço a todos antecipadamente.
Cabelo
Curtidas 0
Respostas
Cabelo
07/11/2007
Sobe...
GOSTEI 0
Cabelo
07/11/2007
sobe de novo...
Pessoal ajuda aê...
Pessoal ajuda aê...
GOSTEI 0
Emerson Nascimento
07/11/2007
um dos problemas pode ser em função do momento que a SP CRIA_RELATORIO_OS_EM_ABERTO é executada.
outro problema pode ser por conta de você usar somente [i:f3927c820f]inner joins[/i:f3927c820f] na SP do relatório. de repente alguma das tabelas não contém os dados necessários.
na verdade é muito difícil avaliar esse tipo de problema sem ter acesso à base de dados.
outro problema pode ser por conta de você usar somente [i:f3927c820f]inner joins[/i:f3927c820f] na SP do relatório. de repente alguma das tabelas não contém os dados necessários.
na verdade é muito difícil avaliar esse tipo de problema sem ter acesso à base de dados.
GOSTEI 0
Cabelo
07/11/2007
Emerson..
Muito Obrigado pela ajuda..
Mas o select estava blz, inclusive com os join´s...
Não sei por que cargas d´agua o problema estava na forma de montar a procedure...
O parâmetro :I_ORDER as vezes atrapalhava a procedure, pesquisei em outros fóruns e me disseram que este pode ser um bug do Firebird, onde não é possível utilizar um parâmetro num select a não ser no where, então me falaram para fazer assim :
Funcionou perfeitamente...
Você sabe me dizer se a informação que obtive procede ??
Mais uma vez obrigado pela atenção..
Muito Obrigado pela ajuda..
Mas o select estava blz, inclusive com os join´s...
Não sei por que cargas d´agua o problema estava na forma de montar a procedure...
for select TE0300.C_COD_OS, OS0100.C_COD_GRUPO_PAT, OS0100.C_COD_SUB_GRUPO_PAT, OS0100.C_COD_CONJUNTO, OS0100.C_COD_INSUMO, OS0100.C_COD_COLABORADOR, OS0100.C_DESC_SOLICITACAO, GP0100.C_DESC_GRUPO_PAT, GP0200.C_DESC_SUB_GRUPO_PAT, GP0300.C_DESC_CONJUNTO, CA0500.C_NOME_COLABORADOR, CM0100.C_DATA_PREVISAO, CM0100.C_TIPO_MANUT from TE0300, OS0100, GP0100, GP0200, GP0300, CA0500, CM0100 where TE0300.C_COD_OS = OS0100.C_COD_OS and OS0100.C_COD_GRUPO_PAT = GP0100.C_COD_GRUPO_PAT and OS0100.C_COD_SUB_GRUPO_PAT = GP0200.C_COD_SUB_GRUPO_PAT and GP0100.C_COD_GRUPO_PAT = GP0200.C_COD_GRUPO_PAT and OS0100.C_COD_CONJUNTO = GP0300.C_COD_CONJUNTO and GP0300.C_COD_GRUPO_PAT = GP0100.C_COD_GRUPO_PAT and GP0300.C_COD_SUB_GRUPO_PAT = GP0200.C_COD_SUB_GRUPO_PAT and OS0100.C_COD_COLABORADOR = CA0500.C_COD_COLABORADOR and CM0100.C_COD_OS = OS0100.C_COD_OS order by :I_ORDER into :C_COD_OS, :C_COD_GRUPO_PAT, :C_COD_SUB_GRUPO_PAT, :C_COD_CONJUNTO, :C_COD_INSUMO, :C_COD_COLABORADOR, :C_DESC_SOLICITACAO, :C_DESC_GRUPO_PAT, :C_DESC_SUB_GRUPO_PAT, :C_DESC_CONJUNTO, :C_NOME_COLABORADOR, :C_DATA_PREVISAO, :C_TIPO_MANUT do
O parâmetro :I_ORDER as vezes atrapalhava a procedure, pesquisei em outros fóruns e me disseram que este pode ser um bug do Firebird, onde não é possível utilizar um parâmetro num select a não ser no where, então me falaram para fazer assim :
for EXECUTE STATEMENT ´ select TE0300.C_COD_OS, OS0100.C_COD_GRUPO_PAT, OS0100.C_COD_SUB_GRUPO_PAT, ´|| ´OS0100.C_COD_CONJUNTO, OS0100.C_COD_INSUMO, OS0100.C_COD_COLABORADOR, ´|| ´OS0100.C_DESC_SOLICITACAO, GP0100.C_DESC_GRUPO_PAT, ´|| ´GP0200.C_DESC_SUB_GRUPO_PAT, GP0300.C_DESC_CONJUNTO, ´|| ´CA0500.C_NOME_COLABORADOR, CM0100.C_DATA_PREVISAO, ´|| ´CM0100.C_TIPO_MANUT ´|| ´from TE0300, OS0100, GP0100, GP0200, GP0300, CA0500, CM0100 ´|| ´where TE0300.C_COD_OS = OS0100.C_COD_OS and ´|| ´OS0100.C_COD_GRUPO_PAT = GP0100.C_COD_GRUPO_PAT and ´|| ´OS0100.C_COD_SUB_GRUPO_PAT = GP0200.C_COD_SUB_GRUPO_PAT and ´|| ´GP0100.C_COD_GRUPO_PAT = GP0200.C_COD_GRUPO_PAT and OS0100.C_COD_CONJUNTO = ´|| ´GP0300.C_COD_CONJUNTO and GP0300.C_COD_GRUPO_PAT = GP0100.C_COD_GRUPO_PAT ´|| ´and GP0300.C_COD_SUB_GRUPO_PAT = GP0200.C_COD_SUB_GRUPO_PAT and ´|| ´OS0100.C_COD_COLABORADOR = CA0500.C_COD_COLABORADOR and ´|| ´CM0100.C_COD_OS = OS0100.C_COD_OS ´|| ´order by ´|| :I_ORDER into :C_COD_OS, :C_COD_GRUPO_PAT, :C_COD_SUB_GRUPO_PAT, :C_COD_CONJUNTO, :C_COD_INSUMO, :C_COD_COLABORADOR, :C_DESC_SOLICITACAO, :C_DESC_GRUPO_PAT, :C_DESC_SUB_GRUPO_PAT, :C_DESC_CONJUNTO, :C_NOME_COLABORADOR, :C_DATA_PREVISAO, :C_TIPO_MANUT do
Funcionou perfeitamente...
Você sabe me dizer se a informação que obtive procede ??
Mais uma vez obrigado pela atenção..
GOSTEI 0
Emerson Nascimento
07/11/2007
a informação procede, sim.
eu não havia reparado naquele ORDER BY, mas aquilo deveria dar problema mesmo. só é permitido parâmetros em where, e ainda assim com uma ressalva: não podem ser passados elementos, como aqueles utilizados em cláusulas IN.
a forma como o problema foi solucionado está perfeita. para o seu caso, a solução é mesmo o EXECUTE STATEMENT.
eu não havia reparado naquele ORDER BY, mas aquilo deveria dar problema mesmo. só é permitido parâmetros em where, e ainda assim com uma ressalva: não podem ser passados elementos, como aqueles utilizados em cláusulas IN.
a forma como o problema foi solucionado está perfeita. para o seu caso, a solução é mesmo o EXECUTE STATEMENT.
GOSTEI 0
Cabelo
07/11/2007
Então..
Só fiquei com uma dúvida...
Como não deu erro na compilação da procedure ?
Passou direto.. não deu nenhum erro...
É muito estranho...
Só fiquei com uma dúvida...
Como não deu erro na compilação da procedure ?
Passou direto.. não deu nenhum erro...
É muito estranho...
GOSTEI 0