32
Fevereiro 2010

The Club - megazine - O maior clube de programadores do ... · Sabemos o quanto é notório a importância do 09 pacote Microsoft Office na vida de muitas empresas, e por ... planilhas

Embed Size (px)

Citation preview

Fevereiro 2010

Fevereiro 2010

Fevereiro 2010 03

Banco de Dados

Entendendo o uso adequado de Índices com o Interbase 19Autor: Felipe Santos

Desafio The Club

.NET

- Dicas Delphi

28Dicas

- Cruzada

30

Delphi

Banco de Dados

índiceCriando um componente de pesquisa

Editorial Delphi

09Sabemos o quanto é notório a importância do pacote Microsoft Office na vida de muitas empresas, e por mais ... 04

Integrando o Delphi 2010 ao Excel e Word.

05IDEs gráficas para MySQL

14 24

LegendaInicianteIntermediárioAvançado

Autor: Luciano Pimenta

Autor: Bruno AlcarásAutor: Djonatas Tenfen

Autor: Antonio Spitaleri

Fevereiro 201004

Bem-vindo

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Marcos César Silva - Editor [email protected]

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 à necessi-dade 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 lucrati-vidade do projeto, sem contar no ganho com futuras manutenções no sistema.

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 pode-mos avaliar e comparar as diferentes ferramentas abordadas, podendo escolher a que mais se adéqua as nossas necessidades.

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.

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.

Bom, é isto ai pessoal! Espero que todos aproveitem a leitura, e não se es-queçam de nos encaminhar suas dúvidas com relação os artigos deste mês.

Abraço a todos.

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações: (14) 3732-1529 Suporte: (14) 3733-1588

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected] Informações: [email protected] Cadastro: theclub_cadastro

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr

Copyright The Club Megazine 2009

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoTassiane Fileto

ColunistasAntonio Spitaleri Neto

Bruno AlcarásDjonatas TenfenFelipe Santos

Luciano Pimenta

Impressão e acabamento:GRIL - Gráfica e Editora

Taquarituba-SP - Tel. (14) 3762-1345

ReproduçãoA 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.

Fevereiro 2010 05

Delphi

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 Mi-crosoft 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 apli-cativos 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 tecno-logia 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 desenvolve-dor, o que facilita o trabalho de desenvolver aplicações integradas aos aplicativos da suíte Office da Microsoft.

Integrando o Delphi 2010 ao

Excel e Word

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.

Imagem 01

Fevereiro 201006

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 docu-mento da seguinte forma:

ADOS DO CLIENTE

NOME: @nomeRG: @rgCPF: @cpfESTADO CIVIL: @estcivil ENDEREÇO: @enderecoCIDADE: @cidadeCEP: @cepTELEFONE: @telefoneE-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 for-mulá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:

Veja a imagem 02.

O botão ‘limpar”, terá a seguinte codificação em seu evento Onclick:

Veja o Código 01.

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.

Para essa etapa é importante, a fim de facilitar a codificação, que o documento Word criado esteja

salvo na mesma pasta do aplicativo. No exemplo escolhi dados.doc como nome do documento.

Estaremos trabalhando com variáveis do tipo OleVariant que são um tipo definido pelo Delphi quando precisamos trabalhar com objetos OLE.

Segue o código do evento Onclick do botão “Salvar”:

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;

Veja o Código 02.

Teste o aplicativo e salve as alterações.

Integrando a aplicação com Excel

Na outra página do PageControl de nossa apli-cação, iremos realizar a exportação dos dados de

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;

Imagem 02

Código 02

Código 01

Fevereiro 2010 07

um clientdataset para uma planilha do Excel.

Da aba Servers adicionaremos três com-ponentes: ExcelApplication, ExcelWorkBook e ExcelWorksheet, que estarão representando res-pectivamente: 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 Clien-tdataset, clique com o botão direito sobre ele e se-lecione 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.

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:

// 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.Add(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

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,EmptyParam,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;

Imagem 03

Código 02

Fevereiro 201008

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;

Teste o aplicativo e salve as alterações.

Conclusão

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!

Consultor Técnico The Club.

Sobre o autor

Antonio Spitaleri Neto

[email protected]

Código 03

Fevereiro 2010 09

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 con-sultas 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 com-ponente 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

Criando um componente de pesquisa

Reutilize as telas de pesquisa da sua aplicação

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.

Nossa tela de pesquisa terá dois filtros: um para pesquisa pelo código, outro para pesquisa

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.

Veja a figura 02.

No código do formulário devemos criar alguns métodos e propriedades, conforme o código a

Fevereiro 201010

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 compo-nente 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 retorna-mos o primeiro campo (Field) do ClientDataSet.

Result := DataSet.Fields[0].AsInteger;

Claro, precisamos indicar o campo chave na consulta SQL (propriedades SQLCodigo e SQL-Descricao) 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 thenbegin FDataSet := Value; DataSource1.DataSet := FDataSet;end;

No código, atribuímos para a propriedade

Figura 2. Formulário de pesquisa

FDataSet.Close;if (rgLocalizar.ItemIndex = 0) thenbegin FDataSet.CommandText := FSQLCodigo; FDataSet.Params[0].AsInteger := StrToInt(edtLocalizar.Text);endelsebegin 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 can-celar 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 com-ponente:

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-

Fevereiro 2010 11

mos se foi apertado a tecla ENTER. Após, verifica-mos 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 proprie-dade 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 for-mulá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 sim-ples, que deixarei a cargo do leitor, mas a versão para download possui essas funcionalidades.

Criando o componente

Agora, precisamos criar uma unit, que re-ceberá 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, des-cendente 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 Clien-tDataSet associado a mesma, por excluído.

Isso evita erros no IDE do Delphi. Sua imple-mentaçã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 201012

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 for-mulário, assim podemos repassar para a consulta principal, o valor do registro.

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 FFor-mLocalizar. Por fim, o Register (abaixo de imple-metation), 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.

Listagem 3. Método Execute

O código é bastante simples, primeiro verifica-mos 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, configu-ramos 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 compo-nente, 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

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 Re-source. 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 confi-gurações.

Para os dois casos (Image Editor ou XN Re-

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;

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.

Figura 4. Criando um resource no XN Resource Editor

Fevereiro 2010 13

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 t a m b é m u m D a t a S e t 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 cd-sEmployee configure o CommandText para: “select * from EMPLOYEE where EMP_NO = :EMP_NO”.

Estamos selecionando todos os dados da ta-bela, 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 con-sulta, 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 retornan-do 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 cdsBuscaEm-ployee. Digite nas propriedades SQL do Localizar, os mesmos comandos mostrados anteriormente para cada propriedade SQL.

Adicione os campos do cdsEmployee no for-mulá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

Agora, simplesmente, precisamos usar o se-guinte código no botão:

if Localizar1.Execute thenbegin cdsEmployee.Close; cdsEmployee.Params[0].AsInteger := Localizar1.ReturnValue; cdsEmployee.Open;end;

Veja que o código é bem simples, onde verifi-camos se foi escolhido algum registro no formulário de consulta, usando o Execute. Após, simplesmen-

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

Conclusão

Vimos neste artigo como podemos criar com-ponentes 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é ini-cial, use sua criatividade para agilizar seu dia a dia de programador. Um grande abraço a todos!

É 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 Bussi-ness em Florianópolis-SC.

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

Fevereiro 201014

Nem sempre é agradável criar um banco e gerenciá-lo digitando os comandos no MyS-QL 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 ferra-mentas gráficas para MySQL.

Instalação do MySQL

Antes de iniciar este artigo vou demons-trar 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

IDE’s GRÁFICAS PARA MYSQL

isso não é necessário para usar o MySQL;

• Na próxima tela cli-que em Finish para iniciar a configuração do servidor;

• Escolha a opção stan-dard na tela de configuração do servidor;

• Nessa tela será per-guntado se você quer instalar o MySQL como serviço, mar-que 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 nos-so site no seguinte endereço: http://www.theclub.com.br/REVISTA/ACES0207.ASPX

Fevereiro 2010 15

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/gui-tools/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.

Onde:

• Stored Connection – por aqui você pode carregar seu perfil com as configurações anterior-mente criadas;

• Server Host – IP ou DNS do servidor onde está o MySQL, se estiver trabalhando local-mente 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 preen-chido 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 03.

Imagem 04.

Fevereiro 201016

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.

Para criar uma tabela clique com o botão direi-to 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/mysql-front .

Usando o SQL FRONT

Após executar a instalação lhe será apresen-tada a seguinte tela:

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 carac-teres usado que por padrão é o UTF-8.

Ao ser feita a conexão será apresentada a seguinte tela:

Imagem 05.

Imagem 06.

Fevereiro 2010 17

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 digi-tam suas consultas SQL;

• Diagrama – local para se montar um dia-grama e ver o relacionamento entre as tabelas.

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.

3) EMS SQL MANAGER FOR MYS-QL

O EMS SQL Manager é uma poderosa ferra-menta 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

encontrada no seguinte endereço http://www.sqlmanager.net/en/products/mysql/manager/do-wnload, existe também uma versão comercial.

Usando o EMS

Após a instalar e iniciar o programa será apre-sentada a seguinte tela:

Veja a imagem 10.

Para criar um banco vá ao menu Database e es-colha 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 pressio-nar Shift + Control + R.

Tela de criação de tabelas:

Imagem 09.

Imagem 10.

Fevereiro 201018

Veja a iamgem 11.

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);

Consultor Técnico The Club.

Sobre o autor

Bruno Alcarás

[email protected]

• 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 sof-twares para isso, cada usuário deve escolher a que melhor se adaptar as suas necessidades.

Espero que tenham gostado e até outra hora.

Fevereiro 2010 19

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 ambien-tes, 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 extrema-mente saturado. Um relatório importante demorava cerca de 30 minutos para ser exe-cutado. Imaginem aguardar 30 minutos para extrair um relatório? É tempo demais. O que

ENTENDENDO O USO ADEQUADO DE ÍNDICES COM O

INTERBASE

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 nor-malmente. 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 sof-tware 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

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 pesqui-sa, 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 qual-quer 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 adequada-mente 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 dese-jada 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, retornan-

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 espe-cificas 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 absur-da, 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 perfor-mance 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 recur-sos 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 ASCENDINGINDEX 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 re-gistros 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 co-luna 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 01.

Fevereiro 2010 21

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 auto-maticamente índices de apoio:

1. Em colunas definidas como parte de uma chave primária

• Quando definimos uma chave pri-mária na tabela, o InterBase cria automati-camente um Índice ascendente e único com os campos da chave primária.

2. Em colunas integrantes de cons-traints 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 cons-traints de chave única

• Sempre que definimos que uma determinada coluna é do tipo Unique, o In-terBase 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 tor-narão o InterBase mais lento na hora de manter os mesmos.

QUANDO CRIAR ÍNDICES

É fundamental a criação de índices principal-mente nas seguintes situações:

1. Chaves primárias e chaves estrangei-ras se não foram criadas como constraints.

2. Em colunas utilizadas por cláusulas ORDER BY e GROUP BY em Selects.

3. Em outras colunas utilizadas fren-quentemente como critérios de busca.

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%’.

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:

Select * from Clientes where Tipo_Cliente = ‘PF’.

Nesse sentido, para verificarmos se o índice está adequado à coluna, devemos verificar a Sele-tividade do índice. Utilizando uma ferramenta de conexão ao banco de dados, como por exemplo o IBExpert, podemos facilmente verificar a seletivi-dade 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

Imagem 02.

Fevereiro 201022

possuem o mesmo valor na coluna referenciada pelo índice. Nesse caso o uso do índice é totalmente desnecessário.

Podemos utilizar um comando SQL para rea-valiar a seletividade de um índice:

SET STATISTICS INDEX <NOME_DO_INDICE>

É importante que o índice esteja com sua sele-tividade 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 existen-tes na tabela, marcando os pontos médios entre os registros:

Veja a imagem 03.

No gráfico acima, o índice Nome está marcan-do 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 ini-ciam 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 pro-fundidade 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.

Para resolver esse problema devemos recons-truir 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 co-mando 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

Imagem 03.

Imagem 04.

Fevereiro 2010 23

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 produtivida-de. E ferramentas de apoio, como o Performance Monitor por exemplo, se tornam obrigatórios nes-

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.

Sobre o autor

Felipe Santos

[email protected]

sas situações, permitindo encontrar facilmente pro-blemas 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.

É isso ai pessoal. Nos vemos no próximo artigo. Até lá!

Referência:

InterBase 2009 Data Definition Guide – cap. 7.

Fevereiro 201024

Olá leitores da revista The Clube

No edição anterior da revista falamos so-bre 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:

Nov idades do

Silverlight 4

Imagem 1

Fevereiro 2010 25

Suporte a WebCam e microfone sendo possível bater fotos gravar videos, etc;

Veja a Imagem 2.

Identificação de Código de Barras ( impres-sionante )

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.

• MultiCast Streaming - Name Space System.Net.Sockets a clientes multicast UDP. Per-mitindo 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 utili-zado 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.

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 2

Imagem 3

Imagem 4

Fevereiro 201026

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 UIEle-ments MouseRightButtonDown e MouseRightBut-tonUp 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 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 – Melho-rias 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 perfeita-mente com a infra-estrutura do Windows Media Streaming Server.

• 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.

Imagem 5

Imagem 6

Imagem 7

Fevereiro 2010 27

• 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 ).

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.

Obrigado e até o próximo artigo.

Trabalha a quase 7 anos com Delphi, trabalha na empresa Benner Sistemas (www.benner.com.br ) na área de tecnologia desenvolvendo fer-ramentas 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/

Sobre o autor

Djonatas Tenfen

[email protected]

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/F653F7FD-AD4D-411D-8B1F-9C4B1BD69881/Silverlight_Developer.exe

WCF RIA Services - http://www.silverlight.net/getstarted/riaservices/

O n l i n e S i l ve r l i g ht 4 B eta D o c u m e ntat i o n - htt p : / /go . m i c ro s o f t . co m /fwlink/?LinkID=111305

Offline CHM help Silverlight 4 Beta Documentation file download - http://go.microsoft.com/fwlink/?LinkID=167824

Fevereiro 201028

Dicas DELPHI

Enviar emails com o programa padrão do Windows.

Declare MAPI na uses.

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);

lpRecepient.ulReserved := 0; lpRecepient.ulEIDSize := 0; lpRecepient.lpEntryID := nil; 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;

Fevereiro 2010 29

Anuncie

conosco

Solicite um orçamento:

Skype: theclub_cadastro

E-mail: [email protected]

Fone: (14) 3732-1529

Anuncie na revista e ganhe um

banner publicitário no site do The Club

Não permitir que o aplicativo rode duas vezes na mesma máquina.

Na unit do Projeto ou no arquivo .dpr

program Project1;

uses Forms, Windows, Dialogs, Unit1 in ‘Unit1.pas’ {Form1};

{$R *.res}var Aplicativo: THandle;beginAplicativo := FindWindow(‘TApplication’, ‘Teste’);

// Ele procura por um programa chamado Teste que não deve ser o nome do seu projeto

{ “Se teste não estiver aberto” }If (Aplicativo = 0) thenbeginApplication.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;endElse

{ “Se, emite uma mensagem de aviso” }

Showmessage(‘O aplicativo já está aberto’)end.

Stored procedure para zerar os generators de um banco Firebird

CREATE PROCEDURE SP_ZERA_GENERATORS

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

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

Fevereiro 201030

VerticalHorizontal

Fevereiro 2010

Fevereiro 2010