Inquiridor
manipulação de data com loop

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: BIMESTRALData Registro Atual: 04/03/2014Data Registro 1: 04/05/2014Data Registro 2: 04/07/2014Data Registro 3: 04/09/2014Data Registro 4: 04/11/2014Data Registro 5: 04/01/2015Data Registro 6: 04/03/2015Eu 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.
Todas as Respostas
-
-
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 -
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. */
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 11 de março de 2014 13:41
-