- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por
LeloStyle.
-
AutorPosts
-
4 de agosto de 2009 às 6:15 pm #88524
LeloStyle
ParticipanteBom dia pessoal,
Como já devem ter visto algumas postagens minhas, sou novato em plsql, alterei a rotina que pede para ser feita, ela ta compilando legal, queria saber se tem uma maneira de diminuir esse código para fazer as mesma coisa.
Situação atual:
Atualmente regra verifica somente se existe status 13 para proposta/Cotação se existir status atualiza funcionário e data corrente.BEGINSELECT COUNT(1)
INTO V_EXISTE
FROM PEDIDO_STATUS_HISTORICO_SITUA
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO
AND CD_COTACAO_STATUS = 13;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;
END;
-- Se existe Insere dados com Status 13, senão atualiza
IF V_EXISTE = 0 THENBEGIN
SELECT NVL(MAX(CD_SEQUENCIA),0) + 1
INTO V_CD_SEQUENCIA
FROM PEDIDO_STATUS_HISTORICO_SITUA
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao ler a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro: '||SQLERRM);END;
-- INSERE SE NÃO EXISTE
BEGININSERT INTO PEDIDO_STATUS_HISTORICO_SITUA (CD_PEDIDO_COTACAO,
CD_FUNCIONARIO,
CD_COTACAO_STATUS,
CD_SEQUENCIA,
DS_OBSERVACAO,
DT_HISTORICO_COTACAO,
NM_USUARIO,
DT_ATUALIZACAO,
DT_SOLICITACAO_COTACAO)
VALUES (:PEITRIN.CD_PEDIDO_COTACAO,
V_CD_FUNCIONARIO,
13,
V_CD_SEQUENCIA,
NULL,
DATA_CORRENTE,
USER,
DATA_CORRENTE,
NULL);EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;
END;ELSE
BEGINUPDATE PEDIDO_STATUS_HISTORICO_SITUA
SET CD_FUNCIONARIO = V_CD_FUNCIONARIO,
NM_USUARIO = USER,
DT_ATUALIZACAO = DATA_CORRENTE
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO
AND CD_COTACAO_STATUS = 13;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;END;
END IF;
Situação Proposta:
Se Status 56 da proposta/Cotação for o último então:
Incluir Status:
21 – EM EMISSÃO – GERÊNCIA EMPRESARIAL
13 – AGUARDANDO RELATÓRIO DE INSPEÇÃO / VISTORIA
Se status não for 56 regra permanece como é hoje, ou seja como descrito no item situação atual.Ai montei assim:
BEGINSELECT COUNT(1)
INTO V_EXISTE
FROM PEDIDO_STATUS_HISTORICO_SITUA
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO
AND CD_COTACAO_STATUS = 56;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;
END;
-- Se Status for 56, insere status 21 e 13, senão insere status 13
IF V_EXISTE = 0 THENBEGIN
SELECT NVL(MAX(CD_SEQUENCIA),0) + 1
INTO V_CD_SEQUENCIA
FROM PEDIDO_STATUS_HISTORICO_SITUA
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao ler a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro: '||SQLERRM);END;
--INSERE SE EXITIR STATUS 56
BEGININSERT INTO PEDIDO_STATUS_HISTORICO_SITUA (CD_PEDIDO_COTACAO,
CD_FUNCIONARIO,
CD_COTACAO_STATUS,
CD_SEQUENCIA,
DS_OBSERVACAO,
DT_HISTORICO_COTACAO,
NM_USUARIO,
DT_ATUALIZACAO,
DT_SOLICITACAO_COTACAO)
VALUES (:PEITRIN.CD_PEDIDO_COTACAO,
V_CD_FUNCIONARIO,
21,
V_CD_SEQUENCIA,
NULL,
DATA_CORRENTE,
USER,
DATA_CORRENTE,
NULL);V_CD_SEQUENCIA := V_CD_SEQUENCIA + 1;
INSERT INTO PEDIDO_STATUS_HISTORICO_SITUA (CD_PEDIDO_COTACAO,
CD_FUNCIONARIO,
CD_COTACAO_STATUS,
CD_SEQUENCIA,
DS_OBSERVACAO,
DT_HISTORICO_COTACAO,
NM_USUARIO,
DT_ATUALIZACAO,
DT_SOLICITACAO_COTACAO)
VALUES (:PEITRIN.CD_PEDIDO_COTACAO,
V_CD_FUNCIONARIO,
13,
V_CD_SEQUENCIA,
NULL,
DATA_CORRENTE,
USER,
DATA_CORRENTE,
NULL);EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;
END;ELSE
-- INSERE SE NÃO EXISTE
BEGININSERT INTO PEDIDO_STATUS_HISTORICO_SITUA (CD_PEDIDO_COTACAO,
CD_FUNCIONARIO,
CD_COTACAO_STATUS,
CD_SEQUENCIA,
DS_OBSERVACAO,
DT_HISTORICO_COTACAO,
NM_USUARIO,
DT_ATUALIZACAO,
DT_SOLICITACAO_COTACAO)
VALUES (:PEITRIN.CD_PEDIDO_COTACAO,
V_CD_FUNCIONARIO,
13,
V_CD_SEQUENCIA,
NULL,
DATA_CORRENTE,
USER,
DATA_CORRENTE,
NULL);EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;END;
END IF;
BEGIN
SELECT COUNT(1)
INTO V_EXISTE
FROM PEDIDO_STATUS_HISTORICO_SITUA
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO
AND CD_COTACAO_STATUS = 13;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;
END;
-- Se existe dados na tabela Atualiza, senão Insere dados com Status 13
IF V_EXISTE = 0 THENBEGIN
SELECT NVL(MAX(CD_SEQUENCIA),0) + 1
INTO V_CD_SEQUENCIA
FROM PEDIDO_STATUS_HISTORICO_SITUA
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao ler a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro: '||SQLERRM);END;
-- INSERE SE NÃO EXISTE
BEGININSERT INTO PEDIDO_STATUS_HISTORICO_SITUA (CD_PEDIDO_COTACAO,
CD_FUNCIONARIO,
CD_COTACAO_STATUS,
CD_SEQUENCIA,
DS_OBSERVACAO,
DT_HISTORICO_COTACAO,
NM_USUARIO,
DT_ATUALIZACAO,
DT_SOLICITACAO_COTACAO)
VALUES (:PEITRIN.CD_PEDIDO_COTACAO,
V_CD_FUNCIONARIO,
13,
V_CD_SEQUENCIA,
NULL,
DATA_CORRENTE,
USER,
DATA_CORRENTE,
NULL);EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;
END;ELSE
BEGINUPDATE PEDIDO_STATUS_HISTORICO_SITUA
SET CD_FUNCIONARIO = V_CD_FUNCIONARIO,
NM_USUARIO = USER,
DT_ATUALIZACAO = DATA_CORRENTE
WHERE CD_PEDIDO_COTACAO = :PEITRIN.CD_PEDIDO_COTACAO
AND CD_COTACAO_STATUS = 13;EXCEPTION
WHEN OTHERS THEN
MENSAGEM('Erro ao atualizar a tabela PEDIDO_STATUS_HISTORICO_SITUA. Erro : '||SQLERRM);
RAISE FORM_TRIGGER_FAILURE;END;
END IF;
Se puderem me ajudar em relação a performance e tbm a diminuição do código.
Gratooo
4 de agosto de 2009 às 9:43 pm #88538Rodrigo Mesquita
ParticipanteLelo,
Vc pode simplificar um pouco.
begin
/* coloque aqui o Update */
Update ….
If Sql%Notfound Then — verifica se o update foi feito
/* se não pega a proxima sequencia e faz o insert */
select max…
Insert Into …
End If;
end;5 de agosto de 2009 às 3:50 am #88559LeloStyle
ParticipanteRodrigooo, valew cara conseguiii resolver !!!
Mas de qualquer maneira muito obrigadooo.Abraço
-
AutorPosts
- Você deve fazer login para responder a este tópico.