none
Procedure RRS feed

  • Pergunta

  • Ola , !!!

     

     

    Pessoal , preciso criar uma mecanismo no banco de dados , que é o seguinte

     

    Tenho um arquivo em Excel , onde tenho 3 campos

     

    Cliente , Mes , Ano

     

    Estou levando estas informações para o Banco de dados via "Dts" até ai tudo bem , mas o que preciso fazer é o seguinte.

     

    Cada linha no arquivo contem 1 cliente , Mes , ano . preciso jogar estas informações no banco contando 12 meses a partir do mes e o ano que o usuario colocou na linha.

     

    Como faço isto com um cursor, se for , alguem tem algum exemplo  ??

     

     

    Att,

    Cristiano  

    segunda-feira, 27 de agosto de 2007 14:18

Todas as Respostas

  •  

    Olá Cristiano!!

     

    Vamos ver se entendi corretamente, o seu arquivo tem esses dados:

     

    Nome, Mes, Ano

    "Nome do Cliente", 08, 2007

     

    E precisa incrementar 12 meses?? Mas, sendo assim, basta incrementar 1 no ano. A melhor forma para fazer isso é primeiramente jogar os dados numa tabela intermediária e depois pegar os dados já corrigidos (incrementados no valor necessário) na tabela destino.

     

    Se eu interpretei errado, retorne.

     

     

    Abraço

    segunda-feira, 27 de agosto de 2007 15:05
  • Olá , alexandre !!!

     

    Seria isso mesmo , mas como faço este incremento inserindo em outra tabela ! 

     

    Exemplo

     

    Tabela Enviada pelo usuario 

     

    CLIENTE MÊS ANO
    10 5 2007

     

     

    Tabela tratada pegando os 12 meses a partir do mes e ano que o usuario informou

     

    CLIENTE MÊS ANO
    10 5 2007
    10 6 2007
    10 7 2007
    10 8 2007
    10 9 2007
    10 10 2007
    10 11 2007
    10 12 2007
    10 1 2008
    10 2 2008
    10 3 2008
    10 4 2008
    10 5 2008

     

     

     

    segunda-feira, 27 de agosto de 2007 16:09
  •  

    Cristiano,

     

    Bem que eu achei que tava muito fácil, rs. Eu não tinha entendido. Bom, se essa é uma tarefa executada frequentemente, eu implementaria um função com retorno de tabela, veja:

     

    Code Snippet

    -- Criação da function

    CREATE FUNCTION dbo.fnIncrementarMesAno (@Cliente INT, @Mes INT, @Ano INT)

    RETURNS @t TABLE (Cliente INT, Mes INT, Ano INT)

    AS

    BEGIN

    DECLARE @c int

    SELECT @c = 0

    WHILE @C <= 12

    BEGIN

    INSERT INTO @t VALUES (@Cliente, @Mes, @Ano)

    SELECT @Mes = CASE @Mes WHEN 12 THEN 1 ELSE @mes + 1 END, @Ano = CASE @Mes WHEN 1 THEN @Ano + 1 ELSE @Ano END, @C = @C + 1

    END

    RETURN

    END

     

    -- Retorno de dados

    SELECT * FROM dbo.fnIncrementarMesAno (10, 5, 2007)

     

     

     

    Veja se atende sua necessidade.

     

     

    Abraço

    segunda-feira, 27 de agosto de 2007 16:26
  • Alexandre

     

    Executei da forma que vc me enviou e funciona , mas onde eu uso esta function  ?

     

     

     

    Att,

    Cristiano brito

    segunda-feira, 27 de agosto de 2007 18:46
  •  

    E aí Cristiano,

     

     

    Você pode usar para fazer o insert na tabela que desejar. Por exemplo:

     

    INSERT INTO Tabela (Usuario, Mes, Ano)

    SELECT dbo.fnIncrementarMesAno (@cliente, @mes, @ano)

     

     

    Dessa maneira será feito insert com os dados retornados pela função.

     

     

     

    Abraço

    segunda-feira, 27 de agosto de 2007 19:09
  • Olá , Alexandre 

     

    Não consegui ainda aplicar esta function no meu script

     

    Exemplo :

     

    Tenho uma tabela e não procedure onde tenho os campos

     

    Cliente , Mes , ano - onde tenho varios registros de clientes diferentes.

     

    Como eu faria para usar o select into , tentei com a instrução acima , mas não deu certo !

     

     

    Att,

    Cristiano Brito

     

     

    terça-feira, 28 de agosto de 2007 13:29
  • Alexandre, estou fazendo desta forma

     

    Criei uma tabela de teste chamada "TABELA" p/ inserir os dados

     

    INSERT INTO TABELA (CLIENTE, MES, ANO)
    SELECT dbo.fnIncrementarMesAno (cliente, mes, ano)

     

     

    Retorna este erro !

     

    Server: Msg 120, Level 15, State 1, Line 2
    The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

     

     

    Att,

    Cristiano

     

    terça-feira, 28 de agosto de 2007 13:37
  •  

    Cristiano,

     

    Desculpa, escrevi errado. Faz assim:

     

    Code Snippet

    INSERT INTO TABELA (CLIENTE, MES, ANO)
    SELECT * FROM dbo.fnIncrementarMesAno (cliente, mes, ano)

     

     

     

    Abraço

    terça-feira, 28 de agosto de 2007 13:48
  • Alexandre ,

     

     

    Mas é o seguinte , como faço no script que vc me envio , eu ler uma outra tabela onde recebo as informações  do (Cliente , Mes , Ano) relacionar com a function e inserir na tabela teste ?

     

     

    Att,

    Cristiano

     

     

     

    terça-feira, 28 de agosto de 2007 14:03
  • Alexandre

     

     

    Estou montando o relacionamento desta forma , mas retorna erro

     

    INSERT INTO TABELA (cliente,mes,ano)
    SELECT
    *
    FROM DBO.FNINCREMENTARMESANO (CLIENTE,MES,ANO) , ENVIO_SERRALHEIRO
    WHERE  FNINCREMENTARMESANO.CLIENTE = ENVIO_SERRALHEIRO.CLIENTE AND
     FNINCREMENTARMESANO.MES = MONTH(ENVIO_SERRALHEIRO.DATA_COMECO) AND
     FNINCREMENTARMESANO.ANO = YEAR(ENVIO_SERRALHEIRO.DATA_COMECO)

     

    Erro:

    Server: Msg 155, Level 15, State 1, Line 4
    'CLIENTE' is not a recognized OPTIMIZER LOCK HINTS option.

     

    Att,

    Cristiano

    terça-feira, 28 de agosto de 2007 14:25
  •  

    Cristiano,

     

    Dessa maneira não vai funcionar. Esse tipo de função não aceita receber vários registros como parâmetro. A solução seria modificar completamente a função para que receba apenas o ID do cliente e dentro dela faça um join com essa outra tabela.

     

    Veja se consegue fazer algo nesse sentido, senão retorne.

     

     

    Abraço

    terça-feira, 28 de agosto de 2007 14:45
  • Alexandre ,

     

    Não faço a minima idéia de como fazer isto , se vc puder me ajudar , vc ira quebrar um galhão , rs

     

     

    Abraço,

    Cristiano

     

    terça-feira, 28 de agosto de 2007 14:50
  • Alexandre ,

     

     

    Esta outra tabela , possui apenas 1 registro por cliente , não funcionaria ?

     

    Abraço,

    Cristiano

    terça-feira, 28 de agosto de 2007 14:52
  •  

    Opa,

     

    Veja se te ajuda, acho que é como você precisa:

     

    Code Snippet

    declare @tmp table (id int identity(1,1), cliente int, mes int, ano int)

    declare @c int, -- variável de controle

    @cliente int, @mes int, @ano int

    select @c = 1

    -- popula tabela temporária

    insert into @tmp (cliente, mes, ano)

    select cliente, month(envio_serralheiro.data_comeco), year(envio_serralheiro.data_comeco)

    from envio_serralheiro

    while @c <= (select max (id) from @tmp)

    begin

    -- seleção de dados

    select @cliente = cliente, @mes = mes, @ano = ano from @tmp where id = @c

    -- insert na tabela

    insert into tabela (cliente,mes,ano)

    select cliente, mes, ano from dbo.fnIncrementarMesAno (@cliente, @mes, @ano)

    -- incremento

    select @c = @c + 1

    end

     

     

     

     

    Abraço

    terça-feira, 28 de agosto de 2007 18:39