Você está na página 1de 31

Revista The Club Megazine - 02/2004

A utilizao, reproduo, apropriao, armazenamento em banco de dados,


sob qualquer forma ou meio, de textos, fotos e outras criaes intelectuais
em cada publicao da revista The Club so terminantemente proibidos
sem autorizao escrita dos titulares dos direitos autorais.
Copyright The Club 2004
EDITORIAL

Editorial
Ol amigos,

Estamos aqui com mais uma edio da The Club Megazine e como sempre,
trazendo dicas e informaes teis ao seu dia-a-dia. Para comear, algumas dicas sobre
THE CLUB o Delphi 8 (Delphi For .Net), o qual estamos testando e trilhando novamente o caminho
Av. Celso Ferreira da Silva, 190 das pedras!
Jd. Europa - Avar - SP - CEP 18.707-150
Informaes: (0xx14) 3732-3689
Continuando, um artigo sobre a apresentao de relatrios na web, mesclando
Suporte: (0xx14) 3733-1588 - Fax: (0xx14) 3732-0987 Intraweb com Rave Reports, obtendo um resultado bastante interessante. Por falar em
web, apresentamos uma prvia do Delphi 8, para que voc possa conhecer a nova IDE,
Internet componentes, etc, enfim, realmente um novo Delphi!
http://www.theclub.com.br Nosso amigo Facunte, traz a segunda parte do artigo demonstrando como criar
Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br uma aplicao web com o polmico Intraweb, demonstrando que nem tudo est perdido
Informaes: info@theclub.com.br e que possvel extrair muita coisa boa dessa ferramenta. Continuando, demonstramos
uma funcionalidade bastante interessante no Rave Reports, onde possvel efetuar
Dvidas conexes com banco de dados, sem utilizar as engines de conexo do Delphi, com
Correspondncia ou fax com dvidas devem ser
enviados ao - THE CLUB, indicando "Suporte". certeza, esta ferramenta ainda tem muito ser explorada. Devido a muitas solicitaes,
estamos publicando a primeira parte de um tutorial sobre dbExpress, explicando seu
Opinio funcionamento e apresentando dicas de como portar aplicaes BDE para dbExpress.
Se voc quer dar a sua opinio sobre o clube em E para encerrar, nossa sesso Perguntas e Respostas, na qual selecionamos
geral, mande a sua correspondncia para a seo
"Tire sua dvida". algumas das perguntas que chegaram aos nossos tcnicos, procurando fazer um
intercmbio de informaes entre os associados The Club.
Reproduo Boa leitura e um timo carnaval todos!
A utilizao, reproduo, apropriao,
armazenamento em banco de dados, sob qualquer
forma ou meio, de textos, fotos e outras criaes
intelectuais em cada publicao da Revista
The Club so terminantemente proibidos sem
autorizao escrita dos titulares dos direitos
autorais.

Copyright The Club 2004 Celso Jefferson Paganelli


Presidente - The Club
Impresso e acabamento:
Impressos Gril - Gril Grfica e Repr. Ind. Ltda.
Tel.: (0xx14) 3762.1345 - Fax: (0xx14) 3762.1259
Rua So Paulo, 447 - Cep 18.740-000
Taquarituba - SP
Tiragem: 5.000 exemplares
Editorial ............................................................................ 03
Diretor - Presidente
Dicas & Truques ................................................................. 04
Celso Jefferson M. Paganelli Rave Report com Intraweb ................................................. 05
Uma viso geral do Delphi 8 for .NET................................. 10
Diretor Tcnico
Mauro SantAnna
Retrospectiva .................................................................... 16
Cadastro de Clientes com Intraweb - Parte II ..................... 18
Colaboradores
Emerson Facunte
Rave Report - Conectando banco de dados via Rave .......... 21
Delphi marca registrada da Borland International, as
demais marcas citadas so registradas pelos seus
Migrando aplicaes BDE para dbExpress .......................... 24
respectivos proprietrios.
Perguntas & Respostas ...................................................... 30

MeGAZINE 3
Dicas & TTruques
ruques

Delphi 8 (For .Net) Como chamar Delphi 8 (For .Net) Requisitos


uma pgina em um nova janela mnimos para rodar...

Neste simples exemplo demonstramos como chamar uma Para voc que deseja instalar o Delphi 8 (For .Net), segue
pgina, porm, abrindo em uma nova janela do browser, abaixo os requisitos mnimos para poder rod-lo:
lembrando que aqui estamos nos referindo a um Asp.Net - Microsoft Windows 2000 (SP2 ou superior recomendado)
Application. - Microsoft Windows XP Professional
- Microsoft Windows Server 2003
Uses -Microsoft Internet Explorer 6.0 SP1 ou superior
Borland.Vcl.SysUtils; -Delphi 8 for .NET requer aproximadamente 225 MB de
procedure TWebForm1.Page_Load( espao em disco para a instalao completa.
sender: System.Object; e: System.EventArgs); -O .NET Framework verso 1.1 requer aproximadamente
var 150 MB de espao em disco.
URL, Opt: String; -O .NET Framework SDK verso 1.1 requer
begin aproximadamente 850 MB de espao em disco.
if not IsPostBack then -Pentium 233 MHz Intel ou superior (recomendado P3,
begin 1Ghz)
URL := QuotedStr(http://www.theclub.com.br); -128 MB RAM (recomendado 512)
Opt := QuotedStr(_new);
btnTheClub.Attributes.Add(
onClick, window.open(+URL+,+Opt+)); Delphi 8 Erro: Unable to attach to
end; ASP.NET worker process (typically aspnet_
end; wp.exe or w3wp.exe)
Caso voc instale o IIS aps a instalao do .Net Framework, e
Para chamar uma pgina sem abrir uma nova janela, utilize tente rodar uma aplicao Asp.Net, ir receber o erro acima, e
o seguinte: para solucionar, basta executar o seguinte comando: c:\windows\
Response.Redirect(index.aspx); microsoft.net\framework\v1.1.4322\aspnet_regiis.exe -i

4 MeGAZINE
Delphi

Rave Report com IntraWeb


Por Andr Colavite

Neste artigo iremos criar um pequeno projeto IntraWeb onde publicada em nossa revista de Janeiro de 2003.
geramos alguns relatrios atravs do Rave Report. A
apresentao dos relatrios na Web consiste na possibilidade do O projeto do Rave utilizado nesta matria estar disponvel
Rave Report gerar arquivos no formato HTML e PDF, pois para download atravs do link no final da matria.
iremos utilizar esses recursos para gerar esses arquivos, do
relatrio solicitado, e depois mostr-lo ao usurio no Browse. Como primeiro passo do projeto, vamos criar um novo projeto
Intraweb no Delphi7.
Iniciando os trabalhos
Como o assunto principal dessa matria criar o projeto Para isso selecione o menu File / New e a opo Other.
Intraweb com Rave Report, ento no entrarei nos detalhes da Selecione a aba IntraWeb e depois escolha a opo Intraweb
criao do relatrio. Caso tenha alguma dvida veja matria Application Wizard e clique em Ok.

Um detalhe importante: Essa opo de criao do


projeto Intraweb, est disponvel no delphi ao qual o
IntraWeb j foi atualizado.

Na prxima janela iremos selecionar a opo


StandAlone Application e no Options iremos
selecionar a opo Create Datamodule, conforme
figura 2.

Neste momento temos um projeto contendo um


IWForm e um DataModule, ambos em branco.

Informaes importantes sobre o projeto do Rave


Report

O projeto do Rave Report que criei foi gerado


utilizando o arquivo Employee.GDB, que vem como
exemplo no Delphi, e para visualizar os dados dentro
do projeto do Rave utilizei um componente do tipo
TRvDataSetConnection chamado
Figura 1: Criando um novo projeto Intraweb. RvDataSetConnection1.

MeGAZINE 5
Delphi

O passo seguinte criar a instruo de Select ao


qual nos dar acesso aos dados da tabela Customer.
Sendo assim coloque no Datamodule um componente
SQLQuery e ligue em sua propriedade
SQLConnection o componente SQLConnection1.

Em seguida coloque no datamodule um


componente DataSetProvider, ligue a sua
propriedade DataSet ao componente SQLQuery1 e
em sua propriedade Options altere a opo
poAllowCommandText para True.

Como ltima opo desse acesso aos dados,


coloque no datamodule um componente
ClientDataSet1 e indique na sua propriedade
ProviderName o componente DataSetProvider1 e na
sua propriedade CommandText coloque a seguinte
instruo de Select.
SELECT CUST_NO, CUSTOMER,
Figura 2 CONTACT_FIRST, CONTACT_LAST
FROM CUSTOMER WHERE CUSTOMER LIKE :Letra
Conectando o banco de dados
Mediante essas informaes vamos criar a conexo ao banco Acessando o projeto do Rave Report
de dados, para isso coloque no Datamodule o componente Estando com a conexo ao banco de dados criada, iremos
SQLConnection e crie a conexo ao GDB. O arquivo agora fazer as ligaes dos componente do Rave Report. Para isso
Employee.gdb normalmente fica no seguinte diretrio: coloque no datamodule os componentes RvProject1, RvSystem1 e
C:\Program Files\Common Files\Borland RvDataSetConnection1.
Shared\Data\Employee.GDB
No componente RVDataSetConnection1 iremos ligar a sua
As configuraes do SQLConnection ficaro idnticas as propriedade DataSet ao componente ClientDataSet1.
mostradas na figura3.
No componente RVSystem iremos alterar as suas
propriedades SystemSetup e
SystemOptions onde desligaremos todas as
opes e na sua propriedade DefaultDest
iremos indicar a opo rdFile.

No componente RvProject no iremos


fazer configuraes neste momento, pois as
suas propriedades sero configuradas via
programao.

Como o nosso projeto ir gerar


arquivos .HTM e .PDF a partir do
resultado do relatrio, ento devemos
incluir tambm no datamodule os
componentes RvRenderHtml1,
RvRenderPDF1 e RvNDRWriter1.

Figura 3 No componente RvNDRWriter1, altere

6 MeGAZINE
Delphi
a sua propriedade StreamMode para o valor smUser.

Neste momento o nosso datamodule est pronto, contendo No IWEdit1 apague o texto da sua propriedade Text.
todos os componentes que iremos utilizar, conforme podemos
observar na figura 4. No IWButton1 iremos configurar a sua propriedade Caption
com o texto: Filtrar
D duplo click sobre o componente IWButton1 e no seu evento
onclick escreva a seguinte instruo:

procedure TIWForm1.IWButton1Click(Sender: TObject);


begin
DataModule1.ClientDataSet1.Close;
Datamodule1.ClientDataSet1.Params.ParamByName(Letra).
AsString := IWEdit1.Text+%;
DataModule1.ClientDataSet1.Open
end;

Neste momento o nosso form ficar igual a figura 5.

Figura 4

Criando o form de chamada do


relatrio
Neste momento iniciaremos a criao do form
onde o usurio visualizar os dados e tambm
poder chamar os relatrios.

Sendo assim visualize o IWForm e dentro dele


coloque os seguintes componentes:
DataSource1
IWDBGrid1
IWLabel1
IWEdit1
IWButton1

Para podermos selecionar na propriedade


DataSet do DataSource1 o componente
ClientDataSet1 que est no datamodule, temos
que declarar na seo implementation da unit a
instruo Uses DatamoduleUnit;
Em seguida visualize novamente o
componente DataSource1 e selecione o
DataModule1.ClientDataSet1 na sua propriedade DataSet.
Figura 5
O prximo componente ser o IWDBGrid onde selecionaremos
Arquivo Relatorio.rav
em sua propriedade DataSource o componente DataSource1.
Uma informao importante, o arquivo Relatrio.rav, que
contem a estrutura do relatrio, foi colocado num subdiretrio
No componente IWLabel1 iremos configurar a sua
chamado files e est sendo indicado na propriedade ProjectFile, do
propriedade Caption com o seguinte texto: Filtrar os Clientes
componente RvProject1, via programao, conforme poder ser
iniciados com:
observado na instrues que iremos criar a seguir.

MeGAZINE 7
Delphi
Visualizando os relatrios RvProject1.Execute
Nos passos seguintes iremos montar a visualizao do finally
relatrio no formato HTML e PDF. Sendo assim coloque no form RvProject1.Close;
os componentes IWRadioGroup1, IWLabel2, IWButton2 e end;
IWButton3, para assim podermos mostrar na tela a opo para o end;
usurio selecionar em qual formato ser apresentado o relatrio. { Apresenta uma nova janela com o arquivo gerado }
Nesses componentes faremos as seguintes configuraes: AddToInitProc(window.open(/files/
+sArquivo+,,););
IWRadioGroup1, indique na propriedade Items os valores, end;
HTML e PDF.
O prximo exemplo que iremos criar far o mesmo resultado,
IWLabel2, coloque na propriedade Caption o texto, Gerar isso , criar os arquivos .HTML e .PDF mas utilizando para isso
Relatrio em: os componentes RvNDRWriter1, RvRenderHTML1 e
RvRenderPDF1.
IWButton2, coloque na propriedade Caption o texto,
Gerar atravs do RvSystem A seguir poderemos ver as instrues no evento onclick do
IWButton3:
No evento onclick deste componente IWButton2, iremos
incluir as instrues responsveis pela criao e apresentao do procedure TIWForm1.IWButton3Click(Sender: TObject);
relatrio no formato selecionado. var
A criao dos arquivos .HTML e .PDF ser realizada pelos stream: TMemoryStream;
componentes RvSystem1, RvRenderHTML1 e RvRenderPDF1. sArquivo: string;
begin
A seguir poderemos ver as instrues no evento onclick do With DataModule1 do
IWButton2: begin
RvProject1.Engine := RvNDRWriter1;
procedure TIWForm1.IWButton2Click(Sender: TObject); stream:=TMemoryStream.create;
var try
sArquivo: string; RvProject1.ProjectFile:=WebApplication.
begin ApplicationPath+files\Relatorio.rav;
With DataModule1 do RvNDRWriter1.Stream := stream;
begin RvProject1.Open;
if IWRadioGroup1.ItemIndex = 0 then // HTML RvProject1.Execute;
begin sArquivo:=WebApplication.AppID;
sArquivo := WebApplication.AppID+.html; if IWRadioGroup1.ItemIndex = 0 then // HTML
RvSystem1.RenderObject := RvRenderHTML1; begin
end RvRenderHTML1.PrintRender(stream,WebApplication.
else // Formato PDF ApplicationPath+ files\+sArquivo+.html);
begin sArquivo := sArquivo+1.html;
sArquivo := WebApplication.AppID+.pdf; end
RvSystem1.RenderObject := RvRenderPDF1; else // Formato PDF
end; begin
RvProject1.Engine := DataModule1.RvSystem1; sArquivo := sArquivo+.pdf;
RvSystem1.DoNativeOutput := False; RvRenderPDF1.PrintRender(stream,WebApplication.
RvSystem1.OutputFileName := WebApplication. ApplicationPath+files\+sArquivo);
ApplicationPath+files\+sArquivo; end;
RvProject1.ProjectFile :=WebApplication. finally
ApplicationPath+files\Relatorio.rav; RvProject1.Close;
try stream.free;
RvProject1.Open; end;

8 MeGAZINE
Delphi
end;
{ Apresenta uma nova janela
com o arquivo gerado }
AddToInitProc(window.open(
/files/+sArquivo+
,,););
end;

Observao: Eu recomendo que em


seus projetos utilize apenas uma das
duas formas para trabalhar, pois neste
projeto aps executar essa segunda
forma de criao do arquivo .PDF se
tentarmos executar a primeira forma
novamente ocorre um erro de Access
Violation.

E at o momento no consegui
identificar como resolver este erro, mas
usando apenas uma das duas formas
esse erro no ser gerado.

Aps colocarmos todos os


componentes no form e configura-los o
nosso IWForm ficar parecido com a
figura 6.

Dica importante sobre o Rave


Report
Essa dica bastante importante, pois para o Rave Report Figura 6: IWForm contendo todos os componentes do projeto.
funcionar num projeto chamado por vrias mquinas ao mesmo
tempo, necessrio indicar um DataID para cada projeto, pois desse projeto, devido a facilidade com que o Rave Report exporta o
assim no ocorrer conflitos entre as suas execues. relatrio para os formatos desejados. Lembrando que podemos
fazer essas exportaes mesmo em projetos simples que no sero
Esse DataID ser definido no arquivo ServerController do executados na Web.
nosso projeto e para isso declare na lista de Uses as units:
Um grande abrao a todos e at a prxima.
RPDefine
Download
Depois dentro do Constructor TUserSession.Create O projeto de exemplo deste artigo est disponvel para
inclua a seguinte instruo: download em:

RPDefine.DataID := WebApplication.AppID; http://www.theclub.com.br/revista/download/IWRave.zip

Concluso:
Neste momento estamos com o nosso projeto pronto, basta Sobre o autor
executa-lo para podermos visualizar os relatrios em nosso
navegador atravs dos arquivos .HTML ou .PDF. Andr Colavite
Consultor Tcnico do The Club
Podemos observar que foi bastante simples a montagem colavite@theclub.com.br

MeGAZINE 9
Delphi

Uma viso geral do Delphi 8 for .NET


Por Claudinei Rodrigues nei@theclub.com.br

O objetivo deste artigo dar-lhe uma viso geral do que voc como voc pode ver na figura 1. Quem teve a oportunidade de ver
encontrar no Delphi 8 for .NET. Mostrar-lhe as novidades desta o C# Builder poder notar que ambas as IDEs so iguais e que
nova verso e comentar sobre a migrao de suas aplicaes so similares a IDE do Microsoft Visual Studio .NET.
desenvolvidas em verso anteriores para o Delphi 8 for .NET.
Na minha opinio a IDE do Delphi ficou melhor, pois tem um
Uma nova IDE layout mais limpo e altamente configurvel dando a voc
A caracterstica mais bvia do Delphi 8 for .NET a sua IDE, inmeras opes com respeito a sua configurao.

Figura 1: IDE do
Delphi 8 for .NET

10 MeGAZINE
Delphi
Qualquer um que j tenha trabalho com o Delphi 7 no ter expandidos ou ocultados bastando para isto clicar sobre o titulo de
dificuldades em trabalhar com esta nova verso. As ferramentas, cada categoria. Alm disto, voc pode ir diretamente a uma
opes e as caixas de dilogo so encontradas geralmente com o determinada categoria clicando sobre o boto Categories e
mesmo nome ou selees similares do menu. selecionar a categoria desejada.

O editor de cdigo outro local onde voc encontrar o Code A barra de ferramentas sensvel ao contexto, ou seja, ela vai
Insight, code templates, o todo list como na verso anterior do mostrar apenas aqueles componentes que so apropriados ao tipo
Delphi. Outra similaridade a combinao de teclas e itens do de objeto que voc est trabalhando no momento. Por exemplo, se
menu relacionados ao editor de cdigo que continuam as voc est trabalhando em um Windows Forms, a barra de
mesmas. Por exemplo, ao pressionar a tecla F5 possvel incluir ferramentas mostrar os componentes que voc poder utilizar
um breakpoint, F9 para rodar a aplicao, F7 para Trace Into e neste tipo de formulrio, se voc estiver em um ASP.NET Web
etc. Form, voc ter acesso aos componentes compatveis com este
form.
Mas existem algumas diferenas. A modificao mais notvel
pode ser encontrada na barra de ferramentas como mostrada na Inicialmente a barra de ferramentas contm um pequeno,
figura 2, que diferente da palheta de componentes do Delphi 7. mas bem escolhida, coleo de objetos que podem ser
configuradas dentro da IDE. Por exemplo, ainda que a verso 1.1
do .NET Framework inclua aproximadamente 4.500 classes
diferentes, a barra de ferramentas tem menos de 100
componentes.

Voc pode adicionar ou remover componentes a partir da


barra de ferramentas. Para isto v at o menu do Delphi e clique
em Components | Installed .NET Components ou clique com o
boto direito sobre a barra de ferramentas e selecione Installed
.NET Components... Isto ir lhe mostrar a caixa de dilogo .NET
Components, como mostrada na figura 3.

Se voc quiser que um determinado componente listado nesta


caixa de dilogo seja includo na barra de ferramentas, basta que
voc clique no checkbox do lado esquerdo ao nome do componente
que ele aparecer dentro da sua categoria. Caso queira remover o
componente basta desmarcar o checkbox.

Como voc deve ter notado aqui tambm que voc instala os
objetos no gerenciados COM e ActiveX que voc quer utilizar em
sua aplicao e tambm os componentes da VCL.NET ( a
biblioteca de componentes visuais para .NET. Mas veremos isto
mais adiante).

Os cdigos no gerenciados em DLLs tambm podem ser


Figura 2: Barra de ferramentas
utilizados no Delphi 8 para aplicaes .NET, mas eles so
acessados utilizando uma tcnica diferente.
Os objetos podem ser adicionados ao seu projeto clicando e
arrastando para o seu formulrio. Um recurso interessante a Outro aspecto da IDE que est um pouco diferente so as
pesquisa de objetos. Voc pode digitar na caixa de dilogo <Search vrias opes de caixas de dilogo, incluindo as caixas de dilogo
Tools> o nome do componente que quer localizar. Este tipo Options e Project Options.
pesquisa funciona igual ao Component List presente no Delphi 7.
Neste caso a interface est um pouco diferente, um treeview
Os objetos so organizados por categoria e podem ser do lado esquerdo da caixa de dilogo mostra as categorias ao

MeGAZINE 11
Delphi

Figura 3:
Componentes
.NET instalados

Figura 4: Caixa de
dilogo Options

invs da interface utilizando o tabbed notebook das verses


anteriores. Os vrios itens dentro destas caixas de dilogo Outra nova caixa de dilogo o Data Explorer, como voc
tambm so familiares. pode ver na figura 5. Esta caixa de dilogo fornece a voc um
excelente visualizador para verificar as conexes disponveis
Veja a caixa de dilogo Options na figura 4. usando o Borland Data Providers ou BDP.NET. A partir desta

12 MeGAZINE
Delphi
caixa de dilogo voc pode arrastar as tabelas, views ou stored ASP.NET Web Forms
procedures para qualquer WinForm ou WebForm. Use o ASP.NET Web Forms para criar aplicaes que podem
ser acessadas por qualquer Web browser em qualquer
plataforma. Voc usa as classes .NET para criar uma aplicao
ASP.NET. O form consiste de uma representao visual de um
HTML e um arquivo de cdigo. Para acessar ASP.NET Web
Forms, v at o menu do Delphi 8 for .NET e clique em File |
New | ASP.NET Web Application.

VCL Forms
Use VCL Forms para criar aplicaes que usam componentes
VCL.NET para rodar no .NET Framework. Voc usa o Borland
Visual Component Library for .NET para criar uma aplicao
VCL Form. Os VCL Forms so especialmente teis se voc quer
passar uma aplicao j existente contendo controles VCL para o
ambiente .NET ou se voc j est familiar com o VCL e prefere
us-lo.
Para acessar VCL Forms, v at o menu do Delphi 8 for
.NET e clique em File | New | VCL Forms Application.

Facilidade no desenvolvimento Web


Quando voc arrasta um componente para um WebForm o
Delphi gera o cdigo HTML correspondente, inserindo-o a um
arquivo com a extenso .ASPX associado com o WebForm.
Igualmente se o componente um que tem controle de eventos
como por exemplo, um Button, o Delphi adiciona a classe
referente classe WebForm no editor de cdigo, que o arquivo
que contm as instrues Delphi que sero executadas no
servidor. Veja na figura 6 um exemplo de WebForm em tempo de
Figura 5: Data Explorer design.
O interessante desta nova verso do Delphi que ele permite
que voc desenvolva em WebForm de forma muito similar ao Suporte total ao .NET
trabalho com WinForms e VCL.NET, permitindo assim construir Diferente do Borland C# Builder, o qual usa o compilador
pginas Web com uma interface visual. Veja a seguir como criar Microsoft C# sob licena, o Borland Delphi 8 for .NET utiliza um
aplicaes Windows Forms, ASP.NET Web Forms e VCL Forms. novo compilador .NET da Borland.

Windows Forms Quando voc compila um projeto feito em Delphi 8 for .NET,
Use Windows Forms para criar aplicaes nativas Windows este novo compilador usa o Microsoft Intermediate Language
que rodem em ambientes gerenciados. Voc usa classes .NET (MSIL), uma CPU independente de instrues que so
para construir clientes Windows que oferecem duas grandes convertidas para o cdigo nativo, normalmente por um
vantagens. Ele permite que voc utilize caractersticas no compilador em tempo de execuo (Just-in-Time). Este MSIL
disponveis para clientes do browser. equivalente ao qual gerado por qualquer compilador Microsoft
incluindo aqueles para o C# e o Visual Basic .NET.
O Windows Forms combina o melhor dos dois mundos,
apresentando um modelo de programao que tira vantagens de Por causa do Delphi 8 incluir uma linguagem completa
um unificado .NET Framework e do rico GUI do Windows. Voc .NET, ele tem acesso ao .NET Framework Class Library (FCL),
usa controles do Windows como botes, listbox, caixas de texto uma abrangente classe de bibliotecas, tipos e smbolos que
para criar suas aplicaes. Para acessar Windows Forms, v at constituem o .NET equivalente a VCL do Delphi. As classes do
o menu do Delphi 8 for .NET e clique em File | New | Windows FCL fornecem um extensivo suporte para acesso a dados
Forms Application. (ADO.NET), WebForms (ASP.NET e Web Services), WinForms

MeGAZINE 13
Delphi

Figura 6: WebForm em tempo de design

(desenvolvimento GUI Windows), desenvolvimento XML e muito tambm sero adicionadas em futuras verses do compilador
mais. Delphi Win32. Isto ser feito para assegurar que o seu cdigo
continue compatvel com os vrios compiladores da linguagem
Alm disso, os desenvolvedores que utilizam o Delphi 8 .for Delphi.
NET tem acesso transparente a qualquer classe pblica
declarada em legtimo ambiente .NET. Isto significa que todos os Indo alm do .NET FCL
componentes de terceiros .NET sero facilmente acessados pelo Ainda que o Delphi 8 for .NET fornea total suporte para o
Delphi 8 for .NET sem levar em considerao a linguagem a qual FCL, ele vai bem mais alm, tornando a linguagem Delphi uma
ele foi desenvolvido. soluo atrativa para o desenvolvimento .NET. A Borland incluiu
no Delphi 8 for .NET um numero de tecnologias que estendem e/
Para acomodar muitas das caractersticas do .NET, a ou complementam o FCL. A Borland refere-se a estas tecnologias
Borland introduziu um significativo aprimoramento a linguagem como Borland Data Providers (BDP.NET), RTL.NET, VCL.NET,
Delphi. Isto inclui a edio de atributos (declaraes descritivas dbExpress.NET, IBX.NET, DataSnap.NET e BDE.NET.
que so usadas para identificar as caractersticas dos elementos
programticos), unit namespaces, overloading de operadores, e Estas duas primeiras tecnologias, BDP.NET e RTL.NET,
nova visibilidade de identificadores. Por exemplo, declaraes de podem ser usadas em padres WinForms, WebForms e aplicaes
classes agora suportam visibilidade private e protected. console .NET que empregam o FCL. O BDP.NET um conjunto
de classes concretas que implementam o ADO.NET usado para
O que nos chama a ateno sobre este aprimoramento na acesso a dados. Estas classes diferem de suas correspondentes no
linguagem que, segundo a Borland, estas novas caractersticas FCL porque elas fornecem uma soluo portvel para acesso a

14 MeGAZINE
Delphi
uma variedade de bancos de dados diferentes incluindo o MSSQL Por exemplo, se voc tiver instalado o Delphi 8.NET e o Delphi
Server, Interbase, Oracle e DB2. Note que o BDP.NET est 7 na mesma mquina, use o Delphi 8 para abrir o projeto
disponvel apenas nas verses Enterprise e Architect do Delphi 8 ConvertIt que est localizado ..\Demos\ConverIt no Delphi 7.
for .NET. Pressione F9 para compilar e rodar o projeto. O projeto ser
compilado sem nenhum problema.
O RTL.NET uma verso da biblioteca de runtime do Delphi,
uma coleo de funes e procedures puras (e suas constantes, Quanto ao dbExpress.NET, IBX.NET, DataSnap.NET e o
variveis e tipos associadas) que voc pode usar a partir do seu BDE.NET estes so implementaes .NET associadas as classes
cdigo. O RTL.NET mantm uma estreita compatibilidade com o VCL para acesso a dados. Como qualquer outra parte da VCL,
cdigo fonte das verses Win32 do Delphi, tornando mais fcil o estas classes fornecem um caminho de atualizao para o .NET
caminho de migrao do seu cdigo existente Win32 para o .NET, para a maioria da aplicaes com acesso a dados existentes. Aqui
e tambm permitindo a voc escrever rotinas que so facilmente voc encontrar classes como TSqlDataSet, TIBConnection,
compiladas sob a plataforma de sua escolha. TClientDataSet, TDataSetProvider, TDCOMConnection,
TDataSource e at TTable.
Na minha opinio, a presena do RTL.NET fornece um
argumento convincente para usar o Delphi como sua linguagem Veja a figura 7. Ela mostra o projeto FishFact.dpr que pode
preferida para o .NET. O RTL.NET inclui literalmente centenas ser encontrado em ..\Demos\DB\FishFact localizado no Delphi
de rotinas proveitosas incluindo aquelas das units 7. Ao compilar no Delphi 8 este projeto ser uma aplicao
Borland.VCL.SysUtils, Borland.VCL.StrUtils, VCL.NET que utiliza o BDE.NET para acessar a tabela Paradox.
Borland.VCL.DateUtils e Borland.VCL.Math. Igual ao projeto ConverIt, basta abrir o projeto e compil-lo.

Outra tecnologia da Borland, o DB Web


Controls for ASP.NET, est disponvel para voc
usar na construo de WebForms. Eles so
componentes visuais Web data-aware que voc
pode usar com o ADO.NET ou BDP.NET para
criar aplicaes Web de forma rpida e simples.

As tecnologias que foram mencionadas


anteriormente nesta seo foram desenvolvidas
para facilitar o processo de migrao de aplicaes
Win32 para .NET. Estas tecnologias podem ser de
um modo geral comentada como VCL.NET, com
dbExpress .NET, IBX.NET, DataSnap .NET e
BDE.NET sendo subconjuntos da tecnologia
VCL.NET.

VCL.NET um conjunto de componentes que


fornece um extensivo cdigo de compatibilidade entre o Delphi Figura 7: Projeto Fish Facts
Win32 e o Delphi for .NET. As classes e tipos disponveis na
VCL.NET representam um rico sub-conjunto da VCL Win32. Concluso
Alm disto, estes tipos e classes ostentam interfaces que so Espero ter concludo o objetivo deste artigo que era dar uma
essencialmente idnticas as contidas na VCL, permitindo a voc viso geral sobre o Delphi 8 for .NET. claro que existe muita
criar facilmente simples projetos que podem ser compilados tanto coisa nova e pretendo descrev-las nas prximas edies de nossa
na plataforma .NET quanto na Win32, alm de fornecer uma revista. Ento at l.
enorme simplicidade na migrao para o .NET. Se uma de suas Sobre o autor
aplicaes j existentes usa componentes comuns da VCL do
Delphi como Edits, Labels, DBGrids, Menus, voc pode Claudinei Rodrigues,
simplesmente abrir o seu projeto no Delphi 8 for .NET e compil- Consultor Tcnico do The Club
lo. nei@theclub.com.br

MeGAZINE 15
Retrospectiva

Retrospectiva

Na nossa retrospectiva, estamos no ano de 1997. Um ano de


expectativas, com o amadurecimento do Delphi j na sua terceira
verso.

Na revista de Setembro de 1997, destaca-se entre outros


assuntos o artigo sobre como criar e exportar mtodos do Delphi
para uma DLL, um artigo bem detalhado que no deixava dvidas
para quem necessitava usar este recurso.

Tambm tivemos um artigo sobre OLE, onde ensinamos como


controlar um aplicativo a partir de uma aplicao Delphi.

Em 1997 o Clipper ainda caminhava com fora total, e tivemos


alguns artigos em nossa revista, como a quinta parte de uma srie
onde estvamos ensinando os programadores a fazer suas
aplicaes funcionando em rede, que sempre foium desafio para
alguns programadores.

No ms que vem estaremos em 1996. Nossa restrospectiva ir


aumentar de tamanho e tambm relembrar mais assuntos, pois
este foi um ano mgico para todos ns. Aguardem!
16 MeGAZINE
Delphi

Cadastro de Clientes com Intraweb


Parte II
Por Emerson Facunte

Salve, salve Delphi People! Altere a propriedade Name do formulrio para FmAltera e
BackGroundColor para $00DDFFFF. .
Chegamos na segunda parte de nossa trilogia. Neste artigo
iremos desenvolver o formulrio de alterao de clientes, e de Grave a unit com o nome un_alteracao.
quebra vocs iro aprender algumas tcnicas interessantes da
tecnologia IW. Insira os componentes que seguem no FmAltera..

Recentemente publiquei um artigo sobre a saudvel disputa


entre as tecnologias WebBroker e Intraweb. Alguns entenderam
minha mensagem: utilizem Intraweb com moderao!. Sugiro
que aplicaes baseadas em IW sejam direcionadas para
pequenos e mdios grupos de usurios; algo em torno de 20, ou
at 30 no mximo. Pensem nisso!

Continuando com o nosso artigo, vamos criar o formulrio de


alterao.

Criando o Formulrio de Alterao


Atravs das opes File/New/Other..., selecione a seo
Intraweb e escolha o modelo Application Form (figura 1).

Figura 1 Criando um novo formulrio

18 MeGAZINE
Delphi

Agora vamos codificar o formulrio.

Insira a unit DataModuleUnit (criada no primeiro artigo) na clusula


uses do formulrio.

uses
ServerController, DatamoduleUnit;

No evento OnClick do objeto btDesiste insira o cdigo que segue:

Hide;

Para que possamos retornar ao formulrio de origem,


utilizamos o mtodo Hide do formulrio.

Agora vamos codificar o evento OnClick do objeto btConfirma.

try

{Altera Cliente}
with DataModule1.SQLAltera do
begin
ParamByName(pcodigo).Value:=StrtoInt(lbCodigo.Text);
ParamByName(prazao).Value:=edRazao.Text;
ParamByName(pendereco).Value:=edEndereco.Text;
ParamByName(pcidade).Value:=edCidade.Text;
ParamByName(pestado).Value:=edUf.Items[edUf.ItemIndex];
ParamByName(pcep).Value:=edCep.Text;
ParamByName(pemail).Value:=edEmail.Text;
ExecSQL;
end;

WebApplication.ShowMessage(Cliente alterado com


sucesso,smSameWindow);

except
WebApplication.ShowMessage(Houve um problema na

MeGAZINE 19
Delphi
alterao do cliente, smSameWindow); Em caso de erro, estamos criando o bloco except.
end;
Hide; except
WebApplication.ShowMessage(Houve um problema na
Vamos analisar o cdigo. incluso do cliente, smSameWindow);
end;
Nesta primeira parte, iniciamos um bloco protegido.
E apresentando a mensagem do problema.
try
Embora o Intraweb forneca o objeto com conexo direta a
Em seguida, estamos atribuindo parmetros ao objeto DataSets, estamos utilizando os objetos convencionais, sem
SQLAltera do DataModule1. nenhum vnculo com DataSet. Quando trabalhamos com Internet,
complicado disponibilizar objeto de conexo direta com DataSets,
{Inclui Cliente} justamente porque no sabemos o que poder ocorrer com a
with DataModule1.SQLAltera do conexo.
begin
ParamByName(pcodigo).Value:=StrtoInt(lbCodigo.Text); Sugiro adotar este modelo de desenvolvimento pela
ParamByName(prazao).Value:=edRazao.Text; segurana.
ParamByName(pendereco).Value:=edEndereco.Text;
ParamByName(pcidade).Value:=edCidade.Text; Ento, para que nossos campos sejam preenchidos
ParamByName(pestado).Value:=edUf.Items[edUf.ItemIndex]; automaticamente com as informaes do banco de dados, vamos
ParamByName(pcep).Value:=edCep.Text; utilizar o TDataSource e TSQLDataSet.
ParamByName(pemail).Value:=edEmail.Text;

E finalmente executando a operao e apresentando a


mensagem de sucesso na operao.

ExecSQL;

WebApplication.ShowMessage(Cliente incluido com


sucesso,smSameWindow);

Pronto, agora conclumos o nosso


formulrio de alterao de clientes.

A figura 2 ilustra o nosso formulrio.

Sobre o autor
Emerson Facunte Consultor de
Tecnologia com diversos livros
publicados, especialista em
desenvolvimento de aplicaes e-
business utilizando a ferramenta
Delphi, baseado em webSnap,
dataSnap, BizSnap e ISAPI/Apache
Modules.

Emersonf@livrariasaraiva.com.br
figura 2 Formulrio alterao de clientes

20 MeGAZINE
Delphi

Rave Report
Conectando banco de dados via Rave

Por Alessandro Ferreira (alessandro@theclub.com.br)

Introduo

O Rave Report um poderoso


gerador de relatrios baseado em
projetos de relatrio que alm de
inmeros recursos interessantes,
possui objetos de acesso a banco de
dados independentes dos objetos do
Delphi, inclusive com gerador de
consultas SQL.

Provendo acesso a dados

Primeiro, adicione um componente


RvProject ao seu formulrio e d um
duplo clique no mesmo para acessar o
Rave Visual Designer (Figura 1).

Agora clique no boto New Data


Object e selecione Database
Connection e clique em Next (Figura
2)
Figura 1
Agora escolha a tecnologia de acesso atravs da qual o acesso
ser feito ao seu banco de dados, podendo optar por:

ADO
BDE
DBX (dbExpress)

No nosso exemplo iremos utilizar BDE, e clique em Finish Figura 2

MeGAZINE 21
Delphi
para finalizar. Aps isso, lhe ser apresentado o Query Advanced
Designer, atravs do qual poder selecionar a(s) tabela(s) e
O prximo passo ser escolhar um Alias existente no BDE campos serem impressos, bastando selecionar a tabela na lista
para o acesso nossas tabelas, como mostra a figura 3 e clicar e arrastar a tabela a aba layout. (Figura 6)
em OK para finalizar.

Figura 6
Figura 3
Aps selecionar a(s) tabela(s) e campos desejados, clique em
Observe no Treeview de objetos (lado direito do rave visual OK para finalizar.
designer) que um novo objeto foi adicionado, com o nome de Bem, agora j temos nosso DriverDataView com os campos
Database1. (Figura 4) que selecionamos, como mostra a Figura 7.

Figura 4
Bem, com isso j temos a nossa conexo estabelecida com o
banco de dados.
Figura 7
Agora faremos o acesso a(s) tabela(s) referente nosso Alias.
Mais uma vez, Para concluir o relatrio, adicione um componente Region
clique no boto (aba Report) e sobre ele um DataBand (tambm da aba Report)
New Data ajustando sua propriedade DataView para DriverDataView1.
Object e Para adicionar os campos banda, bastar pressionar a tecla
selecione CTRL, clicar e arrastar o campo sobre a banda.
Driver Data
View, conforme Salve o projeto Rave (menu File | Save).
mostra a figura
5 e clique em Chamando o Relatrio via Delphi
Next...
selecione o Selecione o componente RvProject e selecione o projeto Rave
Database1 e na propriedade ProjectFile do mesmo.
Finish para
finalizar. Figura 5 Para executar, poder utilizar:

22 MeGAZINE
Delphi
RvProject1.ExecuteReport(Report1); bastante flexibilidade ao desenvolvedor. Aos poucos iremos
explorando todos os recursos disponveis nesta boa ferramenta,
IMPORTANTE: Para que a conexo com o banco de dados seja contudo, a verso que acompanha o Delphi no disponbiliza este
estabelecida sem a necessidade de componentes do Delphi, declare a seguinte unit tipo de funcionalidades ao usurio final, isso est disponvel
na lista de uses de sua unit: apenas nas verses compradas do Rave.

rvDlbde = conexo BDE Sade e sucesso todos,


rvdldbx = conexo dbExpress []s,
rvDlAdo = conexo ADO Alessandro Ferreira

Na pasta \Delphi7\Rave5\DataLinks encontrar trs Download


arquivos correspondentes as units acima, que devero ser
copiados para uma pasta em path (exemplo \Windows\System) O projeto de exemplo demonstrado neste artigo est
conforme a conexo utilizada, sendo eles: disponvel para download em: http://www.theclub.com.br/revista/
download/RaveConnection.zip
DataLinkBDE.rvd = conexo BDE
DataLinkDBX.rvd = conexo dbExpress Sobre o autor
DataLinkADO.rvd = conexo ADO
Alessandro Ferreira,
Concluso Consultor Tcnico do The Club
O Rave Report um poderoso gerador de relatrios e oferece alessandro@theclub.com.br

MeGAZINE 23
Delphi

Migrando aplicaes BDE para dbExpress


Parte 1
Recursos & Arquitetura Provider/Resolver

Alessandro Ferreira, alessandro@theclub.com.br

Borland dbExpress Conectividade e


Simplicidade Os drivers dbExpress conseguem ser pequenos e rpidos
Muitas tentativas j foram feitas em relao a se criar um porque eles provem apenas as funcionalidades que realmente
conjunto de APIs comuns para acesso a mltiplos bancos de so necessrias e nada a mais! Cada driver consiste em apenas
dados. Grandes progressos foram realizados, contudo, alguns uma DLL (plataforma Windows) e um shared object library
mecnismos reduziam a performance, eram difceis de utilizar, (plataforma Linux). Basicamente, podemos resumir os
complexos na implementao de drivers ou apresentavam bugs. mecnimos em cinco interfaces que possibilitam extrair
Pensando nisso, a Borland desenvolveu a arquitetura metadatas, executar instrues SQL e stored procedures, e
dbExpress, a qual combina vrias funcionalidades baseadas em retornar conjunto de dados (cursores) uni-direcionais do tipo
interfaces que permitem transparncia ao programador final e somente leitura. Porm, se trabalharmos em conjunto com os
ao mesmo tempo certa facilidade aos desenvolvedores de drivers componentes DataSetProvider e ClientDataSet, os quais
para comunicao com os mais diversos banco de dados. permitem implementar a estratgia Provider/Resolver da
A dbExpress baseada na consagrada arquitetura Borland, a dbExpress constitui-se em um poderoso mecnismo de
Provider/Resolver da Borland, a qual permite timo desempenho obteno e manuteno de dados onde destacam-se a alta-
e escalabilidade no acesso e manuteno de dados e sobre essa performance e um excelente sistema de concorrncia para se
arquitetura que iremos tratar neste artigo, focando trabalhar com SGDBs.
principalmente o processo de migrao do BDE para dbExpress.
Como funciona o mecnismo Provider/Resolver
A arquitetura dbExpress O mecnismo Provider/Resolver na dbExpress composta
A princpio, o dbExpress foi projetado com seis metas pelo trabalho conjunto de alguns componentes, sendo o primeiro o
principais: SQLConnection, o qual responsvel em prover a conexo ao
driver dbExpress e este por sua vez conversar com o banco de
Minimizar o consumo de recursos de sistema dados que voc est utilizando. O prximo componente um
Maximizar a performance TDataSet dbExpress, como exemplo o SQLDataSet, sendo este
Suporte cross-plataform responsvel em prover os dados mediante uma instruo SQL ou
Simplificar o desenvolvimento executando um Stored Procedure disponvel no banco de dados. O
Facilitar o desenvolvimento de novos drivers terceiro componente o DataSetProvider e o quarto componente
Permitir ao programador otimizar o consumo de memria e um ClientDataSet. Quando voc ativa o ClientDataSet, este
trfego em rede requisita os dados ao DataSetProvider. O DataSetProvider por

24 MeGAZINE
Delphi

sua vez, abre a consulta ou stored procedure, recupera os Ordenao e Pesquisas instantneas
registros e fecha a consulta ou stored procedure e armazena este Como o ClientDataSet trabalha com os registros em
resultado no ClientDataSet que solicitou a mesma. memria, possvel fazer ordenaes por qualquer um dos
O ClientDataSet armazena os registros em um cache local, campos disponveis no mesmo, isso de forma rpida. Contudo, se
atravs do qual iremos adicionar, alterar e excluir registros. uma ordenao estiver um pouco lenta, voc poder criar ndices
Assim sendo, todas as operaes que efetuamos ficam em modo de design ou mesmo em run-time. Estes ndices in-
armazenadas neste cache local e para que possamos envi-las memory permite a ordenao e localizao de registros de forma
ao banco de dados teremos que chamar o mtodo ApplyUpdates, o instantnea sem que haja necessidade de efetuar chamadas ao
qual envia o change log ao DataSetProvider. O provedor servidor de banco de dados.
(DataSetProvider) inicia ento uma transao e dentro da
mesma cria e executa instrues SQL para aplicar as mudanas Sumarizao automtica de dados
ao banco de dados. Se todas as instrues forem executadas sem ClientDataSets possibilitam criar complexos sumrios de
erros, o provedor efetua um commit na transao, caso dados automaticamente, como por exemplo a totalizao de
contrrio, efetua um rollback. Alguns exemplos de erros que campos, permitindo o uso das funes Sum(), Count(), Avg(),
podero ocorrer durante este processamento seriam a violao de Min() e Max(). Voc pode agrupar sumrios por qualquer campo
chaves estrangeiras, violao de regras de negcio definidas em ou combinao de campos, provendo assim totalizaes por grupo,
triggers, campos obrigatrios que no foram preenchidos, ou tudo em conjunto com as funes acima e os ndices mencionados
mesmo, registros (campos) diferentes desde a ltima leitura anteriormente.
efetuada pelo DataSetProvider. No caso de erros, alm da
transao sofrer um rollback, automaticamente ser acionado o Filtrar sub-conjuntos de dados
evento OnReconcileError do ClientDataSet, atravs do qual possvel O ClientDataSet possibilita utilizar como expresses em
implementar o tratamento e apresentao dos erros ao usurio. filtros a mesma sntaxe SQL WHERE que utilizamos em
Um detalhe importante que os erros somente sero reportados instrues SQL, contudo, esta filtragem feito em cima da
este evento e se voc no possui nenhuma linha de cdigo no visualizao local dos dados, sem fazer requisio ao servidor de
mesmo, nenhuma mensagem de erro ser apresentada, mesmo banco de dados. Com isso, podemos dizer que possvel efetuar
que a atualizao no tenha sido efetuada com sucesso. um Select em cima de outro Select.

Benefcios do mecnismo Provider/Resolver Visualizaes mltiplas de dados


Transaes com vida curta Podemos literamente clonar os dados de um ClientDataSet e
Transaes abertas por muito tempo foram o servidor de dessa forma apresentar visualizaes diferentes dos mesmos
banco de dados a manter registros travados o que reduz a dados simultneamente.
concorrncia e consome recursos do servidor de banco de dados.
J com o mecnismo Provider/Resolver, as transaes so Campos calculados locais
exigidas apenas no momento em que as atualizaes forem Voc pode criar campos calculados em um ClientDataSet em
realmente aplicadas, ou seja, quando chamarmos o mtodo modo de design, utilizando os mesmos para computar conjntos de
ApplyUpdates. Isso reduz drasticamente a utilizao de recursos dados em memria, conseguindo dessa forma resultados bem
e melhora a concorrncia em um servidor de banco de dados, o mais complexos do que se estivesse utilizando instrues SQL,
qual normalmente j trabalha no limite. alm do que, estas estariam fazendo chamadas ao servidor de
banco de dados e poderiam ser mais lentas, alm de consumirem
Editando dados de qualquer fonte recursos do servidor.
Por padro, no podemos editar diretamente registros
retornados por instrues SQL que contenham joins, unions e Com quantos registros posso trabalhar no cache?
stored procedures, pois estas normalmente vm como somente A princpio no existe uma limitao, ficando esta a cargo dos
leitura. recursos disponveis na mquina. Como sabemos, no
Contudo, trabalhando dentro do mecnismo Provider/ aconselhvel trazer um grande volume de registros em ambiente
Resolver isso perfeitamente possvel e simples de ser feito, claro Client/Server devido ao trfego gerado na rede, sem contar na
que, com alguns pequenos ajustes. performance que no ser nada agradvel. Contudo, o

MeGAZINE 25
Delphi

DataSetProvider e o ClientDataSet possuem mecnimos que componente e como utiliz-lo. Iremos implementar o exemplo
possibilitam trazer registros retornados por uma consulta SQL utilizando o Delphi 7, contudo, os passos aqui utilizados sero
em pacotes de N registros, utiliz-los, descart-los e trazer um idnticos para quem trabalha com Kylix na plataforma Linux.
novo pacote de registros, permitindo assim trabalhar com um Nesta aplicao exemplo iremos utilizar banco de dados
grande volume de dados balanceando o trfego em rede e Interbase/Firebird, aproveitando o banco EMPLOYEE.GDB que
otimizando a performance. disponibilizado aps a instalao do IB/FB, onde poderemos
encontrar tabelas demonstrando relacionamentos, e outras
Desenvolvimento Simplificado situaes triviais em um banco de dados. A aplicao exemplo ir
Uma aplicao que utiliza dbEpxress requer apenas duas abordar as seguintes situaes na dbExpress:
DLLs para rodar. A primeira o driver do dbExpress, o qual ir
fazer acesso ao SGDB, como por exemplo a DBEXPINT.DLL no NestedDataSets, tabela detalhe contida em um campo da
caso do Interbase/Firebird. A segunda a MIDAS.DLL, sendo tabela master
esta ltima a responsvel pelo ClientDataSet. Juntas estas DLLs Editando dados com SQLQuery/SQLDataSet,
somam 1,5 MB de tamanho! Com certeza, isso minimiza o DataSetProvider e ClientDataSet
tamanho da aplicao e simplifica sua distribuio e instalao. Aplicando as atualizaes guardadas em cache do
Se voc preferir no distribuir estas DLLs, voc poder ClientDataSet ao banco de dados
compilar diretamente suas units correspondentes e com isso tudo Interceptando erros que podero ocorrer ao aplicar os dados
ficar embutido no prprio executvel. Utilizando o Kylix/Linux, ao banco de dados
o desenvolvimento idntico, exceto pelo fato de no utilizarmos
DLLs e sim dois shared object libraries. O componente SQLConnection
A criao de uma aplicao utilizando dbExpress bem
Facilidade na criao de novos drivers simples.
Basicamente, a implementao de um drive para a
arquitetura dbExpress consiste na implementao de cinco Vamos comear por configurar a conexo e a este ponto e pelo
interfaces que esto documentadas no help do prprio Delphi. nome sugestivo voc j sabe que iremos utilizar o componente
Para facilitar, a Borland disponibilizou gratuitamente o cdigo SQLConnection para isso, seguindo os seguintes passos:
fonte do driver MySQL para ser utilizado como modelo. Assim,
torna-se ainda mais fcil para desenvolvedores de bancos de 1. Crie uma nova aplicao, File | New | Application e
dados implementarem drivers que ofeream alto-desempenho e adicione um DataModule mesma, ajustando seu nome para
confiabilidade. Contudo, caso o banco de dados que voc utilize MainDm.
no possua nenhum driver no mercado, voc poder se 2. Acesse o menu Project | Options e ajuste na lista Auto-
aventurar no desenvolvimento de seu prprio driver. Create Forms deixe como primeiro objeto ser criado o nosso
Prova disso o projeto Open-Source Unified Interbase, o MainDm.
qual disponibiliza drivers para dbExpress escritos em Delphi 3. Adicione um componente SQLConnection (palheta
para conexo com os bancos: Firebird 1.0.2, Firebird 1.0.3, dbExpress) ao MainDm;
Firebird 1.5, Interbase 6, Interbase 6.5, Interbase 7, Interbase 4. Configure o nome do SQLConnection para
7.1 e Yafill (uma variante do Interbase), e o melhor, tudo EmployeeConnection, e a propriedade DriverName para
gratuto e com cdigo fonte aberto, maiores informaes em: Interbase;
http://www.progdigy.com/UIB/. 5. Agora o editor de propriedades referente a propriedade
Params e configure os seguintes parmetros: Database: com o path
Desenvolvendo uma aplicao utilizando e o nome do arquivo GDB.
dbExpress 6. Altere os parmetros UserName e Password caso estejam
Antes que voc comece a migrar suas aplicaes BDE para diferentes do que est configurado em seu servidor IB/FB;
dbExpress, voc precisa primeiramente estar familiarizado com 7. Configure a propriedade LoginPrompt para False para que
os componentes que compe a dbExpress e o mais importante, no seja solicitado novamente usurio e senha;
como utiliz-los. Neste tpico iremos criar passo a passo uma 8. E finalmente, ative alterando a propriedade Connected para
pequena aplicao utilizando dbExpress, descrevendo cada True;

26 MeGAZINE
Delphi

Voc poder utilizar um nico componente SQLConnection dispensveis.


independente do nmeros de componentes datasets que venha
utilizar. Poder ainda, caso haja necessidade ter vrios O SQLQuery
componentes SQLConnection para conectar-se a bancos As propriedades e mtodos do componente SQLQuery so
diferentes simultneamente sem problemas! Para definir a muito parecidas com a Query existente no BDE, contudo, existe
conexo, poder ter as configuraes definidas atravs da uma diferena bastante significativa, visto o SQLQuery ser
propriedade Params, conforme mencionado anteriormente, unidirecional e a Query do BDE no. Voc poder utilizar o
efetuar as configuraes todas em run-time, ou ainda, SQLQuery para execuo de instrues SQL DML e instrues
armazenar as configuraes em um arquivo INI e carreg-las DDL. Para instrues que resultem em um conjunto de dados
dinmicamente. (ResultSet), utitize o mtodo Open ou Active = True e para
instrues que no retornem conjunto de dados, chame o mtodo
O Editor de Conexes dbExpress ExecSQL. Vamos continuar no desenvolvimento de nosso
Para criar uma nova conexo, bastar dar um duplo-clique aplicativo de exemplo.
no componente SQLConnection para abrir o editor de conexes,
onde sero apresentadas todas as conexes disponveis, alm 1. Adicione trs componentes SQLQuery ao nosso
claro da possibilidade da criao de uma nova conexo. Todas as datamodule;
conexes criadas atravs deste editor ficam armazenadas em um 2. Aponte a propriedade SQLConnection para
arquivo chamado dbxConnections.ini. EmployeeConnection;
Vale ressaltar, que quando criamos conexes 3. Nomeia a primeira SQLQuery para EmployeeQry, a
nomeadas podemos defin-las atravs da propriedade segunda para HistoryQry, e a ltima para DeptQry.
ConnectionName do SQLConnection e com isso precisamos 4. Configure a propriedade SQL do EmployeeQry para:
distribuir o arquivo INI (contendo as informaes sobre nossa
conexo) junto com a aplicao. SELECT * FROM EMPLOYEE
WHERE DEPT_NO = :DEPT_NO
Algumas funcionalidades do SQLConnection ORDER BY LAST_NAME
O componente SQLConnection prov vrias funcionalidades,
entre as quais destacamos o controle de transaes atravs dos 5. Configure a propriedade SQL do HistoryQry para:
mtodos StartTransaction, Commit e RollBack explcitos. Se voc
necessitar executar instrues SQL que no devolvam um SELECT * FROM SALARY_HISTORY
conjunto de dados (ResultSet), voc poder trabalhar diretamente WHERE EMP_NO = :EMP_NO
com o mtodo ExecuteDirect ou Execute, os quais facilitam bastante a
execuo dessas instrues. Caso necessite extrair informaes 6. E finalmente, a propriedade SQL do DeptQry para:
(metadata) do banco de dados que est trabalhando, isso tambm
bastante simples, bastando para isso utilizar os mtodos SELECT DEPT_NO, DEPARTMENT FROM
GetTableNames, GetFieldNames e GetIndexNames do SQLConnection. DEPARTMENT
ORDER BY DEPARTMENT
Os componentes DataSet
A dbExpress disponibiliza basicamente quatro componentes 7. Adicione um componente DataSource, nomeie como
DataSet, sendo: SQLDataSet, SQLQuery, SQLStoredProc e SQLTable. EmpLinkSrc, e aponte a propriedade DataSet para EmployeeQry;
Recomendamos que para qualquer nova aplicao que voc 8. Configure a propriedade DataSource do componente
venha a desenvolver, utilizar o componente SQLDataSet, pois, este HistoryQry para EmpLinkSrc (com isso estaremos relacionando as duas
componente j encapsula os outros trs componentes existentes SQLQuerys);
na dbExpress, ou seja, bastando configurar a propriedade 9. Volte ao EmployeeQry, acesse a propriedade Params e
CommandType para ctQuery, ctStoredProc ou ctTable, assumindo configure o valor do parmetro DEPTO_NO para um valor que
assim as mesmas funcionalidades dos outros componentes. Os voc saiba que no existir na tabela, como exemplo XXX, com
outros componentes (SQLQuerym SQLTable e SQLStoredProc) foram isso, nenhum registro ser retornado at que informemos um
mantidos por uma questo de analogia ao BDE, porm, so valor vlido para departamento;

MeGAZINE 27
Delphi

10. D um duplo-clique no EmployeeQry e adicione os TFields isso ajustar sua propriedade CommandType para ctStoredProc.
ao Fields Editor. Mais uma vez, o SQLStoredProc existe por uma questo de
11. Selecione o campo EMP_NO e configure a propriedade analogia ao BDE, porm, caso necessite utiliz-lo, bastar
ProviderFlags para pfInKey = True. Fazendo esta configurao, apontar sua propriedade SQLConnection um SQLConnection, e
voc est determinando que este campo faz parte da PrimaryKey, atravs da propriedade StoredProcName fazer referncia a uma
dessa forma, o DataSetProvider (que iremos ver mais adiante) stored procedure existente em seu banco de dados, e chamar o
ir necessitar dessa informao para construir a instruo SQL mtodo Open ou ExecProc, dependendo da finalidade de sua sp.
de atualizao dos registros;
12. Agora, selecione o campo FULL_NAME, v a propriedade O SQLDataSet
ProviderFlags e configure pfInUpdate e pfInWhere = False. Para utilizar este componente, assim como os outros
FULL_NAME um campo computado (pelo banco de dados) e anteriormente mencionados, o primeiro passo setar a
no devemos atualizar diretamente este campo visto isto ser feito propriedade SQLConnection um SQLConnection disponvel em
automaticamente pelo banco de dados e dessa forma o sua aplicao. Feito isso, voc dever escolher para qual
DataSetProvider no dever fazer referncia ao mesmo quando finalidade o SQLDataSet ser utilizado, configurando para isso a
construir as instrues SQL de atualizao; propriedade CommadType, podendo ser: ctQuery, ctStoredProc,
13. Ative o EmployeeQry alterando a propriedade Active = ou ctTable. Frequentemente voc usar o valor padro ctQuery.
True; A configurao desta propriedade implica na funcionalidade da
14. Agora, d um duplo clique no componente HistoryQry, e propriedade CommandText. Se for ctQuery, CommandText
adicione todos os campos ao Fields Editor do mesmo; estar configurado com um editor SQL, se for ctStoredProc,
15. Selecione o campo EMP_NO e configure ProviderFlags CommantText ir receber apenas o nome de stored procedures
pfInkey = True e repita o mesmo para os campos existentes em seu banco e finalmente se for ctTable,
CHANGE_DATE e UPDATER_ID, pois, todos compe a CommantText ir listar as tabelas existentes no banco, bastando
PrimaryKey; selecionar uma delas.
16. O campo NEW_SALARY um campo computado A propriedade Params prov a configurao de parmetros
(lembra?!) e devemos configurar ProviderFlags pfInUpdate e para execuo de uma query parametrizada. A propriedade
pfInWhere = False. DataSource utilizada para ligar um componente a outro
17. Altere a propriedade Active do EmployeeQry e HistoryQry provendo um relacionamento master/detail. Vale lembrar, se o
para False; SQLDataSet retornar um conjunto de dados (ResultSet) voc
18. Configure a propriedade Connected do dever chamar o mtodo Open ou Ative = True, caso contrrio,
EmployeeConnection para False; ExecSQL.
Conforme mencionei anteriormente, o SQLDataSet trabalha
O SQLTable em modo unidirecional e assim sendo, voc poder ir registro a
O componente SQLTable se assemelha ao Table que j registro apenas para frente, no havendo possibilidade de
conhecemos do BDE, e como j sabemos, ele no recomendado retroceder o ponteiro de registros, apresentando sempre um por
dentro do ambiente Client/Server devido sua arquitetura de vez. Caso v construir um relatrio onde a ferramenta utilizada
trabalho. Caso necessite utiliz-lo, bastar apontar sua no necessite fazer cache de registros, bastar voc ligar um
propriedade SQLConnection um SQLConnection e selecionar a DataSource ao SQLDataSet e este ao seu gerador de relatrios.
tabela por meio da propriedade TableName. Contudo, este existe Contudo, caso necessite prover navegao entre registros, como
basicamente por analogia ao Table do BDE e por isso no iremos por exemplo a apresentao em uma grade qualquer, adicione
abord-lo neste artigo. um componente DataSetProvider, ligando sua propriedade
DataSet ao SQLDataSet e um ClientDataSet, ligando sua
O SQLStoredProc propriedade ProviderName ao DataSetProvider ou ainda, utilize
Este componente tem finalidade de conectar stored um componente SimpleDataSet (iremos abordar este componente
procedures existentes no banco de dados, basicamente tem o mais adiante).
mesmo papel do StoredProc disponibilizado pelo BDE. Contudo, Se voc necessitar obter informaes de metadata mais
na dbExpress tambm podemos nos referenciar a stored detalhadas do que o componente SQLConnection oferece, voc
procedures atravs do componente SQLDataSet, bastando para poder faz-lo via componente SQLDataSet, fazendo uso do

28 MeGAZINE
Delphi

mtodo SetSchemaInfo. Este mtodo recebe trs parmetros, configurao da propriedade ProviderFlags;
sendo SchemaType, SchemaObject e SchemaPattern. Se voc necessita trabalhar com MyBase (xml ou cds), a
SchemaType pode receber os seguintes valores stNone, stTables, utilizao somente do ClientDataSet reduz o consumo de recursos
stSysTables, stProcedures, stColumns, stProcedureParams, ou em relao a utilizao do SimpleDataSet;
stIndexes. Este parmetro indica o tipo de informao que o As propriedades e mtodos do SqlDataSet interno no tem a
SQLDataSet conter quando for aberto, trazendo mesma funcionalidade de uma Query BDE, assim sendo, se
automaticamente as informaes solicitadas, como exemplo, se estiver convertendo uma aplicao BDE dbExpress vrias
configurar como stTables, ao abrir o SQLDataSet todas as alteraes sero necessrias;
tabelas e informaes sobre as mesmas sero obtidas facilmente.
Por padro, SchemaType configurado como stNone. Vale Em resumo, se voc necessitar de maior flexibilidade, o
ressaltar que, se voc adicionar alguma instruo propriedade SimpleDataSet no o componente mais indicado.
CommandText, automaticamente SchemaType ser setado para Particularmente, no utilizo este componente em nenhuma
stNone. Cada combinao de configurao destes parmetros, ir situao nos projetos que desenvolvo, pois, apesar dele parecer
trazer resultados diferentes. Se por exemplo, voc configurar simples, esta simplicidade pode acabar saindo caro! Mas, se
SchemaType = stTables e SchemaPattern para EMP%, o mesmo assim voc estiver achando complicado a todo momento
conjunto de dados conter somente as tabelas com nome iniciado ter que adicionar os trs componentes em seu DataModule, voc
por EMP. poder criar um template para isso. Bastando adicionar,
configurar e selecionar os trs componentes, depois, acessar o
O SimpleDataSet menu Component | Create Component Template que um novo
Para visualizar e editar dados no BDE, tudo que componente ser criado, geralmente disponibilizado na palheta
necessitvamos era adicionar um componente TQuery, ajustar Template, dessa forma, quando adicionar este novo
algumas propriedades e pronto! Contudo, como vimos componente, os trs sero automaticamente adicionados.
anteriormente, dentro do dbExpress necessitamos combinar trs
componentes, sendo um SQLDataSet ou SQLQuery, um SQLMonitor
DataSetProvider e um ClientDataSet e configur-los a fim de O ltimo componente da dbExpress o SQLMonitor. Este
conseguir o mesmo resultado. Contudo, a partir do Delphi 7 componente bastante til para que possamos fazer ajustes e
contamos com um componente que possibilita economizar tempo, melhorar a performance de nossos aplicativos. Atravs deste,
ele o SimpleDataSet. Na realidade, o TSimpleDataSet combina podemos monitorar todas as instrues e requisies feitas ao
os trs componentes mencionados acima e dessa forma possibilita banco de dados, gerando um log o qual nos dar uma idia
visualizar e editar dados diretamente sem a necessidade de completa se o que mandamos executar realmente a melhor
componentes adicionais, porm, apesar da facilidade, existem abordagem.
algumas restries a respeito deste componente as quais listamos
a seguir: Concluso
No prximo ms irei abordar a palheta Data Access, falando
No possvel utilizar este componente em aplicaes multi- principalmente sobre os componentes DataSetProvider e
camadas. Se voc pensa futuramente converter sua aplicao ClientDataSet, dando assim continuidade a nossa implementao
Client/Server para N-Tier, utilize os trs componentes com dbExpress. Em caso de dvidas, estamos a disposio para
(SqlDataSet, DataSetProvider e ClientDataSet) separadamente; maiores esclarecimentos, basta nos contatar.
No possvel vincular tabelas detalhes via nested dataset
field (TDataSetField); Forte abrao todos,
Nenhum dos eventos do DataSetProvider interno ficam
expostos;
Nenhuma das propriedades Options do DataSetProvider Sobre o autor
podem ser alteradas, nem em modo de design e nem em modo
run-time; Alessandro Ferreira,
No possvel adicionar os TFields para o DataSet interno Consultor Tcnico do The Club
alessandro@theclub.com.br
ao SimpleDataSet e com isso, no existe possibilidade de

MeGAZINE 29
Perguntas & Respostas

Pergunta: Estou utilizando dbExpress para acesso a banco Pergunta: Sempre que eu usava a instruo
de dados e gostaria de saber onde posso encontrar drivers para IBTransaction.StartTransaction para executar a gravao de
Firebird 1.5 e Progress para o Delphi6. meus dados ocorria um erro avisando que o objeto IBTransaction
est ativo, mesmo depois de um IBTransaction.Commit ou
Resposta: Para Firebird, felizmente est disponibilizado um CommitRetaining ao final da operao. O problema que se eu
driver open-source e que nos simples testes que realizamos, desativar o objeto IBTransaction todos os grids so esvaziados
funcionou perfeitamente. Poder baixar diretamente no site do (trabalho com janelas mltiplas, Ex: Cadastro de Clientes pode
fabricante: estar em segundo plano ao lado de Cadastro de Fornecedores que
est sendo editado).
http://www.progdigy.com/UIB/
O cdigo abaixo resolveu o meu problema de gravao de
Quanto ao Progress, infelizmente sabemos que existe driver dados sem desativar o IBTransaction:
para Kylix/dbExpress, porm, para Delphi no temos
conhecimento at o momento. IBSQL1.Transaction :=
IBDatabase1.InternalTransaction;
Dvida enviada por Ana Abrantes, So Paulo/SP. IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add(INSERT INTO ALUNOS
Pergunta: Como fao para alterar um campo de uma (CODIGO, NOME, SEXO, NASCIMENTO));
tabela Firebird 1.0 IBSQL1.SQL.Add(VALUES
para NOT NULL, sem perder os dados constantes da (:PCODIGO, :PNOME, :PSEXO, :PNASCIMENTO));
mesma?
if not IBDatabase1.InternalTransaction.
Resposta: Poder utilizar a seguinte instruo: InTransaction then
IBDatabase1.InternalTransaction.
update RDB$RELATION_FIELDS set StartTransaction;
RDB$NULL_FLAG = 1 IBSQL1.Prepare;
where (RDB$FIELD_NAME = CAMPO) and IBSQL1.ParamByName(PCODIGO).
(RDB$RELATION_NAME = TABELA) AsString:= Edit1.Text;
IBSQL1.ParamByName(PNOME).AsString:= Edit2.Text;
Dvida enviada por Megasoftware Informtica Ltda, IBSQL1.ParamByName(PSEXO).AsString:= Edit3.Text;
Salvador/BA. IBSQL1.ParamByName(PNASCIMENTO).

30 MeGAZINE
Perguntas & Respostas
AsString:= Edit4.Text; isso aplicando uma instruo delete DML:
IBSQL1.ExecQuery;
With sdsClientes do
try
IBDatabase1.InternalTransaction.Commit; Begin
except Close;
IBDatabase1.InternalTransaction.Rollback; CommandText := Format(Delete From
end; Clientes where ID = %s, [EdCodigo.Text]);
IBTable1.Refresh; ExecSQL(True);

End;
A dvida se esse cdigo realmente eficaz como se estivesse
utilizando o IBTransaction.StartTransaction diretamente no Depois, apenas efetue um Refresh em seu ClientDataSet
objeto de transao? para que a visualizao seja atualizada.

Resposta: A mensagem de que a transao j est ativa, * A instruo acima tambm pode ser executada via
geralmente ocorre se tentarmos efetuar um StartTransaction propriedade CommandText do ClientDataSet.
em um IBTransaction que j esteja ativado, ou seja, se voc
deixar um componente IBTransaction ativo (para que suas Dvida enviada por Intime Sistemas Ltda, Ararangua/SC.
tabelas possam permanecer abertas), voc no dever chamar o
mtodo StartTransaction, visto uma transao permanente
ficar ativa enquanto o IBTransaction estiver conectado, bastando Pergunta: Tenho uma instruo SQL semelhante a esta:
neste caso apenas chamar o mtodo CommitRetaining ou
RollBackRetaining para consolidar ou desfazer o que foi postado SELECT Codigo,
ao banco de dados. Nome FROM tabela
ORDER BY 2 DESCENDING
A cada chamada destes mtodos, as pendncias so
eliminadas e como se estivesse aberto uma nova transao. No componente do BDE funciona sem problemas, porm,
quando troquei para o conjunto do dbExpress (SQLDataSet,
Assim sendo, no recomendamos trabalhar com o objeto de DataSetProvider e ClienteDataSet), aonde a instruo vai para o
transao interna embutida no IBDatabase, visto o mesmo ser de CommandText, aparentemente ignora o DESCENDING.
uso interno do IBDatabase, conforme mencionado na prpria
documentao: O interessante que se eu trocar o 2 pelo nome do campo,
ou seja, NOME, funciona corretamente.
Used internally by InterBase transactions.
property InternalTransaction: TIBTransaction; Se for um BUG, por favor me de uma sugesto para o
Description seguinte caso, eu tenho um SQL em que preciso usar UNION e
Do not use InternalTransaction directly. It is for internal use no final como sero tabelas diferentes a unificar, no posso usar
only. o nome do campo precisaria me referenciar a coluna, o que fazer?

Dvida enviada por Nilton Carlos da Silva, Monte Aprazvel/ Resposta: Isso ocorre devido ao mecnismo de trabalho do
SP. DataSetProvider.

Para resolver, altere a propriedade Options |


Pergunta: Gostaria de saber como apago vrios registros de poRetainServerOrder no DataSetProvider para True, com isso,
uma vez (Ex. Quero apagar todos os registros com o cdigo 10) o ClientDataSet ir respeitar a ordenao definida pelo provedor
em uma tabela, utilizando o componente TClientDataSet da de dados.
paleta Data Access.
Dvida enviada por Financial Informatica Ltda, Campo
Resposta: Poder utilizar um componente sqlDataSet para Grande/MS.

MeGAZINE 31