Академический Документы
Профессиональный Документы
Культура Документы
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.
MeGAZINE 3
Dicas & TTruques
ruques
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
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.
MeGAZINE 5
Delphi
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:
Figura 4
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;
E at o momento no consegui
identificar como resolver este erro, mas
usando apenas uma das duas formas
esse erro no ser gerado.
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
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.
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).
MeGAZINE 11
Delphi
Figura 3:
Componentes
.NET instalados
Figura 4: Caixa de
dilogo Options
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.
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
(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.
MeGAZINE 15
Retrospectiva
Retrospectiva
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..
18 MeGAZINE
Delphi
uses
ServerController, DatamoduleUnit;
Hide;
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;
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;
ExecSQL;
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
Introduo
ADO
BDE
DBX (dbExpress)
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.
MeGAZINE 23
Delphi
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.
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
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.
MeGAZINE 31