30

Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

  • Upload
    vuque

  • View
    224

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão
Page 2: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

Revista The Club Megazine - 02/2003A 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® 2003

Page 3: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 3

EDITORIAL

Editorial

Editorial ......................................................................................... 03News ......................................................................................... 04Como Migrar de Clipper para Delphi de Forma Transparente ............. 05Gerando Arquivos para Cobrança Bancária ...................................... 08Montando um relatório com quebra de grupo no Rave Report ............ 13WebServices na Prática .................................................................. 16Escolhendo um Banco de Dados ....................................................... 22UML - Diagrama de Classe – Parte I ................................................ 28Perguntas & Respostas .................................................................... 29

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® 2003

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

Marcelo Nogueira, Emerson Facunte,

Marcos P. Gomes, José R. Prandini

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

registradas pelos seus respectivos proprietários.

Olá amigos,Como vocês já devem estar notando, estamos a cada mês adicionando novas

funcionalidades em nosso site, www.theclub.com.br. Agora a cada page-view vocêencontrará uma dica diferente no item “Dúvidas Freqüentes – The Club Megazine” eestamos na busca freqüente de novidades para melhor lhe atender!

A revista deste mês, como não poderia ser diferente está repleta de assuntosinteressantes e um deles vem de encontro com uma questão muito comum entreprogramadores de qualquer linguagem... “Qual banco de dados é o melhor?” No artigo“Escolhendo um Banco de Dados” daremos parâmetros suficientes para que vocêpossa tomar a melhor decisão para seu caso. Prandini da Renet Tecnologia traz umaótima solução para usuários Clipper que necessitar migrar ou mesmo mantercompatibilidade de sua base de dados entre Clipper e Delphi. Temos ainda um artigoespecial sobre a geração de arquivos para cobrança bancária, onde Marcos P. Gomesmostra de uma maneira bastante simples como implementar esta funcionalidade emsua aplicação.

“Rave Reports”, como prometemos em edições anteriores, estamos dando um focoespecial ao novo gerador de relatórios que acompanha o Delphi 7, mostrando nestaedição como criar um relatório com quebra de grupo. Na série sobre UML, MarceloNogueira faz uma pequena introdução a “Diagrama de Classes” e para finalizar nãodeixe de dar uma olhada na sessão “Perguntas & Respostas” onde selecionamosalgumas das dúvidas mais freqüentes recebidas pelo suporte técnico neste mês.

Forte abraço à todos, e sinta-se a vontade para enviar seus comentários esugestões, sejam para o nosso site, suporte ou a The Club Megazine.

Celso Jefferson PaganelliPresidente - The Club

Page 4: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

Autor: Emerson FacunteOnde comprar: http://www.brasport.com.br

Supreendente! Uma obra prima para desenvolvedores. Delphi 7, todo o poder em nossas mãos.Com o advento do novo milênio, um novo padrão de desenvolvimento foi estabelecido: aplicações e-business. O Delphi 7 incorporou

plenamente o padrão, fornecendo aos desenvolvedores uma infra-estrutura poderosa e eficiente.Este livro aborda de maneira clara e objetiva as principais tecnologias desta nova versão, através de vários exercícios, exemplos

práticos e aplicações reais. Indicado para desenvolvedores, analistas, coordenadores de projetos, gerentes e diretores de tecnologia, ondeo conhecimento e o domínio desta ferramenta são fundamentais para o sucesso.

Entre os assuntos abordados, destacam-se:* Novidades do Delphi 7* Instalação e Configuração do Apache Web Server* HTML na sua essência* Dicas JavaScript e CSS* Protocolos de comunicação* WebBroker - a base da tecnologia* Desenvolvimento de aplicações ISAPI/CGI* DbExpress, a nova tecnologia de banco de dados* Desenvolvimento de aplicações com banco de dados para celulares* Aplicação para envio de e-mails* Cookies simples e eficiente* Todo o poder do Intraweb - desenvolvimento RAD para Internet* Webservices, a nova (r)evolução - aplicações práticas com banco de dados* SOAP na prática* WebSnap básico* Guia do Interbase/Firebird

Aprenda a criar ferramentas para administradores, conheça opções e dicas para hospedagem de aplicações ISAPI/CGI, cases desucesso, e muito mais!

Delphi 7 - Internet e Banco de Dados

NEWS

Page 5: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 5

Depois de muito tempo trabalhando na área deProcessamento de Dados, tenho certeza de que migrar de umalinguagem para outra não é uma tarefa fácil. Em primeiro lugarserá necessário aprender o que o atual sistema faz e isto é maisdifícil do que se possa imaginar. Depois é a vez de dominar a novalinguagem (no nosso caso, o Delphi com TDataSet Descendente),caso contrário o desenvolvedor passará por momentos terríveisquando o novo sistema estiver pronto e for necessário corrigiraquilo que foi muito natural utilizar no início do desenvolvimentoe que com o passar do tempo, a prática mostrou que existiamoutras maneiras de se produzir um resultado melhor e até maisrápido. É neste momento que se descobre que a forma certaexige uma mudança muito grande nos programas desenvolvidos.

Com este e outros artigos que serão criados, formaremos umaidéia global de como será a migração de Clipper para Delphi,mostrando diversos exemplos funcionais que tornarão o caminhoda migração bem mais fácil.

Vamos tomar como exemplo uma empresa que decide evoluirdo Clipper para uma linguagem visual, no nosso caso, o Delphi(qualquer versão). Imaginem que esta empresa tem cerca de 300programas em produção e que, apesar de não ser um sistemacom padrão visual, emite as notas fiscais sem problemas, suasconsultas mostram os dados corretos e tudo o mais seguindo asnecessidades da empresa. No novo sistema deverão existir entre300 e 500 programas, porque novas idéias surgirão, módulos queantes não existiam, agora são necessários etc.

Posteriormente, quando o novo sistema em Delphi estiverpronto, será necessário um período de testes em paralelo com osistema em Clipper. Como a prática tem demonstrado, testes emparalelo funcionam mais por intuição do que por planejamento eexigem o dobro de recursos humanos. São muitos dados a seremconferidos e ajustados e o prazo para estes ajustes e novasrodadas do novo sistema é exíguo.

Neste artigo, descreveremos um componente que permitiráfazer a migração, passo a passo, programa por programa e quequando o último módulo estiver concluído, o novo sistema estarápronto, implementado e funcionando.

O software TDataSet Descendente, é interface (componente) deum produto maior, chamado ADS -Advantage Database Server,que será descrito posteriormente. O TDataSet Descendente é

grátis e pode ser usado com ou sem seu produto principal – oservidor de banco de dados ADS. Sua grande força é permitir aoDelphi compartilhar as bases .DBF/.CDX/.NTX em tempo realcom o Clipper, sem mudanças nos arquivos, sem reindexações,sem criar novos campos ou outra necessidade qualquer. Existe,também, uma base proprietária, que chamaremos de “base.ADT”, que servirá para a criação de novos arquivos, que serãoutilizados somente com Delphi e que serão tratados em capítuloespecial.

Em Delphi, ao invés da utilização dos componentes TABLE &QUERY, temos os equivalentes ADSTABLE e ADSQUERY,contendo as mesmas opções e propriedades. Os comandosutilizados para tratamento de arquivos são basicamente osmesmos, com a palavra ADS na frente do comando, p.ex.:AdsFindKey, AdsSetField, AdsWriteRecord etc. Os outroscomandos do Delphi, que não tratam de arquivos, são os mesmos,já existentes.

No início desta migração o ideal será o desenvolvimento deprogramas de consultas e relatórios porque além de serem maissimples, darão oportunidade ao programador de se acostumarcom a nova ferramenta, para não ter que se preocupar quando osproblemas de lógica e programação realmente acontecerem.

Ferramentas de Apoio - (ARC32 – Advantage DataArchitect)

Para auxiliar no desenvolvimento dos programas, foramcriadas ferramentas de apoio pelos desenvolvedores do ADS.Uma delas, o ARC32, auxilia na criação de todo o materialnecessário no que se refere a arquivos. É similar ao DBU, doClipper, só que feito em Delphi, com muitas funções novas e omais importante, também sem custos. Permite a criação eatualização de arquivos, mudanças em suas estruturas, queriescom arquivos de índice .CDX / .ADT, zaps, reorganização,indexação, reindexações etc.

No Anexo I, demonstramos como criar um arquivo, colocardados e indexar, tudo isto de forma simples. A título decuriosidade será muito bom criar um programa em Clipper, queleia o mesmo arquivo, para que se possa testar a funcionalidadede Clipper e Delphi, lendo o mesmo arquivo, em tempo real. Nãoesquecer de observar as regras de leitura (Exclusive, Shared).

Como Migrar de Clipper para Delphide Forma Transparente

CLIPPER / DELPHI

Por José R. Prandini

Page 6: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE6

Anexo I: Exemplo de criação de arquivo, quando necessário,com seus campos e índices, utilizando o Delphi 7 eTDataDescendente 6.2.

{—————————————————————————ReNet100 - Criação de Arquivo e Índices—————————————————————————}procedure TForm1.Panel1Click(Sender: TObject);var Campos: string;begin

with DM1.AdsArqNovo do begin IndexName := ‘’; Panel1.Enabled := False ; AdsCreateTable( ‘C:\ReNet\’ + ‘ReNet120.dbf’,ttAdsCDX, ANSI, 512, Campos); TableName := ‘ReNet120.dbf’; Exclusive := True; Active := False; DM1.AdsArqNovo.Close ; DatabaseName := ‘C:\ReNet\’ ; TableName := ‘ReNet120.dbf’; Exclusive := True; Active := True; AdsAppendRecord; AdsSetField ( ‘SETOR’, ‘05’ ); AdsSetField ( ‘DEPTO’, ‘6004’ ); AdsSetField ( ‘NOME’, ‘Danilo’ ); AdsSetField ( ‘SOBRENOME’, ‘Rocha’ ); AdsSetField ( ‘CIDADE’, ‘São Paulo’ ); AdsSetField ( ‘VALOR’, ‘3275.66’ ); AdsSetField ( ‘OBS’, ‘Registro 01’ ); AdsWriteRecord; AdsAppendRecord; AdsSetField ( ‘SETOR’, ‘02’ ); AdsSetField ( ‘DEPTO’, ‘6004’ ); AdsSetField ( ‘NOME’, ‘Alfredo de’ ); AdsSetField ( ‘SOBRENOME’, ‘Franco’ ); AdsSetField ( ‘CIDADE’, ‘Campinas’ ); AdsSetField ( ‘VALOR’, ‘1349.45’ );

AdsSetField ( ‘OBS’, ‘Registro 02’ ); AdsWriteRecord; AdsAppendRecord; AdsSetField ( ‘SETOR’, ‘01’ ); AdsSetField ( ‘DEPTO’, ‘1002’ ); AdsSetField ( ‘NOME’, ‘Cristiane de’ ); AdsSetField ( ‘SOBRENOME’, ‘Alvarado’ ); AdsSetField ( ‘CIDADE’, ‘São Paulo’ ); AdsSetField ( ‘VALOR’, ‘7432.12’ ); AdsSetField ( ‘OBS’, ‘Registro 03’ ); AdsWriteRecord; AdsAppendRecord; AdsSetField ( ‘SETOR’, ‘03’ ); AdsSetField ( ‘DEPTO’, ‘1002’ ); AdsSetField ( ‘NOME’, ‘João ‘ ); AdsSetField ( ‘SOBRENOME’, ‘Pedro’ ); AdsSetField ( ‘CIDADE’, ‘Guarulhos’ ); AdsSetField ( ‘VALOR’, ‘3564.54’ ); AdsSetField ( ‘OBS’, ‘Registro 04’ ); AdsWriteRecord; AdsCreateIndex(‘C:\ReNet\ReNet120’, ‘ReNet121’ ,

‘SETOR+NOME’ , ‘’ , ‘’ , [optCOMPOUND] ) ; AdsCreateIndex(‘C:\ReNet\ReNet120’ ,’ReNet122’ ,

‘NOME’ , ‘’ , ‘’ , [optCOMPOUND] ) ; AdsCreateIndex(‘C:\ReNet\ReNet120’ ,’ReNet123' ,

‘SOBRENOME’ , ‘’ , ‘’ , [optCOMPOUND] ) ; AdsCreateIndex(‘C:\ReNet\ReNet120’ ,’ReNet124' ,

‘DEPTO+NOME’ , ‘’ , ‘’ , [optCOMPOUND] ); end ;end ;{————————————————————————————————————}procedure TForm1.AbrirIndiceCdx5a121Click(Sender:TObject);beginWith DM1.AdsArqNovo do IndexName := ‘’; DM1.AdsArqNovo.IndexName := ‘ReNet121’ ;end;{————————————————————————————————————}procedure TForm1.AbrirIndiceCdx5a122Click(Sender:TObject);beginWith DM1.AdsArqNovo do IndexName := ‘’; DM1.AdsArqNovo.IndexName := ‘ReNet122’ ;end;{————————————————————————————————————}procedure TForm1.AbrirIndiceCdx5a123Click(Sender:TObject);begin

Campos := 'SETOR C ;' +'DEPTO C 4 ;' +'NOME C 20 ;' +'SOBRENOME C 20 ;' +'CIDADE C 15 ;' +VALOR N 10,2 ;' +'OBSERVA M 10 ;' ;

CLIPPER / DELPHI

Page 7: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 7

With DM1.AdsArqNovo do IndexName := ‘’; DM1.AdsArqNovo.IndexName := ‘ReNet123’ ;end;{————————————————————————————————————}procedure TForm1.AbrirIndiceCdx5a124Click(Sender:TObject);beginWith DM1.AdsArqNovo do IndexName := ‘’; DM1.AdsArqNovo.IndexName := ‘ReNet124’ ;end;end.

Exemplo da grid utilizadaNotas:No Anexo I, demonstramos a maneira codificada de criação

de arquivos.Colocar uma grid no programa para que assim que o

programa for criado, seus dados apareçam nela. Colocar também4 botões que permitirão a indexação dos arquivos

Com o ARC32 seria bem mais simples e rápido, pois o arquivoseria criado como se cria com o DBU do Clipper. A vantagem dacodificação é que o desenvolvedor toma mais contato com ossoftwares utilizados, no caso, Delphi com TDataSet Descendente.

O download dos produtos referenciados pode serefetuado a partir da área de download da ReNet(www.renet.com.br). Procure o arquivo ADE 6.2TDataset Descendente para Delphi e C++ Builder(com suporte a Delphi 7 e C++ Builder 6) em ADS 6.2– Interfaces Clientes e o arquivo ARC32 (AdvantageData Architect) para ADS 6.2 em ADS 6.2Ferramentas para Windows.

CLIPPER / DELPHI

José R. Prandini ([email protected])ReNet Tecnologia Ltda.www.renet.com.br - [email protected].: 11 3872-0423Fax: 11 3872-4418

Sobre o autor

Page 8: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE8

Nesse artigo vamos gerar um arquivo texto, onde o mesmovai conter dados para que o banco possa gerar os boletosbancários e encaminhar aos nossos clientes.

Não entraremos nos detalhes sobre a forma de transmissãodesse arquivo, pois cada banco tem seu próprio sistema que cuidadessa transmissão, porém ele apenas transmite o arquivo e acriação do mesmo fica por conta nossa.

Aqui pegaremos como exemplo o Banco Sudameris Brasil,pois já trabalho com esse banco ha bastante tempo.

Bom, vamos deixar algumas coisas claras, o processo degerar arquivos é muitíssimo simples. Mas o maior transtornopara quem precisa trabalhar com esse tipo de arquivo é quedevemos seguir um padrão de layout chamado CNAB 400, essepadrão é regulamentado pela Febraban (Federação Brasileira dosBancos).

Aposto que você já pensou “Então é fácil, se eu gerar para umbanco, os outros serão todos iguais”, desculpe decepcioná-lo, masnão se iluda, cada banco tem seu próprio padrão, bem parecidocom os outros, porém você encontrará várias particularidades debanco para banco.

Mas os problemas não param por ai, além de cada banco terseu próprio layout, alguns bancos apenas nos fornecem o layout edeixa muito a desejar quando precisamos tirar pequenas dúvidasque surgem no decorrer da confecção do arquivo.

Vamos entender como funciona o arquivo de Layout, omesmo é divido em 3 partes :

Header – É a primeira linha do nosso arquivo texto, aquiinformaremos os dados de nossa conta corrente.

Gerando Arquivos paraCobrança Bancária

NOME DOCAMPO

SIGNIFICADO POSIÇÕES CONTEÚDO

CODIGO DOREGISTRO

IDENTIFICAÇAODO REGISTRO

001 A 001 '0'

CÓDIGO DAREMESSA

CÓDIGOP/IDENTIF.AROUIV-O

002 A002 '1'

LITERALREMESSA

TIPO DE ARQUIVO 003 A 009 'REMESSA'

CÓDIGO DOSERVIÇO

TIPO DE SERVIÇO 010 A 011 '01'

LITERAL'COBRANÇA'

NOME DOSERVIÇO 012 A 026 'COBRANCA'

CÓDIGO DAAGÊNCIA

CÓDIGO DAAGENCIA

027 A 029 9(3)

NÃO UTILIZADO 030 A03O

CONTACORRENTE

CONTA CORR. DAEMPRESA

031 A 038 9(8)

NÃO UTILIZADO 039 A 046

NOME DAEMPRESA

RAZAO SOCIAL DAEMPRESA 047 A 076 X(30)

CÓDIGO DOBANCO

IDENTIFICAÇAODO BANCO

077 A 079 '347'

NOME DOBANCO

RAZAO SOCIALABREVIADA

080 A 094 'BCOSUDAMERIS'

DATA DAGRAVAÇÃO

DATA DAGERAÇAO 095 A 100 9(6) (ODMMAA)

DENSIDADEDENSIDADE DEGRAVAÇÃO 101 A 105 1600

LITERAL 'BPI' COMPLEMENTODENSIDADE

106 A 106 'BPI'

NÃOUTILIZADO 109 A 394

NÚMERO DESEQÜENCIA

NÚMERO SEQ. DOREGISTRO

395 A 400 9(6)

DELPHI

Por Marcos P. Gomes

Page 9: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 9

Registro de Dados – Aqui gravaremos os dados de nossaduplicata.

NOME DOCAMPO

SIGNIFICADO POSIÇÕES CONTEÚDO

CODIGO DOREGISTRO

IDENTIFICAÇAODO REGISTRO 001 A 001 '1'

TIPO DEINSCRIÇÃO -CEDENTE

IDENTIFICAÇAODA INSCRIÇÃO 002 A 003

01- CPF; 02-CNPJ; 03-PIS/PASEP

INSCRIÇÃONÚMEROINSCRIÇÃO DAEMPRESA

004 A 017 9(14)

CÓDIGO DAAGÊNCIASUDAMERIS

CÓDIGO DAAGÊNCIA

018 A 020 9(3)

NÃO UTILIZADO 021 A 021

CONTACORRENTE

CONTACORRENTE DAEMPRESA

022 A 029 9(8)

NÃO UTILIZADO 030 A 037

NÚMERO DECONTROLE

CAMPO LIVRE 038 A 062 X(25)

NOSSONÚMERO

NÚMERO DOTÍTULO NO BANCO 063 A 071 9(9)

VALOR EMQUANTIDADE

QUANTIDADE DEMOEDA

072 A 084 9(8)V9(5)

NÃO UTILIZADO 085 A 107

TIPO DECARTEIRA

CÓDIGO DACARTEIRA 108 A 108

Há uma tabelade códigos.

CÓDIGO DAOCORRÊNCIA

CÓDIGO DOMOVIMENTO

109 A 110Há uma tabelade códigos.

NÚMERO DOTÍTULO

IDENT. TÍTULO NAEMPRESA

111 A 120 X(10)

VENCIMENTODATAVENCIMENTO DOTÍTULO

121 A 126 9(6) (DDMMAA)

VALOR DOTÍTULO

VALOR NOMINALDO TÍTULO

127 A 139 9(11)V99

CÓDIGO DOBANCO

IDENTIFICAÇÃODO BANCO

140 A 142 '347'

NÃO UTILIZADO 143 A 147

ESPÉCIE DETÍTULO

IDENTIFICAÇÃOTIPO DE TÍTULO

148 A 149Há uma tabelade códigos.

ACEITE NÃO ACEITE 150 A 150 'N'

EMISSÃODATA EMISSÃODO TÍTULO

151 A 156 9(6) (DDMMAA)

1a.INSTRUÇÃO

INSTRUÇÃO PARACOBRANÇA

157 A 158Há uma tabelade códigos.

2a.INSTRUÇÃO

INSTRUÇÃO PARACOBRANÇA 159 A 160

Há uma tabelade códigos.

COMISSÃO DEPERMANÊNCIA

VALOR POR DIADE ATRASO

161 A 173 9(11)V99

1a. DATAP/DESCONTO

DATA PARADESCONTO

174 A 179 9(6) (DDMMAA)

1o. VALOR P/DESCONTO

VALOR DODESCONTOCONCEDIDO

180 A 192 9(11)V99

IOF(P/SEGURAD-ORAS)

IOF (REAIS OUFAJ-TR)

193 A 2059(11)V99 /9(8)V9(5)

VALORABATIMENTO

VALOR DOABATIMENTOCONCEDIDO

206 A 218 9(11)V99

TIPO DEINSCRIÇÃO -SACADO

INDENTIFICAÇÃODA INSCRIÇÃO

219 A 220 Há uma tabelade códigos.

INSCRIÇÃONRO. INSCRIÇÃODO SACADO 221 A 234 9(14)

NOMENOME DOSACADO

235 A 274 X(40)

ENDEREÇOENDEREÇO DOSACADO

275 A 314 X(40)

BAIRROBAIRRO DOSACADO

315 A 326 X(12)

CEP CEP DO SACADO 327 A 334 9(8)

CIDADECIDADE DOSACADO

335 A 349 X(15)

UF ESTADO 350 A 351 X(2)

TIPO MOEDA MODE 352 A 353VER NOTA 09 -PÁG. 27

2a. DATAP/DESCONTO

DATA PARADESCONTO

354 A 359 9(6) (DDMMAA)

2o. VALORP/DESCONTO

VALOR A SERDESCONTADO 360 A 372 9(11)V99

3a. DATAP/DESCONTO

DATA PARADESCONTO

373 A 378 9(6) (DDMMAA)

3o. VALORP/DESCONTO

VALOR A SERDESCONTADO

379 A 391 9(11)V99

PRAZO PARAPROTESTO

NÚMERO DE DIASAPÓS VENCTO.

392 A 393 9(2)

SACADOR /AVALISTA

BRANCO = NÃO; S= SIM

394 A 394 X(1)

NÚMERO DESEQUÊNCIA

NÚMERO SEQ. DOREGISTRO

395 A 400 9(6)

DELPHI

Page 10: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE10

Trailler – Nessa linha, informaremos os dados deencerramento do arquivo

NOME DOCAMPO

SIGNIFICADO POSIÇÕES CONTEÚDO

CÓDIGO DOREGISTRO

IDENTIFICAÇÃODO REGISTRO

001 A 001 '9'

CÓDIGO DEREMESSA

CÓDIGOP/IDENTIF.ARQUIV-O

002 A 002 '9'

CÓDIGO DOSERVIÇO TIPO DO SERVIÇO 003 A 004 '01'

CÓDIGO DOBANCO

IDENTIFICAÇÃODO BANCO 005 A 007 '347'

- NÃO UTILIZADO 008 A 394

NÚMEROSEQUENCIA

NÚMERO SEQ. DOREGISTRO

395 A 400 9 (6)

Agora que já temos o layout fornecido pelo Banco, vamostrabalhar.

Para alimentar os dados, criei um pequeno aplicativo quecontém os seguintes cadastros:

- Config – Aqui gravaremos os dados gerais, tais como contacorrente, agência, número do banco do sacado.

- Clientes – Dados cadastrais dos nossos clientes- Títulos – Cadastros de duplicatas

Não vou aprofundar muito sobre esse pequeno sistema decadastro, afinal esse não é o propósito desse artigo, se você estaquerendo gerar esse tipo de arquivo é porque já tem algumconhecimento em Delphi. Um pouco mais abaixo você encontraráo link para fazer download de tudo o que estaremos fazendo aqui.

Você pode fazer download do sistema que usamos comoexemplo em www.theclub.com.br/revista/cobr0203.zip ouwww.delphibr.com.br. Não vamos montar esse sistema passo-a-passo, pois isso deixaria nosso artigo muito extenso.

ImplementandoAbra o form frmTitulos e adicione os seguintes componentes :

TbitBtn

Caption Gerar Arquivo

Name BtGerarTXT

SaveDialog

Title Salvar Arquivo Texto

DefaultExt Txt

Filter Arquivo Texto|*.txt

Você terá uma tela parecida com a imagem abaixo.

Imagem 1 – Tela de Manutenção de títulos e geração doarquivo texto.

O CódigoAgora chegamos na parte que você realmente está

interessado, dê um duplo clique no botão Gerar Arquivo e vamosimplementar o seguinte código, mas antes de implementar ocódigo para gerar o arquivo texto, vamos criar uma função queserá muito usada no decorrer de nosso sistema.

Declare na seção Private o seguinte protótipo :

function Repl(Valor: string; Repetir: integer):String;

Agora vamos compor o corpo de nossa função.

function TfrmTitulos.Repl(Valor: string; Repetir:integer): String;Var x : integer;begin

{ Aqui iremos receber o Valor e a quantidade deespaços que queremos repetir essa função éequivalente ao velho REPL() do clipper. }

for x := 1 to Repetir - Length(Valor) Do Valor := Valor + ‘ ‘;

Result := Valorend;

Em seguida clique duas vezes no botão btGerarTXT eadicione o seguinte código :

procedure TfrmTitulos.btGerarTXTClick(Sender:TObject);

DELPHI

Page 11: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 11

Var F : TextFile; // Arquivo Texto Linha : String; { Implentaremos todos

os dados, depois gravaremos no TXT } SeqTitulo : Integer; {Guarda o Nr. Sequencia

da linha dentro o arq. texto.} MultaDia : Real; ValorMultaDia : Real;beginSeqTitulo := 0;MultaDia := 0.00; { Inicializando variáveis }ValorMultaDia := 0.00;SaveDialog1.InitialDir :=ExtractFilePath(ParamStr(0));if SaveDialog1.Execute ThenBegin if FileExists(SaveDialog1.FileName) Then Begin {Testa a existencia do arquivo informado. } ShowMessage(‘Arquivo ‘+SaveDialog1.FileName + ‘ já existe, informe outro nome’); exit; End; //Associando o arquivo externo com a variável F AssignFile(F,SaveDialog1.FileName); Rewrite(F); //Incrementa o Numero de Sequencia que vai noarquivo texto. SeqTitulo := SeqTitulo +1; {Vamos montar a 1a. linha de nosso arquivo, essa1a. linha é o Header. Para o melhor entendimento,acompanhe através do layout acima. } Linha := ’01REMESSA01COBRANCA ‘ +dm.tbConfig.FieldByName(‘Ag’).AsString +’ ‘+ dm.tbConfig.FieldByName(‘cc’).AsString+Repl(‘ ‘,8)+ Repl(dm.tbConfig.FieldByName(‘nome_empresa’).AsString,30)+ dm.tbConfig.FieldByName(‘banco’).

AsString+’BCO.SUDAMERIS ‘+ FormatDateTime(‘ddmmyy’,now)+’01600BPI’

+Repl(‘ ‘,286)+ FormatFloat(‘000000’,SeqTitulo);

WriteLN(F,Linha); { Gravando a linha no ArquivoTXT. }

{ O Trecho acima alimentou o cabeçalho de nossoarquivo texto, agora iremos implementar asinformações dos títulos. } with dm do

Begin tbTitulos.First; While not tbTitulos.Eof Do Begin SeqTitulo := SeqTitulo +1; //implementar as informações dos titulos. {MultaDia acha a comissão de Permanênciadiária} MultaDia := (tbConfig.FieldByName

(‘txJuros’).AsFloat / 30); {ValorMultaDia - Juros diários } ValorMultaDia := (tbTitulos.FieldByName

(‘Valor’).AsFloat * MultaDia)/100; { Arredonda ValorMultaDia para 2 casasdecimais } ValorMultaDia := Round

(ValorMultaDia * 100)/100; tbClientes.FindKey([tbTitulos.FieldByName

(‘CodCli’).AsInteger]); Linha := ‘1’+tbConfig.FieldByName

(‘Tipo_doc’).AsString + tbConfig.FieldByName(‘Doc’)

.AsString +tbConfig.FieldByName(‘Ag’).AsString +’ ‘ +

tbConfig.FieldByName(‘cc’).AsString+Repl(‘ ‘,8)+

Repl(tbTitulos.FieldByName(‘codDup’).AsString,25)+

Repl(‘ ‘,9)+Repl(‘ ‘,13)+Repl(‘ ‘,23)+’301'+

Repl(tbTitulos.FieldByName(‘Titulo’).AsString,10)+ FormatDateTime(‘ddmmyy’, tbTitulos.FieldByName(‘Vencto’).AsDateTime) + FormatFloat(‘0000000000000’, tbTitulos.FieldByName(‘Valor’).AsFloat* 100) + ‘347’ + Repl(‘ ‘,5) + ’01N’+FormatDateTime(‘ddmmyy’, now() )+ ‘0000’ + FormatFloat(‘0000000000000’,

ValorMultaDia * 100)+‘000000’+‘0000000000000’+’0000000000000'+’0000000000000'+

tbClientes.FieldByName(‘Tipo_doc’).AsString+ Repl(tbClientes.FieldByName(‘doc’).AsString,14)+ Repl(tbClientes.FieldByName(‘nome’).AsString,40)+ Repl(tbClientes.FieldByName(‘Endereco’).AsString,40)+ Repl(tbClientes.FieldByName(‘Bairro’).AsString,12)+ Repl(tbClientes.FieldByName(‘cep’).AsString,8)+ Repl(tbClientes.FieldByName(‘Cidade’).AsString,15)+

DELPHI

Page 12: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE12

Repl(tbClientes.FieldByName(‘UF’).AsString,2)+’09'+ Repl(‘ ‘,41)+FormatFloat

(‘000000’,SeqTitulo); WriteLN(F,Linha); tbTitulos.Next; End; end; {Agora vamos tratar o fim do nosso arquivo.(Trailler) } SeqTitulo := SeqTitulo +1; Linha := ‘9101347’+Repl

(‘ ‘,387)+FormatFloat(‘000000’,SeqTitulo); WriteLN(F,Linha); CloseFile(F);End;end;

Conclusão

Como você pôde conferir aqui, o processo de gerar o arquivo émuito simples.

Nesse caso que estamos estudando, nossa empresa gera oarquivo TXT e transmite para o banco, o banco se encarrega degerar os boletos e transmitir aos nossos clientes.

Outra forma de trabalhar com cobrança bancária é nossaempresa mesmo gerar os boletos bancários, mas isso é umprocesso bem diferente do qual tentei passar nesse artigo.

Espero que essa breve explicação que dei aqui,possa servircomo base para que você consiga gerar seu arquivo de cobrançade acordo com o layout de seu banco.

DELPHI

Marcos P. Gomes trabalha como desenvolvedor desistemas em uma empresa do ramo automobilístico,desenvolve sistemas em diversas linguagens e é um dosfundadores do site http://www.delphibr.com.br/. Tambémfaz parte do grupo de moderadores da lista de discussã[email protected]. Pode ser contatado peloe-mail [email protected].

Sobre o autor

Page 13: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 13

DELPHI

Rave ReportsMontando um relatório com quebra de grupo no Rave Report.

Por: André ColaviteSuporte Técnico The Club

Neste artigo iremos montar um relatório no Rave com quebrade grupo, para isso iremos utilizar as tabelas PARTS eVENDORS do alias DBDEMOS.

Para iniciar o relatório primeiramente iremos acessar astabelas, para isso iremos colocar no form do Delphi umcomponente QUERY, chamado Query1, ligando-o ao AliasDBDEMOS. Depois na propriedade SQL iremos montar oSELECT que irá retornar os campos da tabela PARTS(VENDORNO, PARTNO, DESCRIPTION e COST) e o campo databela VENDORS (VENDORNAME) sendo a quebra do grupopor esse campo VENDORNAME, portanto ele será colocado noORDER BY.

O nosso SELECT ficará da seguinte forma:

SELECT PARTS.VENDORNO, VENDORS.VENDORNAME,PARTS.PARTNO, PARTS.DESCRIPTION, PARTS.COSTFROM “PARTS.DB” PARTS LEFT OUTER JOIN “VENDORS.DB” VENDORS ON (PARTS.VENDORNO = VENDORS.VENDORNO)ORDER BY VENDORS.VENDORNAME

Estando com a visualização dos dados pronta, iremos colocaros componentes do Rave Report no form do projeto, começandopelo componente RvProject, onde iremos especificar na suapropriedade ProjectFile o nome do arquivo de relatório,RvGrupo.rav. O outro componente que iremos utilizar é oRvQueryConnection1 onde iremos especificar na sua propriedadeQuery o nosso componente Query1.

Montando a estrutura do relatório dentro do RaveDesigner

Primeiramente vamos abrir o Rave Designer clicando duasvezes sobre o RvProject e logo em seguida clique sobre o botãoNew para criar um novo relatório.

Agora teremos que montar um DataView dos dados que serãoimpressos, para isso selecione o botão New Data Object, depois aopção Direct Data View e Next, ao qual irá mostrar o nome docomponente RvQueryConnection1, selecione este componente eclique em Finish.

O próximo passo será adicionar o componente Region no form

do relatório, deixando-o do tamanho da página do relatório, logoem seguida podemos colocar um DataBand dentro desse region,configurando a sua propriedade Name como DBDetalhe e napropriedade DataView o nome do DATAVIEW1 que criamosanteriormente.

Dentro deste DataBand iremos colocar os componentesDataText, para assim especificar os campos que serão impressos.Sendo assim coloque o primeiro componente DataText deixando-ono canto esquerdo da DataBand e neste componente ligue apropriedade DataView com o DATAVIEW1 e a propriedadeDataField com o campo PARTNO.

O segundo DataText iremos colocar no meio da DataBand eiremos especificar o DATAVIEW1 e o campo DESCRIPTION.

O último DataText que iremos colocar nesta DataBand podeficar no canto esquerdo da DataBand, pois ele será utilizado paraimprimir o campo de valores, COST.

Sendo assim configure a sua propriedade DataView com oDATAVIEW1 e a propriedade DataField com o campo COST.Neste componente configure também a propriedade FontJustifycom o valor pjRight, para que o valor seja impresso posicionado aesquerda.

Você deve estar se perguntando sobre os camposVENDORNO e VENDORNAME, mas esses campos são oscampos do grupo, portanto serão impressos na banda decabeçalho que iremos criar mais à frente.

Pronto praticamente neste momento temos um simplesrelatório já montado, sem ainda a quebra por grupo.

Montando o cabeçalho do grupoA quebra por grupo é realizada por um componente Band,

não é DataBand é Band mesmo, portanto coloque essecomponente dentro do Region e pressione com o botão direito domouse sobre essa Band e selecione a opção Order / Move Behindpara que assim essa Band se posicione acima da DataBand,ficando como um cabeçalho. Na verdade poderíamos colocar essaBand antes de colocar a DataBand, mas a idéia foi primeiromontar um relatório simples e depois colocar as opções paraquebra de grupo.

Nesta Band entre na propriedade BandStyle e selecione aopção de Group Header e depois pressione em Ok. Em seguida

Page 14: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE14

DELPHI

configure na propriedade ControllerBand o nome da DataBandDBDetalhe que colocamos anteriormente. Nesta Band aindairemos especificar na sua propriedade GroupDataView o nossoDATAVIEW1 e na propriedade GroupKey o campo que irá fazera quebra do grupo, no caso selecione o campo VENDORNAME.

Pronto agora dentro dessa Band coloque um componenteText, da aba Standard, e na sua propriedade Text escreva o texto‘Grupo’. Coloque também dois componentes DataText um ligadoao campo VENDORNO e o outro ligado ao campoVENDORNAME, não se esquecendo que temos que ligá-los antesao DATAVIEW1.

Iremos aproveitar essa Band de Cabeçalho para montar ocabeçalho das colunas impressas no DataBand, para isso iremoscolocar três componente Text na parte inferior dessa Band,deixando cada Text posicionado sobre a sua coluna de campo.

No primeiro Text, posicionado acima da coluna do campoPARTNO, vamos escrever o texto ‘Código’, no segundo Text,posicionado sobre a coluna DESCRIPTION coloque o texto‘Descrição’ e no terceiro Text posicionado sobre o COST coloque otexto ‘Valores’ e configure a propriedade FontJustify desse últimoText com o valor pjRight.

Coloque abaixo desses componentes Text o componenteHLine, da aba Drawing, para assim imprimir uma linhahorizontal separando o cabeçalho da coluna com os valores dacoluna.

Neste momento se você clicar sobre o botão de Execute Reportpoderá ver o relatório sendo impresso já com a quebra por grupo.

Mas iremos incrementá-lo um pouco mais colocando tambémuma banda de rodapé de grupo para calcular o total do grupo,utilizando para isso o campo COST.

Montando o rodapé do grupoO rodapé do grupo também irá utilizar uma Band, portanto

coloque dentro do Region uma nova Band deixando-a abaixo doDataBand mesmo. Nesta Band configure em sua propriedadeBandStyle com a opção de Group Footer, na propriedadeControllerBand ligue a DataBand DBDetalhe, naGroupDataView o DATAVIEW1 e na propriedade GroupKey ligueo campo de quebra de grupo VENDORNAME. Com exceção dapropriedade BandStyle essa Band de rodapé foi configuradaidêntica a Band de Cabeçalho.

Agora dentro dessa Band de rodapé iremos colocar ocomponente para fazer a somatória de grupo, para isso iremosutilizar um componente CalcText. Neste componente CalcTextselecione na propriedades DataView o DATAVIEW1, napropriedade DataField o campo COST, na propriedade Controllero DBDETALHE, na propriedade FontJustify o valor pjRight e porfim na propriedade DisplayFormat coloque a seguinte máscara###,##0.00.

Outro componente que iremos colocar dentro dessa Band derodapé é o componente Text, deixando-o do lado esquerdo docomponente CalcText, e na propriedade Text deste componenteescreva o texto ‘Total do Grupo’.

Coloque como último componente da Band de rodapé ocomponente HLine para assim imprimir uma linha horizontalpara finalizar o grupo.

Pronto agora o relatório está pronto, basta salvá-loespecificando o nome RvGrupo e a estrutura final ficará parecidacom a figura abaixo:

Para testá-lo pressione o botão Execute Report ao qual irámostrar o relatório com o cabeçalho e o rodapé do grupo.

Para finalizar inclua no Delphi um botão ao qual seráutilizado para chamar o relatório e no evento onclick desse botãocoloque a instrução, RvProject1.Execute, conforme exemploabaixo:

procedure TForm1.Button1Click(Sender: TObject);begin RvProject1.Execute;end;

ConclusãoNeste artigo tentamos passar de uma forma bem simples

como montar um relatório por quebra de grupo dentro do RaveReport, sem se preocupar muito com detalhes na utilização doRave, pois temos como base a matéria publicada na edição deJaneiro de 2003.

O projeto referente a este artigo está disponível no seguintelink:

http://www.theclub.com.br/revista/RaveGrupo.zip

Page 15: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

Imagem da estrutura final do relatório.

Page 16: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE16

DELPHI

No artigo anterior conhecemos alguns pontos fundamentaispara a criação de WebServices com o Delphi, além dos aspectosmercadológicos da tecnologia.

Neste exemplo vamos criar nosso WebService sem utilizar osexemplos de métodos gerados pelo assistente, com o objetivo defirmar nosso conhecimento na tecnologia.

Nosso WebService consiste em fazer um simples cálculo,apresentando um número aproximado de dias já vividos, a partirde uma idade informada.

Exemplo: 28 anos = 10.220 dias aproximadamente ( 28 x 365), onde 28 = idade informada, 365 = dias do ano.

Através das opções File/New..., seção WebServices, selecione aopção SOAP Server Application (figura 1).

WebServices na Prática

Figura 1: Nova aplicação WebService

Em seguida selecione a opção CGI para o tipo da aplicaçãoservidora SOAP (figura 2).

Figura 2: Tipo da aplicação servidora

Em seguida o Delphi questiona se deseja criaruma Interface SOAP padrão (figura 3). Neste caso,selecione No, pois iremos criar “manualmente”.

Figura 3: Criação da Interface

Vamos gravar nossa aplicação.Unit WebModule un_ws2.PASProjeto ws2.DPR

Agora vamos criar a Interface de nossa aplicação.A partir da versão 7, existe o assistente para acriação da Interface. Na realidade faz a mesmaoperação que dispensamos no diálogo anterior (figura3).

Por Emerson Facunte

Page 17: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 17

Através das opções File/New..WebServices, selecione o assistenteSOAP Server Interface (figura 4), e em seguida pressione OK.

Figura 4: Criando a Interface do WebService

Em seguida (figura 5) devemos informar os dados da novaInterface.

Nos campos Service Name e Unit identifier coloque wsidade. Comisso estamos criando uma Interface com o nome wsidade, egravando a unit com o mesmo nome.

Em Code generation desmarque as duas opções (Generate Commentse Generate Sample Methods).

Figura 5: Dados complementares da Interface

O assistente criou duas novas units: wsIdadeIntf.pas ewsIdadeImpl.pas.

Vamos gravar nossa aplicação.

Unit wsIdadeIntf wsIdadeIntf.pasUnit wsIdadeImpl wsIdadeImpl.pas

Vamos analisar as units criadas.

wsIdadeIntf.pas

unit wsIdadeIntf;interfaceuses InvokeRegistry, Types, XSBuiltIns;type

IwsIdade = interface(IInvokable) [‘{A808C7C4-86BC-446C-B329-60F22BD82A87}’] end;

implementation

initialization InvRegistry.RegisterInterface(TypeInfo(IwsIdade));

end.

Esta é a unit para definição da Interface do nosso WebService.

No bloco que segue, definimos os métodos. Repare que foicriado um identificador único (GUID). Poderíamos fazer estaInterface sem o uso do assistente, e para a criação do GUID, bastapressionar as teclas CTRL-G no editor.

type

IwsIdade = interface(IInvokable) [‘{A808C7C4-86BC-446C-B329-

60F22BD82A87}’] end;

A seguir temos o registro da Interface do nossoWebService..

implementation

initialization InvRegistry.RegisterInterface(TypeInfo(IwsIdade));

DELPHI

Page 18: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE18

DELPHI

Agora veremos a unit wsIdadeImpl.

wsIdadeImpl.pas

unit wsIdadeImpl;

interface

uses InvokeRegistry, Types, XSBuiltIns, wsIdadeIntf;

type

TwsIdade = class(TInvokableClass, IwsIdade) public end;

implementation

initialization InvRegistry.RegisterInvokableClass(TwsIdade);

end.

Esta é a unit para implementação dos métodos definidos naInterface (unit wsIdadeIntf).

Repare no bloco a seguir, que esta unit faz uso da anterior.

uses InvokeRegistry, Types, XSBuiltIns, wsIdadeIntf;

No bloco que segue, os métodos são definidos como public,

type

TwsIdade = class(TInvokableClass, IwsIdade) public end;

Bem, agora vamos definir o método de nosso WebService.

Selecione a unit wsIdadeIntf, e insira o método QuantosDias,como segue.

IwsIdade = interface(IInvokable)[‘{A808C7C4-86BC-446C-B329-60F22BD82A87}’]

function QuantosDias(idade: Integer):integer;stdcall;

end;

Repare que estamos fazendo uma chamada explícita stdcall,padrão em WebServices.

Sugiro a leitura do excelente artigo sobre Interfaces do meu amigoAnderson Haertel Rodrigues, publicado na The Club deSetembro.2002.

Grave a unit.

Agora, selecione a unit wsIdadeImpl e insira o métodoQuantosDias, como segue;

public function QuantosDias(idade: Integer):integer;stdcall;

end;

Na seção implementation, digite o código a seguir.

function TwsIdade.QuantosDias(idade: integer):integer;

begin Result:=idade * 365;

end;

Está pronto nosso WebService.

Agora vamos desenvolver dois clientes com tecnologiasdiferentes.

O primeiro será no padrão desktop, e o outro uma aplicaçãoCGI.

Antes de compilar vamos definir o diretório para geração donosso WebService.

Através das opções Project/Options.../Directories_Conditionals,configure a opção Output Directory, apontando para o o seu diretóriocgi-bin (ver figura 6).

Compile a nossa aplicação para que possamos analisar odocumento WSDL.

No browser digite:

http://localhost/cgi-bin/ws2.exe

A figura 7 ilustra o assistente WSDL de nossa aplicação.

Page 19: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 19

Figura 6: Configuração do diretório

Repare que o nosso método QuantosDias estápublicado. Clique no WSDL do método para visualizar aimplementação.

O seguinte documento WSDL foi gerado.

<?xml version=”1.0" encoding=”utf-8" ?>- <definitions xmlns=”http://schemas.xmlsoap.org/wsdl/” xmlns:xs=”http://www.w3.org/2001/XMLSchema”name=”IwsIdadeservice”targetNamespace=”http://tempuri.org/”xmlns:tns=”http://tempuri.org/”xmlns:soap=”http://schemas.xmlsoap.org/wsdl/soap/” xmlns:soapenc=”http://schemas.xmlsoap.org/soap/encoding/”xmlns:mime=”http://schemas.xmlsoap.org/wsdl/mime/”>- <message name=”QuantosDias0Request”> <part name=”idade” type=”xs:int” /> </message>- <message name=”QuantosDias0Response”> <part name=”return” type=”xs:int” /> </message>- <portType name=”IwsIdade”>- <operation name=”QuantosDias”> <input message=”tns:QuantosDias0Request” /> <output message=”tns:QuantosDias0Response”/> </operation> </portType>- <binding name=”IwsIdadebinding”type=”tns:IwsIdade”> <soap:binding style=”rpc” transport=”http://schemas.xmlsoap.org/soap/http” />- <operation name=”QuantosDias”> <soap:operationsoapAction=”urn:wsIdadeIntf-IwsIdade#QuantosDias” style=”rpc” />- <input message=”tns:QuantosDias0Request”> <soap:body use=”encoded”encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/” namespace=”urn:wsIdadeIntf-IwsIdade” /> </input>- <output message=”tns:QuantosDias0Response”> <soap:body use=”encoded”encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/” namespace=”urn:wsIdadeIntf-IwsIdade” />Figura 7: Página de informação (assistente WSDL).

DELPHI

Page 20: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE20

DELPHI

</output> </operation> </binding>- <service name=”IwsIdadeservice”>- <port name=”IwsIdadePort”binding=”tns:IwsIdadebinding”> <soap:addresslocation=”http://localhost/delphi/cgi-bin/ws2.exe/soap/IwsIdade” /> </port> </service> </definitions>

Agora vamos criar a primeiraaplicação cliente para o nossoWebService.

Através das opções File/NewApplication cria uma nova aplicação, egrave os arquivos como segue:

Unit un_teste_ws2.PASProjeto teste_ws2.DPR

Agora vamos importar a Interfaceem nossa aplicação. Através dasopções File/New.../WebServices (figura 8),selecione a opção WSDL Importer.

Em seguida, como ilustra a figura 9, digite endereço que segue.

http://localhost/cgi-bin/ws2.exe/wsdl/IwsIdade

Este endereço faz a chamada ao documento WSDL da InterfaceIwsIdade.

Figura 8: WSDL importer

O assistente gerou uma Unit com toda a Interface

implementada.

Grave a Unit com o nome IwsIdade1.pas.

Agora com o foco na unit un_teste_ws2, insira a unit

IwsIdade1.pas gerada pelo assistente.

implementation

uses IwsIdade1;

Neste ponto iremos configurar o acesso para este

formulário.

Insira um objeto do tipo THTTPRIO, e configure as

propriedades que seguem, respeitando a seqüência

apresentada, caso contrário, uma exceção ocorrerá.

Figura 9: Importando a Interface

Page 21: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 21

Com isto configuramos o objeto de acesso à Interface,informando a localização do documento WSDL (WSDLLocation),o serviço (Service), e a porta (Port).

Agora insira os objetos que seguem, configurando suasrespectivas propriedades.

A figura 10 ilustra o formulário da nossa aplicação.

Agora vamos codificar a aplicação. Insira o código que segueno evento OnClick do objeto Button1.

varIIdade: IwsIdade;begin

IIdade:=HR1 as IwsIdade; lbDias.Caption:=’Você já viveu aproximadamente‘

+InttoStr(IIdade.QuantosDias(StrtoInt(edIdade.Text)))+’ dias’;

end;

Muito parecido com o nosso primeiro teste, estamos definindo

um objeto do tipo IwsIdade, em seguida estamos instanciando oobjeto a partir do nosso HTTPRio (HR1), adotando o modelo IwsIdade.

E por fim, apresentamos o resultado em nosso objeto lbDias,através da função IIDade.QuantosDias.

Fácil? Acredito que neste ponto já deu pra compreender ométodo de implementação de um WebService.

Amigos, este artigo faz parte do meu livro Delphi 7 Internet eBanco de Dados, onde através de exemplos práticos, aprendemos

a desenvolver aplicações para Internet com os novos recursos

desta fantástica ferramenta de desenvolvimento.

Façam uma visita em meu site (www.facunte.com.br) para

maiores informações.

Forte abraço a todos.

Figura 10: Formulário da aplicação

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

Sobre o autor

DELPHI

Page 22: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE22

DELPHI

Uma questão muito comum entre os desenvolvedores é: Qualbanco de dados devo usar? Esta seria uma questão muito fácil deser respondida se houvessem poucas opções. Este artigo examinarácomo você pode determinar qual banco de dados é o melhor paravocê e sua aplicação. No final deste artigo eu espero que você tenhauma lista para checar a melhor opção para as suas necessidades.

Eu estava querendo escrever este artigo sem mencionar nomesde bancos de dados. Porém isso se mostrou uma tarefa muito difícil.Quando eu mencionar um produto no entanto, será apenas paraexemplificar. Se você olhar todas as empresas importantes em todosos segmentos de mercado de banco de dados, chegará à conclusãoque não existem produtos ruins. Ao invés disso, existem diversosprodutos com características diferentes. Uma característica podeser uma vantagem para um tipo de aplicação e uma desvantagempara uma outra.

O básicoBancos de dados diferentes tem forças e fraquezas, então temos

de observar as razões que nos levarão a escolher entre um banco dedados e outro, ou seja, o que irá satisfazer os requerimentos denossa aplicação. Necessariamente, isso não quer dizer que vocêdeva escolher um banco de dados até que você tenha definido osseus requerimentos, mas sim que você deve iniciar com algumasquestões:

• A aplicação é para um usuário ou para vários?• Quantos usuários simultâneos terei conectados?• Quantos usuários simultâneos terei conectados nos próximos

10 anos?• O quão grande seu banco de dados será?• Quanto seu banco de dados crescerá nos próximos 10 anos?• Quantas horas por dia seu banco de dados estará em uso?• No caso de um problema de software ou hardware, o que será

necessário para recuperar no menor tempo possível os dados?• É necessário a replicação dos dados?• O acesso aos dados é somente com a finalidade de inserção e

atualização ou também é necessária pesquisa?• Quão complexas essas pesquisas serão, ou, qual a quantia de

dados que será necessário vasculhar para realizar a pesquisa?

As respostas para essas questões irão prepará-lo para o próximoconjunto de questões.

O banco de dados suporta acessos simultâneos? Se a aplicaçãoé multi-usuário, você eliminará todos os bancos de dados desktop dasua lista, e manterá seu foco em banco de dados que são baseadosem cliente/servidor. Aplicações cliente/servidor reduzem o tráfegona rede e fornecem uma performance superior para usuáriossimultâneos. Mais importante, as chances de uma quebra do bancode dados causando uma perda são muito pequenas, uma vez que oPC que hospeda o software de banco de dados deve ser dedicado àtarefa, com uma fonte de energia ininterrupta, e fisicamente seguro.Os servidos de dados SQL estão disponíveis em várias faixas depreço, inclusive os gratuitos, assim você não tem motivos para nãousá-los.

Qual a arquitetura do banco de dados? A vasta maioria dos

Qual o melhor para suas necessidades?

Escolhendo umBanco de Dados

Page 23: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 23

servidores de banco de dados hoje em dia usam o modelo derelacionamento, porém esta não é a única escolha. Talvez um bancode dados de objeto, um banco de dados hierárquico, um banco dedados associativo, ou de qualquer outra arquitetura pode ser omelhor para sua aplicação. Banco de dados relacionais são os maiscomuns. Assim, para este artigo vou assumir que você escolheráum banco de dados relacional.

Em qual plataforma de hardware e sistema operacional seubanco de dados funcionará? Você precisa considerar o tamanho dobanco de dados e o número de usuários agora, e como isso poderáser alterado no futuro. Se o tamanho do banco de dados e o númerode usuários são ambos pequenos, um banco de dados que rode emum simples PC com Windows com um único processador talvezseja o que você precisa. Agora se você precisa suportar centenas oumilhares de usuários, você precisa de um produto que funcione emuma plataforma mais poderosa. Se você espera que a leitura dobanco de dados melhore o tempo de resposta do sistema, você precisaobservar um banco de dados que suporte múltiplos sistemasoperacionais e plataformas de hardware. Desta maneira você podecomeçar com um simples PC e depois aumentar para um PC comdois ou mais processadores, um conjunto de servidores, um grandesistema Sun, ou um mainframe IBM, sem ter que mudar o seusoftware.

Se o seu banco de dados terá centenas de gigabytes, ou talvezterabytes, de tamanho e suportarão muitos usuários, você irá querera habilidade de distribuir o banco de dados através de vários drives,e a habilidade de controlar quais objetos de qual banco de dadosresidem em qual drive, para otimizar a performance. Este nível deconfiguração fornece a melhor performance e utilização dohardware. No entanto se isto parece um trabalho difícil e se trabalharcom um banco de dados complexo requer um administrador debanco de dados altamente qualificado para instalar, configurar emanter o banco de dados talvez seja necessário observar outro bancode dados antes de se tomar uma decisão. Se o seu banco de dadostem de ficar on-line 24 horas por dia, 7 dias por semana, você talveznecessite de servidores de backup e servidores que assumem o serviçoautomaticamente em caso de falhas, para que os usuários nãotenham o serviço interrompido se algo falhar.

Locking vs VersioningQual arquitetura de controle de concorrência seu banco de

dados usará? Existem dois modelos de controle de concorrênciapara acessar o banco de dados: locking e versioning. A principalvantagem do versioning é que os leitores nunca bloqueiam osgravadores.

Colocando de outra maneira, se o usuário está executando umalonga pesquisa que seleciona e analisa os dados, e esta pesquisarequer uma visualização consistente dos dados naquele exato

momento, outros usuários estarão aptos a atualizar as linhas usadaspela pesquisa enquanto a pesquisa estiver funcionando. O mesmonão é verdade para o banco de dados que usa o modelo “locking”.

Qual é o mínimo de dados que pode ser travado? A granularidadedo travamento é a medida da quantidade. Muitos bancos de dadoshoje suportam o travamento a nível de linha. No entanto, talvezvocê encontre banco de dados que oferecem somente travamento anível de página como referência granular. Isto faz com que ao invésde se travar uma única linha, uma página inteira de linhas sejatravada, o que reduz o acesso concorrente aos dados. Travamentosde página são um problema particular em pequenas tabelas quesão acessadas por muitos usuários. As chances são altas que doisusuários necessitem atualizar a mesma linha na mesma páginana mesma hora.

O banco de dados usa travamento automático? Se sim, sobquais circunstâncias? Será ótimo se o banco de dados que você estáconsiderando utilizar o travamento de linha, porém, o que acontecequando um usuário lê ou atualiza um grande número de linhas ?Por causa da grande manutenção exigida para um grande númerode travamentos, a performance pode não ser a esperada, assim,muitos bancos de dados usarão travamentos menos granularespara reduzir o número de travamentos que o servidor deve manter.Isto faz com que você de repente imagine que o banco de dados estáutilizando travamento por página – ou então de tabelas inteiras – enão de linhas individuais. Obviamente isso pode diminuirsensivelmente o acesso concorrente aos dados.

Quais os tipos de travamento o banco de dados usa, e comoeles podem coexistir? Quando se está considerando o modelo detravamento, é crítico entender como os travamentos entram emconflito uns com os outros. O que acontece quando um usuáriocoloca um tipo de travamento de linha, página ou tabela, e outrousuário tenta colocar o mesmo travamento ou um diferente nomesmo objeto ? A melhor maneira de entender os conflitos detravamento é com uma tabela com travamentos em conflito, quemostre todos os tipos de travamento. Cada célula no gridrepresentará uma tentativa de se colocar dois travamentossimultâneos e as células deverão conter as explicações do que acontecequando os travamentos são tentados. Isto talvez soe como umatarefa corriqueira, mas não é. Por exemplo, a última vez que utilizeio DB2 da IBM haviam 12 diferentes tipos de travamento. Isto fazcom que eu tenha 144 considerações de combinações diferentes detravamento ! Isso é claro, se eu quisesse entender quais os conflitosque eu iria encontrar.

Da mesma maneira você precisa entender quais os tipos deconflitos encontrará, quais os tipos que sua aplicação usará e emque tempo.

DELPHI

Page 24: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE24

DELPHI

TransaçõesO banco de dados suporta transações? Tenha cuidado aqui.

Muitos bancos de dados dizem que suportam transações quandorealmente não o fazem. A verdadeira transação deve ter quatrocaracterísticas, algumas vezes chamadas de teste ACID (veja afigura 1).

Qual o nível de isolamento de transação o seu banco de dadossuporta? Novamente, você precisa ser cuidadoso ao testar o nível deisolamento de transações. Muitos servidores de bancos de dadosnão utilizam os níveis de isolamento de transação padrão definidopelo American National Standards Institute (ANSI).

Por exemplo, o Interbase tem um nível de isolamento detransação que fornece a mesma consistência de visualização dosdados de um isolamento serializável ANSI, porém não garante quea ordem seqüencial da execução das transações correntes produzirãoo mesmo resultado.

Para aumentar a confusão, o isolamento ANSI padrãorepeatable-read talvez não seja o que você espera. A figura 2 mostraos níveis padrão de isolamento ANSI.

De outra maneira, se um usuário está executando uma grandepesquisa que seleciona e analisa dados, e esta pesquisa requer umavisualização consistente dos dados exatamente como eles estãonaquele momento, outros usuários estarão aptos a atualizar aslinhas usadas pela pesquisa enquanto a pesquisa estiverfuncionando. *

O mesmo não ocorre quando se trava o banco de dados.

O que acontece quando o arquivo de log de transações estácheio?

* Se o banco de dados usa um arquivo de log de transações, oque acontecerá se ele para deixar o banco de dados funcionando emsua máxima eficiência?

O arquivo de log de transações crescerá dinamicamente?Se não, o que você deve fazer para incrementar o tamanho do

arquivo?* O arquivo de log pode ser incrementado enquanto o banco de

dados está em uso?* Você pode colocar o arquivo de log em um drive separado do

banco de dados para que em caso de falha de hardware ambos osarquivos – o banco de dados e o arquivo de logs – não sejam perdidos?

As transações podem trabalhar com mais de um banco de dados?Muitos bancos de dados permitem que uma simples transação façaatualizações em mais de um banco de dados, outros não.

O banco de dados tem um método para geração de númerosseqüenciais? É comum guardar dados em bancos de dadosrelacionais que não contenham um número natural como chaveprimária. A solução mais comum é usar um número seqüencial edenominá-lo como chave primária. Isto é um requerimento comume eu não considero um banco de dados que não possua uma maneirade gerar números seqüenciais de maneira segura em um ambientemulti-usuário. Muitos bancos de dados possuem um tipo específicode campo para fazer isso. Outros bancos possuem outrosmecanismos, como os generators usados pelo InterBase. O banco dedados também pode providenciar uma maneira de mudar o próximovalor que será gerado, então o valor pode ser resetado após um testeou por outras razões. Você também pode querer que a opção dedesativar automaticamente a geração de números quando importardados que já contenham uma chave primária atribuída a cadalinha.

Implementação do SQLQual o nível de ajuste ao ANSI SQL que o seu banco de dados

fornece? Se você precisa de características particulares do ANSISQL padrão, tenha certeza que o banco de dados o suporta. Se vocênecessita de características fora do padrão, como uma pesquisafull-text ou referência cruzada, tenha certeza que o fabricante dobanco fornece isso.

Quais funções são incluídas na implementação do SQL? Umabiblioteca completa de datas, hora, matemática e funções com stringaumentam o poder do SQL, das stored procedures e triggers. Issopode reduzir dramaticamente o quantidade do manipulamento dedados que será programado na aplicação cliente. Se você necessitarde análise estatística, procure por estas funções também.

Você pode escrever suas próprias funcionalidades? Isto temum alto valor se você estiver apto a escrever suas próprias funçõese puder chamá-las nas declarações SQL, stored procedures etriggers. Isto torna mais fácil o trabalho para adicionar funçõesespecializadas que não estão disponíveis nas funções padrão dobanco de dados.

Como o otimizador de pesquisa funciona? O poder e asofisticação do otimizador de pesquisa pode ter um grande impactona performance de sua aplicação e pode reduzir o tempo que vocêgasta ao tentar melhorar a performance de suas pesquisas. Façaas seguintes perguntas à você mesmo:

• O otimizador pode procurar pela solução com menor custo?• O otimizador pode constuir tabelas estáticas, ou o sistema

deve fazê-lo?• Quando e como as tabelas estáticas são atualizadas?• O otimizador pode considerar o custo do hardware?• O otimizador pode considerar os dados, como os valores mínimo,

Page 25: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 25

maxímo, total e distribuídos?• Existem tipos de pesquisa que não são otimizadas?

Quais são as características fornecidas para aumentar aperformance? Veja se o banco de dados que você está pesquisandosuporta as seguintes características: cluster em tabelas, cluster emíndices, cache de stored procedures, cache de dados compartilhadose cache de escrita.

O cluster de tabelas colocam as tabelas selecionadas perto umadas outras para um acesso mais rápido. Um cluster de índice guardaas linhas em ordem de modo que as linhas de dados estão em umaordem específica. Isto torna o índice menor e a pesquisa muito maisrápida. Caches de procedures compartilhadas e caches de dadoscompartilhados permitem que múltiplos usuários compartilhem omesmo cache para aumentar a performance e melhorar o uso damemória. O cache de escrita aumenta a performance reduzindo onúmero de operações de escrita tornando-as seguras. Se você usara cache de escrita e o servidor parar, tudo o que estiver no cacheserá perdido, e é muito provável que o banco de dados fiquecorrompido.

O banco de dados suporta stored procedures? Stored proceduressão procedimentos escritos no banco de dados. Estes procedimentospodem ser chamados pela aplicação cliente, triggers ou até mesmooutras stored procedures. Procure pelas seguintes características:

* As stored procedures suportam todos os tipos de dados?* Você pode criar declarações dinamicamente e usá-las?* Você pode utilizar uma stored procedure que retorna um

conjunto de resultados como uma tabela nas declarações SQL?

O banco de dados suporta triggers? As triggers, como as storedprocedures , são funções escritas como procedimentos para o bancode dados e na linguagem correta. Porém, as triggers são executadasautomaticamente quando os dados são inseridos, apagados ouatualizados. Procure pelas seguintes características:

* Você pode atachar várias triggers em um único evento?* Você pode especificar a ordem nas quais múltiplas triggers

funcionarão?* Você pode escolher quais as triggers que funcionarão antes e

depois do evento?* As triggers podem executar algum evento para avisar os

clientes de determinada condição?

As triggers podem ser executadas quando uma linha na tabelaé inserida, apagada ou atualizada. A habilidade de escrever mais deuma trigger executada pelo mesmo evento faz com que você possa

Caracter Descrição

Atomicity

Todas as mudanças são parte de uma transaçãoque teve sucesso ou falhou, são tratadas comouma simples unidade, não importa quantas linhasou tabelas estejam envolvidas.

Consistency

O banco de dados sempre estará em um estadoconsistente. Se o servidor de banco de dados temuma quebra, todas as transações ativas sãoautomaticamente reinicializadas quando oservidor inicializa, então o estado do banco dedados sempre será o que estava antes do iníciodas transações.

IsolationMudanças são transações não gravadas que nãopodem ser vistas por outros usuários.

Durability

Uma vez que a transação esteja gravada, todasas mudanças que são parte da transação setornam parte permanente do banco de dados enão podem mais ser perdidas.

Nível deisolamento

Descrição,

Readuncommited

Também conhecido como isolamento dirty-read. Outras transações podem ver asmudanças feitas por uma transação antes deser gravada. Muitos poucos bancos de dadossuportam o isolamento read-uncommitedporque ele viola a regra de isolamento detransação e deixa que outras transaçõesvejam o conteúdo que podem não estar nobanco de dados caso aconteça algumproblema com o banco de dados.

Read commited Outras transações podem ver as mudançasefetuadas assim que elas estiverem gravadas.

Repeatableread

Se uma transação usando o isolamentorepeatable-read seleciona um conjunto delinhas e depois mais tarde seleciona o mesmoconjunto de linhas, ele verá exatamente osmesmos valores em cada campo de cadalinha da primeira leitura. Observe no entanto,que se novas linhas foram inseridas no bancode dados desde o primeiro SELECT, e estasnovas linhas satisfaçam a clasula WHERE,elas serão retornadas pelo segundo SELECT.A leitura é repetida somente se a segunda foridêntica à primeira.

Serializable

O isolamento serializável garante que se vocêexecutar um SELECT mais de uma vezdurante o curso de uma transação, você teráexatamente o mesmo resultado ajustado paracada vez. Isto também garante que astransações serializáveis executemconcorrentemente, uma ordem seqüencial deexecução produzirá o mesmo resultado.

Figura 1: Características de uma transação: o teste ACID

Figura 2: Níveis de isolamento de transação do padrão ANSI

DELPHI

Page 26: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE26

DELPHI

escrever e testar muitas funções pequenas e simples ao invés deuma única e enorme. Isto torna o desenvolvimento, testes emanutenção muito mais fácil.

Se você quer colocar várias triggers em um simples evento, écrítico que você esteja apto a especificar a ordem nas quais elasexecutarão, no caso das triggers serem dependentes uma das outras.

Muitos bancos de dados não permitem que você tenha triggersque executem antes e depois do evento.

Isto é muito limitante. Por exemplo, um dos usos mais comunsde triggers é validar os dados antes da atualização ou inserçãopermitindo proceder ou bloquear a operação caso os dados nãoestejam válidos.

Eventos permitem que o banco de dados notifique o cliente quealguma coisa está acontecendo, sem sobrecarregar o sistema daaplicação cliente. Por exemplo, você talvez queira que o sistema deadministração de vendas seja avisado se o consumidor cancelaruma compra. Outro exemplo pode ser a notificação do sistema decompras caso o nível do estoque falhe com a quantidade.

Você pode mudar metadados enquanto o banco de dados estáonline?

Você tem que desligar o banco de dados antes de adicionarnovas tabelas, adicionar novas colunas nas tabelas existentes oufazer outras mudanças no banco de dados? Se você pode fazermudanças no metadados enquanto o banco de dados estáfuncionando, quando os usuários conectados verão estas mudanças?

O banco de dados suporta integridade de dados referencialdeclarativa?

Você estará perdendo muito tempo escrevendo triggers parareforçar a integridade referencial, ou, reforçando-a em suasaplicações cliente. O banco de dados deve permitir a você declarar aintegridade referencial relacional entre tabelas e reforçá-lasautomaticamente. Ela também deve permitir a você especificaronde você quer deletar em cascata na tabela filha e onde você queratualizar a chave primária em cascata automaticamente com atabela filha.

Falha de hardwareO banco de dados suporta replicação?Se o banco de dados suporta replicação, ele suporta replicação

síncrona, assíncrona ou ambas? A replicação síncrona atualiza obanco de dados alvo instantaneamente quando o banco de dadosfonte muda. Se a replicação síncrona é usada, o que acontece se aconexão para o banco de dados alvo se perder? Você estará impedidode realizar mudanças no banco de dados fonte? As mudanças serão

logadas e a replicação será feita quando o banco de dados alvo voltara funcionar?

A replicação assíncrona faz um log das mudanças no banco dedados fonte e então as replica para o banco de dados alvo maistarde. A desvantagem da atualização assíncrona é que o banco dedados alvo está sempre desatualizado em relação ao banco de dadosfonte por um período de tempo. A vantagem é que você não precisade uma conexão permanente entre os bancos de dados.

Observe que para banco de dados que não suportam um log detransação em separado, a replicação talvez seja a única maneira defornecer uma recuperação rápida de uma catastrófica falha dehardware.

Quais opções estão disponíveis para efetuar o backup do bancode dados?

• O backup do banco de dados pode ser feito enquanto está emuso?

• Os backups incrementais e diferenciais são suportados oudeve-se efetuar backup de todo o banco de dados? O backup diferencialguarda todas as mudanças feitas desde o último backup completo.O backup incremental guarda todas as mudanças desde o últimobackup seja de que tipo for.

• O banco de dados pode manter o arquivo log separado?• O backup do arquivo de log de transações pode ser feito

enquanto o banco de dados está online?• O arquivo de log de transações permite backups incrementais

e diferenciais?

Como você pode recuperar o banco de dados quando há falhado servidor ou do hardware?

Se o hardware tem uma falha, todas as transações que estavamativas naquele momento da falha devem ser zeradasautomaticamente quando o banco de dados reiniciar, para que obanco de dados fique em estado consistente.

Como isso é feito? Isso requer um processamento no arquivo delog de transações, então quanto tempo esta ação levará considerandoo número máximo de transações que você espera que estivessemabertas ao mesmo tempo?

Esta é uma área onde banco de dados que utilizam o método deversioning tem uma vantagem quando comparados com os modelosde travamento. Nada precisa ser mudado nestes bancos de dadosexceto o código do status para as transações que estão ativas, e estaação leva um segundo ou dois.

Qualquer versão dos registros que foram deixadas para tráspelas transações serão retornadas ao estado original, ignorados elimpos automaticamente pelo processo “garbage-collection”.

Page 27: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 27

O que acontece se você tem uma catástrofe, como uma falha dedisco? Você pode restaurar o último backup completo e repetir o logde transações para que o banco de dados volte ao estado antes dafalha? Quais são as opções se a máquina inteira ou todos os seusdiscos rígidos vierem a falhar?

Existem utilitários para corrigir o banco de dados quando eleestiver corrompido? Eles realmente funcionam?

Outras características• Existem outras questões importantes que você deve incluir na

sua checklist. Ela pode incluir o seguinte:• Você pode importar e exportar no formato XML?• Quais os outros formatos de dados que você precisa importar

e exportar rotineiramente? O banco de dados suporta isso?• Quais utilitários são fornecidos para a importação e exportação

de dados?• Existem gateways disponíveis para que outros bancos de dados

possam trocar dados com o seu banco de dados em caso denecessidade?

• Existe um driver ODBC?• Existe um driver OLE DB?• Existe um driver dbExpress?• Existe um componente nativo para a linguagem de

programação desejada?

Manutenção, segurança e custoQuando você considera o que se requer para manter um banco

de dados, faça a você mesmo as seguintes questões:

• Quais os passos que você deve fazer para deixar o banco dedados funcionando em sua máxima eficiência? Você tem quereconstruir índices, atualizar tabelas estáticas, reorganizar os dadosno disco para reduzir a fragmentação?

• Essas rotinas de manutenção podem ser automatizadas?• Estas operações podem ser realizadas enquanto o banco de

dados está ativo?• Os arquivos de dados e logs crescerão automaticamente ou é

necessária a intervenção de um DBA?• Que nível de habilidade é necessária para uma pessoa manter

o banco de dados?• Existem aplicativos de monitoração de performance para

ajudá-lo a deixar a performance do banco de dados no máximo?• Quantos parâmetros os utilitários disponibilizam para você?

Uma observação cuidadosa na manutenção e nos requerimentosde ajuste de performance ajudarão você a determinar especialmentese é necessário um administrador altamente treinado paraadministrar o banco de dados.

Por exemplo, o Oracle é conhecido por ter mais de 400 parâmetros

para se observar a performance. Obviamente isto não será umatarefa para um usuário qualquer.

O quanto ele custa?• Quanto custa a licença per-seat?• Qual o custo do contrato de suporte?• Qual o custo das atualizações?• Qual o custo do treinamento para o pessoal de desenvolvimento

e suporte?• Você precisa de um administrador especialmente treinado? A

que custo?Quais as características de segurança o seu banco de dados

possui?• A segurança do usuário é mantida a nível de servidor?• Qual a granularidade da segurança para os objetos do banco

de dados? Você pode garantir acesso a nível de tabela ? A nível decoluna?

• Regras são suportadas para tornar a administração maisfácil?

• O banco de dados suporta encriptação? O algorítimo é bom?• Você pode restringir o acesso do usuário ao metadata?• Você pode proteger os dados, metadados, stored procedures ou

triggers de acesso anônimo (incluindo do administrador) no site docliente?

• O quão dependente é a segurança do banco de dados dasegurança do sistema operacional?

A necessidade de segurança varia amplamente. Se você estáajustando um servidor de banco de dados para os seus negócios,segurança a nível de sistema operacional talvez seja suficiente paraprevenir pessoas não autorizadas de obter acesso aos arquivos debancos de dados.

Se o banco de dados está instalado em um notebook que pode serperdido ou roubado, você tem um conjunto diferente de problemas.

Se você está vendendo um produto comercial e necessita protegera propriedade intelectual de qualquer pessoa, incluindo seus clientes,você necessitará de outro conjunto de características de segurança.

Conclusão

A chave para escolher o banco de dados correto para o seuprojeto ou organização é primeiro criar uma definição de suasnecessidades.

Enquanto você não estiver exausto, estas listas quemencionamos aqui lhe darão um ponto para começar. Quando vocêestiver definindo suas necessidades, mantenha este artigo em mãospara confrontar com suas necessidades, e você terá um mecanismoextremamente útil para comparar os servidores de bancos de dados.

DELPHI

Page 28: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE28

DELPHI

UMLLinguagem de Modelagem Unificada

Diagrama de Classe – Parte IPor Marcelo Nogueira

O Diagrama de Classe descreve tipos de objetos erelacionamentos.

As Classes definem os tipos de objetos que existem dentro dosistema. As Classes podem ter atributos que são geralmentemembros de dados primitivos de objetos e operações definidoras demétodos que podem ser aplicados sobre os objetos.

A visibilidade de atributos e operações de outros objetos pode serdefinida, igualmente a suas assinaturas, incluindo tipos, valorespadrão, parâmetros, tipos de parâmetro e tipos de retorno.

Os relacionamentos de objetos entre classes evidenciam quetipos de vínculos existem entre objetos, e definem restrições sobreesses vínculos incluindo a quantidade relativa de instânciasvinculadas por uma associação.

Diagramas de classe também mostram pacotes que agrupamclasses, dependências entre classes e dependências entre pacotesque as contém.

Relacionamentos de generalização ou especialização quecorrelacionam classes em um relacionamento do tipo supertipo ousubtipo também podem ser incluídos.

Um típico modelo estático geralmente consistirá de muitosdiagramas de classe que, tomados em conjunto, definem a estruturaestática do sistema.

De forma que eles são organizados dependerá principalmenteda arquitetura do sistema.

Os conceitos e linhas neste diagrama são:

* Classeo Objetoo Classeo Classe Parametrizadao Restriçõeso Pacotes

* Relacionamentoo Associaçãoo Objeto Associativoo Agregaçãoo Composiçãoo Generalizaçãoo Dependênciao Interfaces

Alguns elementos-chave relativos a diagramas são comumenteencontrados nos diagramas UML.

Por se tratar do diagrama mais rico em exemplos, dividiremosem vários artigos para poder conceituá-los com mais conteúdo eabrangência.

Até o próximo...

Marcelo Nogueira é Analista de Sistemas,Instrutor e Desenvolvedor Delphi, na SoftWayInformática, Santos - SP.

e-mail: [email protected]

Sobre o autor

Page 29: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE 29

PERGUNTAS & RESPOSTAS

Pergunta: Estou fazendo um programa em Delphi queservirá como um instalador de CD. Necessito abrir um arquivoHTML através desta aplicação, porém tentei através do WinExece não consegui abrir este HTML. Como devo proceder?

Resposta: Para isso poderá utilizar a API ShellExecute,como mostra o simples exemplo abaixo:

implementationuses ShellApi;{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);begin ShellExecute(Handle, ‘Open’, ‘file://D:\testes\HTM\theclub_com.htm’, nil,nil,sw_shownormal);end;

Dúvida enviada por Joaquim Teixeira Netto, Niterói/RJ.

Pergunta: Estou tentando fazer um relatório com o Rave5.0 que acompanha o Delphi 7. Minha dificuldade esta em colocaruma imagem bitmap dinâmica no relatório.

O programa vai rodar em 3 recepções de hospitais diferentes.Como cada hospital tem um logotipo eu imaginei um arquivo“Logo.bmp” em cada HD e na hora que eu chamar o relatório eualimentaria o campo da imagem, mas tentei muito e nãoconsegui êxito. Vocês podem me ajudar?

Resposta: No evento OnGetRow de seu componente deconexão (RvDataSetConnection ou semelhante) poderá carregara imagem, pesquisando o componente “Bitmap” existente napágina do relatório, veja abaixo um simples exemplo:

var B: TRaveBitmap; P: TRavePage;begin P :=RvProject1.ProjMan.FindRaveComponent(‘Report1.Page1’,nil) as TRavePage; B :=RvProject1.ProjMan.FindRaveComponent(‘Bitmap1’, P)as TRaveBitmap; if B <> Nil then B.FileLink := ‘D:\Imagens\Chaves.bmp’; Connection.DoGetRow;end;

Dúvida enviada por Dirceu Alves Pereira Jr., Rio Claro/SP.

Pergunta: Tenho um sistema para emissão de boletosbancários, hoje estou procedendo da seguinte forma. O BancoReal me envia os formulários e eu emito os dados para cobrançaem uma impressora matricial. A minha pergunta é a seguintevocês têm algum modelo de emissão de boletos para impressão emimpressora Laser, sem que tenha que depender do banco parame enviar formulário.

Page 30: Revista The Club Megazine - 02/2003 · edição como criar um relatório com quebra de grupo. Na série sobre UML, Marcelo ... mostrando diversos exemplos funcionais que tornarão

MeGAZINE30

Resposta: Existe um componente que poderá facilitar estatarefa... O mesmo chama-se “Delphi-Boleto” e é freeware...Poderá obter maiores informações, bem como baixar ocomponente no site o fabricante: http://www.gbimoveis.com/genilton/.

Dúvida enviada por Luiz Rogério Lima, Itajaí/SC.

Pergunta: Estou criando uma stored procedure paratotalizar valores da tabela ITENS. Nesta tabela de itens o valordeve ser calculado dependendo da moeda. Se for moeda simboloR$ basta somar o valor, Porém se a moeda símbolo for outraqualquer será necessário descobrir a taxa desta moeda para o diade hoje e multiplicar pelo valor para obter o valor deste item eassim obter a soma de todos os valores dos itens.

A data a ser utilizada será sempre a data atual do sistema.Os problemas: O campo “NovoValor” retorna “null” quando

moeda = R$ porque não encontra na tabela de moeda. Eu precisoda soma de todos os valor de itens com esse campo “NovoValor”,porém quando um valor é retornado como “null”, atrapalha osomatório. Como resolver?

Resposta: Neste caso você poderá utilizar a função ISNULLdo SQL-Server, pois assim poderá verificar se o valor retornadodo sub-select for igual a Null, então retorna o valor do campoVALOR da tabela caixa. Veja abaixo como ficará a sua instruçãoutilizando a função ISNULL.

select valor,moeda, ISNULL(( select valor1 from taxawhere moeda= caixa.moeda anddata=(Convert(VarChar(10), GetDate(),126)+’00:00:00') ), valor ) as novovalor from caixa wherecodbl = 1091

Dúvida enviada por Celina L.S. Silva, Santos/SP.

Pergunta: Gostaria de saber como colorir a linhaselecionada inteira de um DBGrid, porém, sem alterar apropriedade Options -> dgRowSelect para True. Isso é possível?

Resposta: Isso é possível através da herança de uma novaclasse a partir da classe TCustomDBGrid, acessando alguns deseus métodos protegidos, veja abaixo:

type {acessar métodos protegidos} TFriendly=class(TCustomDBGrid);

var Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.DBGrid1DrawColumnCell(Sender:TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State:TGridDrawState);begin with TFriendly(DBGrid1) do begin if TDataLink(DataLink).ActiveRecord=Row-1 then begin with Canvas do begin Brush.Color:=clHighlight; DefaultDrawColumnCell(Rect,DataCol,Column,State); end; end; end;end;

Dúvida enviada por Paulo Emílio Del Cistia, Avaré/SP.

Pergunta: Como faço para me conectar com o banco dedados Firebird 1.5 beta 1 e o que significa o Alias do diretórioFirebird?

Resposta: Ainda não estamos trabalhando com o FB 1.5visto não ser uma versão confiável para se por em “produção” esim somente para testes e “avaliação”. A respeito de sua dúvida,agora no Firebird 1.5, existe um arquivo chamado “aliases.conf”no qual será possível definir um “apelido” para o banco de dados ereferente a este apelido o path do mesmo no Servidor. Dessaforma, para efetuar a conexão dos Clients ao Server, bastaráinformar o nome do servidor + nome do alias, não sendonecessário mais informar o path no servidor.

Dúvida enviada por Jones Kleber, Três Rios/RJ.

PERGUNTAS & RESPOSTAS

Envie-nos suas dicas para quepossamos compartilhá-las com

outros associados.