Fevereiro 2010

Propaganda
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
Download