Pular para o conteúdo
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #88524
    LeloStyle
    Participante

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

      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 Insere dados com Status 13, senão atualiza
      IF V_EXISTE = 0 THEN

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

      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
      BEGIN

      UPDATE 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:

      BEGIN

      SELECT 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 THEN

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

      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,
      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
      BEGIN

      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;

      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 THEN

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

      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
      BEGIN

      UPDATE 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

      #88538
      Rodrigo Mesquita
      Participante

        Lelo,

        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;

        #88559
        LeloStyle
        Participante

          Rodrigooo, valew cara conseguiii resolver !!!
          Mas de qualquer maneira muito obrigadooo.

          Abraço

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.