none
manipulação de data com loop RRS feed

  • Pergunta

  • Como seria a melhor maneira para resolver essa questão?
    Tenho uma trigger que tem a seguinte regra. Logo depois do insert, verifico qual é o tipo de agendamento podendo ser (anual, mensal e etc).
    Nesse caso, se ele for anual eu apenas crio mais um registro com algumas informações do primeiro insert e mudo a data para um ano a mais. Nesse caso se fosse criar um hoje, o próximo teria a seguinte data 04/03/2015.
    Meu maior problema está sendo para tratar essas datas para os outros tipos, por exemplo. Se tenho um bimestral, terei que criar mais 6 inserts porque a data de vigência é de um ano. Logo, o primeiro vai ser pelo o usuário e os outros será da trigger. Ai, preciso que eles tenham essas datas pegando a partir do primeiro que foi inserido.
    Ex.:
    Tipo Agendamento: BIMESTRAL
    Data Registro Atual: 04/03/2014
    Data Registro 1: 04/05/2014
    Data Registro 2: 04/07/2014
    Data Registro 3: 04/09/2014
    Data Registro 4: 04/11/2014
    Data Registro 5: 04/01/2015
    Data Registro 6: 04/03/2015
    Eu coloquei em um loop utilizando o DATEADD e somente a data que não veio correta. Ela repetiu para os 6 registros a data 04/05/2014.
    terça-feira, 4 de março de 2014 22:16

Todas as Respostas

  • Deleted
    terça-feira, 4 de março de 2014 22:26
  • José, Essa é minha trigger

    ALTER TRIGGER tg_Ordem_Agendamento
    ON TB_ORDEM_SERVICO
    AFTER INSERT
    AS
    BEGIN

        DECLARE @COD_TIPO_AGENDAMENTO INT,
                @CONTADOR       INT,
                @COD_CHAMADO VARCHAR(10),
                @DATA_INICIAL DATETIME

        SELECT @COD_TIPO_AGENDAMENTO = COD_TIPO_AGENDAMENTO FROM INSERTED

        SET @CONTADOR = 1

        IF @COD_TIPO_AGENDAMENTO = '1' --ANUAL
        BEGIN         
            WHILE (@CONTADOR <= 1)
            BEGIN
                SET @COD_CHAMADO = (SELECT ISNULL(MAX(COD_ORDEM_SERVICO),'0')+1 FROM TB_ORDEM_SERVICO)
                SET @CONTADOR = @CONTADOR+1
                INSERT INTO TB_ORDEM_SERVICO(COD_CHAMADO,COD_USUARIO, COD_SUBSISTEMA, COD_CLIENTE, COD_TIPO_AGENDAMENTO, TIPO_ORDEM_SERVICO, EQUIPAMENTO, DATA_INICIO, DATA_FIM, ENDERECO,
                    CIDADE, BAIRRO, TELEFONE, DESCRICAO_ATIVIDADE, OBSERVACAO, STATUS_ORDEM_SERVICO, DATA_CRIACAO, DELETADO)
                SELECT LEFT(COD_CHAMADO,3)+@COD_CHAMADO,COD_USUARIO, COD_SUBSISTEMA,COD_CLIENTE,COD_TIPO_AGENDAMENTO,TIPO_ORDEM_SERVICO,EQUIPAMENTO,DATEADD(YEAR,1,GETDATE()),DATA_FIM,ENDERECO,CIDADE,BAIRRO,TELEFONE,DESCRICAO_ATIVIDADE,'','A',GETDATE(),''
                FROM INSERTED
            END

        END
        ELSE IF @COD_TIPO_AGENDAMENTO = '5' --BIMESTRAL
        BEGIN
            WHILE (@CONTADOR <= 6)
            BEGIN
                SET @COD_CHAMADO = (SELECT ISNULL(MAX(COD_ORDEM_SERVICO),'0')+1 FROM TB_ORDEM_SERVICO)
                SET @CONTADOR = @CONTADOR+1
                INSERT INTO TB_ORDEM_SERVICO(COD_CHAMADO,COD_USUARIO, COD_SUBSISTEMA, COD_CLIENTE, COD_TIPO_AGENDAMENTO, TIPO_ORDEM_SERVICO, EQUIPAMENTO, DATA_INICIO, DATA_FIM, ENDERECO,
                    CIDADE, BAIRRO, TELEFONE, DESCRICAO_ATIVIDADE, OBSERVACAO, STATUS_ORDEM_SERVICO, DATA_CRIACAO, DELETADO)
                SELECT LEFT(COD_CHAMADO,3)+@COD_CHAMADO,COD_USUARIO, COD_SUBSISTEMA,COD_CLIENTE,COD_TIPO_AGENDAMENTO,TIPO_ORDEM_SERVICO,EQUIPAMENTO,DATEADD(MONTH,2,GETDATE()),DATA_FIM,ENDERECO,CIDADE,BAIRRO,TELEFONE,DESCRICAO_ATIVIDADE,'','A',GETDATE(),''
                FROM INSERTED
            END
        END

    END

        
    terça-feira, 4 de março de 2014 22:41
  • Daniel,

    O problema é que você está usando o DATEADD baseado na INSERTED, que é igual ao valor que o usuário colocou originalmente, por isso o valor está sendo replicado.

    Você precisa rever esse teu INSERT.

    E muito cuidado com a atribuição de variáveis em um select como o que você fez.

    Se você estiver inserindo vários registros, com o campo COD_TIPO_AGENDAMENTO diferentes, a variável vai receber um valor esperado e a inserção pode dar errado.... IMHO, triggers são um perigo para esse tipo de ação.

    Espero ter ajudado.

    []'s!


    /* Logan Destefani Merazzi - http://www.merazzi.eti.br Se a resposta for útil, por favor, não esqueça de marcá-la como resposta. */

    quinta-feira, 6 de março de 2014 14:34
  • Deleted
    sexta-feira, 7 de março de 2014 14:37