revista the club megazine - 10/2002 · a arquitetura tcp/ip surgiu com a criação de uma rede...

29

Upload: buidat

Post on 10-Dec-2018

218 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)
Page 2: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

Revista The Club Megazine - 10/2002A 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® 2002

Page 3: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 3

EDITORIAL

Editorial

Celso Jefferson PaganelliPresidente - The Club

Editorial ...................................................................................... 03Livros ......................................................................................... 05Firebird 1.5 - Vêm novidades por ai ....................................... 08Usando a classe DataSet para manipular XML ...................... 10Visão da AFRAC sobre necessidade de padrões .................... 14DataSnap – Parte V - A Guia DataSnap e O Cliente COM+ . 16Perguntas & Respostas .............................................................. 25

THE CLUBRua Acre, 950 - Avaré - SP - CEP 18.700-260

Informações: (0xx14) 3732-3689Suporte: (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® 2002

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’AnnaColaboradores

Claudenir C. Andrade - Mário Camilo Bohm

Marcio Alexandroni da Silva

Anderson H. Rodrigues

Delphi é marca registrada da BorlandInternational, as demais marcas citadas são

registradas pelos seus respectivos proprietários.

Olá,

Este mês estamos publicando a maior quantidade de perguntas erespostas em nossa revista dos últimos anos. Espero que você aproveite eque também participe ativamente enviando os seus comentários. Casoqueira fazê-lo diretamente para a minha pessoa, utilize o [email protected].

Já há aproximadamente um mês, estamos testando o nosso novo site,e incluindo algumas características que estavam sendo solicitadas portodos vocês. Se você ainda não o visitou, não perca a oportunidade, poisestamos nos preparando para lançá-lo oficialmente. Visite agora mesmoem beta.theclub.com.br. E claro, sinta-se à vontade para enviar suacrítica ou sugestão. Até o mês que vem !

Page 4: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE4

AVISO

Estamos chegando ao final de mais umano. Esperamos que nossos serviçostenham atendido as expectativas de todosvocês, e que o trabalho de todos tenha sidoprodutivo.

Agora neste final de ano, vamosaproveitar dois feriados para darmosférias para nossos consultores.

O suporte técnico não atenderá noperíodo de 16/12/2002 até 01/01/03, voltandoas suas atividades normais a partir do dia02/01/2003 às 13:00h.

ATENÇÃO

Page 5: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 5

LIVROS

Acessando Bancos de Dados com Delphi 6Autor: Oliveira, AdelizeEditora: Visual BooksISBN: 8588503182Preço: R$ 39,00Páginas: 230Publicação: 2002Encadernação: BrochuraEdição: 1Idioma: Português

Descrição:Este livro mostra de forma prática e clara como utilizar o Delphi 6 para construir aplicativos que acessam bancos de dados. Entre

outros assuntos, você verá:

• como usar o Database Desktop e o Database Explorer, para criar e administrar bancos de dados;• como se conectar a bancos de dados através do BDE e ADO;• como usar o assistente para criar rapidamente formulários que acessam bancos de dados;• como operar com tabelas, registros e campos, usando os componentes do Delphi, ou através do código;• como utilizar os componentes de visualização de dados do Delphi, para mostrar os dados nos formulários;• como criar formulários master/detail;• como criar relatórios usando o QuickReport.• Uma aplicação completa é desenvolvida no livro, para faciliar o aprendizado.

Qualquer dúvida, entre em contato :Fone: (11) 3266 2988 - Fax: (11) 251 3760e-mail: [email protected]://www.temporeal.com.brAlameda Santos, 1202 - Cerqueira Cesar - São Paulo - SP - CEP 01418-100

Soluções para Segurança de Redes WindowsVigliazzi, DouglasISBN: 85-7502-093-5R$ 39,00A velocidade com que podemos fechar as brechas que são encontradas a cada dia nos sistemas de

rede é n vezes menor do que a velocidade com que elas são descobertas pelos invasores.Este livro não tem a finalidade de ensinar a violar redes, mas de evitar que elas sejam violadas.

Serão apresentados métodos que auxiliaram nestas tarefas com linguagem simples e de fácilentendimento.

Aprenda de forma simples e rápida como tornar sua rede Windows mais segura.Conheça as técnicas mais usadas pelos hackers para obter acesso à sua rede.Tenha à mão as recomendações de segurança da Microsoft para NT/2000/IIS5.Veja como implementar uma política de segurança da informação em sua rede a partir das

recomendações da RFC 2196.Este livro tem como objetivo maior ajudar a corrigir erros existentes na maioria das redes Microsoft.

http://[email protected].: (0xx48) 222-1125

Page 6: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE6

NEWS

Tudo que Você Queria Saber Sobre TCP/IP

Santos, Anderson & Camara, FabioISBN: 85-7502-097-8R$ 25,00

A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento deDefesa do governo dos EUA (DoD - Department of Defense). Uma das tarefas essenciais dessa redeseria manter interligados órgãos do governo e universidades em caso de guerras ou catástrofes,mesmo que um dos integrantes da rede fosse destruído e outros meios de comunicação estivessemafetados.

O TCP é o protocolo da camada de transporte destinado à conexão, o qual oferece um serviçoconfiável. O IP é um protocolo para comunicação de redes Internet, sendo o responsável pelatransmissão de nível inferior (host-to-host) e utilizado em dois tipos de estações: hosts e gateways.

Neste livro, você vai conhecer como funciona essa arquitetura e poderá aplicá-la para planejar uma rede de computadores de umaforma simples e funcional. Vai lhe auxiliar, também, nas configurações desses protocolos para controlar como a informação é passadade uma rede à outra, como manipular o endereçamento contido nos pacotes, a fragmentação dos dados e a checagem de erros.

Aqui, tem tudo o que você queria saber sobre o TCP/IP. Boa leitura!

Sobre os autores:

Fábio Camara, administrador com especialização em tecnologia da informação, iniciou ainda jovem a programar em Basic porvolta de 1984. Foi professor de Delphi do SENAI -Bahia e professor de Análise de Sistemas e Pascal do Colégio Impacto. Atuou comoprogramador na Telebahia e como Coordenador de Projetos na Stefanini Consultoria. Atualmente, desenvolve soluções baseadas emWindows DNA e Plataforma .Net para a CRK Financial Business, empresa líder no segmento de soluções financeiras, onde exerce afunção de Gerente de TQA (Technical Quality Assurance). Possui o certificado Borland Delphi Programmer Master e é MicrosoftCertified Professional em Sistemas Operacionais e Linguagens de Programação.

Anderson Santos, é profissional com doze anos de experiência em informática.Formado em Engenharia Eletrônica, com ênfase em Telecomunicações, executou vários trabalhos para empresas como consultor

em implementações de novos sistemas e projetos (G&P, Nextel, Diveo, Basf, ACE, G&E Capital, Mintter, CRK, entre outras).

Recentemente, foi um dos colaboradores para o projeto SPB (Sistema de Pagamento Brasileiro) pela Mintter Banking & EnterpriseSolutions, onde gerenciava a área de tecnologia e, conseqüentemente, o principal consultor em infra-estrutura para o SPB.Foi o responsável pela implantação do Sistema de Alta Contingência (Cluster e Load Balance Microsoft) nas seguintes instituiçõesfinanceiras: Banco Sumitomo Mitsui, Banco Morgan Stanley do Brasil, Banco Brascan (RJ), Banco Rural (MG) e Banco Bansicredi(RS), pela CRK Informática.

Outros Livros do Autor:

Delphi APIs & Sockets Banco de Dados com Delphi Conhecendo o Delphi 6 Informática Corporativa - Conceitos, Termos e SiglasAprenda Rápido: Oracle - Inclui Integração com Delphi Aprenda Rápido: InterBase. Projetos com Windows DNA e .NET eImplementando o Active Directory Orientação a Objeto com .net

http://[email protected].: (0xx48) 222-1125

Page 7: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE8

Um pouco da história

Até mesmo antes de iniciar o projeto oficial a 2 anos atrás (30de julho de 2000), havia um grande desejo de migrar o código doaté então Interbase ® de “C” para “C++”.

Em seguida o projeto começou, e nós percebemos que amigração do código iria requerer um investimento de tempoconsiderável por parte dos membros do projeto, mais tempo doque tínhamos disponível, visto o estado original do processo deconstrução, código, engine...

Consequentemente, a meta de migrar o código ficou para av2.0.

Então, o Firebird v1.5 representará o primeiro release com ocódigo novo transcrito para “C++”. A meta era proporcionar ascompletas funcionalidades da v1.0, mantendo o mesmo formatodo banco de dados (ODS) permitindo assim total compatibilidadecom a versão anterior.

A partir do momento que a versão v1.5 estiver liberada,poderão ser sugeridos novos recursos à serem implementados nav2.0.

Quais características serão disponibilizadas na v1.5?

Características

· Novo gerenciador de memória

· Aprimoração do “in-memory” (arquivos temp/sort) na lógicade ordenação

· Novo processo de configuração de portas “Bootstrap” paraLinux/Unix. Nenhum engine “install/running” anterior érequerido

· Novo sistema de configuração multi-plataforma· Novo “Server-Side” Database alias· Novos INT64 e LARGEINT aliases para colunas tipo

NUMERIC( 18, 0)· Novas variáveis de sistema CONNECTION_ID e

TRANSACTION_ID· Novas triggers genéricas· Novo “EXECUTE VARCHAR”, execução de instruções

contidas em strting para Stored Procedures e Triggers· Suporte a blocos “Begin|End” vazios em Stored Procedures

e Triggers· Novas instruções CASE, NULLIF e COALESCE· Suporte “Readline” (histório de comandos) adicionado ao

ISQL· Suporte a nomeação de indices em Primary e Foreign Keys· Suporte a declaração de variáveis com atribuição de valores· Novo Group By com suporte a agrupamento por funções

internas

Bugs corrigidos

· Suporte a arrays com elementos tipo INT64· Corrigido “crash” durante execução da API

isc_database_info() para listar usuários ativos rodando processos“Background Sweep”

Firebird 1.5Vêm novidades por ai...

Por Alessandro FerreiraSuporte Técnico The Club, [email protected]

DELPHI

Page 8: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 9

· Corrigido “server-crash” no prepare de XSQLDAs quandonão utilizados todos os parâmetros.

· Os parâmetros em Stored Procedures comportam-se damesma maneira em ambas as síntaxes de SPs (SELECT FROMe EXECUTE PROCEDURE), permitindo assim expressões,UDFs, etc serem passadas como parâmetros.

· Bug parcialmente corrigido SF #567931—Falha segurançado Metadata

· Bug corrigido SF #562417 — Agregado concatenação detipos char vazios

Remoção do suporte à SOs obsoletos

· Windows 3.1, NCR3000, HP9000, M88K, NT Power PC,

porta Apollo, IMP, Cray, NeXT, DELTA, OS/2, XENIX, MAC (nãoDarwin/OS X) e EPSON (por Sean Leyne)

A versão Alpha esta disponível?

· Felizmente ao concluir a adaptação deste artigo a versãoAlpha 2 do Firebird 1.5 já estava disponível para download,porém ela ainda não é uma versão para ser utilizada emprodução e sim para testes e verificação de problemas à seremcorrigidos! Quem quiser se aventurar, poderá baixar em:

http://firebird.sourceforge.net/download/snapshot_builds/

Fique atento as novidades sobre o Firebird no site do projeto eaqui na The Club Megazine, pois com certeza “vêm mais coisaspor ai”, até a próxima.

DELPHI

Page 9: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE10

A principal classe para manipulação de banco dedados da arquitetura .NET é a classe DataSet. Estaclasse funciona como uma espécie de banco de dados emmemória, contendo tabelas e relacionamentos. Ointeressante é que podemos usar esta classe paramanipular dados sem que tenhamos feito acesso anenhum banco de dados físico. Isto é particularmenteinteressante para manipular dados no formato XML.

Um DataSet pode conter:· Tabelas (instâncias da classe DataTable);· Relacionamento entre tabelas (semelhante às chaves

estrangeiras de banco de dados relacionais)· Restrição de unicidade em coluna (semelhante à integridade

da chave primária em bancos de dados relacionais).

Usando a classe DataSet paramanipular XML

Por Mauro Sant’Anna([email protected]). Mauro é um “MSDNRegional Director”, consultor e instrutor daMAS Informática (www.mas.com.br), tendoministrado treinamentos na arquitetura.NET desde outubro de 2000.

Um DataSet e seus componentes podem ser manipulados emmemória sem que tenha sido feito necessariamente nenhumacesso físico a bancos de dados. É possível fazer coisas como:

· Criar tabelas contendo diversos tipos de colunas; cadacoluna é uma instância de DataColumn;

· Adicionar dados às tabelas;

DELPHI

Page 10: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 11

· Alterar dados das tabelas;· Salvar sem ler em arquivos XML, com um bom controle

sobre “schema”.Criando TabelasVeja um exemplo de criação de tabelas e adição de dados nas

tabelas:

Veja o código que cria as tabelas:

// Declara o DataSetDataSet DS = new DataSet();private void Button1_Click(object sender,System.EventArgs e) {

// Cria uma tabelaDataTable Funcionarios =

new DataTable(“Funcionarios”);// Cria coluna com chave primáriaDataColumn CodFunc =Funcionarios.Columns.Add(“CodigoFuncionario”, typeof(int));// Altera características desta colunaCodFunc.Unique = true;CodFunc.AllowDBNull = false;// Adiciona outras colunasFuncionarios.Columns.Add(“Nome”, typeof(string));Funcionarios.Columns.Add(“Nascimento”, typeof(DateTime));Funcionarios.Columns.Add(“CodDepto”, typeof(int));Funcionarios.Columns.Add(“Salario”, typeof(Decimal));

// Define chave primáriaFuncionarios.PrimaryKey =new DataColumn[] {CodFunc};

// Adiciona dados à tabelaFuncionarios.Rows.Add(new object[]{1, “Mané”, new DateTime(1950, 12, 22),

1, 1200D});Funcionarios.Rows.Add(new object[]{2, “Marinilada”, new DateTime(1970,

1, 13), 1, 400D});Funcionarios.Rows.Add(new object[]

{3, “Pedrina”, new DateTime(1981,4, 19), 2, 4000D});

// Cria outra tabelaDataTable Depto = new

DataTable(“Departamentos”);Depto.Columns.Add(“CodDepto”, typeof(int));Depto.Columns.Add(“Nome”, typeof(string));Depto.Rows.Add(new object[] {1, “Limpeza”});Depto.Rows.Add(new object[]

{2, “Diretoria”});// Adiciona tabelas ao DataSetDS.Tables.Add(Funcionarios);DS.Tables.Add(Depto);// Adiciona restrição de chave estrangeiraDS.Relations.Add(Depto.Columns

[“CodDepto”], Funcionarios.Columns[“CodDepto”]);

// Exibe nos GridsDataGrid1.DataSource = Funcionarios;DataGrid2.DataSource = Depto;DataGrid3.DataSource = DS;

}

Observe que as duas tabelas são exibida no DataGrid superior:

DELPHI

Page 11: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE12

Veja o DataGrid do meio: como existe o relacionamento, vocêpode selecionar o código do departamento e visualizar todas aspessoas daquele departamento. Note no DataGrid inferior (quecontem o DataSet) a possibilidade de selecionar a tabela a serapresentada.

Manipulações BatchPodemos alterar os dados através de programação. Veja

alguns exemplos a seguir.

// Atualiza tabela inteira para aumentar// salário em 10%

private void Button4_Click(object sender, System.EventArgs e) {// Pega a tabelaDataTable Func = DS.Tables[“Funcionarios”];// Varre a tabela inteiraforeach(DataRow Linha in Func.Rows) {

// Pega o salário da linhadecimal Salario = (decimal) Linha[“Salario”];// Altera valorSalario *= 1.1m;// Coloca de volta na tabelaLinha[“Salario”] = Salario;

}}

// Pesquisa uma chave e apaga a seguir

private void button5_Click(object sender, System.EventArgs e) {// Pega a tabelaDataTable Func = DS.Tables[“Funcionarios”];// Pesquisa funcionário de código 2DataRow Linha = Func.Rows.Find(2);// Achou?if (Linha != null) {

// ApagaFunc.Rows.Remove(Linha);

}else {

MessageBox.Show(“Não achado”);}

}

// Elimina linhas segundo um critério

private void button6_Click

(object sender, System.EventArgs e) {

// Pega a tabelaDataTable Func = DS.Tables[“Funcionarios”];

// Aplica um filtroDataRow [] Linhas = Func.Select

(“Salario > 900”);

// Elimina linhas filtradasforeach(DataRow Linha in Linhas)

Func.Rows.Remove(Linha);}

Você pode salvar o DataSet acima como XML com uma linhade código:

private void Button2_Click(object sender,System.EventArgs e) {

// Salva como XMLDS.WriteXml(@”c:\Temp\Pessoal.xml”,

XmlWriteMode.WriteSchema);}

Existe um bom controle de como o XML é salvo:· Podemos salvar em um arquivo, stream, que por sua vez pode

assumir várias formas, ou em uma classe especial, umainstância de XMLWriter;

· Podemos especificar se o “schema” será ou não gravadojunto com o arquivo.

Podemos também ler o arquivo XML facilmente:

private void Button3_Click(object sender,System.EventArgs e) {

// Lê arquivoDS.ReadXml(@”c:\Temp\pessoal.xml”,

XmlReadMode.Auto);DataGrid3.DataSource = DS;

}

Assim como na escrita, temos diversas opções para a leitura.Embora o .NET Framework tenha classes para manipulaçãodireta de XML, o DataSet pode ser usado para manipular dadosem XML de uma forma “relacional”, que pode ser mais familiarpara os programadores.

ConclusãoA classe DataSet permite ter uma visão relacional de dados

XML, o que pode ser bem mais fácil do que manipular o XMLdiretamente.

DELPHI

Page 12: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

PROPAGANDA

AUTOMATECH

Page 13: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE14

DELPHI

A globalização trouxe algumas necessidades novas para todosos setores da vida humana. Um deles é a intensificação da noçãode padrão. Os países desenvolvidos têm aplicado muitos recursospara o desenvolvimento de padrões, principalmente os ISO, queem alguns momentos até prejudicam países que não dedicamgrandes esforços para defender seus pontos de vista nestesfóruns.

Anteriormente a essa era de globalização, vários padrõeseram já eram utilizados automaticamente em escala mundial. Éo caso, por exemplo, do sistema métrico, do sistema horário, e detodo o calendário ocidental. Isto é até óbvio, mas talvez seja útilpensar numa situação de desajuste e ninguém vai esquecer osinúmeros estudos, tudo o que se falou e as confusões sobre o “bugdo milênio”.

A Informática contribui, enormemente, para que novospadrões sejam sempre criados ou desenvolvidos, especialmente noramo da Automação Comercial, que ainda é muito novo nãosomente no Brasil, mas no mundo todo, o que tem exigidomudanças de postura de todos os que lidam com o comércio. Issogerou padrões como o EAN, Active Store e o ARTS (). No casoespecífico do Brasil, por sua gigantesca dimensão territorial, aautomação está trazendo desafios que, graças à ousadia denossos técnicos e pesquisadores, têm se transformado emsoluções técnicas. Estas, por sua vez, têm atraído a atenção deempresários da América Latina e da Europa.

Ao cruzarmos os fatores território e automação, o Governotem um peso decisivo, pois lhe interessa, e muito, que todas asinformações que chegam às secretarias da fazenda sejampadronizadas. É sabido e notório que o Fisco brasileiro tem todotipo de problemas e dificuldades para manter a sanidade dosistema de recolhimento de impostos.

Portanto, para fabricantes, desenvolvedores, interventores e

usuários, a necessidade de um padrão nacional para ECF -Emissor de Cupom Fiscal - é uma realidade. As própriassoftware-houses evoluíram até o momento em que, reunidas comos fabricantes, arregaçaram as mangas e trabalharam em umpadrão que viabilizasse a conectividade entre todos osequipamentos e softwares. Esse encontro aconteceu na AFRAC_Associação dos Fabricantes e Revendedores de Equipamentospara Automação Comercial e o seu resultado veio a público nomês de setembro último. Quatro empresas - Mecaf, Schalter,Dataregis e Sweda - já foram certificadas com base na InterfaceGenérica, nome considerado mais adequado, pois não se trata deum software nem de uma DLL, mas sim de um padrão que cadafabricante pode desenvolver em várias linguagens deprogramação para vários ambientes, etc.

É importante ressaltar que, assim como a ABNT_ AssociaçãoBrasileira de Normas Técnicas não é proprietária das normasque estão sob sua tutela, a AFRAC não é proprietária daInterface Genérica. Ela está à disposição de todos os interessadosque podem, inclusive, obtê-la através do site www.afrac.com.br.

A Interface Genérica traz vantagens e desvantagens, mas éinegável que ela representa um avanço para todo o mercado deAutomação Comercial no Brasil e, a partir de agora, todos osajustes que se fizerem necessários terão todo apoio da AFRACque, para garantir a continuidade técnica da Interface Genérica,constituiu um grupo de manutenção permanente, semprereceptivo a sugestões.

Ao assumir a elaboração e a tutela da Interface Genérica, aAFRAC está cumprindo o seu papel e sabe que, ao dar esse passo,contribui para que os empresários do setor ofereçam melhorqualidade com menor custo. A partir de agora, as software-houses não perderão mais tempo e recursos para adaptar seussoftwares de automação comercial aos vários modelos de ECF,nem precisarão mais emprestar ou comprar um ECF de teste do

Visão da AFRAC sobrenecessidade de padrões

Page 14: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 15

fabricante ou até mesmo, em alguns casos, emprestar do cliente.Os fabricantes passarão a ter um maior número de softwares eclientes disponíveis. E os clientes terão liberdade de escolha, poispoderão optar por outros modelos de ECF sem se preocupar se osoftware de automação comercial será ou não compatível com oECF.

Agradeço a todos os participantes do Grupo de ECF/ AFRAC,especialmente ao Paulo Sérgio Palmério da Presence, pelosesforços prestados, e já tenho saudades de quando há pouco maisde 1 ano, o Grupo de ECF (naquela época composto por 10software-houses) se reuniu por 3 dias em um hotel fazenda, comdúzias de manuais de um sem número de fabricantes e modelosde ECF, cada um defendendo seu ponto de vista técnico,comparando cada diferença entre cada modelo de impressora, atéchegar ao difícil consenso de um padrão que hoje conseguimoscolocar em prática. De lá para cá, foram dezenas de reuniões comfabricantes, técnicos, software-houses, representantes docomércio. Desse processo, evoluiu um conceito que foi muito bemaceito, principalmente pelos usuários de ECF, que enfim são osnossos clientes e a quem temos que atender.

Concluo esse artigo enfatizando que sou um grandeadmirador do Claudenir Andrade, da Bematech, e que considerobastante saudável o surgimento de discussões e discordâncias aolongo do processo permitindo, assim, que o mercado realmenteamadureça. Como Associação estamos sempre abertos a ouvir e

discutir a fim de que possamos sempre evoluir.

SOBRE O AUTOR

Geraldo Luiz Yoshizawa, é Diretor da AFRAC responsávelpela parte de desenvolvedores de automação comercial e Diretorde Tecnologia da Esys Sistemas, desenvolvedora dos SistemasColibri e Girassol.

SOBRE A AFRAC

A AFRAC - Associação dos Fabricantes e Revendedores deEquipamentos para Automação Comercial - foi criada em 1987, apartir da união de alguns fabricantes de equipamentos deemissão de cupom fiscal para o comércio varejista que desejavamter maior representatividade nas negociações com o governo noscasos de elaboração dos convênios fiscais que regulamentam ouso destes equipamentos, bem como na homologação destesequipamentos perante órgãos governamentais.

Entidade de abrangência nacional, a AFRAC possui hojecerca de 180 associados. Reúne fabricantes de máquinasregistradoras e terminais PDV, equipamentos periféricos para aAutomação Comercial em geral, como leitores óticos (scanners),gaveteiros e balanças, revendedores destes equipamentos,consultores e Software-houses.

É representante oficial da ABNT, organismo ligado aoMinistério de Ciências e Tecnologia.

DELPHI

Page 15: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE16

Introdução

No 4o artigo vimos a criação de um servidor de aplicaçãoCOM+, vimos as opções de criação do servidor de aplicação, osconceitos, criamos a conexão com o Banco de Dados FireBird(através do Servidor de Aplicação) e por último vimos comoinstalar pelo Delphi nosso Objeto COM+.

Este artigo (Parte V), será divido em duas partes: PrimeiraParte - A Guia DataSnap e a Segunda Parte - O Cliente COM+,onde criaremos o formulário de Login, o formulário Principal daAplicação e implementaremos o método Login_BD para acesso aoBanco de Dados, usando DCOMConnection e ConnectionBroker.

Primeira Parte

Guia DataSnap - Delphi 6/7

SocketConnection - Usaremos SocketConnectionquando desejarmos e criarmos um servidor de aplicação usando oprotocolo TCP/IP. Para maiores detalhes sobre Sockets eDataSnap, consulte o Help do Delphi e ou então leia o 2o artigo deDataSnap.

WebConnection - Usaremos WebConnection quandodesejarmos e criarmos um servidor de aplicação usando oprotocolo HTTP. Para maiores detalhes sobre WebConnection eDataSnap, consulte o Help do Delphi e ou então leia o 2o artigo deDataSnap.

CorbaConnection - Usaremos CorbaConnection quandodesejarmos e criarmos um servidor de aplicação usando oprotocolo CORBA. Para maiores detalhes sobre CORBA e

DataSnap, consulte o Help do Delphi, detalhes sobre o protocoloCORBA www.corba.com e ou então leia o 2o artigo de DataSnap.

TCorbaConnection esta na Guia DataSnap do Delphi 6, mas,não aparece na Guia DataSnap do Delphi 7. O fato é,TCorbaConnection era baseado no VisiBroker 3.3 e a versão queacompanha o Delphi 7 é o VisiBroker 4.5, sendo assim, o mesmofoi removido. Mas, nem tudo está perdido! Olhando o exemplo quese encontra em: $(DELPHI)\Demos\Corba\Idl2Pas\MidasXML, você pode ver como substituir o Componente.

SimpleObjectBroker - Este componente é muito interessante!Ele tem a função de colocar um servidor de aplicação no ar,quando um servidor de aplicação da sua lista de servidores cair.Ele não faz Load-Balance como sugere o Help do Delphi! Nãodeve ser usado em CORBA, porque CORBA já tem o seumecanismo de Load-Balance. Também serve para fazer a ligaçãoestática do seu Cliente com o servidor de Aplicação. Suasprincipais propriedades são:

- LoadBalance - Indica se o componente colocará outroservidor no ar assim que um servidor de aplicação cair;

- Servers - A lista dos servidores de Aplicação. Pode ser o IP eou o nome do HOST;

Como citei, este componente é muito interessante, e mereceuma atenção especial.

Listarei logo mais abaixo o trecho de código onde é verificadose iremos usar LoadBalance ou não, Listagem 1:

function TServerCollection.GetBalancedName: string;var

DataSnap – Parte VA Guia DataSnap e O Cliente COM+

Anderson Haertel Rodrigues

DELPHI

Page 16: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 17

i, GoodCount: Integer; GoodServers: array of TServerItem;

Begin

GoodCount := 0;

SetLength(GoodServers, Count);

for i := 0 to Count - 1 do if (not Items[i].HasFailed) and(Items[i].Enabled) then begin

GoodServers[GoodCount] := Items[i];

Inc(GoodCount);

end;

if GoodCount = 0 then raise EBrokerException.CreateRes(@SNoServers);

Randomize;

Result :=GoodServers[Random(GoodCount)].ComputerName;

Listagem 1: O método responsável pelo “LoadBalance” nocomponente SimpleObjectBroker.

Vejam que o esquema é muito simples!

GoodServer é um Array do Tipo TServerItem. A ClasseTServerItem é onde estão armazenados os nomes dos servidoresque participam da lista de servidores de aplicação. TServerItemherda de TCollectionItem, classe que, como o próprio nome diz,armazena uma coleção de informações.

Logo mais abaixo, é inicializada a variável GoodServers com onúmero de itens que é armazenado na TCollectionItem. É feitoum FOR na lista de Servidores e, para descobrir se existe algumservidor com falha e se o mesmo está Habilitado, é feito um testecom o IF. Se houver tudo Ok, GoodServers recebe as informaçõesdo servidor que está na lista. No final, é feito um teste para ver sea variável GoodCount é igual a 0(Zero), se for, é levantada umaexceção. No final é chamada a procedure Randomize, que nestecaso, faz o papel para que não seja escolhido sempre o mesmoservidor, e é retornado o nome do Computador que fará o papel de“Load-Balance” neste momento.

A unit ObjBrkr.pas onde está o código listado acima e, maisalguns controles, é muito simples e vale a pena estuda-la comCalma.

ConnectionBroker - Outro componente muito interessante!Ele tem a função de abstrair a camada de conexão dosClientDataSet´s e a chamada dos métodos do servidor deaplicação. Isto é, com o uso do ConnectionBroker, podemos iniciara implementação de servidor de aplicação em COM+ e, se houvera necessidade de trocarmos o tipo de protocolo, digamos, Sockets eou CORBA podemos fazer o mesmo de uma forma menostraumática, porque, nossos ClientDataSet´s não estão ligadosdiretamente ao DCOMConnection (propriedade RemoteServer doClientDataSet), e sim ao ConnectionBroker (propriedadeConnectionBroker do ClienteDataSet).

Então, se trocarmos o componente de conexãoDCOMConnection pelo SocketConnection/CorbaConnection nospreocuparemos com poucas coisas. Da mesma forma que aconexão, iremos também abstrair na nossa camada Cliente achamada dos métodos no servidor de aplicação. Invés de usarmoso DCOMConnection para chamar nossos métodos no Servidor deAplicação (DCOMConnection.AppServer.NomedoMetodo) iremoschamar o mesmo através doConnectionBroker(ConnectionBroker.AppServer.NomedoMetodo).

Sua principal propriedade é:

- Connection - Propriedade onde indicamos a qualcomponente de conexão estamos ligado. Podendo ser umDCOMConnection e ou até um SharedConnection. É destaforma, que fazemos toda a “mágica” da abstração de conexão echamada dos métodos conforme explicado acima;

ConnectionBroker não tem a capacidade de realizar umaconexão por si só, por isso o mesmo está ligado a um componentede conexão.

SharedConnection - Até o Delphi 5 não tínhamos o recurso depoder usar vários RDMs na nossa aplicação Servidora. Era tudodentro de um mesmo RDM. Ficava visualmente muito ruim.Com a chegada do Delphi 6, isso mudou. Podemos ter agoravários RDM´s interligados entre si, através do uso doSharedConnection. O seu uso num primeiro momento parececomplicado, porque, não fizemos as ligações apenas compropriedades (aliás, não fazemos ligação nenhuma através daspropriedades desse componente) todas as ligações são feitas viaInterface e com o velho USES entre unidades do Delphi.

Assim que formos usar o mesmo, eu explicarei mais

DELPHI

Page 17: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE18

detalhadamente como fazer a ligação entre dois RDMs. Ele deveser usado com os componentes de conexão: TDCOMConnection,TWebConnection ou TSocketConnection, pois, ambos sãodescendentes de: TDispatchConnection (MConnect.pas). Suasprincipais propriedades são:

- ChildName - É a qual RDM o componenteSharedConnection pertence. Aparecerá uma lista com todos osChildRDMs criados para você escolher;

- ParentConnection - A conexão principal de nossa aplicação.Pode ser um TDCOMConnection, TWebConnection ouTSocketConnection;

LocalConnection - Com LocalConnection você administravários DataSets na mesma aplicação e conexão. Com ele vocêtambém pode futuramente migrar sua aplicação para umaaplicação 3 Camadas. É como se ele simulasse as Camadas, pois,o mesmo implementa AppServer.

DCOMConnection

Apesar de aparecer como 1o componente da lista doscomponentes da Guia DataSnap resolvi deixar o mesmo paraexplicar por último pelo fato de que é este componente que iremosusar para a conexão com o nosso servidor de aplicação. Para nósneste momento é o componente mais importante.

Ele é utilizado pela aplicação Cliente para manter umaconexão entre o servidor de aplicação e a nossa aplicação Cliente.A conexão é feita através da GUID do nosso servidor de aplicação.Ele também tem as seguintes funções:

- Prover acesso às interfaces do servidor de aplicação;

- Mantém uma lista dos ClientDataSets atualmenteutilizando esta conexão;

- Desfazer a conexão com o servidor de aplicação.

As principais propriedades são:

- ComputerName - É o nome da máquina onde se encontra oservidor de Aplicação;

- ObjectBroker - O nome do SimpleObjectBroker que oDCOMConnection está relacionado;

- ServerGUID - O CLSID da Interface do nosso Servidor;

- ServerName - Apresenta uma lista de servidoresregistrados no Registry do Windows. É o nome do servidor deaplicação. Não confunda com o nome do computador (HOST)onde está o nosso servidor de aplicação;

Como já tinha mencionado, expliquei o que é e para que servecada componente da Guia DataSnap do Delphi 6. Veremos agorana segunda parte desse artigo, a criação da aplicação ClienteCOM+ para acesso ao Servidor de Aplicação COM+.

Segunda Parte

Cliente COM+

No Lado Cliente, criaremos uma tela de Login para acesso aoBanco de Dados FireBird e a tela principal contendo as opções deacesso aos outros formulários que serão criados na Parte VI. Oacesso ao Banco de Dados, pode acontecer com Sucesso e ouFalhar. Certo?

Será explicado como criar uma Interface (método) paraacesso ao Banco, com a passagem de dois parâmetros: Usuário eSenha e será retornado Verdadeiro (True) ou Falso (False) se atentativa de Login ocorrer com sucesso. Lembre-se, não podemosmais fazer acesso direto ao Componente de Conexão ao Banco,então, necessitamos de uma interface para esse papel. Mãos aObra! Se ainda não abrimos o Delphi, vamos abrir o mesmo eabrir nosso projeto ServerCOMPlus.dpr. Neste momento,necessito dar uma dica a você. Como iremos trabalhar com LadoServer e Lado Cliente ao mesmo tempo, não posso ter dois“Delphis” Abertos ao mesmo tempo né?! Necessitamos usar oProject Manager, que deve aparecer após a combinação de TeclasCTRL+ALT+F11 e ou então: View|Project Manager. Após isso,devemos ter a seguinte tela em nosso monitor, Figura (1):

Figura 1: O Project Manager do Delphi.

DELPHI

Page 18: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 19

O Path nesse caso deve ser: C:\DataSnap\Servidor. O nossoservidor COM+ é uma DLL e iremos criar neste momento nossolado Cliente. Para isso, clique com o botão direito do mouse sobreo formulário do Project Manager, deve aparecer a seguinte tela,Figura (2):

Figura 2: O menu de Opções do Project Manager.

Iremos escolher Add New Project, e após essa escolha deveaparecer a seguinte tela, Figura (3):

Figura 3: O formulário New Itens.

Iremos escolher a opção Application. Após isso, devemos terduas opções no Project Manager, conforme a Figura (4):

Figura 4: Nosso Project Manager com o Lado Server e LadoCliente.

Vamos salvar a Unit1.pas com o nome: uFrmLogin.pas e oprojeto como o nome: ClientCOMPlus.dpr no diretório:C:\DataSnap\Cliente. Agora sim, devemos ter a Figura 4!

Devemos também salvar o Project Manager com o nome de:PrjctGrpCOMPlus.bpg no diretório C:\DataSnap.

Com essa nova forma de trabalho (você irá se acostumar)podemos trabalhar com o Servidor e Cliente ao mesmo tempo.Sempre que uma opção estiver em Negrito, é que estamos com oprojeto selecionado. De resto, o trabalho é igual no Delphi,CTRL+F12 para visualizarmos as Units do projeto, SHIFT+F12para visualizarmos os formulários, etc. Quando formos trabalharcom o projeto, não abriremos mais o DPR e sim o BPG (BorlandPackage Group).

Necessitamos criar um DataModule comum para colocarmosnele o componente DCOMConnection. Crie o mesmo através de:File|New|Data Module e coloque nele o componenteDCOMConnection com o name de: DCOMCnctnConexao. Salve oDM com mo nome de: uDMConexao.pas no diretórioC:\DataSnap\Cliente. Devemos colocar também no mesmoDataModule o componente ConnectionBroker, com o nome de:CnctnBrkrConexao, e setarmos a propriedade Connection para onosso DCOMConnection. O DataModule deve se parecer com oseguinte, Figura(5):

Figura 5: O DataModule de Conexão com o Servidor deAplicação

DELPHI

Page 19: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE20

Vamos agora configurar nosso DCOMConnection paraacessar o nosso servidor de aplicação.

A propriedade ServerName deve ser igual ao nome da nossaaplicação Servidora, que neste caso é: ServerCOMPlus + (mais) onome da nossa Classe: Server_COMPlus. Devemos ter a seguinteString de conexão: ServerCOMPlus.Server_COMPlus. Caso aindahaja dúvidas do que faz a propriedade ServerName, leianovamente a 1a Parte desse artigo onde explico oque faz cadacomponente da Guia DataSnap, em especial o DCOMConnection.A propriedade ServerGUID é preenchida automaticamente após aescolha do Servidor (Objeto COM+).

Vamos agora fazer um teste para ver se tudo está Ok?!

Altere a propriedade Connected do ConnectionBroker paraTrue. Se tudo ocorreu bem, temos a nossa conexão com o Servidorde Aplicação. Caso ocorra algum erro, devemos apenas escolher oprojeto Servidor e executar um Build All e devemos registrar anossa DLL, através de: Run|Register ActiveX Server. Logo após,devemos escolher o projeto Cliente e também executarmos umBuild All. Outro erro que pode acontecer é relacionado ao arquivodbxconnections.ini, porque, o mesmo pode não estar no diretórioindicado, isto é, onde se encontra o arquivo DLLHOST.EXE.

Ok. Agora devemos ter a seguinte tela, Figura (6):

Figura 6: A Conexão feita com Sucesso no Servidor deAplicação.

O valor da Propriedade ServerGUID que aparece para vocêdeve ser diferente do mostrado na figura 6, lembre-se da lenda doGUID ;-).

Nosso próximo passo é apenas programar a conexão com onosso servidor de aplicação, através dos eventos OnCreate() eOnDestroy() do nosso DM. Um Duplo clique no DM e ou então,devemos escolher a Guia Events e com um duplo clique no eventoOnCreate() devemos ter o seguinte código no evento, Listagem 2:

procedure TDMConexao.DataModuleCreate(Sender:TObject);begin CnctnBrkrConexao.Connected := True;end;

Listagem 2: O Código de conexão com o nosso servidor deAplicação.

E no evento OnDestroy(), Listagem 3:

procedure TDMConexao.DataModuleDestroy(Sender:TObject);begin CnctnBrkrConexao.Connected := False;end;

Listagem 3: O Código de encerramento da conexão com onosso servidor de Aplicação.

Nosso próximo passo agora é criarmos o Login de acesso aoSistema, que fará acesso ao Banco de Dados FireBird parasabermos se temos direitos de acesso ao Banco. Vamos criar umnovo Formulário o mesmo deve se parecer com a nossa Figura(7):

Figura 7: O Formulário de Login.

Peço que você salve a Unit com o nome: uFrmLogin.pas. Apósisso, vamos criar mais um Formulário, e, vamos salvar o mesmocom nome: uFrmPrincipal.pas. Todas as units devem estar nodiretório: C:\DataSnap\Cliente

Nosso Formulário Principal deve ter a seguinte aparência,Figura (8):

Figura 8: O Formulário Principal da nossa Aplicação ClienteCOM+

DELPHI

Page 20: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 21

Nesse formulário, temos um TMainMenu com as seguintesopções:

Tabelas - SairAtividade - OkCliente

Onde no próximo artigo iremos implementar as opções. Antesde programarmos o Login, peço que Project Options da aplicaçãoCliente seja igual a figura (9): para isso acesse o menuProject|Options do Delphi:

Figura 9: Project Options do nosso Lado Cliente.

O formulário Principal é o FrmPrincipal, DMConexao écriado automaticamente e o FrmLogin iremos criar.

Feito isso, vamos abrir o ClientCOMPlus.dpr no Delphi edeixar o mesmo com o seguinte código:

program ClientCOMPlus;

uses Forms, uFrmLogin in ‘uFrmLogin.pas’ {FrmLogin}, uDMConexao in ‘uDMConexao.pas’ {DMConexao:TDataModule}, uFrmPrincipal in ‘uFrmPrincipal.pas’{FrmPrincipal};

{$R *.res}

begin

Application.Initialize; Application.CreateForm(TDMConexao, DMConexao); Application.CreateForm

(TFrmPrincipal, FrmPrincipal);

FrmLogin := TFrmLogin.Create(nil);

try

FrmLogin.ShowModal;

finally

FrmLogin.Free;

FrmLogin := nil;

Application.Run;

end;

end.

Listagem 4: O Código do Arquivo de Projeto.

O Código acima, mostra que estamos criando o nossoFormulário de Login e chamando o mesmo com ShowModal, paraevitar que o usuário acesse outra tela enquanto o formulário deLogin está aberto.

Neste ponto temos pronto o código necessário para serchamado o FrmLogin, mas, ainda não temos o código principal doLogin:

A Interface que deverá ser criada no Servidor de Aplicação parasabermos se temos acesso ao Sistema ou Não.

Salve tudo feito até agora!

No Project Manager escolha o Servidor de Aplicação(ServerCOMPlus.dll) e iremos agora para a Type Library(View|Type Library), onde, devemos criar o método de Login. Ok.

Sobre a nossa Interface (IServer_COMPlus) clique com obotão direito do Mouse e escolha: New|Method. Devemos ter aseguinte tela, Figura (10): A Figura (10) também mostra o botãoresponsável por criar um novo método e também o botão RefreshImplementation:

DELPHI

Page 21: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE22

Figura 10: Type Library com o método de Acesso ao Banco deDados.

O nome do nosso método deve ser: Login_BD, e aí simdevemos ter uma tela igual a figura(10). Após isso, vamos para aGuia Parameters, criar nossos parâmetros de entrada e o valorde retorno para o método. Clique no botão Add três vezes paracriarmos três parâmetros de uma só vez. O nome dos parâmetrosdeve ser o seguinte e ao lado o seu tipo:

UserName - BSTR - [in]PassWord - BSTR - [in]Retorno - VARIANT_BOOL* - [out, retval]

A nossa tela deve ser igual a Figura (11):

Figura 11: O método Login_BD com os seus parâmetrosdefinidos.

Para conseguirmos escolher os tipos corretos da Coluna Typee definirmos corretamente os valores para a coluna Modifier ,

basta clicarmos ao lado da coluna que irá aparecer umComboBox para a coluna Type e um formulário para a ColunaModifier. Os dois primeiros parâmetros do nosso método são doTipo BSTR, que é um Tipo OLE compatível com o WideString doPascal e VARIANT BOOL é compatível com o WordBool doPascal.

Parâmetros do tipo [out] obrigatoriamente tem de ser umPonteiro*, mas, na lista não existe VARIANT BOOL*, existeapenas o tipo VARIANT BOOL, então, o que fazemos ésimplesmente colocar o *(asterisco) após o VARIANT BOOL.

Nota: Não se preocupe, neste momento e quase todos osmomentos não temos de nos preocupar em trabalhar comPonteiros. Neste caso ele é apenas necessário para o tipo deretorno.

[retval] indica que o método é uma função.

Vimos também que Return Type é igual a HRESULT, onde,HRESULT é o tipo de retorno da maioria dos métodos COM. Nãodevemos nesse momento mudar o Tipo.

Logo após, clique no botão Refresh Implementation, ilustradona Figura (10). Salve tudo!

O método que acabamos de criar está declarado em doislugares: RDMConexao.pas e ServerCOMPlus_TLB.pas ambos noservidor de aplicação. Iremos implementar o método que está noRDMConexao.pas. Para isso, devemos ir até o método que seencontra na seção protected da classe TServer_COMPlus.Pressione CTRL+SHIFT+SetaBaixo para implementarmos ométodo, o método nesse momento deve ser igual a listagem 5:

function TServer_COMPlus.Login_BD(constUserName,PassWord: WideString): WordBool;

begin

end;

Listagem 5: O Método Login_BD criado após a manutençãona Type Library.

Temos agora que implementar o método. Na verdade aimplementação do método é uma mistura de códigos emAssembly e Delphi........(hehehehe, brincadeiras à parte pararelaxarmos um pouco), usaremos para implementar o método ovelho e excelente Delphi, nada a mais!

(Aliás, agora, o Delphi tem sua própria linguagem,Linguagem Delphi, e não mais Object Pascal) ;-).

DELPHI

Page 22: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 23

O método Login_BD agora deve ser igual ao apresentado nalistagem 6:

function TServer_COMPlus.Login_BD(constUserName,PassWord: WideString): WordBool;begin

try

with SQLCnctnBASE do begin

LoginPrompt := False; Connected := False;

Params.Values[‘USER_NAME’] := UserName; Params.Values[‘PASSWORD’] := PassWord;

Connected := True;

Result := True;

end;

except

Result := False;

end;

end;

Listagem 6: O Método Login_BD implementado.

Vimos que a implementação do método Login_BD não temmistério algum, passamos os valores de conexão para ocomponente e esperamos o retorno de Sucesso e ou Falha.

Salve Tudo e Registre a nossa DLL, através de: Run|RegisterActiveX Server.

Para o nosso código ficar completo e terminarmos a Parte V,temos agora apenas que implementar os Botões Ok e Cancelar noFormulário Login.

Antes, o formulário de Login necessita ter acesso ao DM deconexão e ao Formulário Principal da aplicação, para isso, incluaos mesmos no uses da seção implementation.

O Código do Botão Ok do Formulário de Login é o que aparecena listagem 7:

procedure TFrmLogin.BtnOkClick(Sender: TObject);begin

if notDMConexao.CnctnBrkrConexao.AppServer.Login_BD

(EdtUsuario.Text,EdtSenha.Text) then MessageDlg(‘Usuário não tem acesso ao

Sistema’,mtError, [mbOK],0)

else begin

FrmLogin.Hide;

FrmPrincipal.Show;

end;

end;

Listagem 7: O Código do Botão Ok do Formulário de Login.

O principal se encontra no if, onde estamos usando o conceitode abstração já mostrado com o componente ConnectionBroker.Através dele chamamos o método Login_BD e passamos osparâmetros de Usuário e Senha, através das propriedades Textdos dois Edit´s.

O código do Botão Cancelar deve ser igual a Listagem 8:

procedure TFrmLogin.BtnCancelaClick(Sender: TObject);begin

Application.Terminate;

end;

Listagem 8: O Código do Botão Cancelar do Formulário deLogin.

No código do Botão Cancelar, chamamosApplication.Terminate para encerrarmos a execução do nossoEXE.

Ok. Podemos testar a nossa conexão. Lembrando, o usuárioAdmin do Banco de Dados FireBird é SYSDBA e a senha émasterkey (tudo minúsculo).

Se digitarmos um usuário e ou uma senha que não existe,será exibida a mensagem, Figura (12):

DELPHI

Page 23: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE24

Figura 12: O Login não executado com Sucesso.

se digitarmos SYSDBA e masterkey, aparecerá a seguintetela, Figura (13):

dizer se apenas o usuário não existe e ou se a senha está inválida.Mas, o objetivo era demonstrar como criar um método de Loginno Banco de Dados através de uma Interface no Servidor deAplicação. Lembrando, esse Banco de Dados pode estar emqualquer máquina da rede.

ConclusãoVimos nesse artigo o que são e o que faz cada componente da

Guia DataSnap. Na segunda parte do artigo, criamos nossoCliente COM+ e ainda implementamos o método Login_BD paraacesso ao Banco de Dados FireBird.

No próximo artigo, iremos implementar as opções do MenuPrincipal da aplicação Cliente COM+, iremos criar umformulário de Cadastro Simples e mais adiante um Formuláriode Cadastro de Master/Detail.

Sucesso e Saúde a todos!Um Abraço.

Anderson Haertel Rodrigues

Consultor em desenvolvimento de Sistemas Client/Server-MultiCamadas/DataSnap.

Oferece treinamentos para empresas em: InterBase, SQL-Server, Delphi e COM+.

[email protected] - [email protected]ópolis - Santa Catarina - Brasil.

Figura 13: O Login efetuado com Sucesso.O nosso código de Login não tem maiores recursos,

poderíamos ter implementado o recurso de tentativas de acesso,

DELPHI

Page 24: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 25

Pergunta: Estou utilizando o Delphi 7 e DbExpress. Uso oscomponentes TSQLConnection, TSQLQuery, TDatasetProvider eTClientDataSet para acessar

banco de dados DB2 7.2 e Oracle 8i todos rodando no windows2000. Quando abro o ClientDataset os valores são retornados semos separadores de decimais. Por exemplo, o valor 10.45 éretornado como 1045. Interessante que no Interbase estáfuncionando corretamente. Alguma sugestão para o problema?

Resposta: Estivemos pesquisando a respeito do problema eocorre o seguinte... O Oracle envia “,” como separador decimal aoDelphi, porém, o Delphi entende “,” como separador de milhar ecom isso ignora a mesma, deixando assim o valor sem umseparador de decimais válido. Para corrigir o problema, vocêdeverá alterar uma chave no registrador do Windows. Para isso,acesse o “Executar” e execute RegEdit. Localize a chaveMSL_Lang dentro da chave do Oracle e altere o padrão para“America/American” que o problema será sanado.

Dúvida enviada por Stand By Consultoria, Belo Horizonte/MG.

Pergunta: Em um projeto IntraWeb estou rodando minhaaplicação através de um emulador IWServerControl. Comopublicar isto na internet?

Resposta: Isso será bem simples!No arquivo DPR (projeto) altere o seguinte:

program Guess;uses

IWInitStandAlone, Main in ‘Main.pas’ {formMain: TIWFormModuleBase}, ServerController in ‘ServerController.pas’{IWServerController: TDataModule};

{$R *.res}

begin IWRun(TFormMain, TIWServerController);end.

Para:

library Guess;

uses IWInitISAPI, Main in ‘Main.pas’ {formMain: TIWFormModuleBase}, ServerController in ‘ServerController.pas’{IWServerController: TDataModule};

{$R *.res}

begin IWRun(TFormMain, TIWServerController);end.

E recompile seu projeto que a DLL ISAPI será criada e prontapara rodar em seu Servidor Web.

Dúvida enviada por Admnet Com e Serv de InformáticaLtda., São Paulo/SP

PERGUNTAS & RESPOSTAS

Page 25: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE26

Pergunta: Estamos desenvolvendo um relatório genéricoque possui um QrChart sem série alguma. A partir de uma telacontendo um DBChart queremos fazer uma cópia das séries doDBChart contido no formulário

para o QRChart existente no relatório. Fizemos a seguinteprogramação:

1) QRDBChart.AddSeries(DBChart.Series[i]);{ A série é visualizada no QrChart mas “desaparece”do DBChart }

2) QRDBChart.Series[i].Assign(DBChart.Series[i]);{ Se não existir uma série no QrChart ocorre accessviolation }

E se esta série for definida no QrChart não conseguimosalterá-la para a série do DBChart. Além do mais não podemosdefinir nenhuma série no QRChart porque sendo um relatóriogenérico a série do QRChart tem que ser montadadinamicamente. Como posso resolver este problema?

Resposta: Neste caso é necessário criar um objeto para seradicionado ao QRChart. Este objeto deverá ser do mesmo tipo daSérie que você possui em seu DBChart, veja abaixo um simplesexemplo onde estamos utilizando uma série do tipo Barras:

var Barra: TBarSeries;begin // cria série. Barra := TBarSeries.Create(Self); // Clona série. Barra.Assign( DBChart1.Series[0] ); // adicione no QRChart. QRDBChart1.AddSeries(Barra);end;

Testamos dessa forma e funcionou perfeitamente!

Dúvida enviada por Alessandra Giovani, FundaçãoDesenvolvimento Gerencial, Belo Horizonte/MG.

Pergunta: Como faço para retornar a lista de servidoresSQL Server disponíveis em minha rede e depois passar comoparâmetro para meu componente ADOConnection?

Resposta: Isso é possível através do métodoListAvailableSQLServers disponível na interface SQLDMOoferecida pelo SQL Server. Veja abaixo um simples exemplo:

implementationuses ComObj;{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);var SqlDmo: Variant; oNameList: Variant; Cnt, I: Integer; S: string; AServerList: TStrings;begin AServerList := TStringList.Create; SqlDmo := CreateOLEObject(‘SQLDMO.Application’); try oNamelist := Sqldmo.ListAvailableSQLServers; Cnt := oNameList.Count; for I := 0 to Cnt - 1 do begin S := oNameList.item(I); if (Length(S) = 0) or (pos(‘(LOCAL)’,uppercase(S)) > 0) then Continue else if (AServerList.IndexOf(S) < 0) then AServerList.Add(S); end; finally ListBox1.Items.Assign(AServerList); AServerList.Free; SqlDmo := UnAssigned; end;end;

Dúvida enviada por Almir R. Borges, Elite Informática,Araçatuba/SP.

Pergunta: Estou com uma dúvida quanto a velocidade dealguns conversores, pois em algums computadores mais antigosmeu sistema tem demonstrado uma certa lentidão.

Conversores: (Sender as TEdit)     /    TEdit(Sender)(Sender is TEdit)     /    Sender.ClassName = ‘TEdit’ Eu gostaria de saber se existe diferença de velocidade nas

conversões acima? Eu utilizo muito esses tipos de converão, masgostaria de saber se existe outro método mais eficaz?

PERGUNTAS & RESPOSTAS

Page 26: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 27

Resposta: Os operadores “is” e “as” resolvem os tipos emtempo de execução e isso com certeza será mais lento!

Já o typecast TClasse(variavel) faz a resolução em tempo dedesenvolvimento, gerando com isso uma execução mais rápidaem relação aos operadores “is” e “as”. Pelo que conheço,ClassName = Classe não é typecast válido!

Dúvida enviada por Edson Murilo Maestri, Blumenau/SC.

Pergunta: Gostaria de saber a finalidade dos comandos“Exit” e “Suspend” em um Stored Procedure no Interbase/Firebird.

Resposta: Anote ai a funcionalidade de cada instrução:

EXIT -> Encerra o Stored Procedure, causando um desvioimediato para seu fim ou seja, o comando END.

SUSPEND -> Suspende a execução da Stored Procedure atéque uma nova solicitação de dados (FETCH) seja requerida pelaaplicação que o chamou; neste ponto causa o envio dos dados deretorno (caso tenham sido declarados) para a aplicaçãochamadora. Este comando distingue uma SP SELECTÁVEL deuma EXECUTÁVEL.

Com isso, estes comandos deverão ser aplicados de acordocom a estrutura de sua Stored Procedure.

Dúvida enviada por Gil Teles, ATS Informática, BeloHorizonte/MG.

Pergunta: Qual a vantagem de utilizar uma constantecomo parâmetro em uma função?

Resposta: Utilizando constantes existe a possibilidade desetar um valor default para o parâmetro e na chamada dafunção simplesmente inibir a passagem do parâmetro, comoexemplo:

{ procedure exemplo }procedure FazNada(const S: string = ‘The Club’);begin ShowMessage(S);end;{ chama omitindo os parâmetros }procedure TForm1.Button1Click(Sender: TObject);begin FazNada();

{ Retorna The Club }end;{ chama passando os parâmetros }procedure TForm1.Button2Click(Sender: TObject);begin FazNada(‘Delphi’); { Retorna Delphi }end;’

Outro detalhe, é que dentro da procedure não podemosatribuir valores à um parâmetro constante.

Dúvida enviada por Mauro Mancio da Silva, São Paulo/SP.

Pergunta: Gostaria de saber se é possivel desabilitar o botãoimprimir no preview de um relatório do Report Build, estouchamando ele através dos componentes instalados no Delphi.

Resposta: Isto é possível percorrendo todos os componentesexistentes no “PreviewForm”. Porém como não há “Caption” enem nome nos objetos, a única forma que encontrei paraidentificar o “PrintButton” foi através de seu “Hint”, veja abaixo:

 { evento onPreviewFormCreate }procedure TForm1.ppReport1PreviewFormCreate(Sender:TObject);var  i, j: integer;begin  for i := 0 to ppReport1.PreviewForm.ComponentCount-1 do    for j := 0 toppReport1.PreviewForm.Components[i].ComponentCount-1do      ifppReport1.PreviewForm.Components[i].Components[j] isTSpeedButton then        if(UpperCase(TSpeedButton(ppReport1.PreviewForm.Components[i].Components[j]).Hint) = ‘IMPRIMIR’) or         

(UpperCase(TSpeedButton(ppReport1.PreviewForm.Components[i].Components[j]).Hint) = ‘PRINT’) then           

TSpeedButton(ppReport1.PreviewForm.Components[i].Components[j]).Enabled := False;end;

Dúvida enviada por Sidney Ap. Muriano, App Procs. Dados S/C Ltda, São José do Rio Preto/SP.

PERGUNTAS & RESPOSTAS

Page 27: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE28

Pergunta: Há alguns dias solicitei uma rotina para iniciarvia Delphi, o Interbase/Firebird. Vocês me enviaram e funcionou.Contudo, para que essa rotina funcione no Windows XP, énecessário que o Firebird tenha sido instalado pelo próprioinstalador dele. Do contrário, o serviço não é criado. Minhaintenção, é não precisar distribuir o instalador do Firebird e simeu mesmo fazer a instalação. Fiz uma rotina para instalar oFirebird pelo Delphi. No Windows 95/98, copio alguns arquivos ecrio algumas chaves no registro e funciona beleza. Então, meuproblema está em fazer uma rotina que crie no Windows XP/NTo serviço Firebird, isso é possível?

Resposta: E possível sim, na pasta de instalação do FB emsua máquina na pasta “Bin”, irá encontrar um aplicativo quetem exatamente está finalidade chamado “InstSvc”, veja abaixocomo proceder:

CD\Program Files\Firebird\bin>

instsvc install c:\progra~1\firebird -auto

{ Se executar OK irá mostrar a mensagem abaixo }

Service “Firebird Server” successfully created.

Para executar via Delphi, poderá utilizar o WinExec:

WinExec(‘command.com /c instsvc installc:\progra~1\firebird -auto’, sw_hide);

Dúvida enviada por Valdir Alberto Dill, Santa Helena/PR.

Pergunta: Existe alguma maneira de, através de umcomando do Delphi6 colocar a impressora padrão em estado deespera, e após fazer algumas “impressões”, voltar a ativar aimpressora, para que somente então as impressões sejamrealmente feitas?

Resposta: Para deixar a impressora em modo de espera,você poderá utilizar APIs do Windows para passar o comandopara o drive da impressora, veja exemplo:

{ Comandos para a impressora

PRINTER_CONTROL_PAUSE = 1 Pauses the printer. PRINTER_CONTROL_RESUME = 2 Resumes a pausedprinter. PRINTER_CONTROL_PURGE = 3 Deletes all print jobsin the printer.

PRINTER_CONTROL_SET_STATUS = 4 Sets the printerstatus. }

procedure TForm1.Button1Click(Sender: TObject);var hPrinter: THandle; PrinterName: PChar; PrinterDefaults: TPrinterDefaultsA; DevMode: PDeviceModeA; Needed: integer; iComando: Cardinal;begin PrinterName :=PChar(Printer.Printers[Printer.PrinterIndex]); WinSpool.OpenPrinter(PrinterName, hPrinter, nil); Needed := WinSpool.DocumentProperties(Handle,hPrinter, PrinterName, DevMode^, DevMode^, 0); if Needed < 0 then Exit; GetMem(DevMode,Needed); WinSpool.DocumentProperties(Handle, hPrinter,PrinterName, DevMode^, DevMode^, DM_COPY); PrinterDefaults.pDatatype := nil; PrinterDefaults.pDevMode := @DevMode^; PrinterDefaults.DesiredAccess :=PRINTER_ALL_ACCESS; ClosePrinter(hPrinter); { Pega o comando selecionado num RadioGroup,que será indicado pelos seus valores 1, 2, 3 ou 4 } iComando := RadioGroup1.ItemIndex+1;

if OpenPrinter(PrinterName, hPrinter,@PrinterDefaults) then begin

{ Aqui passamos o comando para o drive daimpressora }

WinSpool.SetPrinter(hPrinter, 0, nil, iComando); if GetLastError = 0 then Showmessage(‘Erro na configuração daimpressora, erro nº ‘+IntToStr(GetLastError)); end; ClosePrinter(hPrinter); FreeMem(DevMode);end;

Dúvida enviada por Eldimar Mariano Fonseca Marques, SãoLuis/MA.

PERGUNTAS & RESPOSTAS

Page 28: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE 29

Pergunta: Caros amigos, eu preciso calcular um ano sobreuma data fornecida eu obtive uma função que me retorna oúltimo dia do mês.

Tentei implementar, porém não consegui. Vocês teriam algumexemplo de função para incrementar anos em uma data?

Resposta: Primeiramente o Sr. irá necessitar decodificarsua data e ano, mês e dia. Depois incrementar o ano codificar adata para passar como retorno à sua função. Veja abaixo umsimples exemplo:

function IncYear(Data: TdateTime; I: Integer):TDateTime;var Ano, Mes, Dia: word;begin DecodeDate(Data, Ano, Mes, Dia); Inc(Ano, I); Result := EncodeDate(Ano, Mes, Dia);end;

procedure TForm1.Button1Click(Sender: TObject);begin Caption := DateToStr(IncYear(Date, 3));end;

Caso seja Delphi 6, declare a unit DateUtils e nela encontraráa função IncYear nativa no Delphi.

Dúvida enviada por Jefferson Pereira, Igreja Universal R.Deus, Rio de Janeiro/RJ.

Pergunta: Como mover uma pasta para outro local damesma forma que fazemos via Windows Explorer (Recortar eColar)?

Resposta: Segue abaixo exemplo de como mover uma pastapara outro local utilizando APIs da ShellAPI do Windows:

 implementationuses ShellAPI;{$R *.DFM} function MoveALL(cOrigem, cDestino: string): Boolean;var  F: TSHFileOpStruct;  pFromc, pToc: array[0..255] of char;  ResultVal: integer;begin

  FillChar(pFromc, SizeOf(pFromc),0);  StrPcopy(pFromc, ExpandFileName(cOrigem)+#0#0);   FillChar(pToc, SizeOf(pToc),0);  StrPcopy(pToc, ExpandFileName(cDestino)+#0#0);   F.wnd := 0;  F.wFunc := FO_MOVE;  F.pFrom := pFromC;  F.pTo   := pToc;   F.fFlags:= FOF_ALLOWUNDO or FOF_NOCONFIRMATION orFOF_SIMPLEPROGRESS or FOF_FILESONLY;   F.fAnyOperationsAborted := False;  F.hNameMappings := nil;  Resultval := ShFileOperation(F);  Result := (ResultVal = 0);end; { exemplo da chamada }procedure TForm1.Button1Click(Sender: TObject);begin  if MoveALL(‘d:\uteis’, ‘d:\utils’) then    Caption := ‘Moveu com sucesso!’  else    Caption := ‘Erro ao mover pasta!’end;

Dúvida enviada por Elson Carlos Almeida, Irecê/BA.

Pergunta: Gostaria de saber como faço para controlar qualdos botões de uma mensagem do tipo MessageBox foi pressionadopara dialogos com mais de dois botões...

Resposta: As funções MessageBox e MessageDLG devolvemum valor inteiro o qual poderá ser utilizado em um bloco “case”onde o retorno será testado, veja abaixo um simples exemplo:

 // MessageDlg.procedure TForm1.Button1Click(Sender: TObject);begin  case MessageDlg(‘Teste The Club... Confirma’,mtConfirmation, [mbYes, mbNo, mbCancel], 0) of    mrYes   : ShowMessage(‘Yes’);    mrNo    : ShowMessage(‘No’);    mrCancel: ShowMessage(‘Cancel’);  end;end;

PERGUNTAS & RESPOSTAS

Page 29: Revista The Club Megazine - 10/2002 · A arquitetura TCP/IP surgiu com a criação de uma rede patrocinada pelo Departamento de Defesa do governo dos EUA (DoD - Department of Defense)

MeGAZINE30

Pergunta: Desenvolvemos nossa aplicação e agoragostaríamos de por ela para funcionar em rede.

Já colocamos o executável em cada máquina mas nãoconseguimos compartilhar o banco de dados Interbase em rede, oque devemos fazer?

Resposta: Para rodar uma aplicação Interbase em redevocê deverá fazer o seguinte:

1. instalar o IBServer em seu servidor;2. instalar o IBClient em cada estação;3. na string de conexão com o banco de dados, configurar:

SERVIDOR:C:\PASTA\ARQUIVO.GDB

Onde:SERVIDOR = nome da máquina servidoraC:\PASTA = nome da pasta “no servidor”ARQUIVO.GDB= nome do seu banco de dados

4. Localize em todas as estações um arquivo chamado“HOSTS” e nele configure:

192.168.0.1 SERVIDOR————— ————\_ ip do servidor \_ nome do servidor

Com isso sua aplicação deverá rodar sem problemas!

Dúvida enviada por Silmara, Barco & Pizzato Ltda, Tangarada Serra/MT.

Pergunta: Em nossos sistemas usamos ocomponente TClientDataSet. Sabemos que para funcionardevemos copiar a “Midas.DLL” para a pasta system do Windows.Isto funcionou bem no Win95 e Win98, mas no Win2000 retornamensagem de erro ao carregar “Midas.DLL”, nos formuláriosonde usamos o componente. Gostaríamos de saber onde devemoscolocar esta biblioteca no WIN2000?

Resposta: No Windows 2000/XP/NT copie para a pasta

\Windows\System32. Porém, em algumas situações somenteisso não resolve o problema, sendo necessário registrar a DLL:

RegSvr32 MIDAS.DLL

Dúvida enviada por Francisco Zanin, Syscomp Comp. e Sist.,Campo Largo/PR.

Pergunta: Como desenvolver um sistema integrado comum Palm?

Resposta: Via Delphi não é possível gerar aplicativo paraplataforma PalmOS, porém em nossa revista de janeiro/2002encontrará uma matéria com dicas de ferramentas paradesenvolvimento para a plataforma PalmOS.

Caso não possua a revista poderá acessar em nosso site,www.theclub.com.br.

Dúvida enviada por Jefferson Mogomente, Juazeiro/BA.

Pergunta: Temos um banco de dados de contabilidade noFirebird que está crescendo assustadoramente.

Isso normalmente não ocorre com outros de nossos bancos dedados também em Firebird. Quando faço o backup/restore elediminui de tamanho. Já convertemos o arquivo para outro. Jáutilizamos o GFIX.

Gostaria de ter uma solução para tal problema.

Exemplo: O arquivo estava com 60MB, ao fazer o backup/restore ele caiu para 9MB.

Resposta: Uma explicação para isso poderia ser a quantidadede transações disparadas contra o banco de dados e a quantidadede transações abertas por muito tempo.

Certifique-se de não estar deixando transações abertas pormuito tempo ou ainda, de não estar deixando transaçõespendentes (sem Commit/Rollback)!

O aumento do tamanho do datafile de um banco de dados éaté aceitável, visto que toda e qualquer transação disparadacontra o banco de dados aloca espaço para poder trabalhar atéque a transação seja confirmada ou cancelada, porém, esteespaço não é eliminado após o término da transação, porém éreutilizado mediante novas transações. Muitas vezes o tamanhodo datafile pode ser até 50% maior do que o tamanho real dosdados nele armazenados.

Em resumo, atente para as transações que está disparandocontra o banco de dados, certificando-se de que não estejamficando abertas por muito tempo e que ainda não estejam sendoperdidas.

Dúvida enviada por Denis Pereira Raymundo, Tek-SystemInformática Ltda, Ubá/MG.

// MessageBox.case Application.MessageBox(‘Teste...’, ‘The Club’,MB_OKCANCEL + MB_DEFBUTTON1) of   IDOK     : ShowMessage(‘Ok’);   IDCANCEL : ShowMessage(‘Cancel’);   IDRETRY  : ShowMessage(‘Retry’);  end;

Dúvida enviada por Thiago Zandomênico Araújo, Vitória/ES.

PERGUNTAS & RESPOSTAS