Categorias
Uncategorized

Feliz Natal e At?? Ano que Vem

Pessoal,

Feliz Natal, Pr??spero Ano Novo, tudo de bom, etc e tal para todos voc??s!

Infelizmente em Dezembro n??o tive muito tempo para escrever artigos, mas para o ano teremos boas mat??rias. Estou preparando uma s??rie de artigos para o tema Newsletter que vai ser show de bola. Ent??o, divirtam-se… Dia 10/01/2011 voltamos com as novidades!

Categorias
dll handler html thumbnail

Gerar Thumbnail de um HTML

Nesse artigo veremos como gerar um Thumbnail (ou Screenshot) de um HTML. Por exemplo: ??s vezes queremos ter uma pr??via de uma p??gina e n??o temos como v??-la a n??o ser abrindo-a. Ent??o geremos o thumb delas e coloquemo-as em um DataList. No caso n??o colocarei no DataList… apena mostrarei como gerar o thumb. Usaremos o componente WebsitesScreenshot. Essa DLL permite:

  • Gerar um thumb atrav??s de um arquivo HTML local (indicando o arquivo ou inserindo o c??digo-fonte);
  • Gerar um thumb atrav??s de uma URL;
  • Salvar o thumb gerado ou exibir na tela, etc.
?? um poderoso componente que voc?? pode manipular de v??rias formas e chegar a bons resultados. Irei mostrar algo bem simples: gerarei um thumb de uma URL e exibirei em uma imagem. Vamos?
Crie uma p??gina (Web Form) qualquer onde ser?? exibida o thumb. Adicione um Image e no seu atributo ImageUrl indique o valor Thumb.ashx. Agora criemos um Generic Handler chamado Thumb.ashx no projeto. Dentro do ProcessRequest coloque o seguinte trecho de c??digo ficando da seguinte forma:
public void ProcessRequest (HttpContext context) {
        WebsitesScreenshot.WebsitesScreenshot ComponenteThumb = new WebsitesScreenshot.WebsitesScreenshot();
        WebsitesScreenshot.WebsitesScreenshot.Result ResultadoCaptura = ComponenteThumb.CaptureWebpage(“http://www.google.com.br/”);
        if (ResultadoCaptura == WebsitesScreenshot.WebsitesScreenshot.Result.Captured)
        {
            System.Drawing.Image thumb = ComponenteThumb.GetImage().GetThumbnailImage(140, 110, null, new IntPtr());
            MemoryStream ms = new MemoryStream();
            context.Response.ContentType = “image/png”;
            thumb.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            ms.WriteTo(context.Response.OutputStream);
        }
        ComponenteThumb.Dispose();
    }
N??o se esque??a de adicionar o namespace System.IO; l??. O resultado seria algo do tipo:
A depender dos par??metros que voc?? trabalhar e qualidade dos objetos, o resultado final vem a ser melhor do que isso. O que mostrei foi o b??sico do componente!
Se fosse para gerar o thumb de um arquivo HTML local ou c??digo-fonte, bastaria inserir o seu conte??do em uma string e depois usar o seguinte m??todo:
string HtmlArquivo = “Voc?? visitou o blog de Thiago Mar??al!”;
WebsitesScreenshot.WebsitesScreenshot.Result ResultadoCaptura = ComponenteThumb.CaptureHTML(HtmlArquivo);
E o resultado seria:
Est?? pequenininho, mas ?? thumb! Mais informa????es voc?? pode obter no site oficial.
Categorias
dicas dll flash

Flash Control – Componente ASP.NET para Incluir Flash nas P??ginas

Voc?? pode estar se perguntando? Porque usar esse componente ao inv??s de usar embed, object do pr??prio HTML? Bem, abaixo tem uma algumas vantagens de sua utiliza????o:

  • Funciona com o framework 2.0, 3.0, 3.5 e 4.0;
  • Funciona em conjunto com o ASP.NET AJAX;
  • Cross browser;
  • Passagem de vari??veis para o Flash e comunica????o JS, etc.

Essas e outras vantagens o componente lhe d?? para n??o ter dores de cabe??a. O Flash Control ainda lhe resolve o problema do flash sumir quando dado um PostBack. Vamos l??? ?? bem simples seu uso. Primeiro baixe a DLL do componente aqui (h?? 2 vers??es dela: paga e a free – pegue a free). Adicione a DLL FlashControl.dll na pasta Bin de seu projeto. Na p??gina que queira exibir registre a DLL e invoque-a usando os seguintes trechos de c??digos:

<%@ Register Assembly=”FlashControl” Namespace=”Bewise.Web.UI.WebControls” TagPrefix=”Bewise” %>


<Bewise:FlashControl ID=”FlashControlEmbed” runat=”server” MovieUrl=”~/arquivo.swf” BrowserDetection=”False” Height=”200px” Width=”200px” />

Pronto! Mais informa????es e outras op????es (transpar??ncia, FLV, par??metros, etc) podem ser encontradas na p??gina de Faq deles.

Categorias
boleto banc??rio componentes dll

Boleto Banc??rio em ASP.NET

Para quem quer implementar boleto banc??rio em ASP.NET e n??o quer perder tempo fazendo tudo, h?? um componente que ?? m??o na roda: Boleto.Net. Segue abaixo descritivo retirado do site:

“Boleto.Net ?? um componente desenvolvido em C# e ASP.Net e contempla as seguintes funcionalidades:

Emiss??o e Impress??o de Boletos Banc??rios

Gera????o de Arquivo de Remessa (CNAB 240 e 400)

Leitura do Arquivo de Retorno (CNAB 240 e 400)

Atualmente estamos implementando mais alguns bancos e toda colabora????o ser?? importante. Nosso objetivo ?? implementar todos os bancos brasileiros.

A vers??o 2.0 est?? dispon??vel. Nessa vers??o contempla leitura e remessa de arquivos CNAB 400/240.”

Uma boa iniciativa por parte do pessoal. Todo apoio ?? importante! Na p??gina do site deles h?? toda informa????o que precisa para desenvolver: tanto o componente quanto exemplo. Os bancos homologados s??o: Banco do Brasil, Bradesco, Santander, Ita?? e BRB. J?? ajuda bastante…

Categorias
dicas som windows winform

Tocando/Emitindo som com C#

Dica r??pida para emitir um som com C# usando a API do Windows: basta importar a fun????o PlaySound. Crie a lista enumerada e importe a DLL utilizando os seguintes c??digos:

        // FLAGS DE SOM
        [System.Flags]
        public enum PlaySoundFlags : int
        {
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001,
            SND_NODEFAULT = 0x0002,
            SND_LOOP = 0x0008,
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000,
            SND_FILENAME = 0x00020000,
            SND_RESOURCE = 0x00040004
        }


        // IMPORTA????O DO COMPONENTE DE SOM
        [DllImport(“winmm.dll”, EntryPoint = “PlaySound”, SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)]
        private static extern bool PlaySound(string szSound, System.IntPtr hMod, PlaySoundFlags flags);

N??o precisa copiar a DLL para a aplica????o uma vez que ele busca na biblioteca do pr??prio Windows.

Para tocar, execute o m??todo (exemplo):

PlaySound(“sound.wav”, new System.IntPtr(), PlaySoundFlags.SND_ASYNC);

Sempre use a flag PlaySoundFlags.SND_ASYNC (forma ass??ncrona). ?? aconselh??vel usar ela do que PlaySoundFlags.SND_SYNC (forma s??ncrona) se estiver trabalhando com outro processamento em paralelo. Ou seja, ap??s o som, se for realizar algum outro m??todo ou trecho de c??digo. De forma ass??ncrona ele ir?? tocar e continuar com o processamento do c??digo que tiver logo abaixo (paralelo). De forma s??ncrona pode haver lentid??o no processo pois ?? vezes o som pode demorar a tocar ou ter que esperar terminar para prosseguir (cont??nuo). Fa??a os testes antes para ver o diferencial.

Agora sim! Volte ao post do Microterminal e adicione sua fun????o para tocar um som quando apertar * (asterisco).

Categorias
dicas web.config

Problema no ASP.NET Menu no Chrome e Safari

Me veio esse problema a alguns dias ao usar o ASP.NET Menu. Nunca tinha usado para desenvolver menus. Geralmente uso o componente da DevExpress, o ASPxMenu, no qual consiste em um menu robusto, flex??vel e mil vezes melhor que o menu convencional. Pois bem… Quando reparei, vi que no Chrome n??o funcionava… Uai! Procurando informa????es, obtive que o ASP.NET n??o renderiza direito o menu diante desses navegadores e que a solu????o era adicionar uma configura????o de browser na aplica????o. Li v??rios artigos mas s?? Seiti mostrou em seu blog uma forma mais elegante e funcional de corrigir (clique aqui para ver na ??ntegra).

Basicamente, crie a pasta App_Browsers em sua aplica????o e adicione um arquivo safari.browser. Em seguida adicione o trecho abaixo:

<browsers>
    <browser refID=Safari1Plus>
        <controlAdapters>
            <adapter controlType=System.Web.UI.WebControls.Menu adapterType=“” />
        </controlAdapters>
    </browser>
</browsers>

Agora funciona! Mais detalhes veja o blog de Seiti.

Categorias
blog iis mvc wordpress

WordPress em ASP.NET

O WordPress ?? um dos melhores gerenciadores de blogs que eu j?? vi. Muito completo e de c??digo aberto, sua flexibilidade de utilizar add-ons (plugins) ?? o que permite dar-lhe grande escalabilidade. Visite o link para conhecer… J?? tinha utilizado a ferramenta algumas vezes e achei bem intuitiva e f??cil de usar (al??m de manipul??-la). Ent??o dei uma olhada na net e, infelizmente, n??o h?? vers??es dele em ASP.NET. Ent??o pensei: porque n??o fazer?

Comecei a dar uma olhada no c??digo analisando a reutiliza????o das p??ginas. Vendo por alto d?? para sentir como o neg??cio foi bem feito! Surpreendente o que foi feito em PHP… Voltando… Primeiro gerei uma c??pia do HTML de algumas p??ginas. Como fiz isso? Exibindo a p??gina no navegador, mostrando o c??digo-fonte (em HTML) e salvando. S?? assim que d?? pois o c??digo PHP est?? misturando com c??digo HTML. ?? chato, trabalhoso e principalmente nunca fica do jeito que queremos. Mas ficou quase parecido.

Depois fiquei vendo que n??o vai ser t??o f??cil assim. Parei e desisti! Muito cansativo… Pelo menos j?? tenho o HTML de algumas p??ginas (est??tico). Fiquei enrolando por um tempo e precisava ter um CMS para sites. O WordPress j?? ?? um CMS ent??o pensei em agregar um m??dulo para fazer cadastros pegando uma tabela no banco de dados e transformando em formul??rio. Pelo menos isso! Feito…

Hoje, ao menos, j?? tenho um cadastro! Isso poderia ser feito por Linq? Claro! Isso ?? Linq… Apenas coloquei na casca do WordPress. Ou seja, o que fiz, qualquer um poderia ter feito. Agora o mais dif??cil ?? fazer os demais m??dulos. Ou seja, fazer o WordPress… Complicado! N??o sei se conseguirei fazer. Talvez desista no meio do caminho ou n??o. Futuro indeciso. Se um dia terminar coloco no Google Code ou em qualquer reposit??rio para download.

Fazendo umas pesquisas no Google, encontrei o site de David Pirek. Ele fez um gerenciador de conte??do para blogs em ASP.NET (em MVC ainda) de forma bem mais reduzida que o WordPress mas que tem o mesmo objetivo (menos a casca). Bem interessante! Para conhecer veja o projeto ASP.NET CMS 3.0. Acho que quebra um galho… Tamb??m, para ver o demo e a vers??o 4.0 clique aqui. A minha id??ia de copiar o WordPress e transformar em ASP.NET veio da?? e no grande poder que a ferramenta disponibiliza.

Resumo
Projeto: WordPress em ASP.NET
Linguagem: C# 3.5
Banco de Dados: SQL Server
Plugins: JQuery, Mootools, ASP.NET AJAX, NicEdit WYSIWYG
Andamento: 1%

Obs: Depois estava lendo que h?? um “armengue” de colocar o WordPress em PHP e o blog em ASP.NET para funcionar. Parece que se colocar o WordPress em um diret??rio e o blog em outro e configurar como aplica????es separadas no IIS (lembrando que pode ter o PHP no IIS com FastCGI) d?? pra fazer funcionar. S?? que ter?? que programar o blog para puxar as informa????es. N??o testei, mas fica a dica para quem quiser tentar…

Categorias
dicas ip microterminal rede tcp windows

Comunicando com microterminal em ASP.NET

Quem j?? foi em supermercado e nunca viu aquelas maquininhas que o operador fica digitando? Pois ??… estamos falando dela mesma. Parece ser f??cil seu uso, mas quem come??a a trabalhar com elas ?? de perder os cabelos.

Nesse artigo veremos como comunicar com um microterminal via TCP/IP e trocar informa????es (ida e volta). Para isso vamos utilizar o modelo da Gertec MT 720. Uma breve descri????o do aparelho e seu uso (retirado daqui):

“O MT 720 ?? um excelente microterminal que opera em rede Ethernet com protocolos TCP-IP. Seu teclado com 20 teclas program??veis pode ser utilizado com fun????es espec??ficas de atalhos para agilizar a opera????o.

As teclas re-legend??veis permitem a identifica????o da fun????o de cada tecla. O display com back light (iluminado), com 20 caracteres por 2 linhas, permite facilmente a visualiza????o da informa????o, principalmente em ambientes que possuem pouca ilumina????o, como bares noturnos, por exemplo.

Atrav??s de uma porta de teclado (AT/PS2) e mais 3 portas Seriais (RS-232) ?? poss??vel a conex??o de perif??ricos como: Leitor de C??digo de Barras, Display de Cliente, Balan??a, Impressora, etc.

O MT 720 ?? ideal para aplica????es de Cart??o de Consumo, solu????es para Bares, Lanchonetes, Restaurantes Self-Service, Livrarias, Papelarias, apontamento de produ????o em Ind??strias.”

Na pr??pria p??gina do dispositivo (citada acima) tem alguns downloads de arquivos, dentre eles alguns c??digos-fontes com exemplos de como fazer a comunica????o bem como realizar as opera????es pelas quais foi criado. Um por??m: s?? tem dispon??veis nas linguagens C++, Delphi e VB (n??o ?? VB.NET).

Da?? pensamos: “sem problemas! ?? s?? converter pra VB.NET a partir do VB”… Tamb??m pensei nisso e n??o consegui! Dando uma olhada de perto no c??digo-fonte d?? para saber que as proezas encontradas s??o s?? poss??veis por artif??cios que a linguagem oferece: por exemplo, ponteiros. Quem j?? programou em VB via a grande flexibilidade da linguagem de fazer tudo o que quer e do jeito que era mais conveniente. Maravilha! Pena que tenhamos que seguir certos padr??es. Fica a dica: se n??o quiser perder tempo, pegue logo o c??digo prontinho l?? na p??gina do fabricante (vem tamb??m no CD quando compra o aparelho) e utilize. De prefer??ncia use o Delphi e em seguida em VB. Se quiser aventurar vamos com C#…

Se escolheu C# siga lendo pois, em diante, veremos como fazer… Teremos os seguintes objetivos na implementa????o:

  1. Criar uma ??nica aplica????o que ir?? receber e enviar os dados;
  2. Exibir o que foi digitado tanto no microterminal quanto no monitor.

Instala????o

Leia o manual do usu??rio aqui. Em resumo: ligue o microterminal na rede el??trica e conecte na porta traseira um cabo RJ-45 no dispositivo e a rede. Em seguida configure, no microterminal, o IP do Servidor (no meu caso, considerei minha m??quina local com o IP 192.168.1.100, por exemplo). Demais configura????es a seu gosto…

Implementa????o

Criemos um Windows Form. Coloquei alguns controles para embelezar a aplica????o…

O mais importante ?? adicionar um objeto Timer. Os demais coloquei para gerar a aplica????o final (que ficar?? no tray – perto do rel??gio – e outras coisas fru-frus). Configure seu Timer com Interval de 50. Pegue a DLL pmtg.dll e copie para sua aplica????o. Eu disse copie! Voc?? n??o conseguir?? aplicar Reference sobre ela. Clique com o bot??o direito sobre a DLL e escolha Properties. Em Copy to Output Directory coloque Copy Always.

Agora vamos ao c??digo! Clique sobre o WinForm e escolha View Code. Cole os c??digos abaixo para que possamos us??-las no form:

        // VARI??VEIS
        IntPtr v_Hwnd;
        int statusCard;
        int statusSerial;
        int MsgReceiveData = 1;
        string[] dados = new string[255];


        // INICIALIZA????O DE FUN????ES EXTERNAS
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_startserver(IntPtr mywhnd, int conecmsg, int commumsg);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern void mt_finishserver();
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_getkey(int id, StringBuilder str);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_backspace(int id);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_dispstr(int id, string str);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_dispch(int id, char ch);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_dispclrln(int id, int lin);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]]
        public static extern int mt_gotoxy(int id, int lin, int col);

Em seguida adicionamos as duas fun????es primordiais: in??cio (quando carregar o formul??rio) e t??rmino (quando fechar o formul??rio):

        private void MicroTerminal_Load(object sender, EventArgs e)
        {
            v_Hwnd = this.Handle;
            statusCard = 0;
            statusSerial = 0;
            if (mt_startserver(v_Hwnd, 0, MsgReceiveData) == 1)
            {
                temporizadorLista.Enabled = true;
            }
            else
                MessageBox.Show(“N??o foi poss??vel carregar os m??dulos de conex??o ?? leitora!”);
        }

        private void MicroTerminal_FormClosed(object sender, FormClosedEventArgs e)
        {
            temporizadorLista.Enabled = false;
            mt_finishserver();
        }

Lembrando que esses eventos devem estar configurados (n??o ?? apenas copiar e colar o c??digo, lembra? deve-se indicar l?? em Events do Form). Com isso, ao fazer o primeiro teste, sua aplica????o j?? estar?? recebendo dados do microterminal. Em seguida devemos adicionar um evento Tick ao Timer. Ou seja, a cada 50 milisegundos (lembra que colocamos com esse valor) ir?? ser executado um determinado m??todo.

Antes disso vamos criar um m??todo que ir?? limpar a tela do microterminal e reiniciar os dados de entrada:

                 private void ReiniciaEntrada(int i)
        {
            // Limpa as duas linhas e o que foi armazenado
            dados[i] = “”;
            mt_dispclrln(i, 1);
            mt_dispclrln(i, 2);
            // Coloca o cursor na primeira linha e prepara o display
            mt_gotoxy(i, 1, 0);
            mt_dispstr(i, “Numero: “);
            mt_gotoxy(i, 2, 0);
        }

Enfim adicionamos o c??digo que ir?? ler temporariamente cada leitora conectada ?? rede e coletar/processar os dados de acordo com o que desejar. No meu caso deixei o seguinte:

        private void temporizadorLista_Tick(object sender, EventArgs e)
        {
            StringBuilder rntStr = new StringBuilder();
            int i = 0;
            // Loop em toda faixa de Ips ??teis: cada leitora conectada na rede
            while (i < 255)
            {
                // Captura algo do teclado
                if (mt_getkey(i, rntStr) == 1)
                {
                    string chrAsHex = ((int)rntStr[0]).ToString(“x”);
                    // Entrada do display caso seja um n??mero
                    if ((chrAsHex == “3030”) || (chrAsHex == “30”) || (chrAsHex == “31”) || (chrAsHex == “32”) || (chrAsHex == “33”) || (chrAsHex == “34”) || (chrAsHex == “35”) || (chrAsHex == “36”) || (chrAsHex == “37”) || (chrAsHex == “38”) || (chrAsHex == “39”))
                    {
                        if (dados[i].Length >= 20)
                            dados[i] = dados[i].Substring(0, 19) + rntStr[0];
                        else
                            dados[i] += rntStr[0];
                        mt_dispch(i, rntStr[0]);
                    }
                    // Se for um ENTER, d?? a entrada na tela para mostrar
                    else if (chrAsHex == “d”)
                    {
                        // Captura e trata a entrada
                        if (dados[i] != “”)
                        {
                            // Faz o processamento do que desejar em dados[i]
                        }
                        // Limpa tela
                        ReiniciaEntrada(i);
                    }
                    // Se for um ESC, apaga tudo
                    else if (chrAsHex == “1b”)
                    {
                        // Limpa tela
                        ReiniciaEntrada(i);
                    }
                    // Se for backspace apaga ??ltimo caractere do display
                    else if (chrAsHex == “8”)
                    {
                        if (dados[i].Length > 0)
                            dados[i] = dados[i].Substring(0, dados[i].Length – 1);
                        mt_backspace(i);
                    }
                    // Se apertar * toca o som
                    else if (chrAsHex == “2a”)
                    {
                        // Toca um sonzinho… depois publico o c??digo de tocar som!
                    }
                }
                i++;
            }
        }

Feito! Rode sua aplica????o e digite algo no teclado do microterminal e ver?? que o que est?? sendo digitado est?? indo tanto para a aplica????o quanto para o display (no microterminal). A sa??da seria algo do tipo:

Se precisar de sa??da na tela crie um outro WinForm que ocupe toda tela (sua) e captura o que est?? no display do microterminal. Assim ?? mais f??cil! Ou fa??a do jeito que sua imagina????o mandar! O mais dif??cil j?? passou…

Para quem quiser capturar os IPs de cada microterminal, utilize os m??todos:

[DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern TTABSOCK mt_connectlist();

ou

[DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern StringBuilder mt_ipfromid(int id);

Nessas fun????es tem algumas particularidades muito chatinhas de se trabalhar (veja no manual das fun????es) por isso deixei de lado. Principalmente a classe:

    [StructLayout(LayoutKind.Sequential)]
    public struct TTABSOCK
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
        public UInt32[] TSOCK;
    }

Quem quiser se aventurar nela, fica a?? a dica. Esse artigo merecia at?? uma v??deo-aula, mas a pregui??a ??s vezes ?? muito forte! ?? at?? legalzinho ter esses desafios, mas ??s vezes se torna muito chato quando n??o consegue. Enfim, quanto menos se estressar, melhor! Ent??o tente usar as implementa????es que j?? a Gertec j?? disponibilizou, caso n??o queira aventurar, a menos que precise de algo mais espec??fico.
Falar que nem Marcoratti: “eu sei, ?? apenas ASP.NET, mas eu gosto!”

Categorias
dicas sql server

Melhorando o desempenho de consultas (SELECT) em tabelas grandes no SQL SERVER

“Tenho uma tabela com mais de um milh??o de registros. Fa??o uma consulta… um simples SELECT… mas est?? demorando muito para retornar. O que fazer?”

Essa ?? a pergunta que voc?? se faz nessa situa????o. Todo programador sabe trabalhar com banco, mas nem sempre sabemos utilizar da melhor forma. Um DBA j?? ?? craque na situa????o e sabe a melhor forma de melhorar o desempenho de uma consulta. A dica do dia ??: ??ndices! Se voc?? n??o sabe o que s??o ??ndices, veja essa mat??ria aqui de Thiago Pastorello que explica de forma bem compreensiva. Tamb??m recomendo que leia tamb??m esse artigo da Compute-rs onde explica as vantagens e desvantagens de usar ??ndices.

?? s?? isso? Talvez. Se voc?? entedeu o significado de ??ndices lendo os dois artigos (refer??ncia) e fez o que irei demonstrar abaixo pode ser que resolva. Na net voc?? ir?? encontrar outros artigos semelhantes que ir??o mostrar outros caminhos que podem ajudar melhor. Aqui ser?? de forma simplificada… Vamos?

Abra o Microsoft SQL Server Management Studio, conecte-se a base de dados e clique em New Query. Escreva a consulta que deseja avaliar e corrigir para ficar mais r??pida. No meu caso irei executar uma Stored Procedure que cont??m v??rias sub-consultas com manipula????o de agrupamento tais como COUNT, SUM, etc. Na barra de ferramentas marque a op????o Include Actual Execution Plan (Incluir Plano de Execu????o Atual).

Agora clique em Execute ou pressione F5 para executar a query e avali??-la. Aguarde at?? que finalize completamente. V?? na ??ltima aba abaixo de Plano de Execu????o e veja os resultados.

Passando o mouse por cima de cada item ir?? ser exibidos detalhes acerca do custo de processamento. Depois procurem ai no Google mais explica????es sobre cada item. Mas vamos nos atrelar a essa mensagem verde. Note que o pr??prio SQL Server informa que h?? indices ausentes! Vamos cri??-los?

Clique com o direito sobre a mensagem e escolha Detalhes de ??ndices Ausentes.

Ao clicar, ir?? aparecer outra tela com um query de cria????o do ??ndice, exemplo:

/*
Detalhes de ??ndice Ausentes de SQLQuery1.sql – SERVIDOR.Mailing (thiago (53))
O Processador de Consultas estima que a implementa????o do ??ndice a seguir pode melhorar o custo da consulta em 99.7047%.
*/
/*
USE [Mailing]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[News_Envio] ([id_campanha])
GO
*/
 
A consulta de cria????o est?? praticamente pronta bastanto apenas dar um nome para o ??ndice e remover o coment??rio, deixando da seguinte forma:
 
USE [Mailing]
GO
CREATE NONCLUSTERED INDEX PI_Index_Envio_Campanha
ON [dbo].[News_Envio] ([id_campanha])
GO

Pressione F5 ou Execute esse bloco de instru????es para criar o ??ndice. Antes de testarmos, vamos atualizar os ??ndices e suas estat??sticas.

V?? na tabela desejada, na op????o de ??ndices e escolha Reorganizar ??ndices. Veja o n??vel de fragmenta????o e d?? OK. Em seguida execute:

UPDATE STATISTICS News_Envio

No caso substitua News_Envio pelo nome de sua tabela. Agora execute novamente o primeiro processo e ver?? um ganho significativo de velocidade de consulta. O que levava 1 minuto para executar, em menos de 1 segundo obt??m-se o resultado. Bom n???

Aprecie com modera????o o uso de ??ndices e leiam as refer??ncias para saber quais situa????es onde ?? vantagem ou n??o o uso deles.

Categorias
Uncategorized

Volta dos artigos

Ol?? pessoal…
Como prometido, estarei retormando os artigos ajudando a comunidade e programadores. Uma nova se????o que teremos ?? a divulga????o de vagas e cursos (gratuitos ou bem baratinhos) interessantes que todo desenvolvedor deveria participar.
Tamb??m estava criando umas v??deos aulas para auxiliar em algumas mat??rias, j?? que a curva de aprendizado vendo ?? mais acentuada do que lendo (t??tica de professor – falei bonito, eheheh). Mas isso logo que tiver um tempinho sobrando.
Outra coisa que notei, logo ap??s a pausa, ?? que alguns artigos meus foram copiados quase na ??ntegra e publicado em outros blogs sem refer??ncia (uns 3). Bem… podem copiar, alterar e divulgar ao menos que tenham a refer??ncia de onde buscaram. Sem problemas! O que temos hoje na net ?? a contribui????o de ??numeras pessoas que se dedicaram boa parte de seu precioso tempo na leitura de artigos de v??rios outros escritores para elabora????o dos pr??prios. Nada aqui ?? inventado e sim compilado conhecimento de contribuidores (pela net, livros e revistas).
Sem mais delongas… voltemos a nossa programa????o normal!