Fevereiro 2010 Fevereiro 2010 índice Delphi Delphi Editorial 04 Sabemos o quanto é notório a importância do pacote Microsoft Office na vida de muitas empresas, e por mais ... Banco de Dados 14 05 Criando um componente de pesquisa Autor: Antonio Spitaleri Autor: Luciano Pimenta Banco de Dados 19 IDEs gráficas para MySQL Entendendo o uso adequado de Índices com o Interbase Autor: Bruno Alcarás Autor: Felipe Santos Dicas - Dicas Delphi 09 Integrando o Delphi 2010 ao Excel e Word. .NET Autor: Djonatas Tenfen 24 Desafio The Club 28 - Cruzada 30 Legenda Iniciante Intermediário Avançado Fevereiro 2010 03 Bem-vindo Sabemos o quanto é notório a importância do pacote Microsoft Office na vida de muitas empresas, e por mais recursos que nossa aplicação tenha nossos clientes sempre tem por necessidade um documento do Word ou uma planilha do Excel, por exemplo, usados respectivamente para a emissão de um contrato padrão ou cálculos de cobrança. Baseado nisto surge naturalmente à necessidade da integração dos dados do sistema da empresa com estas planilhas ou documentos, e caso nos desenvolvedores não percebamos a necessidade disto em nossa aplicação, mais cedo ou mais tarde o usuário irá perceber e cobrar por este recurso. Visando este tipo de integração aplicação pacote Office o nosso consultor técnico Antonio Spitaleri Neto, trás para nos este mês o artigo “Integrando o Delphi 2010 ao Excel e Word”, onde mostra como é simples fazer nossas aplicações desenvolvidas em Delphi comunicar-se com documentos do Word ou Excel usando apenas componentes Servers. Neste mês Luciano Pimenta vem com o artigo “Criando um componente de pesquisa”, embora o foco do artigo seja a criação do componente, o que fica implícito e que acredito ser o mais importante, é a reutilização de código, ou seja, com a criação de um componente de pesquisa que será utilizado em toda a aplicação haverá grande economia de código e conseqüentemente no esforço de desenvolvimento, o resultado disto será a ganho de tempo e aumento a lucratividade do projeto, sem contar no ganho com futuras manutenções no sistema. Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150 Informações: (14) 3732-1529 Suporte: (14) 3733-1588 Internet http://www.theclub.com.br Cadastro: [email protected] Suporte: [email protected] Informações: [email protected] Skype Cadastro: theclub_cadastro Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3 www.twitter.com/theclubbr Copyright The Club Megazine 2009 Diretor Técnico Marcos César Silva Neste mês fico feliz em poder anunciar o primeiro artigo de nosso consultor Jr. Bruno Alcarás, que trás para nós em seu artigo “IDE’s gráficas para MySql”algumas interfaces gráficas de manutenção do banco de dados MySql, neste artigo podemos avaliar e comparar as diferentes ferramentas abordadas, podendo escolher a que mais se adéqua as nossas necessidades. Diagramação e Arte Vitor M. Rodrigues Continuando na abordagem do banco de dados Interbase, Felipe Santos com seu artigo “Entendendo o uso adequado de índices com o Interbase”, escreve sobre um tema imperdível, inclusive para quem não utiliza este banco de dados, que é o uso de índices nos mostrando os critérios que devemos ter na hora da criação de índices em nos banco de dados. Colunistas Antonio Spitaleri Neto Bruno Alcarás Djonatas Tenfen Felipe Santos Luciano Pimenta Na nossa seção .Net convido a todos a lerem o artigo de Djonatas Tenfen que fala a respeito das “Novidades do Silverlight 4“, nos mostrando recursos sensacionais desta nova versão da ferramenta. Revisão Tassiane Fileto Impressão e acabamento: GRIL - Gráfica e Editora Taquarituba-SP - Tel. (14) 3762-1345 Reprodução Bom, é isto ai pessoal! Espero que todos aproveitem a leitura, e não se esqueçam de nos encaminhar suas dúvidas com relação os artigos deste mês. A utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais. Abraço a todos. Marcos César Silva - Editor Chefe [email protected] 04 Fevereiro 2010 Delphi é marca registrada da Borland International, as demais marcas citadas são registradas pelos seus respectivos proprietários. Delphi Integrando o Delphi 2010 ao Excel e Word Quando estamos navegando por uma página da internet através do Browser e desejamos copiar um trecho da página para um arquivo texto em algum editor como o Microsoft Word, basta que selecionemos o texto escolhemos a opção copiar no Browser e em seguida a opção colar no editor de texto. Essa tarefa simples é viabilizada no Windows por uma tecnologia chamada OLE (Object Linking and Embedded) que foi criada para proporcionar a integração entre os aplicativos que rodam em ambiente Windows. Para quem desenvolve em Delphi, em muitas situações se faz necessário lançar mão dessa integração proporcionada pela tecnologia OLE. Para tanto o Delphi 2010 conta em sua VCL com os componentes da aba Servers. Esses componentes fazem o uso da tecnologia OLE de forma transparente ao desenvolvedor, o que facilita o trabalho de desenvolver aplicações integradas aos aplicativos da suíte Office da Microsoft. Imagem 01 Nesse artigo estarei mostrando como utilizar os componentes da aba Servers para integrarmos nossa aplicação ao Microsoft Word e Microsoft Excel. Trabalhando com Word. Começaremos montando o layout inicial de nosso aplicativo, que consistirá em um componente PageControl com duas abas, uma para Word e a outra para Excel. O layout ficará dessa forma: Veja a imagem 01. Fevereiro 2010 05 Para trabalharmos com Word, precisamos ter um documento do mesmo para onde enviaremos as informações do aplicativo. Então, abra o Microsoft Word e crie um documento da seguinte forma: ADOS DO CLIENTE NOME: @nome RG: @rg CPF: @cpf ESTADO CIVIL: @estcivil ENDEREÇO: @endereco CIDADE: @cidade CEP: @cep TELEFONE: @telefone E-MAIL: @email Repare nos valores antecedidos pelo caractere ‘@’, são esses valores que serão preenchidos com os valores provenientes de nosso aplicativo. Iremos agora montar esse aplicativo que irá mandar os dados para o documento Word. O primeiro componente que iremos adicionar ao formulário para isso é o WordApplication, seguido do WordDocument da aba Servers do Delphi 2010. Em seguida insira 9 componentes Tedit e configure suas propriedades hint iguais aos valores com ‘@’ do documento, porém sem o caractere ‘@’. Insira também 9 labels para servirem de rótulo aos componentes Tedit indicando a função de cada um. Lembrando que esses componentes devem ser inseridos na primeira aba do PageControl. A Aplicação deverá ficar assim: Imagem 02 procedure Tfrmservers.btnlimparClick(Sender: TObject); var i:integer; begin for i:=0 to Self.ComponentCount-1 do if(Components[i] is TEdit)then if(TEdit(Components[i]).Text<>’’)then TEdit(Components[i]).Clear; end; Código 01 procedure Tfrmservers.btnsalvarClick(Sender: TObject); var docorigem, docdestino, procurar, substituir:OleVariant; i:integer; begin // Atribui a variavel docorigem o caminho de nosso documento Word // anteriormente criado docorigem:=ExtractFilePath(Application. ExeName)+’DADOS.doc’; // Cria uma nova aplicação Word // e a torna visível WordApplication1:=TWordApplication.Create(Application. Owner); WordApplication1.Visible:=true; Veja a imagem 02. Código 02 O botão ‘limpar”, terá a seguinte codificação em seu evento Onclick: salvo na mesma pasta do aplicativo. No exemplo escolhi dados.doc como nome do documento. Veja o Código 01. Veja o Código 02. Teste o aplicativo e salve as alterações. Em seguida faremos a codificação do botão que irá salvar os dados digitados nesse formulário no documento Word que criamos há pouco. Estaremos trabalhando com variáveis do tipo OleVariant que são um tipo definido pelo Delphi quando precisamos trabalhar com objetos OLE. Integrando a aplicação com Excel Para essa etapa é importante, a fim de facilitar a codificação, que o documento Word criado esteja Segue o código do evento Onclick do botão “Salvar”: Na outra página do PageControl de nossa aplicação, iremos realizar a exportação dos dados de 06 Fevereiro 2010 um clientdataset para uma planilha do Excel. Da aba Servers adicionaremos três componentes: ExcelApplication, ExcelWorkBook e ExcelWorksheet, que estarão representando respectivamente: A aplicação Excel, a pasta com as planilhas e finalmente a planilha para a qual serão exportados os dados. Em seguida, adicione um componente Clientdataset, clique com o botão direito sobre ele e selecione a opção Load from mybase table, selecione como arquivo de dados o arquivo employee.xml que se encontra em: C:\Arquivos de programas\ Arquivos comuns\Borland Shared\Data. // Cria um novo documento Word, conecta-o ao documento // existente // e adiciona esse documento a aplicação Word WordDocument1:=TWordDocument.Create(Application. Owner); WordDocument1.ConnectTo(WordApplication1.Documents.Ad d(docorigem,EmptyParam,EmptyParam,EmptyParam)); // O laço a seguir irá pegar os valores das edits do formulário e enviá-las // ao documento Word for i:=0 to Self.ComponentCount-1 do begin if(Components[i] is TEdit)then begin // Cria a chave para busca no documento Insira um Button e uma Label no tabsheet, a página do PageControl e altere seus captions para “Exportar” e “Aguarde” respectivamente. A página “Excel” do PageControl deverá ficar assim: Veja a imagem 03. No evento OnClick do botão “Exportar” faça: procurar:=’@’+TEdit(Components[i]).Hint; // Cria o texto que irá substituir a chave substituir:= TEdit(Components[i]).Text; // Realiza a busca e substituição do valor no documento WordDocument1.Content.Find.Execute(procurar,Emp tyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam, EmptyParam,EmptyParam,EmptyParam,substituir, EmptyParam, EmptyParam, EmptyParam,EmptyParam,EmptyParam); end; end; // Aponta o caminho e nome do arquivo a ser salvo docdestino:=ExtractFilePath(Application. ExeName)+’DADOS’+edtnome.Text+’.doc’; // Salva o arquivo WordDocument1.SaveAs(docdestino); WordDocument1.Close; end; Código 02 Imagem 03 Fevereiro 2010 07 procedure Tfrmservers.btnexportarClick(Sender: TObject); var Planilha:OleVariant; linha, coluna:integer; begin try lblprogresso.Caption:=’Aguarde...’; // Cria uma nova aplicação Excel, // adiciona um novo documento // e torna visível o documento ExcelApplication1:=TExcelApplication.Create(Application.Owner); ExcelApplication1.Workbooks.Add(EmptyParam,0); ExcelApplication1.Visible[0]:=True; // Carrega o primeiro documento em branco da aplicação // excel na variável Planilha a ser trabalhada Planilha:= ExcelApplication1.Workbooks[1].Worksheets[1]; // Cria o cabeçalho do documento Excel com os nomes dos // campos contidos no clientdataset for coluna:=1 to ClientDataSet1.FieldCount do begin Planilha.Cells[1,coluna].Select; Planilha.Cells[1,coluna].font.bold:=true; Planilha.cells[1,coluna].value:=ClientDataSet1.Fields[coluna-1].DisplayLabel; end; // Passa os dados contidos no Clientdataset para a planilha Excel linha:=2; ClientDataSet1.Open; ClientDataSet1.First; while not(ClientDataSet1.Eof)do begin for coluna:=1 to ClientDataSet1.FieldCount do begin Planilha.Cells[linha,coluna].select; Planilha.Cells[linha,coluna].value:=ClientDataSet1.Fields[coluna-1].AsString; end; Inc(linha); ClientDataSet1.Next; end; finally lblprogresso.Caption:=’Exportação Concluída!’; ClientDataSet1.Close; end; end; Código 03 Teste o aplicativo e salve as alterações. Sobre o autor Conclusão Antonio Spitaleri Neto Como pudemos ver no artigo, o Delphi 2010 utiliza a tecnologia OLE em sua plenitude, fazendo com que a integração dos aplicativos construídos na plataforma com os aplicativos da suíte Office seja feita de forma ágil e de fácil entendimento. Espero que tenham gostado e até a próxima! 08 Fevereiro 2010 Consultor Técnico The Club. [email protected] Criando um componente de pesquisa Reutilize as telas de pesquisa da sua aplicação Para aplicações terem performances, sempre bati na tecla da parametrização de dados, ou seja, os dados que são mostrados em tela, devem ser a menor quantidade possível. Em uma aplicação, a quantidade de consultas auxiliares é bastante grande, ou seja, pesquisa de clientes, fornecedores, produtos etc, além de serem utilizadas em vários locais da aplicação. Criar um formulário de consulta para cada uma das pesquisas torna o trabalho honoroso, então por que não criar um componente para essas consultas. O que vou mostrar neste artigo, é um componente simples, para localizar dados, que pode ser modificado de acordo com a necessidade do desenvolvedor. Inciando a construção Primeiramente, primeiro precisamos criar um pacote. Vamos usar o Delphi 2010 neste artigo, mas você pode usar, qualquer versão do Delphi para criar o componente. Clique em File>New>Other e acesse o item Package (Figura 1). Veja a figura 01. Salve o pacote com o nome de “pkLocalizar. dproj”. Criando o formulário Figura 1. Criando o pacote do componente Teremos de criar o formulário de pesquisa, que deve conter os componentes para digitar o texto, botão de pesquisa e um grid onde serão mostrados os dados, além de um DataSource que será vinculado a um DataSet. Você pode incluir componentes de sua necessidade. por uma descrição (nome, titulo etc). Crie um novo formulário no pacote e adicione os controles, veja na Figura 2 como será o formulário de pesquisa. Nossa tela de pesquisa terá dois filtros: um para pesquisa pelo código, outro para pesquisa No código do formulário devemos criar alguns métodos e propriedades, conforme o código a Veja a figura 02. Fevereiro 2010 09 seguir: procedure Buscar; function GetCodigo: integer; property DataSet: TClientDataSet; property SQLCodigo: string; property SQLDescricao: string; No código anterior, criamos a assinatura de um método que será responsável por realizar a consulta (Buscar) e uma função, para retornar o código retornado pela consulta. Além disso, temos que criar uma propriedade do tipo TClientDataSet, responsável por ter os dados da consulta. Caso deseje, mude para o controle que utilize para trabalhar com dados locais (IBQuery, Query etc). As outras duas propriedades indicam o código SQL para a consulta por código ou por descrição, assim basta configurar a propriedade do componente Localizar, para ter a consulta parametrizada no componente. O código do Buscar, simplesmente, repassa pro ClientDataSet o valor do Edit (edtLocalizar), onde o usuário digitará o valor de busca. No caso, temos que verificar qual o tipo de filtro escolhido pelo usuário, para poder configurar no DataSet o respectivo comando SQL: Veja o código 02. O código do GetCodigo, para retornar o campo chave da tabela, é bastante simples, onde retornamos o primeiro campo (Field) do ClientDataSet. Result := DataSet. Fields[0].AsInteger; Claro, precisamos indicar o campo chave na consulta SQL (propriedades SQLCodigo e SQLDescricao) para que seja o primeiro registro. Ao apertar CRTL+C, o Delphi cria o manipulador para a propriedade DataSet. O código do SetDataSet fica conforme o código a seguir: if FDataSet <> Value then begin FDataSet := Value; DataSource1.DataSet := FDataSet; end; No código, atribuímos para a propriedade 10 Fevereiro 2010 Figura 2. Formulário de pesquisa FDataSet.Close; if (rgLocalizar.ItemIndex = 0) then begin FDataSet.CommandText := FSQLCodigo; FDataSet.Params[0].AsInteger := StrToInt(edtLocalizar. Text); end else begin FDataSet.CommandText := FSQLDescricao; FDataSet.Params[0].AsString := ‘%’ + edtLocalizar.Text + ‘%’; end; FDataSet.Open; DataSet do DataSource, o valor passado. Assim, ao configurarmos a propriedade no Object Inspector, o DataSet é vinculado ao DataSource. Codificando o formulário Para os botões, que vão indicar se devemos confirmar o item selecionado no DBGrid ou cancelar o formulário (fechando-o), devemos chamar o Close, e a seguir, configurar o ModalResult, que para o botão OK, será mrOK e Cancelar como mrCancel. Veremos adiante, o motivo de usarmos o ModalResult. No evento OnDblClick do DBGrid, devemos usar o mesmo código do botão OK, apenas verificando antes se existem registros na consulta, verificando a propriedade RecordCount do FDataSet. Assim, o usuário pode dar um duplo clique no grid e o mesmo será fechado. No OnDataChange do DataSource, vamos habilitar o OK, apenas se existirem registros no ClientDataSet, ou seja, mais uma validação que fizemos para não termos problemas com o componente: btnOk.Enabled := FDataSet. RecordCount > 0; Para finalizar o formulário, precisamos tratar o evento OnKeyPress do edtLocalizar, usando o código da Listagem 1. Veja a listagem 01. No código anterior, primeiramente, verifica- mos se foi apertado a tecla ENTER. Após, verificamos se o Edit não esta vazio, isso é bom para que uma pesquisa muito grande não seja executando, trazendo lentidão ao sistema. Poderíamos ainda, colocar uma quantidade mínima de caracteres a serem digitados para que o usuário chegue o mais perto possível do que esta procurando. Após verificarmos se a propriedade DataSet não esta vazia, chamamos o Buscar, configuramos o foco para o DBGrid e adicionamos uma mensagem na StatusBar, com a quantidade de registros encontramos com o valor digitado no Edit. O key := #0, não emite o bip característico do sistema operacional. Com essa configuração, o formulário de consulta esta pronto. Alguns retoques a mais poderiam ser feitos, como configurar as colunas do DBGrid para que fiquem centralizadas pelo código e alinhadas a esquerda com o texto. Quando o usuário apertar ESC podemos fechar o formulário, ou ainda, quando o usuário apertar ENTER no DBGrid o mesmo fechar como se fosse clicado o botão OK. Isso são funcionalidades simples, que deixarei a cargo do leitor, mas a versão para download possui essas funcionalidades. Criando o componente Agora, precisamos criar uma unit, que receberá mais propriedades que serão repassadas ao formulário no momento de sua criação em memória, assim como também fazer o registro do componente no Delphi. Crie uma nova unit e adicione o código da Listagem 2. No código, criamos uma classe TLocalizar, descendente de TComponent. Na seção private temos variáveis, uma referente a propriedade publicada DataSet (seção published) que teremos e outra referente ao formulário criado neste artigo, e ainda as variáveis referentes as propriedades SQL. O SetDataSet configura a propriedade e sua implementação é bem simples, onde apenas precisamos configurar a propriedade DataSet e verificar se o formulário esta criado, através do FFormLocalizar. As propriedades dos comandos SQL também são simples, basta configurar as mesmas como a padronização de propriedades. Na seção protected, precisamos implementar o Notification, que é responsável, por atribuir nil a propriedade DataSet, quando por exemplo o ClientDataSet associado a mesma, por excluído. Isso evita erros no IDE do Delphi. Sua implementação usa o seguinte código: { se apertou ENTER, realiza a busca } if key = #13 then if edtLocalizar.Text <> ‘’ then begin if Assigned(FDataSet)then begin Buscar; grdLocalizar.SetFocus; StatusBar1.SimpleText := Format( ‘%d registro(s) encontrado(s) com “%s”’, [FDataSet.RecordCount, edtLocalizar.Text]); Key := #0; end; end; Listagem 1. Código do OnKeyPress do Edit unit uLocalizar; interface uses Classes, Forms, DB, Dialogs, ufrLocalizar, Graphics, Controls,DBClient; type TLocalizar = class(TComponent) private FDataSet: TClientDataSet; FFormLocalizar: TfrLocalizar; FSQLDescricao: string; FSQLCodigo: string; procedure SetDataSet(const Value: TClientDataSet); procedure SetSQLCodigo(const Value: string); procedure SetSQLDescricao(const Value: string); protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; public function Execute: Boolean; function ReturnValue: integer; published property DataSet: TClientDataSet read FDataSet write SetDataSet; property SQLCodigo: string read FSQLCodigo write SetSQLCodigo; property SQLDescricao: string read FSQLDescricao write SetSQLDescricao; end; procedure Register; implementation procedure Register; begin RegisterComponents(‘Luciano Pimenta®’, [TLocalizar]); end; Listagem 2. Unit do componente Fevereiro 2010 11 inherited; if Operation = opRemove then if AComponent = FDataSet then FDataSet := nil; Continuando o código da Listagem 2, na seção public temos duas funções. A primeira, Execute, indicará se houve algum registro escolhido no formulário, assim podemos repassar para a consulta principal, o valor do registro. if not FDataSet.Active then FDataSet.Active := True; FFormLocalizar := TfrLocalizar.Create(nil); try FFormLocalizar.DataSet := FDataSet; FFormLocalizar.SQLCodigo := FSQLCodigo; FFormLocalizar.SQLDescricao := FSQLDescricao; FFormLocalizar.ShowModal; Result := FFormLocalizar.ModalResult = mrOk; finally FFormLocalizar.Free; end; A segunda retorna o valor da chave primária do registro escolhido no grid do formulário, onde simplesmente, chama o GetCodigo da variável FFormLocalizar. Por fim, o Register (abaixo de implemetation), registra o componente na Component Pallete do Delphi, onde passamos como parâmetro o nome a paleta e a classe do componente. Chamando o formulário de pesquisa O Execute, é o principal método do nosso componente. Ele se comporta semelhante ao Execute dos controles Dialogs do Delphi, ou seja, é retornado true se foi escolhido um registro na consulta. Na Listagem 3, temos a implementação do método. Figura 4. Criando um resource no XN Resource Editor Listagem 3. Método Execute O código é bastante simples, primeiro verificamos se o ClientDataSet vinculado ao componente esta ativo, se não “abrimos” o mesmo. A seguir, instanciamos o formulário de pesquisa, repassamos as propriedades e chamamos o ShowModal. O resultado do Execute, será de acordo com o ModalResult do formulário, ou seja, caso seja mrOK foi selecionado algum registro na consulta, senão, nenhum registro foi selecionado. Por isso, configuramos nos botões do formulário o ModalResult. Por fim, no finally, liberamos o formulário da memória. Para finalizar, toda a criação do componente, no pacote, clique em Compile e depois em Install. Caso tudo tenha dado certo, você terá um componente instalado em uma nova paleta no Delphi (Figura 3). Figura 3. Componente instalado no Delphi Colocando um ícone no componente Para adicionarmos um ícone do componente, precisamos editar um arquivo DCR e adicionar no pacote. Caso esteja usando uma versão mais 12 Fevereiro 2010 antiga, como o Delphi 7, podemos usar o Image Editor, acessando o menu Tools>Image Editor. No editor, clique em File>New>Component resource file (dcr). Clique como botão direito em Contents e escolha New>Bitmap. Escolha uma imagem de tamanho 24x24 (use SuperVGA nas opções de cores). Após criar, de um duplo clique Bitmap1 e crie ou cole uma imagem de sua preferência. Após adicionar a imagem, renomeie o arquivo Bitmap1 para “TLOCALIZAR”. Para versões mais novas, o Image Editor não acompanha o Delphi, então vamos usar uma ferramenta externa para resource files. Para esse artigo, usei a ferramenta XN Resource Editor que pode ser baixada em: www.wilsonc.demon.co.uk/ d10resourceeditor.htm. Para criar o resource e bem simples, abra a ferramenta e acesse o menu Resource>Add Resource. Escolha a opção Bitmap e clique em OK. Nas propriedades configure “24” para Width e Height. Cole a imagem que deseja ou importe a mesma usando o menu Resource. No painel lateral, renomeie a pasta 1 para “TLOCALIZAR”. Veja na Figura 4 a ferramenta com as configurações. Para os dois casos (Image Editor ou XN Re- source Editor), salve o arquivo na mesma pasta do pacote criado no Delphi (com a extensão DCR). Voltando ao Delphi, no source do pacote (DPK), adicione o código que irá adicionar o arquivo: {$R *.dcr} Poderíamos também indicar o nome do arquivo se a utilização da máscara. Agora, basta recompilar a aplicação e seu componente terá um novo ícone (Figura 5). Figura 5. Novo ícone do componente Testando o componente Agora, precisamos testar o componente. Crie um novo projeto e crie uma conexão com um banco de dados, usando dbExpress ou qualquer outra suíte de componentes para acesso a dados. Nosso principal componente é o ClientDataSet. No Delphi 2010, crie uma conexão no Data Explorer para o banco Employee.fdb do Firebird. Caso deseje, pode usar qualquer outro banco que possua um driver no Delphi. Arraste a conexão criada para o formulário. Arraste a tabela Customer para o formulário, para ser criado um SQLDataSet. A d i c i o n e ta m b é m u m D ata S et P ro vider e modifique para True a propriedade Options>AllowCommandText, assim indicamos que o responsável por receber as consultas (instruções SQL) é o próprio ClientDataSet. Adicione dois ClientDataSets ao formulário (“cdsEmployee” e “cdsBuscaEmployee”). No cdsEmployee configure o CommandText para: “select * from EMPLOYEE where EMP_NO = :EMP_NO”. Estamos selecionando todos os dados da tabela, mas parametrizando a mesma pelo código, assim nossa consulta retornará todos os registros, apenas quando indicarmos o valor do parâmetro. Você pode fazer sub-consultas, joins nessa consulta, que não será afetada no nosso componente de pesquisa. No cdsBuscaEmployee digite na mesma propriedade: “select EMP_NO, FIRST_NAME from EMPLOYEE where upper(FIRST_NAME) like :FIRST_NAME”. Nesse controle, estamos retornando apenas o código e nome da tabela Employee, parametrizando pelo nome, que será configurado no nosso componente. Não esqueça de configurar os parâmetros nos dois ClientDataSets. Adicione um Localizar no formulário e configure DataSet para cdsBuscaEmployee. Digite nas propriedades SQL do Localizar, os mesmos comandos mostrados anteriormente para cada propriedade SQL. Adicione os campos do cdsEmployee no formulário para que o mesmo fique semelhante a Figura 6. Adicione também um botão para chamar o Localizar. Figura 6. Formulário de cadastro para teste te, configuramos o parâmetro da consulta com o valor retornado pelo componente (ReturnValue). Com isso, temos um componente de pesquisa que pode ser reaproveitado em vários formulários usando o mesmo componente de dados. Veja o mesmo em execução na Figura 7, onde temos uma pesquisa pelo nome e outra pelo código. Figura 7. Testando o componente Agora, simplesmente, precisamos usar o seguinte código no botão: if Localizar1.Execute then begin cdsEmployee.Close; cdsEmployee.Params[0]. AsInteger := Localizar1. ReturnValue; cdsEmployee.Open; end; Veja que o código é bem simples, onde verificamos se foi escolhido algum registro no formulário de consulta, usando o Execute. Após, simplesmen- Conclusão Vimos neste artigo como podemos criar componentes que nos auxilie em aplicações client/ server para ser utilizado em consultas auxiliares, poupando tempo de programação e diminuição de código. O que mostrei aqui foi apenas o pontapé inicial, use sua criatividade para agilizar seu dia a dia de programador. Um grande abraço a todos! Sobre o autor Luciano Pimenta É Técnico em Processamento de Dados, desenvolvedor Delphi/C# para aplicações Web com ASP.NET e Windows com Win32 e Windows Forms. Palestrante da 4ª edição da Borland Conference (BorCon). Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussiness em Florianópolis-SC. www.lucianopimenta.net Fevereiro 2010 13 IDE’s GRÁFICAS PARA MYSQL Nem sempre é agradável criar um banco e gerenciá-lo digitando os comandos no MySQL Command Line Client, ainda mais quando temos que criar muitas tabelas, triggers, fazer inserções etc. Por isso existem as ferramentas gráficas que ajudam o usuário a fazer essa tarefa de forma mais intuitiva. Neste artigo mostrarei três das muitas opções de ferramentas gráficas para MySQL. Instalação do MySQL Antes de iniciar este artigo vou demonstrar rapidamente com é feita a instalação do MySQL. O instalador do MySQL pode ser encontrado no seguinte endereço: http://dev. mysql.com/downloads/mysql/ • Na primeira tela aparecerá a opção de como você quer fazer a instalação, escolha Typical e clique em Next; • Depois será perguntado se você deseja criar uma conta em MySQL.com, mas 14 Fevereiro 2010 isso não é necessário para usar o MySQL; • Na próxima tela clique em Finish para iniciar a configuração do servidor; • Escolha a opção standard na tela de configuração do servidor; • Nessa tela será perguntado se você quer instalar o MySQL como serviço, marque esta opção e clique em Next; ver imagem 01. • Na última tela será possível definir uma senha para o usuário padrão root, clique em Next e proceda a instalação; ver imagem 02. Para uma explicação mais detalhada consulte a edição de Fevereiro de 2007, que pode ser encontrada em nosso site no seguinte endereço: http://www.theclub.com.br/ REVISTA/ACES0207.ASPX 1) MySQL Query Browser O MySQL Query Browser é uma ferramenta gráfica utilizada para controlar o servidor MySQL e fazer a manutenção de Banco de Dados MySQL, sendo fornecido pela MySQL AB, seu rico ambiente gráfico facilita a criação do banco por parte do usuário, onde seu aplicativo é compatível a partir da versão 4.0 do MySQL e tem que ser baixado separadamente, já que não esta presente no pacote de instalação do MySQL, o MySQL Essentials. Você pode encontrar este pacote de instalação no seguinte endereço http://dev.mysql.com/downloads/guitools/5.0.html Usando o Query Browser Após instalar e iniciar o aplicativo lhe será apresentada o seguinte Connection Dialog: Veja a Imagem 03. Imagem 03. Onde: • Stored Connection – por aqui você pode carregar seu perfil com as configurações anteriormente criadas; • Server Host – IP ou DNS do servidor onde está o MySQL, se estiver trabalhando localmente digite localhost ou 127.0.0.1; • Port – este campo já vem preenchido com a porta padrão de conexão ao MySQL , a porta 3306; • Username – aqui é definido o nome do usuário do MySQL criado quando da instalação ou posteriormente, por padrão o usuário do MySQL é root; • Password – este campo deve ser preenchido com o password do usuário, se existir, que foi escolhido quando a conta foi criada. • Default Schema – deve-se preencher com o nome do banco de dados com o qual se ira trabalhar, caso não se tenha nenhum banco criado digite um valor neste campo e o banco será criado com o nome digitado; Clicando no botão Details você encontra opções para ativar a compressão de dados, usar o Security Sockets Layer(que traz mais segurança aos dados usando a criptografia) ou usar o ANSI quotes to quote identifiers para colocar strings entre aspas duplas(“”) ao invés de simples(‘’); Veja a imagem 04. Imagem 04. Fevereiro 2010 15 Ao se clicar em ok aparecerá a seguinte tela: Veja a imagem 05. A tela inicial do Query Browser é dividida nas seguintes áreas: • SQL Query Area – é o local onde são digitados os comandos do banco de dados, para executar os comandos clique no botão execute the entered query; • Result Area – local onde são exibidos os resultados das consultas digitadas na Query Area; • Object Area – dividida em três abas que mostram os bancos do servidor MySQL(Schemadata), guardam os comandos mais utilizados pelo usuário(Bookmarks) e guardam os logs dos comandos executados, e que podem ser executados novamente com um duplo clique (History); • Information Browser – aqui existe uma documentação interessante sobre o MySQL e as funções suportadas pelo banco (Syntax e Functions) e abas sobre o que está acontecendo com o banco no momento. Imagem 05. Para criar uma tabela clique com o botão direito no nome do banco(schema) e escolha a opção Create New Table Veja a imagem 06. 2) SQL Front O SQL Front é uma ferramenta autônoma desenvolvida por Christian Wallbaum que permite uma completa manutenção do banco de dados MYSQL. A sua interface simples e o idioma, que pode ser alterado para português, permitem que mesmo usuários com pouca experiência em banco de dados consigam usá-lo. Esse aplicativo concentra-se principalmente no mais importante para o usuário, o desenvolvimento do banco de dados. O endereço para download desse aplicativo é http://www.ziggi.com.br/downloads/mysqlfront . Usando o SQL FRONT Após executar a instalação lhe será apresentada a seguinte tela: 16 Fevereiro 2010 Imagem 06. A conexão com este aplicativo funciona da mesma maneira do Query Browser tendo apenas alguns campos diferentes: • Tipo de Conexão – indica o tipo do acesso e é dividido em três opções, Direto que faz o acesso normal, localmente, DLL faz o acesso usando uma DLL especifica e Tunnel HTTP que acessa um banco via web. • Tipo de Caracteres – conjunto de caracteres usado que por padrão é o UTF-8. Ao ser feita a conexão será apresentada a seguinte tela: Veja a imagem 09. Onde: • Navegador de Objetos – local onde é mostrado detalhes do banco de dados e de suas tabelas; • Navegador de Dados – são mostrados os dados das tabelas; • Query Builder – uma espécie de wizard que ajuda os usuários a criarem suas consultas; • Editor SQL– é aui que os usuários digitam suas consultas SQL; • Diagrama – local para se montar um diagrama e ver o relacionamento entre as tabelas. Imagem 09. As opções do treeview da parte esquerda da tela mostram as bases de dados do servidor MySQL, os hosts, os processos executados pelo servidor (Processos), o status do servidor MySQL(Situação), os usuários do banco e os valores das variáveis do sistema(que podem ser modificadas) . Os botões da parte superior da barra alternam entre Favoritos, Logs do Sistema e um Treeview para mostrar os arquivos do computador. QL 3) EMS SQL MANAGER FOR MYS- O EMS SQL Manager é uma poderosa ferramenta de desenvolvimento e administração de Banco de Dados. É compatível a partir da versão 3.2 do MySQL e suporta todas as principais operações do banco como, triggers, procedures, funções e tabelas InnoDb. Com o EMS você gerencia o banco como um todo criando tabelas em modo visual, criando permissões de usuário e as alterando, exporta scripts SQL, importa e exporta dados do banco entre outros bons recursos. A versão usada neste artigo é a Lite, que é gratuita e oferece ótimos recursos, que pode ser Imagem 10. encontrada no seguinte endereço http://www. sqlmanager.net/en/products/mysql/manager/download, existe também uma versão comercial. Usando o EMS Após a instalar e iniciar o programa será apresentada a seguinte tela: Para criar um banco vá ao menu Database e escolha Create Database, na primeira tela escolha um nome, na segunda aparecerão as opções de Host, porta e usuário e na última tela clique em Finish, na tela de Register Database clique em OK. Para trabalhar com um banco anteriormente criado é necessário antes registrá-lo e para fazer isso você deve ir até o menu Database ou pressionar Shift + Control + R. Veja a imagem 10. Tela de criação de tabelas: Fevereiro 2010 17 • • • Ferramentas de reparo e checagem de tabelas; Query Builder ; Um gerador de relatórios. CONCLUSÃO A intenção deste artigo não foi indicar qual é a melhor ferramenta gráfica para bancos MySQL, e sim mostrar algumas das opções de softwares para isso, cada usuário deve escolher a que melhor se adaptar as suas necessidades. Espero que tenham gostado e até outra hora. Sobre o autor Bruno Alcarás Veja a iamgem 11. Consultor Técnico The Club. Entre suas principais funcionalidades estão: • SQL Editor (atalho F12); • Ferramentas que auxiliam no backup do seu banco; • Um extrator de dados do banco (que exporta o script do seu banco para um arquivo txt); 18 Fevereiro 2010 [email protected] ENTENDENDO O USO ADEQUADO DE ÍNDICES COM O INTERBASE Olá pessoal, Nesses longos anos trabalhando com o banco de dados InterBase, um dos assuntos que mais me chamam a atenção é em relação à performance. É comum encontrar ambientes, sistemas e bancos de dados “sofrendo” com problemas de performance e velocidade no retorno de suas pesquisas. E isso vem desde quando comecei a trabalhar com o produto, na sua versão InterBase 4.0 (já faz um tempão mesmo...). Lembro bem que quando utilizava a versão do InterBase 4.0 havia um cliente na época cujo banco havia atingido 500 Mb. Era praticamente um “super banco de dados” para a situação, mas que estava extremamente saturado. Um relatório importante demorava cerca de 30 minutos para ser executado. Imaginem aguardar 30 minutos para extrair um relatório? É tempo demais. O que fizemos foi trocar a versão do banco de dados InterBase 4.0 para o novíssimo InterBase 6.0. Foi a solução de nossos problemas. O relatório caiu para míseros 3 minutos. Era um espetáculo. Esse ganho de performance nos trouxe a tranqüilidade para continuar trabalhando normalmente. Mas, como não havíamos atacado na fonte do problema, alguns anos depois o problema voltou. O banco agora com mais de 4 Gb e o relatório a níveis terríveis. E mais uma vez veio a solução mágica: trocar a versão do banco de dados. Foi novamente um remédio salvador, baixando os tempos de execução em muito. Porém, dessa vez, a lâmpada da grande idéia brilhou sobre nossas cabeças: estamos trocando as versões do banco mas o problema continua assombrando nossas vidas. Estamos fazendo certo? Só a troca da versão do banco resolve nossos problemas? Pois o problema realmente não estava na versão do banco de dados que, é claro, evolui a cada versão e nos traz um ganho significativo de performance, melhorando o acesso aos processadores, gerenciamento de memória e recursos, enfim. O buraco estava mais abaixo, estava na estrutura de nosso banco de dados e a forma desordenada com que tratávamos suas tabelas e objetos. Utilizando o monitor de performance do InterBase (assunto que já detalhamos em edições anteriores que na The Club) foi possível notar um problema muito grave: o uso inadequado dos índices no banco de dados. O tempo passou e muita história rolou também. E o mais interessante foi notar que o problema não era só comigo ou com o software na época. O mau uso de índice é um mal mais comum do que jamais imaginei. E é nesse clima de nostalgia que vamos tratar sobre esse assunto muito interessante dos bancos de dados InterBase: Índices. Fevereiro 2010 19 O QUE SÃO ÍNDICES Por definição, “Um índice é um mecanismo que é utilizado para acelerar a recuperação de registros em resposta a determinadas condições de pesquisa, bem como impor restrições de singularidade em colunas. Assim como você busca umíndice de um livro em uma lista de números de página para encontrar rapidamente as páginas que você quer ler, umíndice de banco de dados serve como um ponteiro lógico para o local físico (endereço) de uma linha em umatabela. Um índice armazena cada valor da coluna ou colunas indexadas, juntamente com os ponteiros paratodos os blocos de disco que contém as linhas com que o valor da coluna.” Os índices do InterBase são armazenado no próprio banco de dados, em páginas especiais chamadas páginas de índices. Assim toda e qualquer query executada no banco de dados aciona um mecanismo chamada Query Optimizer que “vasculha” as páginas de índices de identifica um índice adequado à tarefa que será executada. A estrutura do Query Optimizer é constantemente otimizada também a cada nova versão. Essa é uma das grandes razões porque as aplicações ganham e performance somente com a atualização do banco. Mas é preciso ter em mente como são montados os índices do banco e como trabalhar adequadamente com esses índices, auxiliando o otimizador a encontrar índices mais eficientes. Imaginemos a seguinte situação: Veja a Imagem 01. Temos uma tabela de clientes, com nomes e outros campos. Dependendo da informação desejada da tabela e de que informações repassamos para o banco na busca pelo registro desejado, então o otimizador tentará identificar se existe um índice que nos ajude nessa busca. Se essa nossa tabela declararmos um índice para a coluna Nome, então sempre que executarmos uma busca por nome, esse índice terá uma grande chance de ser utilizado. Se nós queremos, ainda no exemplo, buscar o nome Joaquim Cordeiro, sem o índice o banco de dados teria que percorrer três registros até encontrar o registro desejado. Já com índice o banco fará uma única busca na página de índice que, por sua vez, apontará direto para o registro desejado, retornanFevereiro 2010 Imagem 01. do o resultado na metade do tempo. É claro que essa é uma situação básica, mas é válida para notar que devemos utilizar índices sempre quando desejamos efetuar buscas especificas através de valores de uma ou mais colunas na tabela. POR QUE UTILIZAR ÍNDICES? Índices são essenciais para que qualquer aplicação baseada em bancos de dados possa funcionar adequadamente. Eu costumo dizer que em qualquer tabela com mais de 1000 registros já se torna obrigatório o uso de ao menos um índice. A diferença de performance é simplesmente absurda, não tem como comparar. A técnica de busca que o InterBase utiliza em suas páginas de índices (conhecida como B-tree) permite que registros seja encontrados em poucos passos ao invés de ter que “varrer” toda a tabela de dados em busca do registro desejado. O uso dos ponteiros de índices auxiliam a engine do banco a ganhar em performance nas buscas e utilizar o recurso economizado para outras tarefas, como cálculos, agrupamentos, processamento em geral. Ora, se índices são tão bons assim, vamos sair espalhando índices em nossas tabelas! Calma, não é bem assim não. Índices são importantes sim, mas é preciso entender que eles também utilizam recursos de nosso banco de dados. O InterBase precisa manter as paginas de índices. Quando inserimos registros em nossas tabelas, as páginas de índices são atualizadas com novos ponteiros e os ponteiros já existentes são atualizados. Se criarmos índices em todas as colunas de uma tabela, certamente será mais caro para o banco manter o índice do que utilizá-lo. CRIANDO ÍNDICES A sintaxe de criação de um índice é bem simples: CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]] INDEX index ON table (col [, col ...]); Exemplo: CREATE UNIQUE ASCENDING INDEX IDX_EMPNO ON EMPLOYEE (EMPNO); Basicamente definimos que o índice pode ser Ascending ou Descending, indicando se a forma de ordenação de busco no índice será crescente ou decrescente, respectivamente. Além disso, podemos definir se o índice será do tipo Unique, situação onde o índice não permitirá valores de registros duplicados em sua chave. Por fim indicamos um nome para o índice, a tabela e o(s) campo(s) relativo(s). No exemplo acima criamos um índice chamado IDX_EMPNO do tipo único e crescente para a coluna EMPNO tabela EMPLOYEE. Esse índice não permitirá a repetição de valores na coluna EMPNO entre todos os registros da tabela. Uma boa prática é evitar que uma mesma coluna seja referenciada em mais de um índice. Não é uma situação obrigatória, mas auxilia o otimizador de queries a analisar e decidir melhor pelo índice adequado na busca. Imagem 02. Criar índices de forma Descending também é uma boa prática em situações onde a pesquisa na tabela é feita sempre busca de valores em ordem decrescente. Nesses casos índices Descending ganham muito em performance. CRIAÇÃO AUTOMÁTICA DE ÍNDICES Em algumas situações o InterBase cria automaticamente índices de apoio: 1. Em colunas definidas como parte de uma chave primária • Quando definimos uma chave primária na tabela, o InterBase cria automaticamente um Índice ascendente e único com os campos da chave primária. 2. Em colunas integrantes de constraints de chave estrangeira • Uma foreing key também cria um índice automático na tabela. São índices ascendentes e não únicos. 3. Em colunas integrantes de constraints de chave única • Sempre que definimos que uma determinada coluna é do tipo Unique, o InterBase já cria um índice ascendente e único na coluna respectiva. Em todos esses casos não há necessidade de se criar manualmente outros índices nas mesmas colunas. Dois índices iguais podem não fazer muita diferença no tempo de pesquisa, mas tornarão o InterBase mais lento na hora de manter os mesmos. QUANDO CRIAR ÍNDICES É fundamental a criação de índices principalmente nas seguintes situações: 1. Chaves primárias e chaves estrangeiras se não foram criadas como constraints. 2. Em colunas utilizadas por cláusulas ORDER BY e GROUP BY em Selects. 3. Busca com poucos valores únicos. Imaginem uma tabela com uma coluna Tipo_Cliente, onde existam apenas dois tipos de clientes – PF e PJ (Física e Jurídica). Mesmo que indexarmos essa coluna, a query abaixo não terá um ganho de performance com o índice, pois o InterBase acabará retornando um subset muito grande de registros. O tempo que o banco tem de buscar o índice e então encontrar o registro é praticamente o mesmo do que “varrer” a tabela toda: 3. Em outras colunas utilizadas frenquentemente como critérios de busca. Select * from Clientes where Tipo_Cliente = ‘PF’. QUANDO NÃO CRIAR ÍNDICES Em alguns casos a criação de índice pode até atrapalhar ao invés de ajudar: 1. Busca por critérios inexatos. Índices não são utilizados quando queremos, por exemplo, encontrar um valor calculado ou buscas utilizando algumas UDFs. São casos onde o InterBase terá que “varrer” toda a tabela, calcular valores e ai sim realizar a busca. 2. Busca por uma substring em uma coluna CHAR, VARCHAR, ou textos BLOB. Um query como a abaixo não conseguirá utilizar índice: Select * from Employee where EmpName like ‘%reira%’. Nesse sentido, para verificarmos se o índice está adequado à coluna, devemos verificar a Seletividade do índice. Utilizando uma ferramenta de conexão ao banco de dados, como por exemplo o IBExpert, podemos facilmente verificar a seletividade dos índices: Veja a Imagem 02. Quanto mais próximo de 0 (zero), melhor a seletividade do índice. Significa dizer que ele está “ponteirando” para mais registros únicos e que a chance do índice indicar pontualmente o registro desejado é maior. Quanto mais próximo de 1, significa que o índice aponta para muitos registros com valores iguais, ou seja, quando uma query utilizar o índice, o mesmo irá apontar para um faixa de registros semelhantes, e então a query deve, dessa faixa, encontrar o registro desejado. No exemplo acima temos índices com seletividade = 1. Significa que todos os registros dessa tabela Fevereiro 2010 21 possuem o mesmo valor na coluna referenciada pelo índice. Nesse caso o uso do índice é totalmente desnecessário. Podemos utilizar um comando SQL para reavaliar a seletividade de um índice: SET STATISTICS INDEX <NOME_ DO_INDICE> Imagem 03. É importante que o índice esteja com sua seletividade sempre atualizada, pois esse será um dos fatores principais que o otimizador do InterBase irá utilizar na hora de determinar qual o melhor índice a ser usado em uma pesquisa. MANUTENÇÃO DE ÍNDICES Uma grande falha que cometemos é de se esquecer da manutenção dos índices. Como já dissemos índices são ponteiros armazenados em páginas. Quando criamos um índice para uma coluna de nomes, por exemplo, o InterBase cria sua B-tree, sua estrutura de páginas de índices, equilibrando os ponteiros pelos registros existentes na tabela, marcando os pontos médios entre os registros: Veja a imagem 03. No gráfico acima, o índice Nome está marcando o ponto inicial, com nomes que iniciam com a letra A, o ponto médio com nomes que iniciam com a letra M e o ponto final com nomes que iniciam com a letra Z, de forma que esses pontos são equilibrados em relação à quantidade de registros na tabela. Se, ao longo do tempo, vamos inserindo registros na tabela, os ponteiros de índices vão ficando desbalanceados, ou seja, os pontos médios não representam mais os pontos de equilíbrio em relação aos registros da tabela. Veja a imagem 04. Esse efeito aumenta o que chamamos de profundidade do índice e diminui sua eficiência, pois o InterBase terá que procurar muito nas páginas de índice até encontrar o ponteiro exato para o registro desejado. 22 Fevereiro 2010 Imagem 04. Para resolver esse problema devemos reconstruir o índice, de forma que o InterBase recrie as páginas de índice e reencontre os pontos médios e o equilíbrio do índice. Podemos reconstruir índices utilizando o comando Alter Index: ALTER INDEX <NOME_DO_ INDICE> INACTIVE; ALTER INDEX <NOME_DO_ INDICE> ACTIVE; Quando desativamos e, em seguida, ativamos um índice, o mesmo é reconstruído e reorganizado, tornando-se eficiente novamente. Vale lembrar que, para desativar um índice, o mesmo não pode estar sendo utilizado por nenhum outro processo no banco de dados. Além disso, índices de chaves primárias, chaves estrangeiras e índices de sistema não podem ser desativados. Nesse caso, somente o processo de Backup e Restore do banco de dados conseguirá fazer a manutenção do índice. Outro ponto fundamental que devemos prestar atenção é a respeito do uso que Stored Procedures, Triggers e Views fazem dos índices. Esses objetos definem o índice que utilizaram em seus comandos DML internos no momento que são compilados. Ou seja, se mudamos ou criamos novos índices, esses objetos podem não utilizá-los. É preciso então recompilar esses objetos através dos comandos Alter Procedure, Alter Trigger e Drop View / Create View. Também nesses casos, o processo de Backup e Restore consegue corrigir o índice a ser utilizado nas queries. CONCLUSÃO Os índices são essências em qualquer banco de dados. Mas saber utilizá-los muda a forma com que tratamos nossas aplicações e nos permite um ganho consistente de performance e produtividade. E ferramentas de apoio, como o Performance Monitor por exemplo, se tornam obrigatórios nes- sas situações, permitindo encontrar facilmente problemas relacionados à índices, como pesquisas não indexadas e leituras sequênciais em excesso. Afinal, boas práticas, organização e métodos de qualidade estabelecidos não fazem mal a ninguém. Referência: InterBase 2009 Data Definition Guide – cap. 7. É isso ai pessoal. Nos vemos no próximo artigo. Até lá! Sobre o autor Felipe Santos Felipe Santos é especialista em InterBase. Trabalha com o InterBase desde 2001. atuando como consultor e instrutor do produto em todo Brasil. Especialista em ambientes críticos. Atua e trabalha com os maiores clientes do InterBase no Brasil. Participante ativo na comunidade, com diversos artigos publicados. Participante do grupo de beta testers mundial do produto. Palestrante em eventos como IB Tour, Borcon Conference, CodeRage Latin América, Delphi Developers Day, Linux Day, entre outros. Atualmente trabalhando na área técnica do InterBase na Presence Tecnologia – agente oficial especializado do produto no Brasil. [email protected] Fevereiro 2010 23 Novidades do Silverlight 4 Olá leitores da revista The Clube No edição anterior da revista falamos sobre interoperabilidade COM que veio disponível no Silverlight 4, hoje irei fazer um overview sobre as novidades do Silverlight 4. Durante a PDC de novembro de 2009 foi lançado o Silverlight 4 e com ele muitas coisas solicitadas pela comunidade foi incluso nessa nova versão, vamos ver algumas imagens que foram retiradas do Twitter de um dos “comunicadores” do Brasil na PDC09 Luciano Condé ( http://twitter.com/luconde - http:// blogs.msdn.com/conde ) Algumas novidades: 24 Imagem 1 Fevereiro 2010 Suporte a WebCam e microfone sendo possível bater fotos gravar videos, etc; Veja a Imagem 2. Identificação de Código de Barras ( impressionante ) Veja a Imagem 3. É possível fazer algumas “brincadeiras” com a WebCam Veja a Imagem 4. • Webcam and Microfone – Como visto nas imagens 1 2 e 3 o Silverlight saio na frente dos concorrentes e habilito o acesso WebCam e microfone, ou seja agora uma web cam pode ser transmitida em uma aplicação Silverlight. Imagem 2 • MultiCast Streaming - Name Space System.Net.Sockets a clientes multicast UDP. Permitindo que usuários possam usufruir mais dos recusros de redes MultiCast. • Output Protection - Protecção para fluxos de saída de áudio / vídeo permitindo que os proprietários de conteúdo ou distribuidores, para assegurar o conteúdo protegido só é visto através de uma conexão de vídeo seguro • Offline DRM - Novas funcionalidades integradas ao Silverlight DRM que pode ser utilizado para implementar cenários offline, incluindo a compra e download de filmes, shows e outros streaming, para quem não sabe o que é DRM consiste em restringir a difusão por cópia de conteudos digitais ao mesmo tempo em que se assegura e administra os direitos autorais e suas marcas registradas. Imagem 3 Veja a Imagem 5. • Printing - O meu favorito e acredito que de muita gente, suporte a Impressão, isso mesmo, suporte a impressão de documentos e interface do usuário direto da aplicação sem a necessidade de utilizar códigos de terceiros, Basta apenas indicar qual o UIElement que quer imprimir e pronto a impressão será realizada, muito bom. • Rich Text - Novo controle para fazer companhia ao TextBox e ao TextBlock exite o Ri- Imagem 4 Fevereiro 2010 25 chTextArea que permite inserir, e editar Rich Text, sendo possível aplicar formatações, caracteres especiais, parágrafos,etc. • Clipboard Access - Permite resgatar ou definir textos Unicode ao Clipboard. Existe restrição de usuário para essa área e permite apenas texto Unicode. • Right Click - Novos eventos aos UIElements MouseRightButtonDown e MouseRightButtonUp agora é possível mudar o comportamento do botão direito do mouse. • Mouse Wheel - Agora temos suporte ao Scroll do mouse nativamente ( excelente, chega de códigos de terceiros ). Imagem 5 Imagem 6 • Share Assemblies Across SL and .NET 4 – Agora é possível compartiliar Class Library de .NET com aplicações Silverlight sem a necessidade “Add as Link” como ocorria no Silverlight 3; • Data binding Improvements – Melhorias no Binding de dados com agrupamento de dados, edição e formatação de dados dentro da própria veiculação • UDP Multicast Support – Permite que as empresas deduzam o custo de streaming na transmissão de eventos, tais como reuniões, palestras, treinamentos e pode operar perfeitamente com a infra-estrutura do Windows Media Streaming Server. Imagem 6 • REST Enhancements – Melhorias em comunicação REST; • WCF Improvements e WCF ria Services – Classes empresariais de acesso a dados para a construção de aplicações n-tier e dentro dessas classes incluem as funções de paginação de dados, autenticação de dados, melhorias do trafego de dados bi-direcional e suporte a scripts complexos e suporte a 30 novas línguas como árabe, hebraico, tailândes e outras mais. Veja a Imagem 7. • Custom Window Chrome – Agora é possível rodar aplicações Silverlight no browser da Google o Chrome. 26 Fevereiro 2010 Imagem 7 • Local File System – Agora é possível ler e escrever arquivos através da aplicação Silverlight, pode-se acessar pastas como Meus Documentos do usuário, Minhas Musicas, Minhas Imagens e Meus Videos, o mesmo equivale para plataformas não windows. • Cross-Site Network – Aprimoramento de rede para permitir o acesso entre dominios sem um arquivo de política de segurança. • Keyboard in full Streen Mode – Acesso ao teclado quando a aplicação estiver em moto Full Screen • Hardware Device Access – Acesso ao Hardware ( apenas com permissões elevadas ) através de COM • COM Automation Support – Agora é possível se comunicar com outros aplicativos, como no artigo anterior que realizamos uma comunicação entre o Silverlight e o Skype agora você pode se comunicar com Word, Excel, e outros aplicativos que tenham uma API COM de comunicação. Apenas uma curiosidade, a alguns dias o Visual Studio 2010 RC foi lançado, vale lembrar que até o momento de fechamento desse artigo o Silverlight 4 não é compatível com o Visual Studio 2010 RC, uma versão do Silverlight 4 compatível com VS2010 RC deve sair na MIX 2010, (http://www.microsoft. com/events/mix ). Para quem quiser testar links para os beta do Silverlight 4 Site oficial - http://www.silverlight.net/getstarted/silverlight-4-beta Labs - http://www.silverlight.net/learn/handsonlabs Visual Studio 2010 Beta 2 - http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx Silverlight 4 Beta Tools for Visual Studio 2010 - http://go.microsoft.com/ fwlink/?LinkID=177508 Silverlight 4 SDK - http://go.microsoft.com/fwlink/?LinkID=169408 Windows Runtime - http://silverlight.dlservice.microsoft.com/download/F/6/5/F653F7FDAD4D-411D-8B1F-9C4B1BD69881/Silverlight_Developer.exe WCF RIA Services - http://www.silverlight.net/getstarted/riaservices/ Online Silverlight 4 Beta Documentation - http://go.microsoft.com/ fwlink/?LinkID=111305 Offline CHM help Silverlight 4 Beta Documentation file download - http://go.microsoft. com/fwlink/?LinkID=167824 Conclusão Estamos percebendo um grande evolução da tecnologia Silverlight, principalmente sabendo que ela ainda é uma tecnologia nova, lançada em 2007 e ja estamos superando os concorrentes em alguns aspectos, e agora com rumores que Silverlight será a linguagem de desenvolvimento para Windows Phone 7 e compatível com o iPhone acho que é a hora de se especializar no assunto e conseguir muito sucesso futuramente. Sobre o autor Djonatas Tenfen Trabalha a quase 7 anos com Delphi, trabalha na empresa Benner Sistemas (www.benner.com.br ) na área de tecnologia desenvolvendo ferramentas em Delphi e como hobby e visão de mercado está migrando seus conhecimentos para a plataforma .NET. Faz parte do grupo .NET Blumenau http://dotnetblumenau.ning.com/ . Possue certificação 70-536 (Microsoft .NET Framework 2.0 Application Development Foundation ) . Twitter: djonatastenfen - blog http://www.djonatastenfen.blogspot.com/ [email protected] Obrigado e até o próximo artigo. Fevereiro 2010 27 Dicas DELPHI Enviar emails com o programa padrão do Windows. Declare MAPI na uses. 0; 0; function EnviarEMail(const De, Para, Assunto, Texto, Arquivo: string; Confirma: Boolean): Integer; var Msg: TMapiMessage; lpSender, lpRecepient: TMapiRecipDesc; FileAttach: TMapiFileDesc; SM: TFNMapiSendMail; MAPIModule: HModule; Flags: Cardinal; begin // cria assunto e texto da mensagem FillChar(Msg, SizeOf(Msg), 0); with Msg do begin if (Assunto <> ‘’) then lpszSubject := PChar(Assunto); if (Texto <> ‘’) then lpszNoteText := PChar(Texto); // remetente if (De <> ‘’) then begin lpSender.ulRecipClass := MAPI_ORIG; lpSender.lpszName := PChar(De); lpSender.lpszAddress := PChar(De); lpSender.ulReserved := 0; lpSender.ulEIDSize := 0; lpSender.lpEntryID := nil; lpOriginator := @ lpSender; end; // destinatário if (Para <> ‘’) then begin lpRecepient.ulRecipClass := MAPI_TO; lpRecepient.lpszName := PChar(Para); lpRecepient.lpszAddress := PChar(Para); 28 Fevereiro 2010 nil; lpRecepient.ulReserved := lpRecepient.ulEIDSize := lpRecepient.lpEntryID := nRecipCount := 1; lpRecips := @lpRecepient; end else lpRecips := nil; //anexo if (Arquivo = ‘’) then begin nFileCount := 0; lpFiles := nil; end else begin FillChar(FileAttach, SizeOf(FileAttach), 0); FileAttach.nPosition := Cardinal($FFFFFFFF); FileAttach.lpszPathName := PChar(Arquivo); nFileCount := 1; lpFiles := @FileAttach; end; end; // carrega dll e o método para envio do email MAPIModule := LoadLibrary(PChar(MAPIDLL)); if MAPIModule = 0 then Result := -1 else try if Confirma then Flags := MAPI_DIALOG or MAPI_ LOGON_UI else Flags := 0; @SM := GetProcAddress(MAPIModule, ‘MAPISendMail’); if @SM <> nil then Result := SM(0, Application.Handle, Msg, Flags, 0) else Result := 1; finally FreeLibrary(MAPIModule); end; end; Não permitir que o aplicativo rode duas vezes na mesma máquina. Stored procedure para zerar os generators de um banco Firebird Na unit do Projeto ou no arquivo .dpr CREATE PROCEDURE SP_ZERA_GENERATORS program Project1; uses Forms, Windows, Dialogs, Unit1 in ‘Unit1.pas’ {Form1}; AS declare variable V_Nome_Generator varchar(50); declare variable V_SQL varchar(256); BEGIN FOR SELECT g.RDB$GENERATOR_NAME FROM RDB$GENERATORS g {$R *.res} var Aplicativo: THandle; begin Aplicativo := FindWindow(‘TApplication’, ‘Teste’); // Ele procura por um programa chamado Teste que não deve ser o nome do seu projeto WHERE (g.RDB$GENERATOR_NAME NOT LIKE ‘RDB%’) AND (g.RDB$GENERATOR_ NAME NOT LIKE ‘SQL%’) Into :V_Nome_Generator DO BEGIN V_SQL = ‘SET GENERATOR ‘ || :V_ Nome_Generator || ‘ TO 0’; execute statement V_SQL; END END { “Se teste não estiver aberto” } If (Aplicativo = 0) then begin Application.Initialize; Application.Title := ‘Teste’; {Aqui a aplicação recebe o nome de teste e na próxima tentativa de abertura haverá conflito com o FindWindow acima} Application.CreateForm(TForm1, Form1); Application.Run; end Else { “Se, emite uma mensagem de aviso” } Anuncie conosco e um Anuncie na revista e ganh site do The Club banner publicitário no to: Solicite um orçamen Skype: theclub_cadastro lub.com.br E-mail: cadastro@thec Fone: (14) 3732-1529 Showmessage(‘O aplicativo já está aberto’) end. Fevereiro 2010 29 Horizontal 30 Vertical Fevereiro 2010 Fevereiro 2010 Fevereiro 2010