revista the club megazine - 02/2004 · trazendo dicas e informações úteis ao seu dia-a-dia. para...

31

Upload: lydan

Post on 01-Jan-2019

240 views

Category:

Documents


1 download

TRANSCRIPT

Revista The Club Megazine - 02/2004A utilização, reprodução, apropriação, armazenamento em banco de dados,sob qualquer forma ou meio, de textos, fotos e outras criações intelectuaisem cada publicação da revista “The Club” são terminantemente proibidos

sem autorização escrita dos titulares dos direitos autorais.Copyright© The Club® 2004

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 33333

EDITORIALEDITORIALEDITORIALEDITORIALEDITORIAL

Editorial

Celso Jefferson PaganelliPresidente - The Club

Editorial ............................................................................ 03Dicas & Truques ................................................................. 04Rave Report com Intraweb................................................. 05Uma visão geral do Delphi 8 for .NET................................. 10Retrospectiva .................................................................... 16Cadastro de Clientes com Intraweb - Parte II ..................... 18Rave Report - Conectando banco de dados via Rave .......... 21Migrando aplicações BDE para dbExpress .......................... 24Perguntas & Respostas ...................................................... 30

THE CLUBAv. Celso Ferreira da Silva, 190

Jd. Europa - Avaré - SP - CEP 18.707-150Informações: (0xx14) 3732-3689

Suporte: (0xx14) 3733-1588 - Fax: (0xx14) 3732-0987

Internethttp://www.theclub.com.br

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

DúvidasCorrespondência ou fax com dúvidas devem serenviados ao - THE CLUB, indicando "Suporte".

OpiniãoSe você quer dar a sua opinião sobre o clube em

geral, mande a sua correspondência para a seção"Tire sua dúvida".

ReproduçãoA utilização, reprodução, apropriação,

armazenamento em banco de dados, sob qualquerforma ou meio, de textos, fotos e outras criações

intelectuais em cada publicação da Revista“The Club” são terminantemente proibidos sem

autorização escrita dos titulares dos direitosautorais.

Copyright© The Club® 2004

Impressão e acabamento:Impressos Gril - Gril Gráfica e Repr. Ind. Ltda.

Tel.: (0xx14) 3762.1345 - Fax: (0xx14) 3762.1259Rua São Paulo, 447 - Cep 18.740-000

Taquarituba - SPTiragem: 5.000 exemplares

Diretor - Presidente

Celso Jefferson M. Paganelli

Diretor Técnico

Mauro Sant’Anna

Colaboradores

Emerson FacunteDelphi é marca registrada da Borland International, as

demais marcas citadas são registradas pelos seusrespectivos proprietários.

Olá amigos,

Estamos aqui com mais uma edição da The Club Megazine e como sempre,trazendo dicas e informações úteis ao seu dia-a-dia. Para começar, algumas dicas sobreo Delphi 8 (Delphi For .Net), o qual estamos testando e trilhando novamente o caminhodas pedras!

Continuando, um artigo sobre a apresentação de relatórios na web, mesclandoIntraweb com Rave Reports, obtendo um resultado bastante interessante. Por falar emweb, apresentamos uma prévia do Delphi 8, para que você possa conhecer a nova IDE,componentes, etc, enfim, é realmente um novo Delphi!

Nosso amigo Facunte, traz a segunda parte do artigo demonstrando como criaruma aplicação web com o polêmico Intraweb, demonstrando que nem tudo está perdidoe que é possível extrair muita coisa boa dessa ferramenta. Continuando, demonstramosuma funcionalidade bastante interessante no Rave Reports, onde é possível efetuarconexões com banco de dados, sem utilizar as engines de conexão do Delphi, comcerteza, esta ferramenta ainda tem muito à ser explorada. Devido a muitas solicitações,estamos publicando a primeira parte de um tutorial sobre dbExpress, explicando seufuncionamento e apresentando dicas de como portar aplicações BDE para dbExpress.

E para encerrar, nossa sessão Perguntas e Respostas, na qual selecionamosalgumas das perguntas que chegaram aos nossos técnicos, procurando fazer umintercâmbio de informações entre os associados The Club.

Boa leitura e um ótimo carnaval à todos!

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE44444

Delphi 8 (For .Net) – Como chamarDelphi 8 (For .Net) – Como chamarDelphi 8 (For .Net) – Como chamarDelphi 8 (For .Net) – Como chamarDelphi 8 (For .Net) – Como chamaruma página em um nova janelauma página em um nova janelauma página em um nova janelauma página em um nova janelauma página em um nova janela

Neste simples exemplo demonstramos como chamar umapágina, porém, abrindo em uma nova janela do browser,lembrando que aqui estamos nos referindo a um Asp.NetApplication.

Uses

Borland.Vcl.SysUtils;

procedure TWebForm1.Page_Load(

sender: System.Object; e: System.EventArgs);

var

URL, Opt: String;

begin

if not IsPostBack then

begin

URL := QuotedStr(‘http://www.theclub.com.br’);

Opt := QuotedStr(‘_new’);

btnTheClub.Attributes.Add(

‘onClick’, ‘window.open(‘+URL+’,’+Opt+’)’);

end;

end;

Para chamar uma página sem abrir uma nova janela, utilizeo seguinte:

Response.Redirect(‘index.aspx’);

Delphi 8 (For .Net) – RequisitosDelphi 8 (For .Net) – RequisitosDelphi 8 (For .Net) – RequisitosDelphi 8 (For .Net) – RequisitosDelphi 8 (For .Net) – Requisitosmínimos para rodar...mínimos para rodar...mínimos para rodar...mínimos para rodar...mínimos para rodar...

Para você que deseja instalar o Delphi 8 (For .Net), segueabaixo os requisitos mínimos para poder rodá-lo:

- Microsoft Windows 2000 (SP2 ou superior é recomendado)- Microsoft Windows XP Professional- Microsoft Windows Server 2003-Microsoft Internet Explorer 6.0 SP1 ou superior-Delphi 8 for .NET requer aproximadamente 225 MB de

espaço em disco para a instalação completa.-O .NET Framework versão 1.1 requer aproximadamente

150 MB de espaço em disco.-O .NET Framework SDK versão 1.1 requer

aproximadamente 850 MB de espaço em disco.-Pentium 233 MHz Intel ou superior (recomendado P3,

1Ghz)-128 MB RAM (recomendado 512)

Delphi 8 – Erro: Unable to attach toDelphi 8 – Erro: Unable to attach toDelphi 8 – Erro: Unable to attach toDelphi 8 – Erro: Unable to attach toDelphi 8 – Erro: Unable to attach toASP.NET worker process (typically aspnet_ASP.NET worker process (typically aspnet_ASP.NET worker process (typically aspnet_ASP.NET worker process (typically aspnet_ASP.NET worker process (typically aspnet_wp.exe or w3wp.exe)wp.exe or w3wp.exe)wp.exe or w3wp.exe)wp.exe or w3wp.exe)wp.exe or w3wp.exe)

Caso você instale o IIS após a instalação do .Net Framework, etente rodar uma aplicação Asp.Net, irá receber o erro acima, epara solucionar, basta executar o seguinte comando: c:\windows\microsoft.net\framework\v1.1.4322\aspnet_regiis.exe -i

Dicas & TDicas & TDicas & TDicas & TDicas & Truquesruquesruquesruquesruques

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 55555

Neste artigo iremos criar um pequeno projeto IntraWeb ondegeramos alguns relatórios através do Rave Report. Aapresentação dos relatórios na Web consiste na possibilidade doRave Report gerar arquivos no formato HTML e PDF, poisiremos utilizar esses recursos para gerar esses arquivos, dorelatório solicitado, e depois mostrá-lo ao usuário no Browse.

Iniciando os trabalhosComo o assunto principal dessa matéria é criar o projeto

Intraweb com Rave Report, então não entrarei nos detalhes dacriação do relatório. Caso tenha alguma dúvida veja matéria

Rave Report com IntraWebRave Report com IntraWebRave Report com IntraWebRave Report com IntraWebRave Report com IntraWebPor André Colavite

publicada em nossa revista de Janeiro de 2003.

O projeto do Rave utilizado nesta matéria estará disponívelpara download através do link no final da matéria.

Como primeiro passo do projeto, vamos criar um novo projetoIntraweb no Delphi7.

Para isso selecione o menu File / New e a opção Other.Selecione a aba IntraWeb e depois escolha a opção “IntrawebApplication Wizard” e clique em Ok.

Um detalhe importante: Essa opção de criação doprojeto Intraweb, está disponível no delphi ao qual oIntraWeb já foi atualizado.

Na próxima janela iremos selecionar a opção“StandAlone Application” e no Options iremosselecionar a opção “Create Datamodule”, conformefigura 2.

Neste momento temos um projeto contendo umIWForm e um DataModule, ambos em branco.

Informações importantes sobre o projeto do RaveReport

O projeto do Rave Report que criei foi geradoutilizando o arquivo Employee.GDB, que vem comoexemplo no Delphi, e para visualizar os dados dentrodo projeto do Rave utilizei um componente do tipoTRvDataSetConnection chamado

RvDataSetConnection1. Figura 1: Criando um novo projeto Intraweb.

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE66666

DelphiDelphiDelphiDelphiDelphi

Conectando o banco de dadosMediante essas informações vamos criar a conexão ao banco

de dados, para isso coloque no Datamodule o componenteSQLConnection e crie a conexão ao GDB. O arquivoEmployee.gdb normalmente fica no seguinte diretório:

C:\Program Files\Common Files\BorlandShared\Data\Employee.GDB

As configurações do SQLConnection ficarão idênticas asmostradas na figura3.

O passo seguinte é criar a instrução de Select aoqual nos dará acesso aos dados da tabela Customer.Sendo assim coloque no Datamodule um componenteSQLQuery e ligue em sua propriedadeSQLConnection o componente SQLConnection1.

Em seguida coloque no datamodule umcomponente DataSetProvider, ligue a suapropriedade DataSet ao componente SQLQuery1 eem sua propriedade Options altere a opçãopoAllowCommandText para True.

Como última opção desse acesso aos dados,coloque no datamodule um componenteClientDataSet1 e indique na sua propriedadeProviderName o componente DataSetProvider1 e nasua propriedade CommandText coloque a seguinteinstrução de Select.

SELECT CUST_NO, CUSTOMER,CONTACT_FIRST, CONTACT_LAST

FROM CUSTOMER WHERE CUSTOMER LIKE :Letra

Acessando o projeto do Rave ReportEstando com a conexão ao banco de dados criada, iremos

agora fazer as ligações dos componente do Rave Report. Para issocoloque no datamodule os componentes RvProject1, RvSystem1 eRvDataSetConnection1.

No componente RVDataSetConnection1 iremos ligar a suapropriedade DataSet ao componente ClientDataSet1.

No componente RVSystem iremos alterar as suaspropriedades SystemSetup eSystemOptions onde desligaremos todas asopções e na sua propriedade DefaultDestiremos indicar a opção rdFile.

No componente RvProject não iremosfazer configurações neste momento, pois assuas propriedades serão configuradas viaprogramação.

Como o nosso projeto irá gerararquivos .HTM e .PDF a partir doresultado do relatório, então devemosincluir também no datamodule oscomponentes RvRenderHtml1,RvRenderPDF1 e RvNDRWriter1.

No componente RvNDRWriter1, altere Figura 3

Figura 2

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 77777

DelphiDelphiDelphiDelphiDelphi

a sua propriedade StreamMode para o valor smUser.

Neste momento o nosso datamodule está pronto, contendotodos os componentes que iremos utilizar, conforme podemosobservar na figura 4.

Criando o form de chamada dorelatório

Neste momento iniciaremos a criação do formonde o usuário visualizará os dados e tambémpoderá chamar os relatórios.

Sendo assim visualize o IWForm e dentro delecoloque os seguintes componentes:

DataSource1IWDBGrid1IWLabel1IWEdit1IWButton1

Para podermos selecionar na propriedadeDataSet do DataSource1 o componenteClientDataSet1 que está no datamodule, temosque declarar na seção implementation da unit ainstrução “Uses DatamoduleUnit;”

Em seguida visualize novamente ocomponente DataSource1 e selecione o“DataModule1.ClientDataSet1” na sua propriedade DataSet.

O próximo componente será o IWDBGrid onde selecionaremosem sua propriedade DataSource o componente DataSource1.

No componente IWLabel1 iremos configurar a suapropriedade Caption com o seguinte texto: Filtrar os Clientesiniciados com:

No IWEdit1 apague o texto da sua propriedade Text.

No IWButton1 iremos configurar a sua propriedade Captioncom o texto: Filtrar

Dê duplo click sobre o componente IWButton1 e no seu eventoonclick escreva a seguinte instrução:

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

Figura 5

Arquivo Relatorio.ravUma informação importante, o arquivo Relatório.rav, que

contem a estrutura do relatório, foi colocado num subdiretóriochamado files e está sendo indicado na propriedade ProjectFile, docomponente RvProject1, via programação, conforme poderá serobservado na instruções que iremos criar a seguir.

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE88888

DelphiDelphiDelphiDelphiDelphi

Visualizando os relatóriosNos passos seguintes iremos montar a visualização do

relatório no formato HTML e PDF. Sendo assim coloque no formos componentes IWRadioGroup1, IWLabel2, IWButton2 eIWButton3, para assim podermos mostrar na tela a opção para ousuário selecionar em qual formato será apresentado o relatório.

Nesses componentes faremos as seguintes configurações:

IWRadioGroup1, indique na propriedade Items os valores,HTML e PDF.

IWLabel2, coloque na propriedade Caption o texto, “GerarRelatório em:”

IWButton2, coloque na propriedade Caption o texto,“Gerar através do RvSystem”

No evento onclick deste componente IWButton2, iremosincluir as instruções responsáveis pela criação e apresentação dorelatório no formato selecionado.

A criação dos arquivos .HTML e .PDF será realizada peloscomponentes RvSystem1, RvRenderHTML1 e RvRenderPDF1.

A seguir poderemos ver as instruções no evento onclick doIWButton2:

procedure TIWForm1.IWButton2Click(Sender: TObject);

var

sArquivo: string;

begin

With DataModule1 do

begin

if IWRadioGroup1.ItemIndex = 0 then // HTML

begin

sArquivo := WebApplication.AppID+’.html’;

RvSystem1.RenderObject := RvRenderHTML1;

end

else // Formato PDF

begin

sArquivo := WebApplication.AppID+’.pdf’;

RvSystem1.RenderObject := RvRenderPDF1;

end;

RvProject1.Engine := DataModule1.RvSystem1;

RvSystem1.DoNativeOutput := False;

RvSystem1.OutputFileName := WebApplication.

ApplicationPath+‘files\’+sArquivo;

RvProject1.ProjectFile :=WebApplication.

ApplicationPath+‘files\Relatorio.rav’;

try

RvProject1.Open;

RvProject1.Execute

finally

RvProject1.Close;

end;

end;

{ Apresenta uma nova janela com o arquivo gerado }

AddToInitProc(‘window.open(“/files/

’+sArquivo+’”,””,””);’);

end;

O próximo exemplo que iremos criar fará o mesmo resultado,isso é, criará os arquivos .HTML e .PDF mas utilizando para issoos componentes RvNDRWriter1, RvRenderHTML1 eRvRenderPDF1.

A seguir poderemos ver as instruções no evento onclick doIWButton3:

procedure TIWForm1.IWButton3Click(Sender: TObject);

var

stream: TMemoryStream;

sArquivo: string;

begin

With DataModule1 do

begin

RvProject1.Engine := RvNDRWriter1;

stream:=TMemoryStream.create;

try

RvProject1.ProjectFile:=WebApplication.

ApplicationPath+’files\Relatorio.rav’;

RvNDRWriter1.Stream := stream;

RvProject1.Open;

RvProject1.Execute;

sArquivo:=WebApplication.AppID;

if IWRadioGroup1.ItemIndex = 0 then // HTML

begin

RvRenderHTML1.PrintRender(stream,WebApplication.

ApplicationPath+ ’files\’+sArquivo+’.html’);

sArquivo := sArquivo+’1.html’;

end

else // Formato PDF

begin

sArquivo := sArquivo+’.pdf’;

RvRenderPDF1.PrintRender(stream,WebApplication.

ApplicationPath+’files\’+sArquivo);

end;

finally

RvProject1.Close;

stream.free;

end;

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 99999

DelphiDelphiDelphiDelphiDelphi

end;

{ Apresenta uma nova janela

com o arquivo gerado }

AddToInitProc(‘window.open(

“/files/’+sArquivo+

’”,””,””);’);

end;

Observação: Eu recomendo que emseus projetos utilize apenas uma dasduas formas para trabalhar, pois nesteprojeto após executar essa segundaforma de criação do arquivo .PDF setentarmos executar a primeira formanovamente ocorre um erro de AccessViolation.

E até o momento não conseguiidentificar como resolver este erro, masusando apenas uma das duas formasesse erro não será gerado.

Após colocarmos todos oscomponentes no form e configura-los onosso IWForm ficará parecido com afigura 6.

Dica importante sobre o RaveReport

Essa dica é bastante importante, pois para o Rave Reportfuncionar num projeto chamado por várias máquinas ao mesmotempo, é necessário indicar um DataID para cada projeto, poisassim não ocorrerá conflitos entre as suas execuções.

Esse DataID será definido no arquivo ServerController donosso projeto e para isso declare na lista de Uses as units:

RPDefine

Depois dentro do Constructor TUserSession.Createinclua a seguinte instrução:

RPDefine.DataID := WebApplication.AppID;

Conclusão:Neste momento estamos com o nosso projeto pronto, basta

executa-lo para podermos visualizar os relatórios em nossonavegador através dos arquivos .HTML ou .PDF.

Podemos observar que foi bastante simples a montagem

Figura 6: IWForm contendo todos os componentes do projeto.

desse projeto, devido a facilidade com que o Rave Report exporta orelatório para os formatos desejados. Lembrando que podemosfazer essas exportações mesmo em projetos simples que não serãoexecutados na Web.

Um grande abraço a todos e até a próxima.

DownloadO projeto de exemplo deste artigo está disponível para

download em:

http://www.theclub.com.br/revista/download/IWRave.zip

Sobre o autorAndré ColaviteConsultor Técnico do The [email protected]

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 01 01 01 01 0

DelphiDelphiDelphiDelphiDelphi

O objetivo deste artigo é dar-lhe uma visão geral do que vocêencontrará no Delphi 8 for .NET. Mostrar-lhe as novidades destanova versão e comentar sobre a migração de suas aplicaçõesdesenvolvidas em versão anteriores para o Delphi 8 for .NET.

Uma nova IDEA característica mais óbvia do Delphi 8 for .NET é a sua IDE,

Uma visão geral do Delphi 8 for .NETUma visão geral do Delphi 8 for .NETUma visão geral do Delphi 8 for .NETUma visão geral do Delphi 8 for .NETUma visão geral do Delphi 8 for .NETPor Claudinei Rodrigues – [email protected]

como você pode ver na figura 1. Quem teve a oportunidade de vero C# Builder poderá notar que ambas as IDEs são iguais e quesão similares a IDE do Microsoft Visual Studio .NET.

Na minha opinião a IDE do Delphi ficou melhor, pois tem umlayout mais limpo e altamente configurável dando a vocêinúmeras opções com respeito a sua configuração.

Figura 1: IDE doDelphi 8 for .NET

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 11 11 11 11 1

DelphiDelphiDelphiDelphiDelphi

Qualquer um que já tenha trabalho com o Delphi 7 não terádificuldades em trabalhar com esta nova versão. As ferramentas,opções e as caixas de diálogo são encontradas geralmente com omesmo nome ou seleções similares do menu.

O editor de código é outro local onde você encontrará o CodeInsight, code templates, o todo list como na versão anterior doDelphi. Outra similaridade é a combinação de teclas e itens domenu relacionados ao editor de código que continuam asmesmas. Por exemplo, ao pressionar a tecla F5 é possível incluirum breakpoint, F9 para rodar a aplicação, F7 para Trace Into eetc.

Mas existem algumas diferenças. A modificação mais notávelpode ser encontrada na barra de ferramentas como mostrada nafigura 2, que é diferente da palheta de componentes do Delphi 7.

Figura 2: Barra de ferramentas

Os objetos podem ser adicionados ao seu projeto clicando earrastando para o seu formulário. Um recurso interessante é apesquisa de objetos. Você pode digitar na caixa de diálogo <SearchTools> o nome do componente que quer localizar. Este tipopesquisa funciona igual ao Component List presente no Delphi 7.

Os objetos são organizados por categoria e podem ser

expandidos ou ocultados bastando para isto clicar sobre o titulo decada categoria. Além disto, você pode ir diretamente a umadeterminada categoria clicando sobre o botão Categories eselecionar a categoria desejada.

A barra de ferramentas é sensível ao contexto, ou seja, ela vaimostrar apenas aqueles componentes que são apropriados ao tipode objeto que você está trabalhando no momento. Por exemplo, sevocê está trabalhando em um Windows Forms, a barra deferramentas mostrará os componentes que você poderá utilizarneste tipo de formulário, se você estiver em um ASP.NET WebForm, você terá acesso aos componentes compatíveis com esteform.

Inicialmente a barra de ferramentas contém um pequeno,mas bem escolhida, coleção de objetos que podem serconfiguradas dentro da IDE. Por exemplo, ainda que a versão 1.1do .NET Framework inclua aproximadamente 4.500 classesdiferentes, a barra de ferramentas tem menos de 100componentes.

Você pode adicionar ou remover componentes a partir dabarra de ferramentas. Para isto vá até o menu do Delphi e cliqueem Components | Installed .NET Components ou clique com obotão direito sobre a barra de ferramentas e selecione Installed.NET Components... Isto irá lhe mostrar a caixa de diálogo .NETComponents, como mostrada na figura 3.

Se você quiser que um determinado componente listado nestacaixa de diálogo seja incluído na barra de ferramentas, basta quevocê clique no checkbox do lado esquerdo ao nome do componenteque ele aparecerá dentro da sua categoria. Caso queira remover ocomponente basta desmarcar o checkbox.

Como você deve ter notado é aqui também que você instala osobjetos não gerenciados COM e ActiveX que você quer utilizar emsua aplicação e também os componentes da VCL.NET ( abiblioteca de componentes visuais para .NET. Mas veremos istomais adiante).

Os códigos não gerenciados em DLLs também podem serutilizados no Delphi 8 para aplicações .NET, mas eles sãoacessados utilizando uma técnica diferente.

Outro aspecto da IDE que está um pouco diferente são asvárias opções de caixas de diálogo, incluindo as caixas de diálogoOptions e Project Options.

Neste caso a interface está um pouco diferente, um treeviewdo lado esquerdo da caixa de diálogo mostra as categorias ao

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 21 21 21 21 2

DelphiDelphiDelphiDelphiDelphi

invés da interface utilizando o tabbed notebook das versõesanteriores. Os vários itens dentro destas caixas de diálogotambém são familiares.

Veja a caixa de diálogo Options na figura 4.

Figura 3:Componentes.NET instalados

Figura 4: Caixa dediálogo Options

Outra nova caixa de diálogo é o Data Explorer, como vocêpode ver na figura 5. Esta caixa de diálogo fornece a você umexcelente visualizador para verificar as conexões disponíveisusando o Borland Data Providers ou BDP.NET. A partir desta

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 31 31 31 31 3

DelphiDelphiDelphiDelphiDelphi

caixa de diálogo você pode arrastar as tabelas, views ou storedprocedures para qualquer WinForm ou WebForm.

O interessante desta nova versão do Delphi é que ele permiteque você desenvolva em WebForm de forma muito similar aotrabalho com WinForms e VCL.NET, permitindo assim construirpáginas Web com uma interface visual. Veja a seguir como criaraplicações Windows Forms, ASP.NET Web Forms e VCL Forms.

Windows FormsUse Windows Forms para criar aplicações nativas Windows

que rodem em ambientes gerenciados. Você usa classes .NETpara construir clientes Windows que oferecem duas grandesvantagens. Ele permite que você utilize características nãodisponíveis para clientes do browser.

O Windows Forms combina o melhor dos dois mundos,apresentando um modelo de programação que tira vantagens deum unificado .NET Framework e do rico GUI do Windows. Vocêusa controles do Windows como botões, listbox, caixas de textopara criar suas aplicações. Para acessar Windows Forms, vá atéo menu do Delphi 8 for .NET e clique em File | New | WindowsForms Application.

ASP.NET Web FormsUse o ASP.NET Web Forms para criar aplicações que podem

ser acessadas por qualquer Web browser em qualquerplataforma. Você usa as classes .NET para criar uma aplicaçãoASP.NET. O form consiste de uma representação visual de umHTML e um arquivo de código. Para acessar ASP.NET WebForms, vá até o menu do Delphi 8 for .NET e clique em File |New | ASP.NET Web Application.

VCL FormsUse VCL Forms para criar aplicações que usam componentes

VCL.NET para rodar no .NET Framework. Você usa o BorlandVisual Component Library for .NET para criar uma aplicaçãoVCL Form. Os VCL Forms são especialmente úteis se você querpassar uma aplicação já existente contendo controles VCL para oambiente .NET ou se você já está familiar com o VCL e prefereusá-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 WebQuando você arrasta um componente para um WebForm o

Delphi gera o código HTML correspondente, inserindo-o a umarquivo com a extensão .ASPX associado com o WebForm.Igualmente se o componente é um que tem controle de eventoscomo por exemplo, um Button, o Delphi adiciona a classereferente à classe WebForm no editor de código, que é o arquivoque contém as instruções Delphi que serão executadas noservidor. Veja na figura 6 um exemplo de WebForm em tempo dedesign.Figura 5: Data Explorer

Suporte total ao .NETDiferente do Borland C# Builder, o qual usa o compilador

Microsoft C# sob licença, o Borland Delphi 8 for .NET utiliza umnovo compilador .NET da Borland.

Quando você compila um projeto feito em Delphi 8 for .NET,este novo compilador usa o Microsoft Intermediate Language(MSIL), uma CPU independente de instruções que sãoconvertidas para o código nativo, normalmente por umcompilador em tempo de execução (Just-in-Time). Este MSIL éequivalente ao qual gerado por qualquer compilador Microsoftincluindo aqueles para o C# e o Visual Basic .NET.

Por causa do Delphi 8 incluir uma linguagem completa.NET, ele tem acesso ao .NET Framework Class Library (FCL),uma abrangente classe de bibliotecas, tipos e símbolos queconstituem o .NET equivalente a VCL do Delphi. As classes doFCL fornecem um extensivo suporte para acesso a dados(ADO.NET), WebForms (ASP.NET e Web Services), WinForms

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 41 41 41 41 4

Figura 6: WebForm em tempo de design

(desenvolvimento GUI Windows), desenvolvimento XML e muitomais.

Além disso, os desenvolvedores que utilizam o Delphi 8 .forNET tem acesso transparente a qualquer classe públicadeclarada em legítimo ambiente .NET. Isto significa que todos oscomponentes de terceiros .NET serão facilmente acessados peloDelphi 8 for .NET sem levar em consideração a linguagem a qualele foi desenvolvido.

Para acomodar muitas das características do .NET, aBorland introduziu um significativo aprimoramento a linguagemDelphi. Isto inclui a edição de atributos (declarações descritivasque são usadas para identificar as características dos elementosprogramáticos), unit namespaces, overloading de operadores, enova visibilidade de identificadores. Por exemplo, declarações declasses agora suportam visibilidade private e protected.

O que nos chama a atenção sobre este aprimoramento nalinguagem é que, segundo a Borland, estas novas características

também serão adicionadas em futuras versões do compiladorDelphi Win32. Isto será feito para assegurar que o seu códigocontinue compatível com os vários compiladores da linguagemDelphi.

Indo além do .NET FCLAinda que o Delphi 8 for .NET forneça total suporte para o

FCL, ele vai bem mais além, tornando a linguagem Delphi umasolução atrativa para o desenvolvimento .NET. A Borland incluiuno Delphi 8 for .NET um numero de tecnologias que estendem e/ou complementam o FCL. A Borland refere-se a estas tecnologiascomo Borland Data Providers (BDP.NET), RTL.NET, VCL.NET,dbExpress.NET, IBX.NET, DataSnap.NET e BDE.NET.

Estas duas primeiras tecnologias, BDP.NET e RTL.NET,podem ser usadas em padrões WinForms, WebForms e aplicaçõesconsole .NET que empregam o FCL. O BDP.NET é um conjuntode classes concretas que implementam o ADO.NET usado paraacesso a dados. Estas classes diferem de suas correspondentes noFCL porque elas fornecem uma solução portável para acesso a

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 51 51 51 51 5

uma variedade de bancos de dados diferentes incluindo o MSSQLServer, Interbase, Oracle e DB2. Note que o BDP.NET estádisponível apenas nas versões Enterprise e Architect do Delphi 8for .NET.

O RTL.NET é uma versão da biblioteca de runtime do Delphi,uma coleção de funções e procedures puras (e suas constantes,variáveis e tipos associadas) que você pode usar a partir do seucódigo. O RTL.NET mantém uma estreita compatibilidade com ocódigo fonte das versões Win32 do Delphi, tornando mais fácil ocaminho de migração do seu código existente Win32 para o .NET,e também permitindo a você escrever rotinas que são facilmentecompiladas sob a plataforma de sua escolha.

Na minha opinião, a presença do RTL.NET fornece umargumento convincente para usar o Delphi como sua linguagempreferida para o .NET. O RTL.NET inclui literalmente centenasde rotinas proveitosas incluindo aquelas das unitsBorland.VCL.SysUtils, Borland.VCL.StrUtils,Borland.VCL.DateUtils e Borland.VCL.Math.

Outra tecnologia da Borland, o DB WebControls for ASP.NET, está disponível para vocêusar na construção de WebForms. Eles sãocomponentes visuais Web data-aware que vocêpode usar com o ADO.NET ou BDP.NET paracriar aplicações Web de forma rápida e simples.

As tecnologias que foram mencionadasanteriormente nesta seção foram desenvolvidaspara facilitar o processo de migração de aplicaçõesWin32 para .NET. Estas tecnologias podem ser deum modo geral comentada como VCL.NET, comdbExpress .NET, IBX.NET, DataSnap .NET eBDE.NET sendo subconjuntos da tecnologiaVCL.NET.

VCL.NET é um conjunto de componentes quefornece um extensivo código de compatibilidade entre o DelphiWin32 e o Delphi for .NET. As classes e tipos disponíveis naVCL.NET representam um rico sub-conjunto da VCL Win32.Além disto, estes tipos e classes ostentam interfaces que sãoessencialmente idênticas as contidas na VCL, permitindo a vocêcriar facilmente simples projetos que podem ser compilados tantona plataforma .NET quanto na Win32, além de fornecer umaenorme simplicidade na migração para o .NET. Se uma de suasaplicações já existentes usa componentes comuns da VCL doDelphi como Edits, Labels, DBGrids, Menus, você podesimplesmente abrir o seu projeto no Delphi 8 for .NET e compilá-lo.

Por exemplo, se você tiver instalado o Delphi 8.NET e o Delphi7 na mesma máquina, use o Delphi 8 para abrir o projetoConvertIt que está localizado ..\Demos\ConverIt no Delphi 7.Pressione F9 para compilar e rodar o projeto. O projeto serácompilado sem nenhum problema.

Quanto ao dbExpress.NET, IBX.NET, DataSnap.NET e oBDE.NET estes são implementações .NET associadas as classesVCL para acesso a dados. Como qualquer outra parte da VCL,estas classes fornecem um caminho de atualização para o .NETpara a maioria da aplicações com acesso a dados existentes. Aquivocê encontrará classes como TSqlDataSet, TIBConnection,TClientDataSet, TDataSetProvider, TDCOMConnection,TDataSource e até TTable.

Veja a figura 7. Ela mostra o projeto FishFact.dpr que podeser encontrado em ..\Demos\DB\FishFact localizado no Delphi7. Ao compilar no Delphi 8 este projeto será uma aplicaçãoVCL.NET que utiliza o BDE.NET para acessar a tabela Paradox.Igual ao projeto ConverIt, basta abrir o projeto e compilá-lo.

Sobre o autorClaudinei Rodrigues,Consultor Técnico do The [email protected]

ConclusãoEspero ter concluído o objetivo deste artigo que era dar uma

visão geral sobre o Delphi 8 for .NET. É claro que existe muitacoisa nova e pretendo descrevê-las nas próximas edições de nossarevista. Então até lá.

Figura 7: Projeto Fish Facts

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 61 61 61 61 6

RetrospectivaRetrospectivaRetrospectivaRetrospectivaRetrospectivaRetrospectivaRetrospectivaRetrospectivaRetrospectivaRetrospectiva

Na nossa retrospectiva, estamos no ano de 1997. Um ano deexpectativas, com o amadurecimento do Delphi já na sua terceiraversão.

Na revista de Setembro de 1997, destaca-se entre outrosassuntos o artigo sobre como criar e exportar métodos do Delphipara uma DLL, um artigo bem detalhado que não deixava dúvidaspara quem necessitava usar este recurso.

Também tivemos um artigo sobre OLE, onde ensinamos comocontrolar um aplicativo a partir de uma aplicação Delphi.

Em 1997 o Clipper ainda caminhava com força total, e tivemosalguns artigos em nossa revista, como a quinta parte de uma sérieonde estávamos ensinando os programadores a fazer suasaplicações funcionando em rede, que sempre foium desafio paraalguns programadores.

No mês que vem estaremos em 1996. Nossa restrospectiva iráaumentar de tamanho e também relembrar mais assuntos, poiseste foi um ano mágico para todos nós. Aguardem!

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE1 81 81 81 81 8

DelphiDelphiDelphiDelphiDelphi

Salve, salve Delphi People!

Chegamos na segunda parte de nossa trilogia. Neste artigoiremos desenvolver o formulário de alteração de clientes, e dequebra vocês irão aprender algumas técnicas interessantes datecnologia IW.

Recentemente publiquei um artigo sobre a saudável disputaentre as tecnologias WebBroker e Intraweb. Alguns entenderamminha mensagem: “utilizem Intraweb com moderação!”. Sugiroque aplicações baseadas em IW sejam direcionadas parapequenos e médios grupos de usuários; algo em torno de 20, ouaté 30 no máximo. Pensem nisso!

Continuando com o nosso artigo, vamos criar o formulário dealteração.

Criando o Formulário de AlteraçãoAtravés das opções File/New/Other..., selecione a seção

Intraweb e escolha o modelo Application Form (figura 1).

Cadastro de Clientes com IntrawebCadastro de Clientes com IntrawebCadastro de Clientes com IntrawebCadastro de Clientes com IntrawebCadastro de Clientes com IntrawebParte IIParte IIParte IIParte IIParte II

Figura 1 Criando um novo formulário

Altere a propriedade Name do formulário para FmAltera eBackGroundColor para $00DDFFFF. .

Grave a unit com o nome un_alteracao.

Insira os componentes que seguem no FmAltera..

Por Emerson Facunte

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 1 91 91 91 91 9

DelphiDelphiDelphiDelphiDelphi

Agora vamos codificar o formulário.

Insira a unit DataModuleUnit (criada no primeiro artigo) na cláusulauses do formulário.

uses

ServerController, DatamoduleUnit;

No evento OnClick do objeto btDesiste insira o código que segue:

Hide;

Para que possamos retornar ao formulário de origem,utilizamos o método Hide do formulário.

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

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 02 02 02 02 0

DelphiDelphiDelphiDelphiDelphi

alteração do cliente’, smSameWindow);

end;

Hide;

Vamos analisar o código.

Nesta primeira parte, iniciamos um bloco protegido.

try

Em seguida, estamos atribuindo parâmetros ao objeto

SQLAltera do DataModule1.

{Inclui 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;

E finalmente executando a operação e apresentando amensagem de sucesso na operação.

ExecSQL;

WebApplication.ShowMessage(‘Cliente incluido com

sucesso’,smSameWindow);

Em caso de erro, estamos criando o bloco except.

except

WebApplication.ShowMessage(‘Houve um problema na

inclusão do cliente’, smSameWindow);

end;

E apresentando a mensagem do problema.

Embora o Intraweb forneca o objeto com conexão direta aDataSets, estamos utilizando os objetos convencionais, semnenhum vínculo com DataSet. Quando trabalhamos com Internet,é complicado disponibilizar objeto de conexão direta com DataSets,justamente porque não sabemos o que poderá ocorrer com aconexão.

Sugiro adotar este modelo de desenvolvimento pelasegurança.

Então, para que nossos campos sejam preenchidosautomaticamente com as informações do banco de dados, vamosutilizar o TDataSource e TSQLDataSet.

Pronto, agora concluímos o nossoformulário de alteração de clientes.

A figura 2 ilustra o nosso formulário.

figura 2 Formulário alteração de clientes

Sobre o autorEmerson Facunte é Consultor de

Tecnologia com diversos livrospublicados, especialista emdesenvolvimento de aplicações e-business utilizando a ferramentaDelphi, baseado em webSnap,dataSnap, BizSnap e ISAPI/ApacheModules.

[email protected]

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 12 12 12 12 1

DelphiDelphiDelphiDelphiDelphi

Introdução

O Rave Report é um poderosogerador de relatórios baseado em“projetos de relatório” que além deinúmeros recursos interessantes,possui objetos de acesso a banco dedados “independentes” dos objetos doDelphi, inclusive com gerador deconsultas SQL.

Provendo acesso a dados

Primeiro, adicione um componenteRvProject ao seu formulário e dê umduplo clique no mesmo para acessar o“Rave Visual Designer” (Figura 1).

Agora clique no botão “New DataObject” e selecione “DatabaseConnection” e clique em “Next” (Figura2 )

Agora escolha a tecnologia de acesso através da qual o acessoserá feito ao seu banco de dados, podendo optar por:

· ADO· BDE· DBX (dbExpress)

No nosso exemplo iremos utilizar “BDE”, e clique em “Finish”

Rave ReportRave ReportRave ReportRave ReportRave ReportConectando banco de dados via RaveConectando banco de dados via RaveConectando banco de dados via RaveConectando banco de dados via RaveConectando banco de dados via Rave

Por Alessandro Ferreira ([email protected])

Figura 1

Figura 2

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 22 22 22 22 2

DelphiDelphiDelphiDelphiDelphi

para finalizar.

O próximo passo será escolhar um Alias existente no BDEpara o acesso à nossas tabelas, como mostra a figura 3 e clicarem OK para finalizar.

Figura 3

Observe no Treeview de objetos (lado direito do rave visualdesigner) que um novo objeto foi adicionado, com o nome de“Database1”. (Figura 4)

Figura 4Bem, com isso já temos a nossa conexão estabelecida com o

banco de dados.Agora faremos o acesso a(s) tabela(s) referente nosso Alias.

Mais uma vez,clique no botão“New DataObject” eselecione“Driver DataView”, conformemostra a figura5 e clique em“Next”...selecione o“Database1” e“Finish” parafinalizar. Figura 5

Após isso, lhe será apresentado o “Query AdvancedDesigner”, através do qual poderá selecionar a(s) tabela(s) ecampos à serem impressos, bastando selecionar a tabela na listae arrastar a tabela a aba “layout”. (Figura 6)

Figura 6

Após selecionar a(s) tabela(s) e campos desejados, clique emOK para finalizar.

Bem, agora já temos nosso “DriverDataView” com os camposque selecionamos, como mostra a Figura 7.

Figura 7

Para concluir o relatório, adicione um componente “Region”(aba Report) e sobre ele um “DataBand” (também da aba Report)ajustando sua propriedade “DataView” para “DriverDataView1”.Para adicionar os campos à banda, bastará pressionar a teclaCTRL, clicar e arrastar o campo sobre a banda.

Salve o projeto Rave (menu File | Save).

Chamando o Relatório via Delphi

Selecione o componente “RvProject” e selecione o projeto Ravena propriedade “ProjectFile” do mesmo.

Para executar, poderá utilizar:

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 32 32 32 32 3

DelphiDelphiDelphiDelphiDelphi

RvProject1.ExecuteReport(‘Report1’);

IMPORTANTE: Para que a conexão com o banco de dados sejaestabelecida sem a necessidade de componentes do Delphi, declare a seguinte unitna lista de uses de sua unit:

· rvDlbde = conexão BDE· rvdldbx = conexão dbExpress· rvDlAdo = conexão ADO

Na pasta \Delphi7\Rave5\DataLinks encontrará trêsarquivos correspondentes as units acima, que deverão sercopiados para uma pasta em path (exemplo \Windows\System)conforme a conexão utilizada, sendo eles:

· DataLinkBDE.rvd = conexão BDE· DataLinkDBX.rvd = conexão dbExpress· DataLinkADO.rvd = conexão ADO

ConclusãoO Rave Report é um poderoso gerador de relatórios e oferece

bastante flexibilidade ao desenvolvedor. Aos poucos iremosexplorando todos os recursos disponíveis nesta boa ferramenta,contudo, a versão que acompanha o Delphi não disponbiliza estetipo de funcionalidades ao usuário final, isso está disponívelapenas nas versões “compradas” do Rave.

Saúde e sucesso à todos,[]s,Alessandro Ferreira

Download

O projeto de exemplo demonstrado neste artigo estádisponível para download em: http://www.theclub.com.br/revista/download/RaveConnection.zip

Sobre o autorAlessandro Ferreira,Consultor Técnico do The [email protected]

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 42 42 42 42 4

DelphiDelphiDelphiDelphiDelphi

Borland® dbExpress – Conectividade eSimplicidade

Muitas tentativas já foram feitas em relação a se criar umconjunto de APIs comuns para acesso a múltiplos bancos dedados. Grandes progressos foram realizados, contudo, algunsmecânismos reduziam a performance, eram difíceis de utilizar,complexos na implementação de drivers ou apresentavam bugs.

Pensando nisso, a Borland desenvolveu a arquiteturadbExpress, a qual combina várias funcionalidades baseadas eminterfaces que permitem transparência ao programador final eao mesmo tempo certa facilidade aos desenvolvedores de driverspara comunicação com os mais diversos banco de dados.

A dbExpress é baseada na consagrada arquiteturaProvider/Resolver da Borland, a qual permite ótimo desempenhoe escalabilidade no acesso e manutenção de dados e é sobre essaarquitetura que iremos tratar neste artigo, focandoprincipalmente o processo de migração do BDE para dbExpress.

A arquitetura dbExpressA princípio, o dbExpress foi projetado com seis metas

principais:

· Minimizar o consumo de recursos de sistema· Maximizar a performance· Suporte “cross-plataform”· Simplificar o desenvolvimento· Facilitar o desenvolvimento de novos drivers· Permitir ao programador otimizar o consumo de memória e

tráfego em rede

Os drivers dbExpress conseguem ser pequenos e rápidosporque eles provêem apenas as funcionalidades que realmentesão necessárias e nada a mais! Cada driver consiste em apenasuma DLL (plataforma Windows) e um shared object library(plataforma Linux). Basicamente, podemos resumir osmecânimos em cinco interfaces que possibilitam extrairmetadatas, executar instruções SQL e stored procedures, eretornar conjunto de dados (cursores) uni-direcionais do tiposomente leitura. Porém, se trabalharmos em conjunto com oscomponentes DataSetProvider e ClientDataSet, os quaispermitem implementar a estratégia Provider/Resolver daBorland, a dbExpress constitui-se em um poderoso mecânismo deobtenção e manutenção de dados onde destacam-se a alta-performance e um excelente sistema de concorrência para setrabalhar com SGDBs.

Como funciona o mecânismo Provider/ResolverO mecânismo Provider/Resolver na dbExpress é composta

pelo trabalho conjunto de alguns componentes, sendo o primeiro oSQLConnection, o qual é responsável em prover a conexão aodriver dbExpress e este por sua vez “conversar” com o banco dedados que você está utilizando. O próximo componente é umTDataSet dbExpress, como exemplo o SQLDataSet, sendo esteresponsável em prover os dados mediante uma instrução SQL ouexecutando um Stored Procedure disponível no banco de dados. Oterceiro componente é o DataSetProvider e o quarto componenteum ClientDataSet. Quando você ativa o ClientDataSet, esterequisita os dados ao DataSetProvider. O DataSetProvider por

Migrando aplicações BDE para dbExpressMigrando aplicações BDE para dbExpressMigrando aplicações BDE para dbExpressMigrando aplicações BDE para dbExpressMigrando aplicações BDE para dbExpressParte 1Parte 1Parte 1Parte 1Parte 1

Recursos & Arquitetura Provider/ResolverRecursos & Arquitetura Provider/ResolverRecursos & Arquitetura Provider/ResolverRecursos & Arquitetura Provider/ResolverRecursos & Arquitetura Provider/Resolver

Alessandro Ferreira, [email protected]

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 52 52 52 52 5

DelphiDelphiDelphiDelphiDelphi

sua vez, abre a consulta ou stored procedure, recupera osregistros e fecha a consulta ou stored procedure e armazena esteresultado no ClientDataSet que solicitou a mesma.

O ClientDataSet armazena os registros em um “cache local”,através do qual iremos adicionar, alterar e excluir registros.Assim sendo, todas as operações que efetuamos ficamarmazenadas neste “cache local” e para que possamos enviá-lasao banco de dados teremos que chamar o método ApplyUpdates, oqual envia o “change log” ao DataSetProvider. O provedor(DataSetProvider) inicia então uma transação e dentro damesma cria e executa instruções SQL para aplicar as mudançasao banco de dados. Se todas as instruções forem executadas semerros, o provedor efetua um “commit” na transação, casocontrário, efetua um “rollback”. Alguns exemplos de erros quepoderão ocorrer durante este processamento seriam a violação dechaves estrangeiras, violação de regras de negócio definidas emtriggers, campos obrigatórios que não foram preenchidos, oumesmo, registros (campos) diferentes desde a última leituraefetuada pelo DataSetProvider. No caso de erros, além datransação sofrer um “rollback”, automaticamente será acionado oevento OnReconcileError do ClientDataSet, através do qual é possívelimplementar o tratamento e apresentação dos erros ao usuário.Um detalhe importante é que os erros somente serão reportados àeste evento e se você não possui nenhuma linha de código nomesmo, nenhuma mensagem de erro será apresentada, mesmoque a atualização não tenha sido efetuada com sucesso.

Benefícios do mecânismo Provider/ResolverTransações com “vida curta”Transações abertas por muito tempo forçam o servidor de

banco de dados a manter registros travados o que reduz aconcorrência e consome recursos do servidor de banco de dados.Já com o mecânismo Provider/Resolver, as transações sãoexigidas apenas no momento em que as atualizações foremrealmente aplicadas, ou seja, quando chamarmos o métodoApplyUpdates. Isso reduz drasticamente a utilização de recursose melhora a concorrência em um servidor de banco de dados, oqual normalmente já trabalha no limite.

Editando dados de “qualquer” fontePor padrão, não podemos editar diretamente registros

retornados por instruções SQL que contenham joins, unions estored procedures, pois estas normalmente vêm como “somenteleitura”.

Contudo, trabalhando dentro do mecânismo Provider/Resolver isso é perfeitamente possível e simples de ser feito, claroque, com alguns pequenos ajustes.

Ordenação e Pesquisas instantâneasComo o ClientDataSet trabalha com os registros em

memória, é possível fazer ordenações por qualquer um doscampos disponíveis no mesmo, isso de forma rápida. Contudo, seuma ordenação estiver um pouco lenta, você poderá criar índicesem modo de design ou mesmo em run-time. Estes índices “in-memory” permite a ordenação e localização de registros de formainstantânea sem que haja necessidade de efetuar chamadas aoservidor de banco de dados.

Sumarização automática de dadosClientDataSets possibilitam criar complexos sumários de

dados automaticamente, como por exemplo a totalização decampos, permitindo o uso das funções Sum(), Count(), Avg(),Min() e Max(). Você pode agrupar sumários por qualquer campoou combinação de campos, provendo assim totalizações por grupo,tudo em conjunto com as funções acima e os índices mencionadosanteriormente.

Filtrar sub-conjuntos de dadosO ClientDataSet possibilita utilizar como expressões em

filtros a mesma síntaxe “SQL WHERE” que utilizamos eminstruções SQL, contudo, esta “filtragem” é feito em cima davisualização local dos dados, sem fazer requisição ao servidor debanco de dados. Com isso, podemos dizer que é possível efetuarum “Select” em cima de outro “Select”.

Visualizações múltiplas de dadosPodemos literamente clonar os dados de um ClientDataSet e

dessa forma apresentar visualizações diferentes dos mesmosdados simultâneamente.

Campos calculados locaisVocê pode criar campos calculados em um ClientDataSet em

modo de design, utilizando os mesmos para computar conjntos dedados em memória, conseguindo dessa forma resultados bemmais complexos do que se estivesse utilizando instruções SQL,além do que, estas estariam fazendo chamadas ao servidor debanco de dados e poderiam ser mais lentas, além de consumiremrecursos do servidor.

Com quantos registros posso trabalhar no cache?A princípio não existe uma limitação, ficando esta a cargo dos

recursos disponíveis na máquina. Como sabemos, não éaconselhável trazer um grande volume de registros em ambienteClient/Server devido ao tráfego gerado na rede, sem contar naperformance que não será nada agradável. Contudo, o

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 62 62 62 62 6

DataSetProvider e o ClientDataSet possuem mecânimos quepossibilitam trazer registros retornados por uma consulta SQLem pacotes de N registros, utilizá-los, descartá-los e trazer umnovo pacote de registros, permitindo assim trabalhar com umgrande volume de dados balanceando o tráfego em rede eotimizando a performance.

Desenvolvimento SimplificadoUma aplicação que utiliza dbEpxress requer apenas duas

DLLs para rodar. A primeira é o driver do dbExpress, o qual iráfazer acesso ao SGDB, como por exemplo a DBEXPINT.DLL nocaso do Interbase/Firebird. A segunda é a MIDAS.DLL, sendoesta última a responsável pelo ClientDataSet. Juntas estas DLLssomam 1,5 MB de tamanho! Com certeza, isso minimiza otamanho da aplicação e simplifica sua distribuição e instalação.

Se você preferir não distribuir estas DLLs, você poderácompilar diretamente suas units correspondentes e com isso tudoficará embutido no próprio executável. Utilizando o Kylix/Linux,o desenvolvimento é idêntico, exceto pelo fato de não utilizarmosDLLs e sim dois shared object libraries.

Facilidade na criação de novos driversBasicamente, a implementação de um drive para a

arquitetura dbExpress consiste na implementação de cincointerfaces que estão documentadas no help do próprio Delphi.Para facilitar, a Borland disponibilizou gratuitamente o códigofonte do driver MySQL para ser utilizado como modelo. Assim,torna-se ainda mais fácil para desenvolvedores de bancos dedados implementarem drivers que ofereçam alto-desempenho econfiabilidade. Contudo, caso o banco de dados que você utilizenão possua nenhum driver no mercado, você poderá seaventurar no desenvolvimento de seu próprio driver.

Prova disso é o projeto “Open-Source” Unified Interbase, oqual disponibiliza drivers para dbExpress escritos em Delphipara conexão com os bancos: Firebird 1.0.2, Firebird 1.0.3,Firebird 1.5, Interbase 6, Interbase 6.5, Interbase 7, Interbase7.1 e Yafill (uma variante do Interbase), e o melhor, tudogratuíto e com código fonte aberto, maiores informações em:http://www.progdigy.com/UIB/.

Desenvolvendo uma aplicação utilizandodbExpress

Antes que você comece a migrar suas aplicações “BDE” paradbExpress, você precisa primeiramente estar familiarizado comos componentes que compõe a dbExpress e o mais importante,como utilizá-los. Neste tópico iremos criar passo a passo umapequena aplicação utilizando dbExpress, descrevendo cada

componente e como utilizá-lo. Iremos implementar o exemploutilizando o Delphi 7, contudo, os passos aqui utilizados serãoidênticos para quem trabalha com Kylix na plataforma Linux.

Nesta aplicação exemplo iremos utilizar banco de dadosInterbase/Firebird, aproveitando o banco EMPLOYEE.GDB que édisponibilizado após a instalação do IB/FB, onde poderemosencontrar tabelas demonstrando relacionamentos, e outrassituações triviais em um banco de dados. A aplicação exemplo iráabordar as seguintes situações na dbExpress:

· NestedDataSets, tabela detalhe contida em um campo databela master

· Editando dados com SQLQuery/SQLDataSet,DataSetProvider e ClientDataSet

· Aplicando as atualizações guardadas em cache doClientDataSet ao banco de dados

· Interceptando erros que poderão ocorrer ao aplicar os dadosao banco de dados

O componente SQLConnectionA criação de uma aplicação utilizando dbExpress é bem

simples.

Vamos começar por configurar a conexão e a este ponto e pelonome sugestivo você já sabe que iremos utilizar o componenteSQLConnection para isso, seguindo os seguintes passos:

1. Crie uma nova aplicação, File | New | Application eadicione um DataModule à mesma, ajustando seu nome paraMainDm.

2. Acesse o menu Project | Options e ajuste na lista “Auto-Create Forms” deixe como primeiro objeto à ser criado o nossoMainDm.

3. Adicione um componente SQLConnection (palhetadbExpress) ao MainDm;

4. Configure o nome do SQLConnection paraEmployeeConnection, e a propriedade DriverName paraInterbase;

5. Agora o editor de propriedades referente a propriedadeParams e configure os seguintes parâmetros: Database: com o pathe o nome do arquivo GDB.

6. Altere os parâmetros UserName e Password caso estejamdiferentes do que está configurado em seu servidor IB/FB;

7. Configure a propriedade LoginPrompt para False para quenão seja solicitado novamente usuário e senha;

8. E finalmente, ative alterando a propriedade Connected paraTrue;

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 72 72 72 72 7

Você poderá utilizar um único componente SQLConnectionindependente do números de componentes datasets que venhautilizar. Poderá ainda, caso haja necessidade ter várioscomponentes SQLConnection para conectar-se a bancosdiferentes simultâneamente sem problemas! Para definir aconexão, poderá ter as configurações definidas através dapropriedade Params, conforme mencionado anteriormente,efetuar as configurações todas em run-time, ou ainda,armazenar as configurações em um arquivo INI e carregá-lasdinâmicamente.

O Editor de Conexões dbExpressPara criar uma nova conexão, bastará dar um duplo-clique

no componente SQLConnection para abrir o editor de conexões,onde serão apresentadas todas as conexões disponíveis, além éclaro da possibilidade da criação de uma nova conexão. Todas asconexões criadas através deste editor ficam armazenadas em umarquivo chamado dbxConnections.ini.

Vale ressaltar, que quando criamos conexões“nomeadas” podemos definí-las através da propriedadeConnectionName do SQLConnection e com isso precisamosdistribuir o arquivo INI (contendo as informações sobre nossaconexão) junto com a aplicação.

Algumas funcionalidades do SQLConnectionO componente SQLConnection provê várias funcionalidades,

entre as quais destacamos o controle de transações através dosmétodos StartTransaction, Commit e RollBack explícitos. Se vocênecessitar executar instruções SQL que não devolvam umconjunto de dados (ResultSet), você poderá trabalhar diretamentecom o método ExecuteDirect ou Execute, os quais facilitam bastante aexecução dessas instruções. Caso necessite extrair informações(metadata) do banco de dados que está trabalhando, isso também ébastante simples, bastando para isso utilizar os métodosGetTableNames, GetFieldNames e GetIndexNames do SQLConnection.

Os componentes DataSetA dbExpress disponibiliza basicamente quatro componentes

DataSet, sendo: SQLDataSet, SQLQuery, SQLStoredProc e SQLTable.Recomendamos que para qualquer nova aplicação que vocêvenha a desenvolver, utilizar o componente SQLDataSet, pois, estecomponente já encapsula os outros três componentes existentesna dbExpress, ou seja, bastando configurar a propriedadeCommandType para ctQuery, ctStoredProc ou ctTable, assumindoassim as mesmas funcionalidades dos outros componentes. Osoutros componentes (SQLQuerym SQLTable e SQLStoredProc) forammantidos por uma questão de analogia ao BDE, porém, são

dispensáveis.

O SQLQueryAs propriedades e métodos do componente SQLQuery são

muito parecidas com a Query existente no BDE, contudo, existeuma diferença bastante significativa, visto o SQLQuery serunidirecional e a Query do BDE não. Você poderá utilizar oSQLQuery para execução de instruções SQL DML e instruçõesDDL. Para instruções que resultem em um conjunto de dados(ResultSet), utitize o método Open ou Active = True e parainstruções que não retornem conjunto de dados, chame o métodoExecSQL. Vamos continuar no desenvolvimento de nossoaplicativo de exemplo.

1. Adicione três componentes SQLQuery ao nossodatamodule;

2. Aponte a propriedade SQLConnection paraEmployeeConnection;

3. Nomeia a primeira SQLQuery para EmployeeQry, asegunda para HistoryQry, e a última para DeptQry.

4. Configure a propriedade SQL do EmployeeQry para:

SELECT * FROM EMPLOYEEWHERE DEPT_NO = :DEPT_NOORDER BY LAST_NAME

5. Configure a propriedade SQL do HistoryQry para:

SELECT * FROM SALARY_HISTORYWHERE EMP_NO = :EMP_NO

6. E finalmente, a propriedade SQL do DeptQry para:

SELECT DEPT_NO, DEPARTMENT FROMDEPARTMENT

ORDER BY DEPARTMENT

7. Adicione um componente DataSource, nomeie comoEmpLinkSrc, e aponte a propriedade DataSet para EmployeeQry;

8. Configure a propriedade DataSource do componenteHistoryQry para EmpLinkSrc (com isso estaremos relacionando as duasSQLQuerys);

9. Volte ao EmployeeQry, acesse a propriedade Params econfigure o valor do parâmetro DEPTO_NO para um valor quevocê saiba que não existirá na tabela, como exemplo XXX, comisso, nenhum registro será retornado até que informemos umvalor válido para departamento;

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE2 82 82 82 82 8

10. Dê um duplo-clique no EmployeeQry e adicione os TFieldsao Fields Editor.

11. Selecione o campo EMP_NO e configure a propriedadeProviderFlags para pfInKey = True. Fazendo esta configuração,você está determinando que este campo faz parte da PrimaryKey,dessa forma, o DataSetProvider (que iremos ver mais adiante)irá necessitar dessa informação para construir a instrução SQLde atualização dos registros;

12. Agora, selecione o campo FULL_NAME, vá a propriedadeProviderFlags e configure pfInUpdate e pfInWhere = False.FULL_NAME é um campo computado (pelo banco de dados) enão devemos atualizar diretamente este campo visto isto ser feitoautomaticamente pelo banco de dados e dessa forma oDataSetProvider não deverá fazer referência ao mesmo quandoconstruir as instruções SQL de atualização;

13. Ative o EmployeeQry alterando a propriedade Active =True;

14. Agora, dê um duplo clique no componente HistoryQry, eadicione todos os campos ao Fields Editor do mesmo;

15. Selecione o campo EMP_NO e configure ProviderFlags àpfInkey = True e repita o mesmo para os camposCHANGE_DATE e UPDATER_ID, pois, todos compõe aPrimaryKey;

16. O campo NEW_SALARY é um campo computado(lembra?!) e devemos configurar ProviderFlags à pfInUpdate epfInWhere = False.

17. Altere a propriedade Active do EmployeeQry e HistoryQrypara False;

18. Configure a propriedade Connected doEmployeeConnection para False;

O SQLTableO componente SQLTable se assemelha ao Table que já

conhecemos do BDE, e como já sabemos, ele não é recomendadodentro do ambiente Client/Server devido sua arquitetura detrabalho. Caso necessite utilizá-lo, bastará apontar suapropriedade SQLConnection à um SQLConnection e selecionar atabela por meio da propriedade TableName. Contudo, este existebasicamente por analogia ao Table do BDE e por isso não iremosabordá-lo neste artigo.

O SQLStoredProcEste componente tem finalidade de conectar stored

procedures existentes no banco de dados, basicamente tem omesmo papel do StoredProc disponibilizado pelo BDE. Contudo,na dbExpress também podemos nos referenciar a storedprocedures através do componente SQLDataSet, bastando para

isso ajustar sua propriedade CommandType para ctStoredProc.Mais uma vez, o SQLStoredProc existe por uma questão deanalogia ao BDE, porém, caso necessite utilizá-lo, bastaráapontar sua propriedade SQLConnection à um SQLConnection, eatravés da propriedade StoredProcName fazer referência a umastored procedure existente em seu banco de dados, e chamar ométodo Open ou ExecProc, dependendo da finalidade de sua sp.

O SQLDataSetPara utilizar este componente, assim como os outros

anteriormente mencionados, o primeiro passo é setar apropriedade SQLConnection à um SQLConnection disponível emsua aplicação. Feito isso, você deverá escolher para qualfinalidade o SQLDataSet será utilizado, configurando para isso apropriedade CommadType, podendo ser: ctQuery, ctStoredProc,ou ctTable. Frequentemente você usará o valor padrão ctQuery.A configuração desta propriedade implica na funcionalidade dapropriedade CommandText. Se for ctQuery, CommandTextestará configurado com um editor SQL, se for ctStoredProc,CommantText irá receber apenas o nome de stored proceduresexistentes em seu banco e finalmente se for ctTable,CommantText irá listar as tabelas existentes no banco, bastandoselecionar uma delas.

A propriedade Params provê a configuração de parâmetrospara execução de uma query parametrizada. A propriedadeDataSource é utilizada para ligar um componente a outroprovendo um relacionamento master/detail. Vale lembrar, se oSQLDataSet retornar um conjunto de dados (ResultSet) vocêdeverá chamar o método Open ou Ative = True, caso contrário,ExecSQL.

Conforme mencionei anteriormente, o SQLDataSet trabalhaem modo unidirecional e assim sendo, você poderá ir registro aregistro apenas para frente, não havendo possibilidade deretroceder o ponteiro de registros, apresentando sempre um porvez. Caso vá construir um relatório onde a ferramenta utilizadanão necessite fazer cache de registros, bastará você ligar umDataSource ao SQLDataSet e este ao seu gerador de relatórios.Contudo, caso necessite prover navegação entre registros, comopor exemplo a apresentação em uma grade qualquer, adicioneum componente DataSetProvider, ligando sua propriedadeDataSet ao SQLDataSet e um ClientDataSet, ligando suapropriedade ProviderName ao DataSetProvider ou ainda, utilizeum componente SimpleDataSet (iremos abordar este componentemais adiante).

Se você necessitar obter informações de metadata maisdetalhadas do que o componente SQLConnection oferece, vocêpoderá fazê-lo via componente SQLDataSet, fazendo uso do

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 2 92 92 92 92 9

método SetSchemaInfo. Este método recebe três parâmetros,sendo SchemaType, SchemaObject e SchemaPattern.SchemaType pode receber os seguintes valores stNone, stTables,stSysTables, stProcedures, stColumns, stProcedureParams, oustIndexes. Este parâmetro indica o tipo de informação que oSQLDataSet conterá quando for aberto, trazendoautomaticamente as informações solicitadas, como exemplo, seconfigurar como stTables, ao abrir o SQLDataSet todas astabelas e informações sobre as mesmas serão obtidas facilmente.Por padrão, SchemaType é configurado como stNone. Valeressaltar que, se você adicionar alguma instrução à propriedadeCommandText, automaticamente SchemaType será setado parastNone. Cada combinação de configuração destes parâmetros, irátrazer resultados diferentes. Se por exemplo, você configurarSchemaType = stTables e SchemaPattern para ‘EMP%’, oconjunto de dados conterá somente as tabelas com nome iniciadopor ‘EMP’.

O SimpleDataSetPara visualizar e editar dados no BDE, tudo que

necessitávamos era adicionar um componente TQuery, ajustaralgumas propriedades e pronto! Contudo, como vimosanteriormente, dentro do dbExpress necessitamos combinar trêscomponentes, sendo um SQLDataSet ou SQLQuery, umDataSetProvider e um ClientDataSet e configurá-los a fim deconseguir o mesmo resultado. Contudo, a partir do Delphi 7contamos com um componente que possibilita economizar tempo,ele é o SimpleDataSet. Na realidade, o TSimpleDataSet combinaos três componentes mencionados acima e dessa forma possibilitavisualizar e editar dados diretamente sem a necessidade decomponentes adicionais, porém, apesar da facilidade, existemalgumas restrições a respeito deste componente as quais listamosa seguir:

· Não é possível utilizar este componente em aplicações multi-camadas. Se você pensa futuramente converter sua aplicaçãoClient/Server para N-Tier, utilize os três componentes(SqlDataSet, DataSetProvider e ClientDataSet) separadamente;

· Não é possível vincular tabelas detalhes via nested datasetfield (TDataSetField);

· Nenhum dos eventos do DataSetProvider interno ficamexpostos;

· Nenhuma das propriedades “Options” do DataSetProviderpodem ser alteradas, nem em modo de design e nem em modorun-time;

· Não é possível adicionar os TFields para o DataSet internoao SimpleDataSet e com isso, não existe possibilidade de

configuração da propriedade ProviderFlags;· Se você necessita trabalhar com MyBase (xml ou cds), a

utilização somente do ClientDataSet reduz o consumo de recursosem relação a utilização do SimpleDataSet;

· As propriedades e métodos do SqlDataSet interno não tem amesma funcionalidade de uma Query BDE, assim sendo, seestiver convertendo uma aplicação BDE à dbExpress váriasalterações serão necessárias;

Em resumo, se você necessitar de maior flexibilidade, oSimpleDataSet não é o componente mais indicado.Particularmente, não utilizo este componente em nenhumasituação nos projetos que desenvolvo, pois, apesar dele parecersimples, esta simplicidade pode acabar saindo caro! Mas, semesmo assim você estiver achando complicado a todo momentoter que adicionar os três componentes em seu DataModule, vocêpoderá criar um template para isso. Bastando adicionar,configurar e selecionar os três componentes, depois, acessar omenu Component | Create Component Template que um novocomponente será criado, geralmente disponibilizado na palheta“Template”, dessa forma, quando adicionar este novocomponente, os três serão automaticamente adicionados.

SQLMonitorO último componente da dbExpress é o SQLMonitor. Este

componente é bastante útil para que possamos fazer ajustes emelhorar a performance de nossos aplicativos. Através deste,podemos monitorar todas as instruções e requisições feitas aobanco de dados, gerando um log o qual nos dará uma idéiacompleta se o que mandamos executar realmente é a melhorabordagem.

ConclusãoNo próximo mês irei abordar a palheta Data Access, falando

principalmente sobre os componentes DataSetProvider eClientDataSet, dando assim continuidade a nossa implementaçãocom dbExpress. Em caso de dúvidas, estamos a disposição paramaiores esclarecimentos, basta nos contatar.

Forte abraço à todos,

Sobre o autorAlessandro Ferreira,Consultor Técnico do The [email protected]

DelphiDelphiDelphiDelphiDelphi

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE3 03 03 03 03 0

Perguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & Respostas

Pergunta: Estou utilizando dbExpress para acesso a bancode dados e gostaria de saber onde posso encontrar drivers paraFirebird 1.5 e Progress para o Delphi6.

Resposta: Para Firebird, felizmente está disponibilizado umdriver “open-source” e que nos simples testes que realizamos,funcionou perfeitamente. Poderá baixar diretamente no site dofabricante:

http://www.progdigy.com/UIB/

Quanto ao Progress, infelizmente sabemos que existe driverpara Kylix/dbExpress, porém, para Delphi não temosconhecimento até o momento.

Dúvida enviada por Ana Abrantes, São Paulo/SP.

Pergunta: Como faço para alterar um campo de umatabela Firebird 1.0

para NOT NULL, sem perder os dados constantes damesma?

Resposta: Poderá utilizar a seguinte instrução:

update RDB$RELATION_FIELDS setRDB$NULL_FLAG = 1where (RDB$FIELD_NAME = ‘CAMPO’) and(RDB$RELATION_NAME = ‘TABELA’)

Dúvida enviada por Megasoftware Informática Ltda,Salvador/BA.

Pergunta: Sempre que eu usava a instruçãoIBTransaction.StartTransaction para executar a gravação demeus dados ocorria um erro avisando que o objeto IBTransactionestá ativo, mesmo depois de um IBTransaction.Commit ouCommitRetaining ao final da operação. O problema é que se eudesativar o objeto IBTransaction todos os grids são esvaziados(trabalho com janelas múltiplas, Ex: Cadastro de Clientes podeestar em segundo plano ao lado de Cadastro de Fornecedores queestá sendo editado).

O código abaixo resolveu o meu problema de gravação dedados sem desativar o IBTransaction:

IBSQL1.Transaction :=

IBDatabase1.InternalTransaction;

IBSQL1.Close;

IBSQL1.SQL.Clear;

IBSQL1.SQL.Add(‘INSERT INTO ALUNOS

(CODIGO, NOME, SEXO, NASCIMENTO)’);

IBSQL1.SQL.Add(‘VALUES

(:PCODIGO, :PNOME, :PSEXO, :PNASCIMENTO)’);

if not IBDatabase1.InternalTransaction.

InTransaction then

IBDatabase1.InternalTransaction.

StartTransaction;

IBSQL1.Prepare;

IBSQL1.ParamByName(‘PCODIGO’).

AsString:= Edit1.Text;

IBSQL1.ParamByName(‘PNOME’).AsString:= Edit2.Text;

IBSQL1.ParamByName(‘PSEXO’).AsString:= Edit3.Text;

IBSQL1.ParamByName(‘PNASCIMENTO’).

MeGAZINEMeGAZINEMeGAZINEMeGAZINEMeGAZINE 3 13 13 13 13 1

AsString:= Edit4.Text;

IBSQL1.ExecQuery;

try

IBDatabase1.InternalTransaction.Commit;

except

IBDatabase1.InternalTransaction.Rollback;

end;

IBTable1.Refresh;

A dúvida é se esse código é realmente eficaz como se estivesseutilizando o IBTransaction.StartTransaction diretamente noobjeto de transação?

Resposta: A mensagem de que a transação já está ativa,geralmente ocorre se tentarmos efetuar um “StartTransaction”em um IBTransaction que já esteja ativado, ou seja, se vocêdeixar um componente IBTransaction ativo (para que suastabelas possam permanecer abertas), você não deverá chamar ométodo “StartTransaction”, visto uma transação permanenteficar ativa enquanto o IBTransaction estiver conectado, bastandoneste caso apenas chamar o método “CommitRetaining” ou“RollBackRetaining” para consolidar ou desfazer o que foi postadoao banco de dados.

A cada chamada destes métodos, as pendências sãoeliminadas e é como se estivesse aberto uma nova transação.

Assim sendo, não recomendamos trabalhar com o objeto detransação interna embutida no IBDatabase, visto o mesmo ser deuso interno do IBDatabase, conforme mencionado na própriadocumentação:

Used internally by InterBase transactions.property InternalTransaction: TIBTransaction;DescriptionDo not use InternalTransaction directly. It is for internal use

only.

Dúvida enviada por Nilton Carlos da Silva, Monte Aprazível/SP.

Pergunta: Gostaria de saber como apago vários registros deuma vez (Ex. Quero apagar todos os registros com o código 10)em uma tabela, utilizando o componente TClientDataSet dapaleta Data Access.

Resposta: Poderá utilizar um componente sqlDataSet para

isso aplicando uma instrução delete DML:

With sdsClientes do

Begin

Close;

CommandText := Format(‘Delete From

Clientes where ID = %s’, [EdCodigo.Text]);

ExecSQL(True);

End;

Depois, apenas efetue um Refresh em seu ClientDataSetpara que a visualização seja atualizada.

* A instrução acima também pode ser executada viapropriedade CommandText do ClientDataSet.

Dúvida enviada por Intime Sistemas Ltda, Ararangua/SC.

Pergunta: Tenho uma instrução SQL semelhante a esta:

SELECT Codigo,Nome FROM tabelaORDER BY 2 DESCENDING

No componente do BDE funciona sem problemas, porém,quando troquei para o conjunto do dbExpress (SQLDataSet,DataSetProvider e ClienteDataSet), aonde a instrução vai para oCommandText, aparentemente ignora o DESCENDING.

O interessante é que se eu trocar o “2” pelo nome do campo,ou seja, “NOME”, funciona corretamente.

Se for um BUG, por favor me de uma sugestão para oseguinte caso, eu tenho um SQL em que preciso usar UNION eno final como serão tabelas diferentes a unificar, não posso usaro nome do campo precisaria me referenciar a coluna, o que fazer?

Resposta: Isso ocorre devido ao mecânismo de trabalho doDataSetProvider.

Para resolver, altere a propriedade Options |poRetainServerOrder no DataSetProvider para “True”, com isso,o ClientDataSet irá respeitar a ordenação definida pelo provedorde dados.

Dúvida enviada por Financial Informatica Ltda, CampoGrande/MS.

Perguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & RespostasPerguntas & Respostas