none
Problema com Container Loop Foreach

    Question

  • Bom dia pessoal.

     

    Estou com um problema estranho no meu pacote SSIS.

    Esse é o Control Flow do meu pacote:

    Explicando:

    - CREATE WORK_PEDIDOS:  eu executo um comando SQL pra deletar e recriar a tabela onde vou jogar os dados (isso depois vai sair, pois vou incluir CRC);

    - LOG_HORA_INICIO: Script C# que cria um .txt e adiciona um pequeno cabeçalho;

    - LOOP FOREACH PEDIDOS: Varre a pasta onde estão vários arquivos Excel que devem ser abertos e importados para o SQL Server;

    - FD_PEDIDOS: Fluxo de Dados que abre o arquivo Excel e insere os dados no SQL Server;

    - LOG_ARQUIVO_LIDO: Abre o .txt gerado pelo LOG_HORA_INICIO e adiciona o nome do arquivo Excel que acaba de ser importado (lembrando que tenho 2 variáveis envolvidas nesse loop: FilePath, para o Loop na pasta e FileName, que é uma expression de FilePath usada para gravação do nome do arquivo no .txt);

    - LOG_HORA_FIM: Adiciona um rodapé no txt com as informações de término do processamento.

     

    Tudo explicado, vamos ao problema.

    O loop é executado sem problemas e vai importando os dados do Excel. Mas subtamente, ele dá um erro (copiei da Saída a partir do ponto de o erro começa).

    Erro: 0xC0202009 em 2_E_PEDIDOS, Gerenciador de conexões "Gerenciador de Conexões do Excel": Código de Erro SSIS DTS_E_OLEDBERROR.  Erro OLE DB. Código de erro: 0x80004005.

    Um registro OLE DB está disponível. Origem: "Microsoft Access Database Engine"  Resultado: 0x80004005  Descrição: "A tabela externa não está no formato esperado.".

    Erro: 0xC020801C em FD_PEDIDOS, PEDIDOS_ABERTOS [1]: Código de Erro SIS DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER. Falha da chamada do método AcquireConnection para o gerenciador de conexões "Gerenciador de Conexões do Excel" com o código de erro 0xC0202009. Mensagens de erro podem ter sido postadas antes com mais informações sobre o motivo da falha na chamada para o método AcquireConnection.

    Erro: 0xC0047017 em FD_PEDIDOS, SSIS.Pipeline: Falha na validação de componente "PEDIDOS_ABERTOS" (1) com o código de erro 0xC020801C.

    Erro: 0xC004700C em FD_PEDIDOS, SSIS.Pipeline: Falha na validação de um ou mais componentes.

    Erro: 0xC0024107 em FD_PEDIDOS: Houve erros durante a validação da tarefa.

     

    Minha maior dúvida é que segundo o log no meu txt, TODOS os arquivos *.xlsx que estão na pasta do loop foram lidos.

    Será que o loop dá mais uma volta mesmo tendo acabado os arquivos para ler?

    Será que o script do LOG_ARQUIVO_LIDO é executado mesmo depois da falha no FD_PEDIDOS e então o erro está no último arquivo?

     

    Quem pode me ajudar?

     

    Obrigado galera.

    Abraços.


    Carlos Eduardo B Martins Junior
    e-mail: kdu.bmartins@gmail.com
    skype: cmartins.othink
    Thursday, December 15, 2011 12:31 PM

Answers

  • Galera, muito obrigado pelas respostas.

     

    Por um desleixo meu acabei não atualizando o fórum antes.

    Mas na sexta-feira eu fiz uma série enorme de testes com o ForEach.

    Alterei o parâmetro de pesquisa (que era *.xlsx) para importar apenas alguns arquivos da pasta de cada vez, ou seja, ia diferindo pelos nomes. Então, ao invés de ler todos os 25 arquivos de uma vez, fiz uma rodada lendo uns 6, depois uns 10 e assim por diante. Funcionou normal.

     

    Rodei então mais uma vez com o parâmetro *.xlsx e deu erro novamente depois de ler o ultimo arquivo (segundo meu log).

    Foi aí que imaginei que poderia ser alguma coisa no tempo de atualização da pasta quando o loop fazia a volta. Ao abrirmos um arquivo excel, o próprio Excel cria no mesmo diretório um arquivo auxiliar com nome de 8 bytes a partir do nome do arquivo (aqueles 1234ABC~.XLSX, já viram?). Pode ser que esses arquivos ainda não tivesses sido apagados da pasta e o BIDS tentou abrir algum deles.

     

    Eu mudei o parâmetro de busca na pasta para B*.xlsx (todos os arquivos começam com o nome "base...") e agora está funcionando.

    Depois que vi como era simples, fiquei até decepcionado... Achei que ia ter que mandar uma cartinha pro Tio Bill dizendo que achei um bug no BIDS e tal... hahaha.

     

    Abraços galera, e obrigado mais uma vez.


    Carlos Eduardo B Martins Junior
    e-mail: kdu.bmartins@gmail.com
    skype: cmartins.othink
    • Marked as answer by Kdu Bonalume Monday, December 19, 2011 12:04 PM
    Monday, December 19, 2011 12:01 PM

All replies

  • Carlos,

     

    Não sei quanto ao erro do log, porem o erro de conexão esta claro, voce deve estar com algum problema de acesso externo, voce esta tentando acessar um access ou excel?


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    Thursday, December 15, 2011 5:00 PM
  • Estou acessando Excel.

    Veja o print da FD_PEDIDOS:

     

    Viu? É uma fonte do Excel sendo lida (com mudança de arquivo a cada volta do loop) e copiando os dados para o SQL Server.

     

    Engraçado que se fosse pela conexão, porque acontecer logo no último arquivo, no fim do loop?


    Carlos Eduardo B Martins Junior
    e-mail: kdu.bmartins@gmail.com
    skype: cmartins.othink
    Thursday, December 15, 2011 5:11 PM
  • Kdu,

    Vamos por partes, você já verificou o tipo de dados que esta sendo utilizado por sua tabela no Access? Provavelmente você esta se deparando com uma pequena incompatibilidade de dados entre o Access e o BIDS durante o processo de leitura dos dados para posterior armazenamento no SQL Server.


    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]
    Sunday, December 18, 2011 11:12 PM
  • Boa noite Carlos, tudo bem?

     

    Seu fluxo está certinho, vamos as perguntas:

    Todos os arquivos de excel estão no mesmo formato? Nome de sheet e nome de colunas?

    Você consegue verificar se no SQL Server foi importado o Excel?

    O loop dá o erro após a execução de todos os arquivos?  Isso justificaria já ter inserido no txt o nome de todos apesar do erro.

     

    Sugiro que coloque um break point no pre-execute do Loop e um data viewer no data flow "FP_PEDIDOS" e analise a consistencia dos dados que estão vindo do excel e alimentando o sql.

     

    Att,

    PG

    Sunday, December 18, 2011 11:52 PM
  • Carlos,

    Talvez será necessário utilizar o componente Convert para realizar o tratamento dos dados de acordo com o formato correto, ainda mais quando trabalhamos com o Excel é necessário converter todos para String Unicode.


    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]
    Monday, December 19, 2011 11:20 AM
  • Galera, muito obrigado pelas respostas.

     

    Por um desleixo meu acabei não atualizando o fórum antes.

    Mas na sexta-feira eu fiz uma série enorme de testes com o ForEach.

    Alterei o parâmetro de pesquisa (que era *.xlsx) para importar apenas alguns arquivos da pasta de cada vez, ou seja, ia diferindo pelos nomes. Então, ao invés de ler todos os 25 arquivos de uma vez, fiz uma rodada lendo uns 6, depois uns 10 e assim por diante. Funcionou normal.

     

    Rodei então mais uma vez com o parâmetro *.xlsx e deu erro novamente depois de ler o ultimo arquivo (segundo meu log).

    Foi aí que imaginei que poderia ser alguma coisa no tempo de atualização da pasta quando o loop fazia a volta. Ao abrirmos um arquivo excel, o próprio Excel cria no mesmo diretório um arquivo auxiliar com nome de 8 bytes a partir do nome do arquivo (aqueles 1234ABC~.XLSX, já viram?). Pode ser que esses arquivos ainda não tivesses sido apagados da pasta e o BIDS tentou abrir algum deles.

     

    Eu mudei o parâmetro de busca na pasta para B*.xlsx (todos os arquivos começam com o nome "base...") e agora está funcionando.

    Depois que vi como era simples, fiquei até decepcionado... Achei que ia ter que mandar uma cartinha pro Tio Bill dizendo que achei um bug no BIDS e tal... hahaha.

     

    Abraços galera, e obrigado mais uma vez.


    Carlos Eduardo B Martins Junior
    e-mail: kdu.bmartins@gmail.com
    skype: cmartins.othink
    • Marked as answer by Kdu Bonalume Monday, December 19, 2011 12:04 PM
    Monday, December 19, 2011 12:01 PM