quinta-feira, 27 de novembro de 2014

Como fazer Update com Bulk Insert - Update em massa com planilha excel

Precisei fazer um UPDATE em massa a partir de uma planilha excel.

Cheguei a solução do BULK INSERT com UPDATE

Segue a Implementação:

private string IncluirSkuRecomendadoNoBanco(List<SkuRecomendadoImportacaoBE> recomendacoes)
        {
            var retorno = "sucesso";
            var totalLinhasAtualizadas = 0;
                                 
            //Cria arquivo de log
            StreamWriter writer = new StreamWriter("C:\\Users\\marcelo.braga\\Desktop\\log.txt");
            writer.WriteLine("IdSku;SkusRecomendados");
         
            //Converte List em DataTable
            var dt = new System.Data.DataTable();
            dt.Columns.Add("IdSkuPai");
            dt.Columns.Add("SkusRecomendados");

            foreach (var item in recomendacoes)
            {
                writer.WriteLine(item.IdSkuPai + ";" + item.SkusRecomendados);

                System.Data.DataRow dr = dt.NewRow();
                dr["IdSkuPai"] = item.IdSkuPai;
                dr["SkusRecomendados"] = item.SkusRecomendados;
                dt.Rows.Add(dr);
                dr.AcceptChanges();
            }

            var conn = new SqlConnection(GetConnection());
         
            try
            {
                conn.Open();

                //Bulk insert into temp table
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
                {
                    bulkcopy.BulkCopyTimeout = 660;
                    bulkcopy.DestinationTableName = "TmpTable";
                    bulkcopy.WriteToServer(dt);
                    bulkcopy.Close();
                }

                //Update
                var queryUpadate = "UPDATE S SET S.SKUSRECOMENDADOS = Temp.SkusRecomendados FROM SKU S INNER JOIN TmpTable Temp ON S.IDSKU = Temp.IdSkuPai;";
                using (var cmd = new SqlCommand(queryUpadate, conn))
                {
                    cmd.CommandTimeout = int.MaxValue;
                    totalLinhasAtualizadas = cmd.ExecuteNonQuery();

                    writer.WriteLine("Total de registros atualizados: " + totalLinhasAtualizadas);
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine("Erro: " + ex.Message);
                writer.Close();
            }
            finally
            {
                conn.Close();
            }

            return retorno;
        }

Não esqueça de criar a tabela no banco:

CREATE TABLE TmpTable(IdSkuPai INT,SkusRecomendados VARCHAR(MAX));

Fonte: http://stackoverflow.com/questions/20635796/bulk-update-in-c-sharp

Muito Obrigado e até o próximo post!


terça-feira, 25 de novembro de 2014

Como criar um Crawler, Robo para nagevar pelo browser via programacao

Como criar um Crawler, Robô para navegar pelo browser via programação

Muito fácil!

Primeiro de tudo é preciso adicionar o Selenium WebDriver.

Fica mais fácil através da linha de comando do Nuget:

PM> Install-Package Selenium.WebDriver

Para mais detalhes de como instalar acesse:

http://www.nuget.org/packages/selenium.webdriver

Segue um exemplo simples de como implementar o robô com Selenium:

private static void ReturnUrl(string url, List<string> listaUrls)
        {
            IWebDriver driver = new FirefoxDriver();

            driver.Navigate().GoToUrl(url);

            var query = driver.FindElements(By.XPath("//a[contains(@href,'nike.com.br')]"));
            var urlExcecao = ConfigurationManager.AppSettings["UrlExcecao"];
            var listaUrlsExcecao = urlExcecao.Split(',').ToList<string>();

            foreach (var item in query)
                listaUrls.Add(item.GetAttribute("href"));

            var urlsRemovidas = 0;
            foreach (var item in listaUrls.Distinct())
            {
                driver.Quit();

                foreach (string itemExcecao in listaUrlsExcecao)
                {
                    urlsRemovidas += listaUrls.Distinct().ToList().RemoveAll(str => str.Contains(item));
                }

                if (!listaFinal.Equals(item))
                {
                    listaFinal.Add(item);
                    Console.Write(item + "\n");
                    ReturnUrl(item, listaUrls.Except(listaFinal).ToList());
                }
            }

            Console.Read();
        }

Muito Obrigado e até o próximo post!

Como fazer para concatenar mais de um campo no PIVOT

Depois de trabalhar com PIVOT, me deparei com outro problema: concatenar mais de um campo dentro do PIVOT.

No forum abaixo tem a pergunta e algumas soluções propostas:

http://stackoverflow.com/questions/27108762/pivot-sql-server-multiple-values-in-aggregate-function

Minha solução ficou da seguinte forma:


select * FROM

(select s.IdSKU, ca.Campo, [Valor] = Case when ca.Campo = 'cor' then REPLACE((Select distinct Valor AS [data()] from Colecao (NOLOCK) cl            
  INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao            
  INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro            
  INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto            
  INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria            
  INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria            
  INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto    
  INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU        
  INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
  INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
  INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
  where s.IdSKU = 309613 and ca.Campo = 'cor' FOR xml path('')),' ',',') else v.Valor end
 FROM Colecao (NOLOCK) cli            
  INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cli.IdColecao            
  INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro            
  INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto            
  INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria            
  INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria            
  INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto    
  INNER JOIN SkuValorCampo (NOLOCK) svc ON svc.idSku = s.IdSKU        
  INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = svc.idValorCampo
  INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
  INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo
  where s.IdSKU = 309613
 
  UNION
 
  select s.IdSKU, ca.Campo, v.Valor
 FROM Colecao (NOLOCK) cl            
  INNER JOIN ColecaoParametro (NOLOCK)cp ON cp.IdColecao = cl.IdColecao            
  INNER JOIN ColecaoParametroProduto (NOLOCK) cpp ON cp.idcolecaoparametro = cpp.idcolecaoparametro            
  INNER JOIN produto (NOLOCK) p ON cpp.IdProduto = p.IdProduto            
  INNER JOIN categoria(NOLOCK) c ON c.idCategoria = p.idCategoria            
  INNER JOIN dbo.CategoriaFiltro (NOLOCK) cf0 ON cf0.IdCategoria=c.IdCategoria            
  INNER JOIN Sku (NOLOCK) s ON s.idProduto = p.idProduto  
  INNER JOIN ProdutoValorCampo (NOLOCK) pvc ON pvc.idProduto = p.IdProduto
  INNER JOIN ValorCampo (NOLOCK) vc ON vc.IdValorCampo = pvc.idValorCampo
  INNER JOIN Valor (NOLOCK) v ON v.IdValor = vc.IdValor
  INNER JOIN Campo (NOLOCK) ca ON ca.IdCampo = vc.IdCampo  
 
  where s.IdSKU = 309613) AS t
 PIVOT
 (MAX(Valor)

 FOR Campo IN (Tamanho,Cor,Gênero)) tt

Muito Obrigado e até o próximo post!

sexta-feira, 24 de outubro de 2014

Como transformar o número do mês em string

Muito fácil!

var mes = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Today.Month);

Pronto! Muito Obrigado e até o próximo POST!

sexta-feira, 19 de setembro de 2014

A página solicitada não pode ser acessada porque os dados de configuração relacionados à página são inválidos.

Erro HTTP 500.19 - Internal Server Error

A página solicitada não pode ser acessada porque os dados de configuração relacionados à página são inválidos.


Depois de passar dois dias pesquisando sobre o assunto cheguei a uma solução:

1 - Abra o IIS e verifique o pool de aplicativos que sua aplicação está apontando. 

2 - Depois na coluna Identidade verifique qual usuário está com permissão. Provavelmente você verá ApplicationPoolIdentity. 

3 - Clique do lado direito na opção "Configurações Avançadas".



4 - Procure por Identidade e troque para seu usuário de máquina:



5 - Em seguida verifique se a pasta onde o IIS aponta os arquivos está com autorização para o mesmo usuário.

Pronto! Muito Obrigado e até o próximo POST!

terça-feira, 2 de setembro de 2014

Como fazer para trabalhar com jQuery Templates

Como fazer para trabalhar com jQuery Templates

Vamos começar a trabalhar com jQuery Templates. Basicamente serve para disponibilizar e principalmente manipular os dados no browser.
Por exemplo, você pode  usar o jQuery Templates para formatar e exibir os dados vindo de uma chamada ajax.

jQuery Templates suporta um número poderoso de funcionalidades como templates tags, template composition, e wrapped templates. Eu vou me concentrar nas funcionalidades que eu penso ser mais usual.

O jQuery Templates plugin foi desenvolvido pelo time da Microsoft ASP.NET com colaboração do time jQuery - código aberto.

Vamos colocar a mão na massa:

Vamos começar com um exemplo simples de como usar jQuery Template. Nós vamos usar o plugin para listar os livros armazenado em um array. Segue o código:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Intro</title>
    <link href="0_Site.css" rel="stylesheet" type="text/css" />
</head>
<body>

    <div id="pageContent">

        <h1>ASP.NET Bookstore</h1>

        <div id="bookContainer"></div>

    </div>

    <script id="bookTemplate" type="text/x-jQuery-tmpl">
        <div>
            <img src="BookPictures/${picture}" alt="" />
            <h2>${title}</h2>
            price: ${formatPrice(price)}
        </div>
    </script>

    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.4.4.js"></script>
    <script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.templates/beta1/jquery.tmpl.js"></script>

    <script type="text/javascript">
        // Create an array of books
        var books = [
            { title: "ASP.NET 4 Unleashed", price: 37.79, picture: "AspNet4Unleashed.jpg" },
            { title: "ASP.NET MVC Unleashed", price: 44.99, picture: "AspNetMvcUnleashed.jpg" },
            { title: "ASP.NET Kick Start", price: 4.00, picture: "AspNetKickStart.jpg" },
            { title: "ASP.NET MVC Unleashed iPhone", price: 44.99, picture: "AspNetMvcUnleashedIPhone.jpg" },
        ];

        // Render the books using the template
        $("#bookTemplate").tmpl(books).appendTo("#bookContainer");

        function formatPrice(price) {
            return "$" + price.toFixed(2);
        }

    </script>

</body>
</html>


Quando abrir a página do browser verá a seguinte página:



Primeira coisa a notar de diferente é o MIME type "text/x-jQuery-tmpl". Que foi atráves dele que fiquei sabendo que se tratava de um "jQuery Template". Segue:

<script id="bookTemplate" type="text/x-jQuery-tmpl">
    <div>
        <img src="BookPictures/${picture}" alt="" />
        <h2>${title}</h2>
        price: ${formatPrice(price)}
    </div>
</script>

Esse template exibe para cada livro renderizado pelo template. O template mostra a "picture", "title" e "price".

Note também que a tag SCRIPT está decorada com um MIME type "text/x-jQuery-tmpl". Porque?
Quando o browser encontra uma MIME type desconhecido ele ignora essa tag. Esse é o comportamentp que você busca com usao de um template. Você não quer que o browser interprete pois pode causar efeitos colaterais.

E também não podemos deixar de notar a expressão ${...} que é usado pra exibir o valor da expressão JavaScript dentro do template. Por exemplo, a expressão ${title} é usado para mostrar o valor do título do livro. Você pode usar qualquer função Java Script dentro da expressão ${...}. Por exemplo, no exemplo abaixo, o preço do livro é formatado com ajuda de uma função JavaScript formatPrice(), que é definida na parte inferior da página.

E por fim vamos atentar para o método tmpl().Que basicamente renderiza o array java script no "bookTemplate". Segue:
$("#bookTemplate").tmpl(books).appendTo("#bookContainer");

Dentro do Template podemos usars as seguintes Tags:

{{tmpl}} - Usado para template composition
{{wrap}} - Usado para wrapped templates
{{each}} - usado para interar uma coleção
{{if}} - usado para condicionar o sitens do template