30

Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

  • Upload
    ngodien

  • View
    232

  • Download
    10

Embed Size (px)

Citation preview

Page 1: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos
Page 2: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

Revista The Club Megazine - 12/2002A utilização, reprodução, apropriação, armazenamento em

banco de dados, sob qualquer forma ou meio, de textos, fotos eoutras criações intelectuais em cada publicação da revista “TheClub” são terminantemente proibidos sem autorização escrita

dos titulares dos direitos autorais.

Copyright© The Club® 2002

Page 3: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 3

EDITORIAL

Editorial

Celso Jefferson PaganelliPresidente - The Club

Editorial ...................................................................................... 03News ......................................................................................... 04UML - Linguagem de Modelagem Unificada .......................... 05WebServices ............................................................................... 07Criando um Banco de Dados (instance) no Oracle 9i (2) ...... 14DataSnap - O Cliente COM+ - Master/Detail - Parte IIV ....... 16Tudo Sobre Domínios................................................................ 27Perguntas & Respostas .............................................................. 30

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

Marcelo Nogueira, Alexandre Magno, Anderson H.

Rodrigues, Emerson Facunte, Mario C. Bohm

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

registradas pelos seus respectivos proprietários.

Enquanto isso, aproveite a revista desde mês, onde temos váriosartigos interessantes! Iniciamos uma série sobre UML, uma linguagemde modelagem estruturada que esta se tornando um padrâo mundial nametodologia da Engenharia de Software. Temos também, um ótimoartigo sobre WebServices, pois hoje, não dá para falar em internet semfalar em WebServices...

Na série DataSnap, é demonstrado de forma bastante simples otemido Master/Detail, provando não ser tão difícil assim!

E finalizando, temos dois artigos sobre banco de dados, um sobreOracle e outro demonstrando a facilidade na utilização dos Domains noFirebird.

Aproveite!

Feliz Natal e próspero ano novo!

Page 4: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE4

Sistemas Multicamadas com Delphi -dbExpress e DataSnap

Rodrigues, Anderson HaertelISBN: 85-7502-105-2Editora: Visual Bookswww.visualbooks.com.br

Aprender sobre o Desenvolvimento de Sistemas utilizando atecnologia multicamadas é uma tarefa possível, basta umpouco de esforço e perseverança e, é claro, um bom livro paraseguir.

Este livro se propõe a ir além de apenas mostrar comoconstruir os cadastros e explicar como são usados oscomponentes. Isso, com certeza, você aprende no Help daferramenta Delphi. Esta publicação explica o conceito e tentaquebrar o paradigma do leitor que está acostumado com atecnologia Client/Server.

São explicados todos os protocolos que o DataSnap suportana versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimentono protocolo COM+.

Veremos, também, os conceitos envolvidos no uso dasferramentas de acesso a Banco de Dados que acompanham oDelphi 6.0/7.0 (dbExpress) e a explicação em detalhes do usodos componentes ClientDataSet e DataSetProvider, além dosseus conceitos.

Conheça esses componentes e os benefícios que os mesmosoferecem e aplique-os em seus projetos.

O livro inicia mostrando o que é uma aplicação Cliente/Servidor, o que é uma aplicação 3 Camadas e quais asvantagens das Aplicações 03 Camadas em relação as

Aplicações Cliente/Servidor.Também aborta o que é e quando usar as palavras/

tecnologias que vimos no dia a dia: COM, OLE , DCOM, MTS,COM+, ActiveX, MSTDC, Sockets, CORBA, ORB, Stub,Skelleton, SOAP, DSOM, Interface, Stateless, Statefull, DCE,RPC, Stack, GUID, CLSID, IID, Early Binding, Late Binding,Regra de negócios, etc.

São explicados (e exemplos de como usar) todos oscomponentes (suas propriedades, métodos e eventos) da GuiaDataSnap do Delphi 6 e do Delphi 7.

Além de ensinar detalhadamente (conceitos, implementação emacetes) o desenvolvimento de um sistema MultiCamadas emDelphi usando o Protocolo COM+ (da família DCOM), o livroensina o que é e como usar as Interfaces, a dbExpress(SQLConnection, SQLDataSet, SQLQuery, SQLStoredProc,SQLTable, SQLMonitor, SQLClientDataSet e SimpleDataSet,suas propriedades, métodos e

eventos) do Delphi 6 e Delphi 7, mostra as principais classesenvolvendo a dbExpress e ainda mostra as Interfaces envolvidasna construção da

dbExpress) estuda e mostra o que é e como usar ocomponente ClientDataSet (suas propriedades, métodos e eventose como usar e criar MyBase e XML envolvendo o componenteClientDataSet) e o componente DataSetProvider (Providing,Resolving, Transações, Regras de Negócios e suas propriedades,métodos e eventos)

O Livro se destina a usuários iniciantes, intermediários eavançados.

O Livro ainda contempla os eleitores com Cases de Sucesso nouso da tecnologia DataSnap. As cases de Sucesso são descritas/faladas por ilustres/prestigiados amigos da Comunidade DelphiNacional.

HOTShow - www.mlsoftware.com.br

Sistema de Apresentações MultimídiaAgora você pode criar e distribuir em arquivos EXE, em

poucos minutos, as mais incríveis aplicações interativasmultimídia, sem ter que gastar meses aprendendo umalinguagem de programação. HOTShow é um sistema deapresentações multimídia que possui um ambiente bastanteintuitivo e amigável. Permite combinar objetos como textos,shapes, imagens, botões, sons, músicas, animações, filmes, linkse variáveis. Você poderá construir, com qualidade, rapidez efacilidade, aplicações interativas multimídia em CD-ROM,apresentações diversas, albuns de fotografias e slide-shows,proteção de telas (screen savers), quiosques de informações,tutoriais, programas de treinamento, catálogos de produtos,cartões digitais, histórias, desenhos animados, arquivamentodigital de imagens, vídeos e documentos e projetos de apoio paraáreas de educação e RH, dentre outras utilidades. Fácil de usar,HOTShow não requer nenhuma programação! É a solução

perfeita para aplicações nos mais diversos segmentos:publicitário, marketing, fotográfico, médico, odontológico, perícia,imobiliário, organizadores de eventos, agências de modelos,artístico, decoradores e acabamentos em geral.

• Ambiente intuitivo e amigável• Apresentações interativas• Suporte aos formatos comuns de imagem: BMP, JPG,

WMF, EMF e ICO• Suporte à filmes digitais nos formatos AVI e MPEG• Adicione som e música para sua apresentação (WAVE /

MP3 / MIDI)• Assistente de Criação de Botões• Assistente de Criação de Animações• Inspetor de Ações• Assistente de Transporte• Ferramenta de Procura e Substituição• Mega clipart (apenas para versão CD-ROM), com imagens,

filmes, sons e músicasE muito mais !!!

NEWS

Page 5: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 5

As empresas cada vez mais estão voltadas àsinformações.Com isso, o volume de informações vem crescendoexageradamente e nem sempre podemos retirar vantagenscompetitivas devido à falta de uniformidade com que elas sãopostadas. O desenvolvimento de sistemas deve acompanhar a mutaçãoconstante das informações e para isso, devemos construiraplicações mais flexíveis e com menor taxa de manutenção. Para que isso ocorra, é necessário adotar uma metodologia detrabalho que se aproxime mais da realidade da empresa, queconsiga descrever seus fluxos operacionais e trâmite dos negócios,retratando de fato toda a sua concepção. É percebível por todos que os métodos de modelagemtradicionais, especificamente o modelo estruturado, tornam odesenvolvimento mais demorado, custos de manutenção maiorese em casos mais caóticos, levam o projeto a naufragar. Isso porque existe uma dificuldade enorme em extrair docliente a verdadeira necessidade da empresa e principalmente asexpectativas que estão focadas encima daquele desenvolvimento. Por este motivo, o contato humano e habilidade de entrevistaro cliente, já não é mais eficiente, necessitando de apoio de umaferramenta que possa de alguma forma, colaborarmetodicamente para que as informações venham condizer com aempresa e os requisitos que o analista de sistemas necessita parao desenvolvimento, bem como atender as necessidades do cliente eresultar em algo mais nas estratégias de negócios.

Onde entra a UML ? A UML é uma linguagem de modelagem, totalmenteorientada à objetos, que une as melhores práticas e metodologiasda Engenharia de Software. É considerada a sintaxe geral para criar um modelo lógico deum sistema.

Ela é utilizada para descrever pontos de um sistema e daforma como ele é percebido de várias visões durante a análise esua arquitetura. É uma linguagem que visa capturar conhecimento eexpressar esse conhecimento. Seu propósito é a modelagem de sistemas, documentar demaneira interativa e visual, proporcionar melhor compreensão esinergia entre o analista e o cliente envolvido no processo dedesenvolvimento.

Devemos adotar a UML? Além da sua alta e rápida adesão no mercado mundial, aquino Brasil, sempre tivemos a grande necessidade da adoção de ummodelo mais eficiente e que resultasse maior produtividade,menos erros no desenvolvimento, encurtamento dos prazos deentrega, menor custo de manutenção do software. Falando assim, parece a solução que todos esperaram poranos, mas também não é bem assim.Os resultados aparecem, sebem utilizados os recursos disponíveis e a perfeita compreensãodos conceitos da orientação à objetos que se pretendesensibilizar.Caso contrário será mais um método que tentaremosutilizar e os resultados não virão.Abandonar os atuais métodosque você utiliza pode ser catastrófico.Afinal, muitos projetosforam bem sucedidos, apesar das estatísticas serem bastanteassustadoras, quando institutos americanos respeitados,afirmam que 60% dos sistemas começados, não chegam a serfinalizados, e muito menos a serem utilizados. Desenvolvemos sistemas que enfocam demandas e requisitosde clientes.Requisitos são considerados os problemas.Os sistemas sãoconsiderados a solução.O problema e a solução ocorrem dentro deum mesmo contexto. Para ser desenvolvida uma boa solução, primeiramente deve

UMLLinguagem de Modelagem UnificadaOrientação à Objeto na Modelagem

Autor: Marcelo Nogueira

Delphi

Page 6: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE6

existir compreensão do problema.A solução deve ser entendidapara que possa ser criada e utilizada. Partindo deste princípio, a solução deve ser arquitetada, a fimde aderir às restrições de suas necessidades. Para adotarmos a solução apropriada ao problema, precisamosmodelar, organizar, e representar através de diagramas, ondepermitirão comunicação e disseminação dos conhecimentosextraídos. Que tipos de diagramas são utilizados? Na UML podemos utilizar vários diagramas para melhorcompreender a complexidade de nosso problema explorando aomáximo todo o conceito de orientação a objeto.Entre eles podemosdestacar:

• Diagramas de casos de uso• Diagramas de objeto• Diagramas de classe• Diagramas de seqüência• Diagramas de colaboração• Diagramas de estado• Diagramas de atividade• Diagramas de componentes• Diagramas de Implantação

Adotando a UML para os novos projetos, explorando eutilizando todos os seus recursos e juntamente com umaferramenta para modelar os dados é o primeiro grande passo. A ferramenta mais conhecida para a utilização da UML é daempresa Rational, e chama-se Rational Rose.A Borland,percebendo a evolução global da UML, incluiu somente na versãoEnterprise do Delphi 7, o ModelMaker, ferramenta muito similarao Rational Rose, capaz de modelar o projeto utilizando UML e jágerar código no Delphi. Utilizar metodologias de modelagem de sistemas que dealguma forma vão melhorar nosso desempenho e resultados, odesafio é grande, no entanto o objetivo, é atenuar ao máximo osdesperdícios de tempo e de recursos financeiros empregados emprojetos de sistemas. A cada artigo mensal, demonstraremos a utilização de cadadiagrama e posteriormente a sua utilização na ferramenta demodelagem UML. Acompanhe!

Marcelo Nogueira é Analista de Sistemas,Instrutor e Desenvolvedor Delphi, na SoftWayInformática, Santos - SP.e-mail: [email protected]

Sobre o autor

Delphi

Page 7: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 7

Para explicar de maneira adequada o significado datecnologia WebServices, é interessante fazer uma breveintrodução aos problemas atuais no mundo da tecnologia.

Com o grande avanço de sistemas operacionais, bancos dedados, hardware, software, enfim, todo o tipo de tecnologia queenvolve o mundo dos negócios, vêm surgindo a necessidade decompartilhamento de informações entre parceiros comerciais,governo e sociedade, e até mesmo entre departamentos de umaempresa.

Acontece que interligar diferentes plataformas, bancos dedados, operações, entre outros conceitos, é uma tarefa muitocomplicada e trabalhosa.

Para concluir o conceito de WebServices, vamos imaginar umcenário simples, onde precisamos integrar informações dediferentes departamentos e filiais, que foram desenvolvidos emplataformas diferentes. Um bom exemplo para isso, são os bancosque estão adquirindo outros bancos em todo o mundo, e queutilizam conceitos e plataformas diferentes de trabalho.

A figura 1 ilustra o Banco Facunte, adquirindo outros doisbancos com diferentes tecnologias.

WebServices

Figura 1: Banco com diferentes plataformas

Tecnologias do nosso cenário exemplo

Banco S.O. Banco Dados Terminais

Facunte Unix DB2 Terminais Linux

X NT SQL Server Windows

Y Solaris Oracle Terminais Linux

Integrar informações de diferentes plataformas não énovidade, e como já foi mencionado é possível, mas muitotrabalhoso.

A proposta da tecnologia WebServices neste cenário, é a defacilitar a troca de informações, fazendo o Banco Facunteentender e tratar as informações dos Bancos X e Y, independentedo banco de dados, sistema operacional, ou outro fator não citado.

Com algumas linhas de programação e um bomplanejamento, as informações essenciais serão interligadasfacilmente.

Meus amigos, isso é WebServices!

Em resumo, WebServices, é um padrão não-proprietário, quepossibilita o processamento distribuído em sistemas heterogêneos.

E acredito que muitos de vocês neste ponto estão ansiosospara produzir o seu primeiro WebService.

Antes, devemos conhecer os padrões que fazem parte datecnologia.

WebService Exemplo

Vamos criar nosso primeiro WebService para aprender melhorseu conceito.

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

Autor: Emerson Facunte

Delphi

Page 8: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE8

Figura 2: Nova aplicação WebService

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

Figura 3: Tipo da aplicação servidora

Em seguida o Delphi pergunta se deseja criar uma InterfaceSOAP padrão (figura 4). Em nosso exemplo, vamos criar a talInterface, a fim de conhecer sua implementação

Figura 4: Criação da Interface

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

Nos campos Service Name e Unit identifier coloque wsexemplo.

Com isso estamos criando uma Interface com o nome wsexemplo, egravando a unit com o mesmo nome.

Em Code generation selecione as opções Generate Comments eGenerate Sample Methods. Com isso estamos gerando exemplos demétodos e comentários.

Figura: 5 Identificação do serviço

Clique em OK para finalizar.

Vamos gravar nossa aplicação.

Unit WebModule un_ws1.pas

Unit Implementação WsExemplo wsexemploImpl.pas

Unit Interface WsExemplo wsexemploIntf.pas

Projeto ws1.dpr

Vamos analisar o que o nosso amigo Delphi criou.

Figura: 6 WebModule1

A figura 6 ilustra nosso WebModule com três componentes nopadrão WebService (HTTPSoapDispatcher,HTTPSoapPascalInvoker,WSDLHTMLPublish).

Vejamos sua implementação.

procedureTWebModule1.WebModule1DefaultHandlerAction(Sender:

Delphi

Page 9: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 9

TObject; Request: TWebRequest; Response: TWebResponse; varHandled: Boolean);begin WSDLHTMLPublish1.ServiceInfo(Sender, Request,Response, Handled);end;

A única função do nosso WebModule1,é a criação de um handlerpara o WebService e publicação do documento WSDL.

Na unit wsexemploIntf estamos definindo a Interface de nossaaplicação.

{Invokable interface Iwsexemplo }

unit wsexemploIntf;

interface

uses InvokeRegistry, Types, XSBuiltIns;

type

TEnumTest = (etNone, etAFew, etSome, etAlot);

TDoubleArray = array of Double;

TMyEmployee = class(TRemotable) private FLastName: AnsiString; FFirstName: AnsiString; FSalary: Double; published property LastName: AnsiString read

FLastName write FLastName; property FirstName: AnsiString read

FFirstName write FFirstName; property Salary: Double read FSalary

write FSalary; end;

{ Invokable interfaces must derive fromIInvokable }

Iwsexemplo = interface(IInvokable) [‘{A391DC0F-CDA7-4929-97B8-DAECA7C2CF18}’]

{ Methods of Invokable interface mustnot use the default }

{ calling convention; stdcall is recommended }

function echoEnum(const Value: TEnumTest):TEnumTest; stdcall;

function echoDoubleArray(const Value:TDoubleArray): TDoubleArray; stdcall;

function echoMyEmployee(const Value:TMyEmployee): TMyEmployee; stdcall;

function echoDouble(const Value: Double):Double; stdcall;

end;

implementation

initialization { Invokable interfaces must be registered } InvRegistry.RegisterInterface(TypeInfo(Iwsexemplo));

end.

Esta unit na realidade está seguindo as regras da O.O.(Orientação a Objeto), onde definimos uma Interface como base,para que possamos implementar nossas classes. Além dissoestamos registrando a Interface no modelo SOAP.

Repare que os métodos criados são apenas exemplos deimplementação, que solicitamos previamente, justamente paraestudar e analisar.

Na unit wsexemploImpl , temos a implementação da Interfaceque vimos anteriormente.

Acredito que deu pra perceber, que os métodos apenasretornam os mesmos valores informados.

Para compreender melhor, vamos fazer uma pequenaalteração no método echoDouble. Substitua a linha de retorno,pelo código que segue em negrito:

function Twsexemplo.echoDouble(const Value: Double):Double; stdcall;

begin { TODO : Implement method echoDouble } Result := Value * 3;end;

Perceba que estamos multiplicando por 3, só para quebrar ogelo (Double = Dobro)

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

Delphi

Page 10: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE10

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

Figura 7: Configuração do diretório

Grave novamente a aplicação.

Agora vamos compilar a aplicação.

Vamos executar a aplicação no browser para analisar o seuconteúdo. Lembre-se que para isso você deverá configurar umservidor web, como o Apache, IIS, Xitami, etc.

Digite: http://localhost/cgi-bin/ws1.exe/

A figura 8 ilustra o resultado da primeira fase de nossaaplicação.

Figura 8: Aplicação ws1

Repare que temos todos os métodos listados na InterfaceIwsexemplo (echoEnum, echoDoubleArray, echoMyEmployee,echoDouble).

O documento gerado está de acordo com o padrão estabelecidopelo W3C-UDDI (órgão responsável pelo padrão WebService).

Clicando no link WSDL da Interface Iwexemplo será apresentadoum documento WSDL.

Vamos analisar algumas partes do documento paracompreender melhor seu funcionamento.

- <types>- <xs:schema targetNamespace=”urn:wsexemploIntf”

xmlns=”urn:wsexemploIntf”>- <xs:simpleType name=”TEnumTest”>- <xs:restriction base=”xs:string”> <xs:enumeration value=”etNone” /> <xs:enumeration value=”etAFew” /> <xs:enumeration value=”etSome” /> <xs:enumeration value=”etAlot” /> </xs:restriction>

Passando pelo bloco das definições inicias (<?xmlversion=”1.0"...), chegamos no bloco de definições de tipos emétodos.

Neste bloco são definidos todos os métodos da nossa Interface,com o descritivo completo. Repare que a classe TEnumTest édescrita com perfeição.

No bloco que segue, são descritos os métodos Request e Responseda Interface em questão.

- <message name=”echoEnum0Request”> <part name=”Value” type=”ns1:TEnumTest” /> </message>- <message name=”echoEnum0Response”> <part name=”return” type=”ns1:TEnumTest” /> </message>

Delphi

Page 11: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 11

A seguir, temos o bloco que define o nome da porta (Port), eas operações Request e Response, descritas no bloco anterior.

- <portType name=”Iwsexemplo”>- <operation name=”echoEnum”> <input message=”tns:echoEnum0Request” /> <output message=”tns:echoEnum0Response” /> </operation>

Em seguida temos o bloco que “envelopa” e define a camada detransporte dos métodos.

- <binding name=”Iwsexemplobinding”type=”tns:Iwsexemplo”>

<soap:binding style=”rpc” transport=”http://schemas.xmlsoap.org/soap/http” />

- <operation name=”echoEnum”> <soap:operation soapAction=

”urn:wsexemploIntf-Iwsexemplo#echoEnum”style=”rpc” />

- <input message=”tns:echoEnum0Request”> <soap:body use=”encoded” encodingStyle=

”http://schemas.xmlsoap.org/soap/encoding/”namespace=”urn:wsexemploIntf-Iwsexemplo” />

</input>- <output message=”tns:echoEnum0Response”> <soap:body use=”encoded”

encodingStyle=”http://schemas.xmlsoap.org/soap/encoding/”namespace=”urn:wsexemploIntf-Iwsexemplo” />

</output>

O último bloco finaliza o documento, declarando o nome doserviço, bem como o nome da porta e a sua camada de transporte.

- <service name=”Iwsexemploservice”>- <port name=”IwsexemploPort”

binding=”tns:Iwsexemplobinding”> <soap:address location=”http://localhost/delphi/

cgi-bin/ws1.exe/soap/Iwsexemplo” /> </port> </service> </definitions>

Agora vamos criar uma aplicação cliente para testar nossoprimeiro WebService.

Através das opções File/New Application cria uma novaaplicação, e grave os arquivos como segue:

Unit un_teste_ws1.PAS

Projeto teste_ws1.DPR

Agora vamos importar a Interface em nossa aplicação. Atravésdas opções File/New.../WebServices (figura 9), selecione a opção WSDLImporter.

Figura 9: WSDL importer

Em seguida, como ilustra a figura 10 , digite endereço quesegue.

http://localhost/cgi-bin/ws1.exe/wsdl/Iwsexemplo

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

Figura: 10 Importação da Interface através do WSDL

Delphi

Page 12: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE12

Este procedimento está importando toda a Interface para anossa aplicação.

Com isso teremos acesso aos métodos definidos.

É interessante destacar que um WebService poderá terinúmeras Interfaces, onde poderemos importar apenas as quecondizem com a nossa necessidade.

Aperte o botão Next para avançar à próxima fase.

A figura 11 ilustra a Interface gerada pelo assistente.

Figura: 11 Interface gerada pelo assistente

Para concluir aperte a tecla Finish.

O assistente gerou uma Unit com toda a Interfaceimplementada.

Grave a Unit com o nome Iwsexemplo1.pas.

O que acabamos de fazer, na realidade, foi a importação deuma Interface para facilitar o uso do WebService.

Agora com o foco na unit un_teste_ws1, insira a unitIwexemplo1.pas gerada pelo assistente.

implementation uses Iwsexemplo1;

Neste ponto iremos configurar o acesso para este formulário.

Insira um objeto do tipo THTTPRIO, e configure aspropriedades que seguem, respeitando a seqüência apresentada,caso contrário, uma exceção ocorrerá.

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

Agora insira os objetos que seguem, configurando suasrespectivas propriedades.

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

Figura 12: Formulário da aplicação

Delphi

Page 13: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 13

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

var Iexemplo: Iwsexemplo;begin Iexemplo:= HR1 as Iwsexemplo; lbResultado.Caption:=FloattoStr(Iexemplo.echoDouble

(StrtoFloat(edValor.Text)));end;

O código é bastante simples, onde estamos definindo umobjeto do tipo Iwsexemplo. Em seguida estamos instanciando oobjeto a partir do nosso HTTPRio (HR1), adotando o modeloIwsexemplo. E por fim, apresentamos o resultado em nosso objetolbResultado, através da função IExemplo.echoDouble.

O mais importante até aqui, é justamente a compreensão decomo conseguimos implementar o WebService em nossa aplicação.

Vamos testar nossa aplicação.

Compile e execute a aplicação, informando um número nocampo e pressionando o botão. A figura 13 ilustra nossa aplicaçãoem tempo de execução.

Figura 13: Aplicação em tempo de execução

Perceba que a primeira vez que pressionamos o botão, existeum delay, que é justamente o tempo de conexão com o WebService.

Repita a operação, e repare que já não existe mais o delay.

Amigos isto é apenas o começo. Em meu livro Delphi 7Internet e Banco de Dados, explico através de exemplos práticostodo o poder dos WebServices. Temos WebServices utilizando banco dedados como serviço, e também conexões concorrentes utilizando oprotocolo SOAP.

Forte abraço e imenso sucesso a todos !!!

Sobre o autor

Emerson Facunte é Consultor de Tecnologia com diversoslivros publicados, especialista em desenvolvimento deaplicações e-Business utilizando a ferramenta Delphi, baseadoem WebSnap, DataSnap, BizSnap e ISAPI/Apache Modules.

Delphi

Page 14: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE14

Vamos lá então, continuar nossa instalação de uma instanceOracle !

Nesta próxima fase da instalação, teremos que definiraspectos importantes de nossa instalação. (ver figura 1)

Um primeiro aspecto é a maneira como a instance irá trataro gerenciamento de memória, principalmente para a SGA(System Global Área), uma alocação de memória ondepraticamente todas as tarefas do banco são executadas.

A partir do Oracle 9i essa configuração, que antes eraobrigatoriamente manual através de parâmetros configurados noinit.ora, pode ser definida como automática, bastando para issovocê escolher a opção “Típico” e definir qual percentual damemória do servidor irá ser disponibilizada para o Oracle.

É importante considerar que nem toda memória pode serdisponibilizada, mesmo que no servidor rode apenas o banco dedados (o que é altamente recomendável), pois existem processosimportantes do sistema operacional que precisam serconsiderados.

Se você precisar instalar outras funcionalidades corporativas,como servidor de Internet, servidor de email, firewall, servidor deanti-vírus, etc, tenha em mente prioritariamente utilizarservidores separados para cada função, em grau a ser definidosegundo o porte da empresa e das aplicações que irão rodar. Oimportante é que no servidor Oracle não tenhamos maisaplicações rodando! Se a sua empresa tiver uma base muitopequena, talvez você consiga obter resultados satisfatórios com“tudo instalado no mesmo servidor”.

É importante ainda ressaltar que esse conceito não valeapenas para Oracle, mas para qualquer banco de dadosrelacional competente (Oracle, SQL Server, Sybase, Informix)

que for utilizado.

Recomendamos, para instalações típicas, utilizar 70% damemória disponível no servidor.

Com essa opção pelo gerenciamento automático, a própriainstance “resolverá” necessidades de alocação parashared_pool_size, db_block_buffers, etc, limitada obviamente àquantidade física de memória. O desempenho da instance sobeconsideravelmente com a opção pelo gerenciamento automáticode memória.

A partir do 9i você pode utilizar até 4GB de RAM paraambientes Windows. (ver figura 2)

Uma outra definição importante se refere ao conjunto decaracteres que você vai utilizar na instance. Prefira, para oBrasil, o conjunto WE8ISO8859P1, que oferece totalcompatibilidade com instalações típicas de versões anteriores ecom conjunto de caracteres “asc ii”, que contém acentuação,cedilha, etc...(ver figura 3)

Para o parâmetro sort_área_size, chamado dimensionamentopara área de classificação, o número padrão de 524288 bytes éuma excelente escolha para a maioria das instalações.

Vale lembrar que essa alocação não faz parte da SGA, e serámultiplicada pelo número de usuários conectados à instance, istoé, para cada conexão neste caso a instance reservará 524288bytes.

Esse parâmetro, que define o quanto de memória cada sessãoterá disponível para efetivar tarefas como “sort”, é fundamentalpara o desempenho. Alocações baixas serão sentidassensivelmente pelos usuários. (ver figura 4)

Em localização dos arquivos, defina sempre como necessáriaa criação de arquivo de parâmetros (SPFILE), que é uma

Criando um banco de dados (instance)no Oracle 9i... (Parte 2)

Autor: Mário Camilo Bohm - Bohm,Interal

Delphi

Page 15: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 15

Figura 4

Figura 5

Figura 1

Figura 2

Figura 3

evolução do init.ora, do qual falaremos no futuro. Com essaopção, o init.ora perde muito de sua importância e, o que émelhor, para praticamente todos os parâmetros de inicializaçãonão será mais necessário re-iniciar a instance em casos dealteração. Em outras palavras, você modifica os parâmetros dainstance sem tirar a instance do ar !

Aliás um comentário: esse recurso é fundamental num bancode dados, já veio tarde ! (ver figura 5)

A última definição desta fase da instalação diz respeito aoarquivamento automático, para backups “a quente”.

Na instalação, não defina esta opção, porque vamos falar delafuturamente e porque você pode fazê-lo a qualquer momentodepois de criada a instance.

Bem, continuamos na próxima. Feliz Natal a todos !!!

E um bom 2003, 2004, 2005, 2006...

Sobre o autor

Mário Camilo Bohm - Bohm,InteralFone (011) [email protected]://www.bohminteral.com.br

Delphi

Page 16: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE16

IntroduçãoNo artigo anterior vimos como funciona o SharedConnection

e criamos nossa aplicação COM+ com manutenção a base dedados simplificada, uma tabela e uma nova regra de negócios, oAutoIncremento.

Nesse artigo, reforço de forma reduzida a criação de um RDMcom ligação ao nosso RDM de Conexão e criaremos um exemplocom atualizações e manutenções Master-Detail.

Mãos a Obra. Vamos abrir o Delphi!

RDM Master/Detail - SharedConnection.Vamos abrir o BPG (Borland Package Group - Project

Manager) que se encontra no diretório C:\DataSnap e escolhernosso servidor de aplicação como o projeto de trabalho. Vamosagora em: File|New|Other|MultiTier| Transaction DataModule e indicar os seguintesparâmetros e escolher asseguintes opções:

CoClass = RDMParceiros,Threading Model=Both eTransaction Model=Requiresa new transaction, temosnovamente um RDM novinhoem folha na nossa frente.Vamos salvar o mesmo com onome deRDMCadParceiros.pas, nodiretório do Servidor:C:\DataSnap\Servidor. NoRDM, vamos mudar aPropriedade Pooled=True.

Devemos colocar 04 (Quatro) SQLDataSets (Guia

dbExpress), 03 DataSources (Guia Data Access) e 01 (Um)DataSetProvider (Guia Data Access). O 1o SQLDataSet devemoscolocar o name = SQLDtStTAB_PARCEIROS, o 2o o name deve ser= SQLDtStTAB_PARCEIROS_CONT, o 3o igual a:SQLDtStTAB_PARCEIROS_REFER_B e o 4 igual a:SQLDtStTAB_PARCEIROS_REFER_C. O 1o DataSource apropriedade name deve ser = DtSrcTAB_PARCEIROS_CONT, o 2o

deve ser = DtSrcTAB_PARCEIROS_REFER_C e o 3o deve ser =DtSrcTAB_PARCEIROS_REFER_B. O name do DataSetProviderdeve ser = DtStPrvdrParceiros.

Já que estamos com o DataSetProvider selecionado, devemosalterar as seguintes propriedades:UpdateMode = upWhereKeyOnly , DataSet =SQLDtStTAB_PARCEIROS, Options = [poCascadeDeletes,poPropogateChanges,poAllowCommandText], devemos ter aseguinte tela, Figura (1):

DataSnapParte VII - O Cliente COM+ - Master/Detail

Autor: Anderson Haertel Rodrigues

Delphi

Figura 1: O Object Inspector com os parâmetros doDataSetProvider.

Page 17: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 17

Delphi

Antes de prosseguirmos, necessitamos ligar (unir) doisRDM´s. ALT+F11 e devemos escolher: RDMConexao. Salve Tudo!

A opção diferenciada de Options do DataSetProvider é:poCascadeDeletes, onde, se o Servidor de Banco de Dados queusamos der suporte a deleção em Cascata, a mesma seráexecutada. Para o nosso exemplo, implementamos a deleção emCascata através das seguintes declarações:

ALTER TABLE TAB_PARCEIROS_CONT ADDCONSTRAINT FK_1014_1013 FOREIGN KEY (ID_PARC)REFERENCES TAB_PARCEIROS (ID_PARC) ON DELETECASCADE;

ALTER TABLE TAB_PARCEIROS_REFER ADDCONSTRAINT FK_1015_1013 FOREIGN KEY (ID_PARC)REFERENCES TAB_PARCEIROS (ID_PARC) ON DELETECASCADE;

Iremos fazer o teste de deleção em cascata quando iniciarmosos nossos testes de manutenção na Tabela Master/Detail.

Com a união (uses) dos dois RDMs podemos enxergar oSQLConnection que se encontra no RDMConexao, e ligar apropriedade SQLConnection de todos os SQLDataSet´s igual a:Server_COMPlus.SQLCnctnBASE. Ok.

Vamos selecionar os trêsDataSources e colocar a propriedadeDataSet=SQLDtStTAB_PARCEIROS.

Vamos selecionar oSQLDtStTAB_PARCEIROS, apropriedade CommandText deve ser aseguinte:

SELECT CNPJ,ID_PARC,INSC_EST,NOME FROMTAB_PARCEIROS, (Duplo Click napropriedade para abrir o CommandTextEditor), Figura (2).

Figura 2 (ao lado): A PropriedadeCommandText deSQLDtStTAB_PARCEIROS.

Vamos selecionar o SQLDtStTAB_PARCEIROS_CONT, a propriedade

CommandText deve ser aseguinte:

SELECTEMAIL_CONTATO, ID,ID_PARC,NOME_CONTATO,TEL_CONTATO FROMTAB_PARCEIROS_CONTWHERE ID_PARC =:ID_PARC, Figura (3):

Figura 3 (ao lado): APropriedadeCommandText deSQLDtStTAB_PARCEIROS_CONT.

Page 18: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE18

Vamos selecionar o SQLDtStTAB_PARCEIROS_REFER_C, apropriedade CommandText deve ser a seguinte: SELECTBCO_AGENCIA, BCO_CHEQUE_ESP,BCO_DT_ABERT_CONTA, COM_DT_ULT_COMPRA,COM_DT_VCTO_ULT_PARC, COM_VL_PRESTACAO,COM_VL_TT_COMPRA, ID, ID_PARC, NOME_REF, TP_REFFROM TAB_PARCEIROS_REFER WHERE ID_PARC =:ID_PARC AND TP_REF = ‘C’, Figura (4):

Figura 4: A Propriedade CommandText de SQLDtStTAB_PARCEIROS_REFER_C.

Vamos selecionar o SQLDtStTAB_PARCEIROS_REFER_B, apropriedade CommandText deve ser a seguinte: SELECTBCO_AGENCIA, BCO_CHEQUE_ESP,BCO_DT_ABERT_CONTA, COM_DT_ULT_COMPRA,COM_DT_VCTO_ULT_PARC, COM_VL_PRESTACAO,COM_VL_TT_COMPRA, ID, ID_PARC, NOME_REF, TP_REFFROM TAB_PARCEIROS_REFER WHERE ID_PARC =:ID_PARC AND TP_REF = ‘B’, Figura (5):

Figura 5: A Propriedade CommandText de SQLDtStTAB_PARCEIROS_REFER_B.

Delphi

Page 19: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 19

Nos falta ligarmos os DataSources aos seus respectivosSQLDataSets para criarmos os relacionamentos. O ComponenteSQLDtStTAB_PARCEIROS_CONT deve ter sua propriedadeDataSource igual a: DtSrcTAB_PARCEIROS_CONT, oComponente SQLDtStTAB_PARCEIROS_REFER_C deve ter suapropriedade DataSource igual a:DtSrcTAB_PARCEIROS_REFER_C e o ComponenteSQLDtStTAB_PARCEIROS_REFER_B deve ter sua propriedadeDataSource igual a: DtSrcTAB_PARCEIROS_REFER_B. Agora,temos o relacionamento completo.

O RDM que acabamos de criar deve o seguinte Layout,Figura (6):

O RDM que acabamos de criar está pronto (nos falta umaregra que escreveremos mais adiante para a manutenção corretados registros Master/Detail).

Devemos Salvar tudo!

Devemos abrir o nosso RDMConexao, ALT+F11 e devemosescolher: RDMCadParceiros.

Vamos agora, fazer a ligação das Interfaces de RDMParceiroscom o RDMConexao e vice-versa, através da Type Library (TLB).View|Type Library, devemos ter a seguinte TLB inicial, Figura(7):

Figura 6: O Remote DataModule RDMCadParceiros.pas -RDMParceiros.

Figura 7: AType Libraryatual.

Delphi

Page 20: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE20

Devemos criar uma nova Interface com o name de:IChildCadParceiros, vamos criar duas propriedades, uma Read-Only e outra Write-Only, com o name de: RDMCadParceiros, apropriedade Read-Only deve ter o seu Type igual a:IServer_COMPlus*, ficando igual a: struct tag IServer_COMPlus*. IChildCadParceiros deve ter seu Parent Interface igual a:IAppServer. A Interface IRDMParceiros deve ter o seu ParentInterface igual a: IChildCadParceiros.

Vamos agora criar uma nova propriedade Read-Only naInterface IServer_COMPlus, com o name igual a:RDMCadParceiros, seu Type deve ser igual a: IRDMParceiros*,ficando igual a: struct tag IRDMParceiros *. Antes de fecharmosa Type Library, vamos escolher todas as CoClass ( ), ir até aGuia COM+, colocar os seguintes valores e parâmetros: MarcarObject Pooling, Creation Timeout=10000, CallSyncronatization=Required e Transaction Model=Requires anew transaction, devendo todas as CoClass ficarem com osseguintes parâmetros, Figura (8):

Figura 8: Mostrando como deve ficar os parâmetros de todas as CoClass.

RDMCadParceiros tem uma nova function e uma novaprocedure.

Antes vamos criar a variável: FIServer_COMPlus:IServer_COMPlus, na seção private.

A function Get_RDMCadParceiros: IServer_COMPlus;safecall; deve ter a seguinte codificação: Result :=FIServer_COMPlus, é claro entre o begin e end;, a procedureSet_RDMCadParceiros(const Value: IServer_COMPlus); safecall; ,deve ter a seguinte codificação: FIServer_COMPlus := Value; , aseção initialization, deve-se ter o seguinte código:RDMCadParceirosFactory :=TComponentFactory.Create(ComServer,TRDMParceiros,Class_RDMParceiros, ciMultiInstance,tmBoth);. Em RDMConexao devemos ter o seguinte código nafunction Get_RDMCadParceiros: IRDMParceiros; safecall;

Result := RDMCadParceirosFactory.CreateCOMObject(nil)as IRDMParceiros;

Delphi

Page 21: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 21

Result.RDMCadParceiros := Self;

Para quem perdeu a Parte VI, eu expliquei detalhadamentecomo se trabalha com SharedConnection. Aqui, como citado naintrodução, foi apenas um pequeno exemplo de como fazer paraos dois RDM´s (Objetos COM) se conversarem. Após isso tudo,salve e vá até o menu: Run|Register ActiveX Server , dessaforma registramos as alterações na nossa DLL COM+. Clique emOk.

Cliente COM+

CTRL+ALT+F11 e vamos escolher o projetoClienteCOMPlus.exe para trabalharmos.

Necessitamos criar o nosso Formulário para dar manutençãono nosso Cadastro Master/Detail.

Vou nesse momento explicar a intenção do cadastro deParceiros. Temos a tabela principal TAB_PARCEIROS, a tabelade Contatos do Parceiro - TAB_PARCEIROS_CONT, a tabela deReferências Comerciais e Bancárias na tabelaTAB_PARCEIROS_REFER, o que diferencia cada referência umada outra é a coluna: TP_REF. Por isso se você olhar, existe umTP_REF = ‘?’ no CommandText da tabelaTAB_PARCEIROS_REFER. Ok, agora que já expliquei aestrutura do nosso exemplo, vamos passar a parte de montagemdo formulário.

Você verá que, o Delphi trata quase tudo internamente paranós, não necessitamos de quase nenhuma linha de programaçãopara montar o nosso Master/Detail.

E afirmo que você pode confiar no mecanismo do Delphi paratal tarefa, até o momento não tive problemas com essa estrutura,e já criei alguns Master´s/Detail´s dentro do meu sistema.

Mãos a Obra!

Vamos criar um novo FORM no Delphi. Já vamos salvar omesmo com o seguinte nome: uFrmParceiros.pas no diretório doprojeto Cliente, isto é, em: C:\DataSnap\Cliente.

O name do nosso Formulário deve ser igual: FrmParceiros, eseu Caption igual a: Cadastro de Parceiros. Já temos o nossoFORM pronto para colocarmos os componentes necessários paracriarmos o nosso cadastro Master/Detail. ALT+F11 e devemosescolher: uDMConexao, Salve Tudo ( )!

Vamos colocar os seguintes componentes no formulário:

01 (Um) DBNavigator - Align=alBottom;01 (Um) PageControl - (Guia Win32), seu name deve ser

igual a: PgCntrlParceiros, coloque a sua propriedade Align iguala: alClient. Logo após vamos criar duas TabSheets, clique com obotão direito do Mouse no PageControl e escolha New Page duasvezes. TabSheet1 o seu name deve ser igual: TbShtFormulario eseu Caption igual a: Formulario, TabSheet2 o seu name deve serigual a: TbShtCont_Refer e seu Caption igual a: Contatos eReferências. Pronto, temos o básico do FORM pronto.

Necessitamos agora, colocar os componentes de acesso aoServidor de Aplicação e os Data-awares para manutenção dosdados.

04 (Quatro) ClientDataSet´s (Guia Data Access);04 (Quatro) DataSource´s (Guia Data Access);01 (Um) ConnectionBroker (Guia DataSnap);01 (Um) SharedConnection (Guia DataSnap);

Na Guia Formulário do PageControl:02 (Dois) Buttons;

Na Guia Contatos e Referências:03 (Três) DBGrids;

Antes de iniciar os testes, devemos fazer as seguintesligações, até para que possamos utilizar os TFields da TabelaPrincipal e deixar o mesmo criar para nós os Data-Awares.

A propriedade Name do SharedConnection deve ser igual a:ShrdCnctnParceiros, e seu ChildName igual a:RDMCadParceiros.

Se a mesma não aparecer na lista, reveja as ligações feitas naType Library, ParentConnection deve ser igual a:DMConexao.DCOMCnctnConexao.

A propriedade Name do ConnectionBroker deve ser igual a:CnctnBrkrParceiros, Connection deve ser igual a:ShrdCnctnParceiros (O SharedConnection que se encontra noFormulário).

A propriedade Name do ClientDataSet1 deve ser igual a:ClntDtStTAB_PARC, ConnectionBroker deve ser igual a:CnctnBrkrParceiros (O ConnectionBroker que se encontra noFormulário) e ProviderName deve ser igual a:DtStPrvdrParceiros, o mesmo deve aparecer na lista se todas asligações feitas na Type Library estão corretas.

Duplo click para editar os TFields, e peça para incluir todos oscampos, após isso devemos ter a seguinte Figura (9):

Delphi

Page 22: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE22

Figura 9: TFields de ClntDtStTAB_PARC.

As três últimas colunas são colunas DataSetFields. Asmesmas não existem na Base de Dados, mas, fazem parte doesquema de Ligação Master/Detail do Delphi.

DataSetField não é um conceito novo, já existia antes dachegada da dbExpress, mas, está se tornando quase queobrigatório o uso do mesmo.

Quando criamos um relacionamento em DataSet´s noServidor de Aplicação e exportamos o DataSet através doDataSetProvider, o Delphi cria este novo tipo de Coluna, parafacilitar a nossa vida.

Esta nova Coluna é criada no DataSet Master e representatodas as linhas do Detalhe para apenas uma linha do Master.

É através dos DataSetFields que ligaremos osClientDataSet´s que se encontram no Formulário.

Para colocarmos os DBEdits, devemos executar um DuploClick no ClientDataSet- ClntDtStTAB_PARC e arrastar osTFields criados, mas, deixaremos de fora as ColunasDataSetField.

DataSource1 deve ter o seu name alterado para:

DtSrcTAB_PARC e seu DataSet ligado a: ClntDtStTAB_PARC.

ClientDataSet2 deve ter seu name igual a:ClntDtStTAB_PARC_CONT e, seu DataSetField igual a:ClntDtStTAB_PARCSQLDtStTAB_PARCEIROS_CONT.

DataSource2 deve ter o seu name alterado para:DtSrcTAB_PARC_CONT e seu DataSet ligado a:ClntDtStTAB_PARC_CONT.

ClientDataSet3 deve ter seu name igual a:ClntDtStTAB_PARC_REF_C e, seu DataSetField igual a:ClntDtStTAB_PARCSQLDtStTAB_PARCEIROS_REFER_C.

DataSource3 deve ter o seu name alterado para:DtSrcTAB_PARC_REFER_C e seu DataSet ligado a:ClntDtStTAB_PARC_REF_C.

ClientDataSet4 deve ter seu name igual a:ClntDtStTAB_PARC_REF_B e, seu DataSetField igual a:ClntDtStTAB_PARC_REF_B.

DataSource4 deve ter o seu name alterado para:DtSrcTAB_PARC_REFER_B e seu DataSet ligado a:ClntDtStTAB_PARC_REF_B.

Com as ligações feitas acima, ligamos o Master ao seusDetails.

Devemos apenas ligar os Grids aos seus respectivosDataSources:

DBGrid1 seu name= DBGrdTAB_PARC_CONT e seuDataSource= DtSrcTAB_PARC_CONT - DBGrid2 seu name=DBGrdTAB_PARC_REFER_C e seu DataSource=DtSrcTAB_PARC_REFER_C - DBGrid3 seu name=DBGrdTAB_PARC_REFER_B e seu DataSource=DtSrcTAB_PARC_REFER_B.

Também vamos colocar o name do DBNavigator1=DBNvgtrTAB_PARC e seu DataSource= DtSrcTAB_PARC.

E por último, ligar os DBEdits ao DataSource:DtSrcTAB_PARC e ligar os mesmos as suas respectivas colunas.

Após tudo isso, nos falta apenas modificar os names dosButtons:

Button1 = BtnAtualizar;Button2 = BtnCancelar;

Devemos ter a seguinte tela, Figura (10) e Figura (11):

Delphi

Page 23: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 23

Figura 10: A Guia Formulário - Layout Sugerido.

Figura 11: A Guia Contatos e Referências - Layout Sugerido.

Figura 10: A Guia Formulário - Layout Sugerido.

Delphi

Page 24: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE24

Vamos implementar nesse momento a unit. No eventoOnCreate() do Formulário, devemos ter o seguinte código,Listagem 1:

procedure TFrmParceiros.FormCreate(Sender: TObject);begin ClntDtStTAB_PARC.Open;end;

Listagem 1: O Evento OnCreate() do Form e a aberturada Tabela.

O Evento OnClose() deve ter o seguinte código, Listagem 2:

procedure TFrmParceiros.FormClose(Sender: TObject;var Action: TCloseAction);begin ClntDtStTAB_PARC.Close; Action := caFree;

end;

Listagem 2: O Evento OnClose() do Form, o fechamento databela e a liberação dos recursos utilizados pelo formulário.

O Evento OnDestroy() deve ter o seguinte código, Listagem 3:

procedure TFrmParceiros.FormDestroy(Sender:TObject);begin FrmParceiros := nil;end;

Listagem 3: Indicando a referência do formulário paranil.

Devemos ter o seguinte código para o botão - Atualizar -Enviar para o Servidor, Listagem 4:

procedure TFrmParceiros.BtnAtualizarClick(Sender: TObject);

begin ClntDtStTAB_PARC.ApplyUpdates(0);end;

Listagem 4: O método responsável por enviar o Delta para oServidor de Aplicação.

Devemos ter o seguinte código para o botão - Desfazer DadosLocais, Listagem 5:

procedure TFrmParceiros.BtnCancelarClick(Sender: TObject);

begin if ClntDtStTAB_PARC.ChangeCount > 0 then ClntDtStTAB_PARC.CancelUpdates;end;

Listagem 5: O método responsável por desfazer as alteraçõeslocais.

A Listagem 5 mostra o método que cancela as alteraçõeslocais. É necessário apenas uma chamada a CancelUpdates paraque todas as alterações, inclusive as dos Detalhes sejam desfeitas.Se quisermos desfazer apenas as alterações de um determinadoDetalhe, devemos ter o mesmo método ligado ao ClientDataSetem específico.

Agora precisamos definir as “quatros linhas” que “auxiliam”o Delphi na tarefa de gravação.

No Evento BeforePost() do ClntDtStTAB_PARC, devemos tero seguinte código, Listagem 6:

procedure TFrmParceiros.ClntDtStTAB_PARCBeforePost(DataSet: TDataSet);

begin if DataSet.FieldByName(‘ID_PARC’).IsNull then DataSet.FieldByName(‘ID_PARC’).AsInteger := 0;end;

Listagem 6: A “Ajuda” para o Delphi gravar sem erros aatualização Local.

A ajuda na gravação dos dados no Delta. O por que dessaajuda eu expliquei na Parte VI.

Da mesma forma, devemos proceder para os outros trêsClientDataSets. Como eu utilizei o mesmo nome de Coluna paraa Chave Primária (como sempre faço, PK tem o nome da colunasempre de “ID”, salvo alguns casos, onde necessito de Master/Detail), posso implementar apenas um evento para os trêsClientDataSets. No Evento BeforePost() doClntDtStTAB_PARC_CONT devemos ter o seguinte código,Listagem 7:

procedureTFrmParceiros.ClntDtStTAB_PARC_CONTBeforePost

(DataSet: TDataSet);begin if DataSet.FieldByName(‘ID’).IsNull then

Delphi

Page 25: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 25

DataSet.FieldByName(‘ID’).AsInteger := 0;end;

Listagem 7: Novamente a “Ajuda” para o Delphi gravar semerros a atualização Local, neste caso, para os Detalhes.

Agora devemos ligar o evento BeforePost() deClntDtStTAB_PARC_REF_C e ClntDtStTAB_PARC_REF_B,para o mesmo evento de ClntDtStTAB_PARC_CONT.

É necessário apenas uma chamada do ApplyUpdates() paraas tabelas envolvidas em Master/Detail e ligadas através deDataSetFields.

Server COM+Mais uma vez o vai e volta de “lados”. Necessitamos apenas

programar o evento BeforeUpdateRecord do DataSetProvider quese encontra em: RDMParceiros, Listagem 8:

procedureTRDMParceiros.DtStPrvdrParceirosBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS:TCustomClientDataSet; UpdateKind: TUpdateKind; varApplied: Boolean);

begin if UpdateKind = ukInsert then

begin if SourceDS = SQLDtStTAB_PARCEIROS then

begin DeltaDS.FieldByName(‘ID_PARC’).NewValue := FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS’,’ID_PARC’); end else if SourceDS = SQLDtStTAB_PARCEIROS_CONTthen

begin DeltaDS.FieldByName(‘ID_PARC’).NewValue := DeltaDS.DataSetField.DataSet.FieldByName(‘ID_PARC’).AsInteger; DeltaDS.FieldByName(‘ID’).NewValue := FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS_CONT’,’ID’); end else if SourceDS = SQLDtStTAB_PARCEIROS_REFER_Cthen

begin DeltaDS.FieldByName(‘ID_PARC’).NewValue := DeltaDS.DataSetField.DataSet.FieldByName(‘ID_PARC’).AsInteger;

DeltaDS.FieldByName(‘ID’).NewValue := FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS_REFER’,’ID’); DeltaDS.FieldByName(‘TP_REF’).NewValue := ‘C’ end else if SourceDS = SQLDtStTAB_PARCEIROS_REFER_Bthen

begin DeltaDS.FieldByName(‘ID_PARC’).NewValue := DeltaDS.DataSetField.DataSet.FieldByName(‘ID_PARC’).AsInteger; DeltaDS.FieldByName(‘ID’).NewValue := FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS_REFER’,’ID’); DeltaDS.FieldByName(‘TP_REF’).NewValue := ‘B’; end; end;end;

Listagem 8: A regra de negócios Master/Detail.

Vamos analisar a regra:

Estamos verificando apenas se é Inclusão (if UpdateKind =ukInsert then), após verificamos qual tabela está sendoatualizada (if SourceDS = SQLDtStTAB_PARCEIROS then... edemais else ifs...), se for SQLDtStTAB_PARCEIROS, geramos oAutoIncremento() para a coluna ID_PARC

( DeltaDS.FieldByName(‘ID_PARC’).NewValue :=FIServer_COMPlus.AutoIncremento(‘TAB_PARCEIROS’,’ID_PARC’);), se for SQLDtStTAB_PARCEIROS_CONT, passamos a colunaID_PARC o relacionamento e criamos o AutoIncremento() para acoluna ID, fizemos a mesma coisa para as tabelasSQLDtStTAB_PARCEIROS_REFER_C eSQLDtStTAB_PARCEIROS_REFER_B, apenas com a diferençade passarmos o tipo de referência:(DeltaDS.FieldByName(‘TP_REF’).NewValue := ‘C’ e ouDeltaDS.FieldByName(‘TP_REF’).NewValue := ‘B’ ), para suasrespectivas tabelas.

Salve Tudo e registre a DLL!

Agora, nos resta apenas testar o exemplo Master/ Detail quecriamos.

Fiz questão de usar colunas e situações que usamos no dia-a-dia, para, uma melhor compreensão e visualização de comofunciona e como é fácil de criarmos Master/Detail.

A forma que exemplifiquei para a criação de Master/Detail,não funciona apenas para 3 Camadas, pode ser usada emCliente/Servidor e não funciona apenas para a dbExpress,também pode ser usada com a BDE, IBX, etc.

Delphi

Page 26: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE26

Figura 12: O Esquema de Camadas em aplicações COM+.

Anderson Haertel RodriguesConsultor em desenvolvimento de SistemasClient/Server- MultiCamadas/DataSnap.Oferece treinamentos para empresas em: InterBase,SQL-Server, Delphi e [email protected] [email protected]ópolis - Santa Catarina - Brasil.

Sobre o autor

ConclusãoNeste artigo implementamos o “temido” Master/Detail em

aplicações 3 Camadas. Vimos que não é um bicho de sete cabeçascomo pensávamos. Criamos também a regra de negócios para aatualização correta das tabelas envolvidas no Master/Detail.

No Próximo artigo (Parte final), veremos como distribuirnossos aplicativos usando COM+.

Usaremos para a distribuição a independência total delocalização!

Qualquer dúvida que surja estou a disposição. Também estoua disposição para troca de idéias.

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

Teste todas as opções do Lado Cliente, inclusive a Exclusãoem Cascata.

Veremos agora, uma figura que representa o Cliente, oDataSnap(MIDAS) e COM+, Figura (12):

Delphi

Page 27: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 27

O que são domínios?

Um domínio é um template de definições de colunas. Quandovocê define uma tabela, você pode especificar o tipo de dado, valor“default”, character set, null constraints e check constraints paracada coluna individualmente, ou você pode informar que estacoluna deve ser definida por um domínio previamente criado comtodas as informações necessárias. Domínios são usualmentedefinidos antes da criação das tabelas, para que você possautilizá-los na definição destas tabelas.

Use domínio para tipos de colunas que estejam presentes emvárias tabelas do seu banco de dados para tornar fácil apassagem de parâmetros para estas colunas. Por exemplo, emum sistema comercial, você deve definir um domínio “CEP” queserá utilizado nos seguintes lugares:

• CEP do Cliente;• CEP do Fabricante;• CEP da Filial;• CEP do Vendedor;• entre outras...

A instrução CREATE DOMAINUse esta instrução para criar um novo domínio. Sua sintaxe

básica é a seguinte:

CREATE DOMAIN domain_name AS datatype;

Veja no Capítulo 5 do manual Data Definition Guide a sintaxecompleta da instrução CREATE DOMAIN.

O nome do domínio deve ser único em todo o banco de dados eo tipo de dado deve ser um dos que foram vistos na seçãoanterior. Por exemplo:

CREATE DOMAIN Cidade AS VARCHAR(15);Em adicional, você pode especificar as seguintes opções –

nesta ordem – na parte de definição do domínio:

• O parâmetro DEFAULT

O parâmetro DEFAULT especifica um valor “padrão” paraser usado se nenhum valor for aplicado. O valor “padrão”somente é aplicado quando o registro é inserido pela primeira vezno banco de dados, se você depois remover o valor original, oDEFAULT não será inserido. A sintaxe da opção default é:

nome_col DEFAULT [valor_default | NULL | USER]

Colocando USER como valor “default” o Firebird adicionará onome do usuário que está conectado em cada nova inserção.

DEFAULT geralmente é utilizado nas seguintes situações:

• Para colunas caractere, você pode precisar indicar um valor“default” explicitamente, ou use NULL para especificar um valornulo, ou use USER para especificar o valor do USER NAME

Tudo Sobre DomíniosAutor: Alexandre Magno

Coluna do Alexandre Magno

Page 28: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE28

corrente.• Para colunas numéricas, você pode precisar indicar um

valor “default” explicitamente, ou use NULL para especificar umvalor nulo.

• Para colunas data, você pode precisar indicar um valor“default” explicitamente, ou utilizar uma das seguintes palavrasreservadas: YESTERDAY, TODAY, NOW, TOMORROW, ouNULL.

• Default não é válido para colunas BLOB.

A seguir alguns exemplos de criação de domínios:CREATE DOMAIN UltimoAtualizador AS VARCHAR(31)

DEFAULT USER;

CREATE DOMAIN DataCadastro AS DATEDEFAULT ‘Today’;

CREATE DOMAIN Desconto AS SMALLINTDEFAULT 0;

CREATE DOMAIN NumCartaoCredito AS CHAR(19)DEFAULT NULL;

Quando você usa um domínio na definição de uma tabela, ovalor DEFAULT pode ser sobrescrito por uma nova condição.

• O parâmetro NOT NULL

Este parâmetro força que um valor seja armazenado nacoluna. Ele é muito similar à opção REQUIRED encontrada emalguns bancos de dados de PC, como o Paradox.

O parâmetro NOT NULL é testado sempre que o registro égravado no banco de dados, e também nas operações de inserçãoe atualização.

Não use ambos DEFAULT NULL e NOT NULL na mesmadefinição de domínio.

• A restrição CHECK

CHECK testa o valor inserido dentro da coluna definida pelodomínio para verificar se este valor satisfaz as condições daexpressão. Para definições de domínio, restrições CHECK sãolimitadas à comparação com um valor ou uma lista de valores, esomente uma restrição CHECK é permitida. Quando você define

uma coluna diretamente na tabela, a restrição CHECK possuiopções adicionais. A sintaxe para a restrição CHECK emdefinições de domínio é:

CHECK(VALUE expression)

Na definição CHECK, a palavra reservada VALUErepresenta o valor da coluna definida neste domínio.

A tabela a seguir mostra os operadores suportados peloFirebird para trabalharem juntamente com o parâmetroVALUE, tabela abaixo.

Expressão Descrição

= value Igual a

< value Menor que

> value Maior que

<= value Menor ou igual a

>= value Maior ou igual a

!< value Não menor que

!> value Não maior que

<> value Diferente de

!= value Não igual a

BETWEEN value AND value Entre a faixa de valores passada

LIKE value Use '%' para 0 ou mais caracteresUse '_' para 1 único caractere

IN (value,value,...value) Um dos elementos da lista

IS NULL Testa se o valor é nulo(ausênciado valor)

IS NOT NULL Testa se o valor é não nulo

CONTAINING value Procura em string case insensitive

STARTING WITH value Procura em string case sensitive

Coluna do Alexandre Magno

Page 29: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE 29

Por exemplo:

CHECK(VALUE <= 5)CHECK(VALUE BETWEEN 0 and 10)CHECK(VALUE STARTING WITH ‘(091)’)CHECK(VALUE LIKE ‘%SEN%’)CHECK(VALUE NOT IN(PA, AM, SP))CHECK((VALUE >= ‘YESTERDAY’) AND (VALUE <=

‘TODAY’))CHECK((VALUE IS NULL) OR (VALUE < 60))

• A cláusula COLLATESomente para colunas CHAR e VARCHAR, você pode

especificar um seqüência de coleção(COLLATE) válida para ocharacter set utilizado. O character set é definido como parte dadefinição do banco de dados, ou com o tipo de dados. Por exemplo,assumiremos que o character set definido em nosso banco dedados foi o ISO8859_1.

A seguinte definição de domínio seleciona uma das definiçõesde COLLATE deste character set:

CREATE DOMAIN Cidade VARCHAR(20)COLLATE PT_PT;

A instrução ALTER DOMAINO Firebird fornece uma instrução ALTER DOMAIN para

mudar o valor default, uma restrição CHECK e/ou o tipo etamanho do domínio. Esta alteração é aplicada imediatamenteem todas as colunas que utilizem aquele domínio.

Sobre o autor

Alexandre Magno é diretor da Argos Tecnologia emBelém do Pará[email protected]

A sintaxe do ALTER DOMAIN é como mostramos a seguir:

ALTER DOMAIN domain_nameTYPE novo_tipo(tamanho);

ALTER DOMAIN domain_nameDROP DEFAULT;

ALTER DOMAIN domain_nameSET DEFAULT default_value | NULL | USER;

ALTER DOMAIN domain_nameDROP CONSTRAINT;ALTER DOMAIN domain_nameADD CHECK(value_expression);

A instrução DROP DOMAIN

O Firebird fornece a instrução DROP DOMAIN para removerum domínio de um banco de dados. Esta instrução só serápermitida se nenhuma tabela estiver utilizando o domínionaquele momento. A sintaxe é:

DROP DOMAIN domain_name;

Windows ou Linux? Ambos!CLXpert: O mais novo produto Argos já está no mercadoO CLXpert Wizard, é um aplicativo desenvolvido pela ArgosTecnologia, que porta com extrema desenvoltura e facilidade seuprojeto Delphi, para um projeto nativo Kylix.Saiba mais sobre oproduto e solicite logo o seu!

Argos Tecnologia Ltda - Av. Almte. Wandenkolk, nº 811, sala 1003, Umarizal - Belém / PAFones: (91) 222-6578 - http://www.argostecnologia.com/clxpert/

Coluna do Alexandre Magno

Page 30: Revista The Club Megazine - 12/2002 - O maior clube de ... · na versão 7.0 do Delphi, mas, enfatiza o seu desenvolvimento no protocolo COM+. Veremos, também, os conceitos envolvidos

MeGAZINE30

Perguntas & Respostas

Pergunta: Como fazer o componente SQLConection receberas configurações de um arquivo INI que eu criei? Eu vi queexiste uma propriedade LoadFromFileIni mas como usá-la?

Resposta: Para passar as configurações para osqlConnection, primeiro crie um arquivo INI contendo osparâmetros necessários para a conexão:

[MINHA_CONEXAO]DriverName=InterbaseBlobSize=-1CommitRetain=FalseDatabase=192.168.0.1:C:\PASTA\ARQUIVO.GDBErrorResourceFile=LocaleCode=0000Password=masterkeyRoleName=RoleNameServerCharSet=SQLDialect=3Interbase TransIsolation=ReadCommitedUser_Name=sysdbaWaitOnLocks=True

A propriedade “LoadParamsOnConnect” deve estar “False”;

Importante: As propriedades abaixo devem estarpreenchidas:

GetDriverFunc = getSQLDriverINTERBASELibraryName = dbexpint.dllVendorLib = GDS32.DLL

Após isso, para carregar os parâmetros e ativar osqlConnection utilize o método abaixo:

sqlConnection.LoadParamsFromIniFile(ExtractFilePath(ParamStr(0)+’Config.Ini’);

sqlConnection.Open;

Dúvida enviada por Editora Alto Astral, Bauru/SP.

Pergunta: Criei uma aplicação usando o IntraWeb e precisoque ao ser executado seja carregado um arquivo INI queconfigura o acesso ao Oracle. Este arquivo INI está junto aaplicação no servidor.Tentei:WebApplication.GetNamePath;WebApplication.UrlBase;WebApplication.IP;

Nenhum funcionou a contento. A forma que consegui foi usandoo caminho dentro da aplicação:vCaminho := ‘c:\inetpub\wwwroot\Isapi\MeuArq.INI’;

Mas preciso de algo dinâmico. Vocês tem alguma solução para oproblema?Resposta: Existe uma variável de ambiente no Intraweb queretorna o path físico onde a aplicação está rodando, veja o códigoabaixo:

uses SWSystem;procedure TformMain.IWButton1Click(Sender: TObject);begin IWEdit1.Text := gsAppPath; // retorna o pathend;

Dúvida enviada Nirlan E. Fundão, São Mateus/ES.

Pergunta: Estou precisando mudar a propriedadeDisplayFormat dos TFields de um componente TIBQuery emtempo de execução, para que em uma consulta os dadosaparecam formatados. Sendo que a propriedade referidaé somente leitura, gostaria de saber de que forma eu conseguiriarealizar esta formatação.Resposta: Para fazer este processo basta utilizar a seguinteinstrução: TFloatField(IBQuery.FieldByName(

‘NomeCampo’)).DisplayFormat := ‘###,##0.00’;

Dúvida enviada por Edson Murilo Maestri, Blumenal/SC

Perguntas & Respostas