locked
Loop RRS feed

  • Pergunta

  • pessoal,

    preciso fazer um loop na tabela pai passando o ID dessa tabela para uma tabela filho.

    se puderem ajudar, agradeço.

    quinta-feira, 22 de março de 2012 13:01

Respostas

  • Se as task´s anteriores atualizarem as datas com algum valor, vc está correto: não precisará negar os registros, mas faça uns testes antes em tabelas de homologação.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    • Marcado como Resposta Bruno.Costa sexta-feira, 23 de março de 2012 20:07
    sexta-feira, 23 de março de 2012 19:33

Todas as Respostas

  • Bruno, vc precisa fazer isto no SSIS? Se sim, porque precisa fazer um looping? Não é melhor fazer um simples select com o critério desejado?

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quinta-feira, 22 de março de 2012 14:29
  • Eduardo,

    Veja:

    Loop na tabela [ A ] 
      - Sending ID Table [A]
      - Envia ID tabela [ A ]
      - Tabela [B] recebe ID da tabela [A]

     

    quinta-feira, 22 de março de 2012 15:38
  • Vc precisa inserir os ID´s da tabela A na tabela B?


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quinta-feira, 22 de março de 2012 16:02
  • Sim.

    Tabela A: Tabela de Processos.

    Tabela B: Tabela de Andamentos.

    Preciso mandar o IDProcesso para Andamentos.
    Onde dentro de Andamentos, possível DataFlow já tenho algumas condições...

    Pendente apenas o "envio" do IDProcesso para Andamentos.

    []s

    quinta-feira, 22 de março de 2012 16:09
  • Bruno,

    Mas não consigo inicialmente entender porque você precisa fazer um loop?

    Existe algum relacionamento entre estas duas tables?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 22 de março de 2012 16:28
    Moderador
  • Junior,

    Existe!

    Um processo pode ter N Andamentos.

    Desses Andamentos preciso "separar" por tipo de andamento especifico, guardando o IDProcesso.
    Tô tentando algo assim:

    http://www.codeproject.com/Articles/14341/Using-the-Foreach-ADO-Enumerator-in-SSIS

    []s

    quinta-feira, 22 de março de 2012 16:43
  • Pessoal,

    Não conseguir deixar a variavel com outro tipo a não ser o tipo OBJECT.

    Daí eu não consigo imprimir esse valor com o Script Task.

    Como faço isso?

    []s

    quinta-feira, 22 de março de 2012 17:42
  • Bruno, vá no menu SSIS --> Variables... aparecerá uma guia (geralmente no seu lado esquedo do BIDS) na coluna Data Type mude o tipo de dados da variavel global.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quinta-feira, 22 de março de 2012 17:50
  • Eduardo,

    Veja que no loop do exemplo a variavel está com o tipo STRING.

    Pra mim, o pacote só funciona se deixar a variavel do loop com o tipo object.

    Não sei como faço para deixar como "string". Na verdade o tipo deveria ser INT...

    quinta-feira, 22 de março de 2012 17:58
  • Veja o erro...

    PackageStart,61-29007,bruno.costa,VerificaAndamentosProcessos,{CA2688E2-8388-4BBB-BDA2-2851604F208D},{A7BFB6D3-B725-4508-A04E-46525201EDFD},22/03/2012 15:00:09,22/03/2012 15:00:09,0,0x,Beginning of package execution.

    OnError,61-29007,bruno.costa,VerificaAndamentosProcessos,{CA2688E2-8388-4BBB-BDA2-2851604F208D},{A7BFB6D3-B725-4508-A04E-46525201EDFD},22/03/2012 15:00:09,22/03/2012 15:00:09,-1073614839,0x,The type of the value being assigned to variable "User::ValorProcesso" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.

    OnError,61-29007,bruno.costa,Foreach Loop Container 1,{24E66385-493C-4792-B69E-3928FC168ED7},{A7BFB6D3-B725-4508-A04E-46525201EDFD},22/03/2012 15:00:09,22/03/2012 15:00:09,-1073627118,0x,ForEach Variable Mapping number 1 to variable "User::ValorProcesso" cannot be applied.

    OnError,61-29007,bruno.costa,VerificaAndamentosProcessos,{CA2688E2-8388-4BBB-BDA2-2851604F208D},{A7BFB6D3-B725-4508-A04E-46525201EDFD},22/03/2012 15:00:09,22/03/2012 15:00:09,-1073627118,0x,ForEach Variable Mapping number 1 to variable "User::ValorProcesso" cannot be applied.

    OnWarning,61-29007,bruno.costa,VerificaAndamentosProcessos,{CA2688E2-8388-4BBB-BDA2-2851604F208D},{A7BFB6D3-B725-4508-A04E-46525201EDFD},22/03/2012 15:00:09,22/03/2012 15:00:09,-2147381246,0x,SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (4) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.

    PackageEnd,61-29007,bruno.costa,VerificaAndamentosProcessos,{CA2688E2-8388-4BBB-BDA2-2851604F208D},{A7BFB6D3-B725-4508-A04E-46525201EDFD},22/03/2012 15:00:09,22/03/2012 15:00:09,1,0x,End of package execution.

    ===

    Nisso não consigo imprimir o valor de cada ValorProcesso... :(


    • Editado Bruno.Costa quinta-feira, 22 de março de 2012 18:17
    quinta-feira, 22 de março de 2012 18:00
  • quinta-feira, 22 de março de 2012 18:40
  • Com ajuda de um amigo aqui do trabalho consegui "caminhar" no pacote..

    Vejam:


    Na condição "diferente de 333 e 208 "

    preciso atualizar o campo DATA com a data do primeiro registro.
    nesse caso, ele atualiza a data com o valor do último registros de todos os 63.

    Como faço isso?

    []s


    • Editado Bruno.Costa quinta-feira, 22 de março de 2012 20:11
    quinta-feira, 22 de março de 2012 20:09
  • Qual o critério para saber quem é o primeiro registro??


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quinta-feira, 22 de março de 2012 20:12
  • O primeiro registro será selecionado pela condição:

    - Se não tem registro 208 e 333, seleciona o primeiro registro.

    Já nesse caso, pode ver que tenho o registro 333.
    Tenho que fazer uma condição verificando se existe o 333 para selecionar o primeiro registro.

    []s


     
    • Editado Bruno.Costa quinta-feira, 22 de março de 2012 20:16
    quinta-feira, 22 de março de 2012 20:14
  • fiz umas buscas na internet..

    não achei resposta para essa pergunta:

    como faço para "parar" um processo se determinado processo já foi executado?

    []s

    sexta-feira, 23 de março de 2012 12:31
  • O processo que vc fala é uma task? Mas a sua task sempre vai rodar certo?

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    sexta-feira, 23 de março de 2012 14:52
  • sim..desculpe pela semelhança das palavras..

    o processo é sim uma task.

    o que quero...quando o registro 333 for encontrado, não execute a condição do registro diferente de 333 e 208.

    sexta-feira, 23 de março de 2012 15:32
  • Seu banco de origem é sql server?

    Conhece funções de "janela"?

    veja um exemplo de uso.

    usando a tabela abaixo

    id

    tipo andamento

    data

    1

    208

    27/07/2007

    2

    333

    29/07/2007

    3

    111

    15/08/2007

    4

    333

    02/09/2007

    5

    222

    02/09/2007

    6

    999

    10/11/2007

    e executando o sql abaixo

    select t.*, 
    min(t.data) OVER() AS PrimeiraData
    from Table_1 t

    o resultado é: 

    id

    tipo

    data

    PrimeiraData

    1

    208

    27/07/2007

    27/07/2007

    2

    333

    29/07/2007

    27/07/2007

    3

    111

    15/08/2007

    27/07/2007

    4

    333

    02/09/2007

    27/07/2007

    5

    222

    02/09/2007

    27/07/2007

    6

    999

    10/11/2007

    27/07/2007

    Dessa forma voce consegue colocar a primeira data do lado e mais tarde pode fazer a troca de uma pela outra.

    sexta-feira, 23 de março de 2012 16:11
  • vejam como ficou a situação.

    dessa forma, o segundo SQLTask será executado, carregando apenas os registros que tenham a DATA de ANDAMENTO em branco.
    basicamente, dividi o processo em 3 condições "separadas", pois não pensei na questão de selecionar a DATA de ANDAMENTO. Tendo ela o valor NULL, será selecionada, do contrário não..

    agradeço a todos que responderam!

    sexta-feira, 23 de março de 2012 17:13
  • Pq vc nao coloca no ultimo criterio... not in (208,333) ?? assim vc nao precisa "parar" a task.

    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    sexta-feira, 23 de março de 2012 19:04
  • eduardo veja a imagem acima.

    diga-me a sua análise..

    pois como disse, não tinha pensado na condição da DATA do ANDAMENTO igual a NULL

    []s

    sexta-feira, 23 de março de 2012 19:07
  • Bruno, as 3 regras nao se interseccionam. Use na última condição Data andamento is null and registro not in (208,333) e irá funcionar...

    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    sexta-feira, 23 de março de 2012 19:11
  • Eduardo,

    O not in ( 208 , 333 ) não é necessário.

    Pois quando o fluxo chegar nessa condição, terá apenas as datas is null, ou seja, as preenchidas já são iguais a 208 ou 333.

    certo?

    []s


    • Editado Bruno.Costa sexta-feira, 23 de março de 2012 19:28
    sexta-feira, 23 de março de 2012 19:28
  • Se as task´s anteriores atualizarem as datas com algum valor, vc está correto: não precisará negar os registros, mas faça uns testes antes em tabelas de homologação.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    • Marcado como Resposta Bruno.Costa sexta-feira, 23 de março de 2012 20:07
    sexta-feira, 23 de março de 2012 19:33
  • Eduardo,

    Obrigado por responder.

    []s
    • Editado Bruno.Costa sexta-feira, 23 de março de 2012 20:07
    sexta-feira, 23 de março de 2012 20:07