GARANTIR DESCONTO

Fórum Procedure só funciona de vez em quando ! #59063

07/11/2007

0

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 :

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

Cabelo

Responder

Posts

23/11/2007

Cabelo

Sobe...


Responder

Gostei + 0

21/02/2008

Cabelo

sobe de novo...

Pessoal ajuda aê...


Responder

Gostei + 0

27/02/2008

Emerson Nascimento

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.


Responder

Gostei + 0

29/02/2008

Cabelo

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...

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..


Responder

Gostei + 0

29/02/2008

Emerson Nascimento

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.


Responder

Gostei + 0

03/03/2008

Cabelo

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...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar