Ir para conteúdo
Fórum Script Brasil

Marco André

Membros
  • Total de itens

    3
  • Registro em

  • Última visita

Posts postados por Marco André

  1. Olá Fulvio, bom dia.

    Obrigado pela resposta!

    Vou testar sua solução. Para ser realmente bem simples e funcional. Mas só um comentário: a variável @Contator parece não estar sendo utilizada. Era para ter um loop ali?

    Vou deixar também o link de um outro post que crie com outra possível solução. Segue:

    http://www.experts-exchange.com/Microsoft/...Q_26310725.html

    Mais uma vez, obrigado!

    Att,

    Marco André

  2. Olá Pessoal,

    Estou tentando alterar uma tabela de Histórico, onde dada uma nova entrada, a tabela seja recriada (apenas para os registros de mesmo ID). As colunas DataAtivacao e DataDesativacao de todos os registros de mesmo ID deverão sofrer uma "reordenação" em suas datas. Por exemplo: o registro anterior deverá ter a DataDesativacao alterada para "DataAtivacao do registro atual - 1".

    Segue o esquema do banco de dados. Em seguida um exemplo de input/output do resultado esperado e também do que já tentei fazer para a solução do problema.

    Tabela de Histórico:

    CREATE TABLE [dbo].[HistoricoInventario] (
      [HistoricoID] bigint IDENTITY(1, 1) NOT NULL,
      [DispositivoID] int NOT NULL,
      [DataAtivacao] datetime NOT NULL,
      [DataDesativacao] datetime CONSTRAINT [DF__Historico__DataD__66603565] DEFAULT '3000/01/01' NULL,
      CONSTRAINT [HistoricoInventario_pk] PRIMARY KEY CLUSTERED ([HistoricoID], [DispositivoID], [DataAtivacao]),
      CONSTRAINT [HistoricoInventario_uq] UNIQUE ([DispositivoID], [DataAtivacao]),
    )
    ON [PRIMARY]
    GO
    O problema é que tenho que manter atualizado o histórico, ou seja, as datas de ativação e desativação. Até aqui, não há nenhuma problema, a não ser que tenho que manter as datas sempre “fazendo sentido”, digo, quando eu alterar a data de ativação/desativação de um registro, tenho que recriar todos os outros históricos contendo o mesmo DispositivoID em questão, ex.: Tenho o seguinte Histórico, cujo DispositivoID=1:
    ID    DispositivoID   DataAtivacao    DataDesativacao
    1    1        01/01/2010    05/01/2010    
    2    1        06/01/2010    20/01/2010    
    3    1        21/01/2010    22/01/2010
    Se a DataAtivacao do registro com ID=2, for alterada para o dia 08/01/2010 e a DataDesativacao para 22/01/2010 o resultado desta alteração deveria ser o seguinte:
    ID     DispositivoID    DataAtivacao    DataDesativacao
    1    1        01/01/2010    07/01/2010    
    2    1        08/01/2010    22/01/2010    
    3    1        23/01/2010    23/01/2010
    O máximo que consegui fazer, foi alterar a DataAtivacao/DataDesativacao do registro anterior(apenas 1 registro anterior), criando a seguinte trigger na tabela de Historico:
    CREATE PROCEDURE dbo.GetLastDataDesativacao 
      @DispositivoID int, 
      @HistoricoIDAnterior bigint OUTPUT
    AS
    BEGIN
      SET NOCOUNT ON
      
      DECLARE @HistoricoIDAtual BIGINT
      
      DECLARE @DataNew datetime, @DataOld datetime
      
      SELECT @HistoricoIDAtual = MAX(HI.HistoricoID)
      FROM Funcoes.dbo.HistoricoInventario HI
      WHERE HI.DispositivoID=@DispositivoID
      
      SELECT TOP 1 
        @HistoricoIDAnterior = HistoricoID, 
        @DataOld = b.DataDesativacao,
        @DataNew = (SELECT TOP 1 DataDesativacao FROM Funcoes.dbo.HistoricoInventario a WITH(NOLOCK)
                    WHERE a.DispositivoID = b.DispositivoID AND
                    a.DataDesativacao < b.DataDesativacao
                    )
      FROM Funcoes.dbo.HistoricoInventario b WITH(NOLOCK)
      WHERE b.DispositivoID = @DispositivoID AND 
        b.HistoricoID <= 
          (SELECT MAX(HistoricoID) FROM Funcoes.dbo.HistoricoInventario 
           WHERE DispositivoID = @DispositivoID) 
      ORDER BY b.DataDesativacao DESC  
      
      RETURN @HistoricoIDAnterior
    END
    
    CREATE TRIGGER [dbo].[HistoricoInventario_tri] ON [dbo].[HistoricoInventario]
    WITH EXECUTE AS CALLER
    INSTEAD OF INSERT
    AS
    BEGIN
    -- Ao invés de inserir, faça o seguinte:
      DECLARE 
        @id int, 
        @DataAtivacao datetime, 
        @DataDesativacao datetime,
        @UltimaDesativacao datetime,
        @HistoricoIDAtual bigint,
        @HistoricoIDAnterior bigint,
        @DebugData nvarchar(200)
    
      SELECT 
        @id              = I.DispositivoID,
        @DataAtivacao    = I.DataAtivacao,
        @DataDesativacao = I.DataDesativacao
      FROM INSERTED I
      
      --Pega o código do historico
      --Se já existe um historico com o mesmo dispositivo, 
      --então altera a data de desativacao do ultimo registro 
      --para 1 dia antes da data de ativacao do registro sendo inserido
      IF EXISTS (SELECT HC.DispositivoID FROM Funcoes.dbo.HistoricoInventario HC
                 WHERE HC.DispositivoID = @id)
      BEGIN
        -- Atualiza o registro anterior
        -- Altera a data de desativacao do registro anterior
        EXEC Funcoes.dbo.GetLastDataDesativacao @id, @HistoricoIDAnterior OUTPUT
       
        UPDATE Funcoes.dbo.HistoricoInventario SET DataDesativacao = DATEADD(day,-1,@DataAtivacao)
        WHERE DispositivoID = @id 
        AND HistoricoID = @HistoricoIDAnterior
        
        -- Insere o novo registro
        IF @DataDesativacao IS NOT NULL 
          INSERT INTO Funcoes.dbo.HistoricoInventario(DispositivoID,DataAtivacao,DataDesativacao)
          VALUES (@id,@DataAtivacao,@DataDesativacao)
        ELSE
          INSERT INTO Funcoes.dbo.HistoricoInventario(DispositivoID,DataAtivacao)
          VALUES (@id,@DataAtivacao)
      END  
      ELSE
        IF @DataDesativacao IS NOT NULL 
          INSERT INTO Funcoes.dbo.HistoricoInventario(DispositivoID,DataAtivacao,DataDesativacao)
          VALUES (@id,@DataAtivacao,@DataDesativacao )
        ELSE
          INSERT INTO Funcoes.dbo.HistoricoInventario(DispositivoID,DataAtivacao)
          VALUES (@id,@DataAtivacao)
      
      RETURN
    END
    GO

    Este procedimento funciona apenas para o primeiro registro anterior, o que não resolve o problema. A tabela deve ser recriada de acordo com o input.

    Espero ter sido feliz na exposição do problema.

    Qualquer ajuda será de grande valia.

    Muito obrigado,

    Marco André

  3. Olá pessoal,

    Tenho 2 tabelas onde preciso listar apenas registros que sigam os seguintes requisitos:

    1-Registros tem que ter a mesma data, duração e número discado (Calls.Start, Calls.Duration, Calls.PhoneNo)

    2-Registros tem que ter valores diferentes (CallsInfo.Cost)

    É possível este tipo de consulta? Já tentei fazer isso de várias formas, mas não estou conseguindo.

    Segue as tabelas:

    CREATE TABLE [dbo].[Calls] (
      [CallID] bigint IDENTITY(1, 1) NOT NULL,
      [Start] datetime NOT NULL,
      [Duration] int NOT NULL,
      [DeviceID] int NOT NULL,
      [ReferenceID] int NOT NULL,
      [DataSourceID] int NOT NULL,
      [CallTypeID] smallint NOT NULL,
      [PhoneNo] nvarchar(30) COLLATE Latin1_General_CI_AS NULL,
      [OriginalPhoneNo] nvarchar(30) COLLATE Latin1_General_CI_AS NULL,
      [StartTimeInSeconds] int NULL,
      [Ext_DeviceID] int NULL,
      [TransferExt_DeviceID] int NULL,
      [TransferInExt_DeviceID] int NULL,
      [DestExt_DeviceID] int NULL,
      [TrunkID] int NULL,
      [Trunk2ID] int NULL,
      [ContextID] int NULL,
      [ReferenceID2] int NULL,
      [TLRStatus] smallint NULL,
      [TLRDeleted] bit NULL,
      [Deleted] tinyint CONSTRAINT [DF_Calls_Deleted] DEFAULT 0 NULL,
      [Arrived] datetime NULL,
      [MaskDuration] nvarchar(30) COLLATE Latin1_General_CI_AS NULL,
      [MaskPhoneNo] nvarchar(30) COLLATE Latin1_General_CI_AS NULL,
      [SessionID] int NULL,
      CONSTRAINT [Calls_PK] PRIMARY KEY CLUSTERED ([CallID]),
      CONSTRAINT [FK_Calls_CallTypes] FOREIGN KEY ([CallTypeID]) 
      REFERENCES [dbo].[CallTypes] ([CallTypeID]) 
      ON UPDATE NO ACTION
      ON DELETE NO ACTION
    )
    ON [PRIMARY]
    GO
    CREATE TABLE [dbo].[CallsInfo] (
      [CallID] bigint NOT NULL,
      [BP] char(1) COLLATE Latin1_General_CI_AS NULL,
      [CallCategoryID] int NULL,
      [LocationID] int NULL,
      [CityLocationID] int NULL,
      [ServiceID] int NULL,
      [Cost] money NULL,
      [OriginalCost] money NULL,
      [Price] money NULL,
      [ResponseTime] int NULL,
      [ResultCode] smallint NULL,
      [PBXServiceIdentity] bigint NULL,
      [Units] int NULL,
      [QueueTime] int NULL,
      [DataSourceCost] money NULL,
      [DataSourcePrice] money NULL,
      [WasPriced] bit NULL,
      [CountryID] int NULL,
      [RawDataID] int NULL,
      [TlrOriginCallID] int NULL,
      [TlrSequenceNumber] int NULL,
      [CostPlanID] int NULL,
      [MaskLocation] nvarchar(30) COLLATE Latin1_General_CI_AS NULL,
      [CostPrecision] real NULL,
      [PricePrecision] real NULL,
      [DataStatusTypeID] int CONSTRAINT [DF_CallsInfo_DataStatus] DEFAULT 1 NOT NULL,
      [CDRID] bigint NULL,
      [OriginalDuration] int NULL,
      [BHours] bit CONSTRAINT [DF_CallsInfo_BHours] DEFAULT 0 NOT NULL,
      [AccountCodeID] int NULL,
      [Descricao da chamada] nvarchar(40) COLLATE Latin1_General_CI_AS NULL,
      [Cidade de destino] nvarchar(25) COLLATE Latin1_General_CI_AS NULL,
      [Codigo DDD] nvarchar(3) COLLATE Latin1_General_CI_AS NULL,
      [Tipo da chamada] nvarchar(20) COLLATE Latin1_General_CI_AS NULL,
      [Tronco] nvarchar(2) COLLATE Latin1_General_CI_AS NULL,
      [MS DE REFERNCIA] nvarchar(4) COLLATE Latin1_General_CI_AS NULL,
      CONSTRAINT [PK_CallsInfo] PRIMARY KEY CLUSTERED ([CallID]),
      CONSTRAINT [FK_CallsInfo_Calls] FOREIGN KEY ([CallID]) 
      REFERENCES [dbo].[Calls] ([CallID]) 
      ON UPDATE NO ACTION
      ON DELETE NO ACTION
    )
    ON [PRIMARY]
    GO

    Agradeço antecipadamente,

    Muito obrigado,

    []s, Marco

×
×
  • Criar Novo...