the club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não...

32
Novembro 2009

Upload: phamliem

Post on 10-Nov-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009

Page 2: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009

Page 3: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 03

Delphi

InfoNews

.NETBanco de Dados

Introdução ao PL/SQL

20Autores: Jacson Crauss e Robison Pereira

Desafio The Club

- Cruzada

índiceDelphi 2010

Editorial Delphi

06Nos dias que vivemos hoje as novidades vem surgindo de forma exponencial, principalmente na área de informática, muitas das novidades podemos... 04

Xô preguiça

05Criando um WebService em Delphi 2010

14Auto complete utilizando Ajax

26

30LegendaInicianteIntermediárioAvançado

Autor: Luciano Pimenta

Autor: Antonio SpitaleriAutor: Luis Alexandre de Oliveira

Autor: Vitor Manuel Rodrigues

Page 4: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200904

Bem-vindo

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Marcos César Silva - Editor [email protected]

Nos dias que vivemos hoje as novidades vem surgindo de forma ex-ponencial, principalmente na área de informática, muitas das novidades podemos desconsiderar achando-as irrelevantes, seja por não contribuir em nada no nosso dia-a-dia ou por complicar nossas vidas ao invés de facilitá-la. A grande novidade que tivemos este ano no mundo dos desenvolvedores foi o lançamento do Delphi 2010, sem dúvida umas das melhores versões do Delphi dos últimos tempos, com novos recursos visuais e suporte a Touch, de melhorias na sua IDE à compilação em background. Neste mês temos em nossa revista a contribuição do colunista Luciano Pimenta que aborda estas novidades de forma bastante detalhada, sendo um artigo imprescindível aos nossos leitores.

Continuando com as novidades dos Delphi 2010, em nosso artigo de capa “Criando um Webservice em Delphi 2010”, o consultor do The Club Antonio Spitaleri Neto, aborda a criação de Webservices como solução para criação de aplicações distribuídas, uma solução que nos dá ótimos resultados de performance quando o assunto é o acesso de dados remotos.

Agora mudando de assunto e irmos para bancos de dados, um dos mais robustos e conhecidos mundialmente encontramos podemos citar o Oracle, e uma entre suas diversas qualidades podemos inicialmente mencionar a PL/SQL (Procedural Language/Structured Query Language), uma poderosíssima linguagem SQL, do qual poderemos tirar aproveito de todo o poder deste banco de dados formidável. Assim com muita alegria recebemos neste mês, pela primeira vez em nossa revista, Jacson Crauss, com seu artigo “Introdução ao PL/SQL”, um artigo introdutório sobre os recursos da linguagem que vai desde Blocos PL/SQL e Estruturas de con-trole, ate criação de Sequences e o uso de Cursores.

Neste mês em nossa seção .Net o consultor Luis Alexandre de Oliveira esta de volta com o artigo “Auto complete utilizando Ajax”, este artigo ele aborda a criação de um mecanismo de autocomplete para aplicaçãoes web utilizando a tecnologia ajax, um recurso simples mas que sem dúvida pode “turbinar” nossos sites.

Espero que todos gostem da edição deste mês, e desejo que tenham uma boa leitura e tirem o máximo de aproveitamento dos assuntos que estamos levando a todos vocês.

Um grande abraço.

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações: (14) 3732-1529 Suporte: (14) 3733-1588

Internethttp://www.theclub.com.br

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

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr

Copyright The Club Megazine 2009

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoTassiane Fileto

ColunistasAntonio Spitaleri Neto

Jacson CraussLuciano Pimenta

Luis Alexandre de OliveiraRobison RodriguesVitor M. Rodrigues

Impressão e acabamento:GRIL - Gráfica e Editora

Taquarituba-SP - Tel. (14) 3762-1345

ReproduçãoA utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais.

Page 5: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 05

InfoNews

Esse mês vou mudar drasticamente o assunto. Como diria o “Leão da Montanha” - “Saída pela direita...”. rsrs

Conversando com uma amiga que é professora de educação física eu estava reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA (data de nascimento avançada).

Piadas a parte ela me sugeriu alguns exercícios de alongamento pra fazer no escritório. Como eu sou meio “bocó” acabei “abraçando a idéia”, e claro, a coisa deu certo. Minhas dores melhoraram bastante. Não pense que é milagre, nem tecnologia, é apenas criar vergonha na cara e ao invés de relaxar no you-tube vendo a loira da faculdade, você pode fazer isso e ainda um alongamento pra relaxar mais ainda.

Antes de mais nada é preciso saber:

Como alongar-se

A maneira correta de alongar-se:- Respirar naturalmente;- Relaxar;- Prestar atenção ao corpo;- Concentrar-se nos músculos e articulações sendo alongados;- Sentir o alongamento;- Orientar-se pela sensação do alongamento;- Não balançar;- Sem dor.

A maneira errada de alongar-se- Prender a respiração;- Estar com pressa;- Não prestar atenção ao corpo;- Alongar quando estiver tenso;- Balançar;- Alongar-se até sentir dor.

Agora sim, Vamos lá!

1- Mantenha a coluna reta, encostado na cadeira. Vire o pescoço de um lado para o ou-tro, lentamente, na primeira vez mantendo os olhos paralelos com o chão, na segunda com os olhos ligeiramente para cima e na terceira com os olhos ligeiramente para baixo. Mante-nha os ombros relachados. Repita 5 vezes.

2 – Mantendo a mesma posição do

exercício 1, flexione o pescoço para a lateral e ao mesmo tempo faça força com o ombro oposto para baixo. Mantenha a posição por 20 segundos.

3 – Encoste o queixo no peito e vá enro-lando seu corpo até onde conseguir. Relaxe os braços e o pescoço. Mantenha a posição por 20 segundos.

4 – Na sequência do exercício anterior,

retorne para a poição inicial, lentamente, mantendo o queixo apoiado no peito.

5 – Apoie a mão na mesa, man-

tendo o tronco reto, as orelhas devem ficar entre os braços. Mantenha a posição por 20 segundos.

6 – Coloque as mãos atrás da cabeça, olhan-

do ligeiramente para cima, levando os cotovelos para trás. Cuidado: contraia o abdome e não deixe formar um arco grande na região lombar (costas). Mantenha a posição por 20 segundos.

7 – Apoie a ponta dos dedos na mesa,

mantenha os cotovelos estendidos. Mantenha a posição por 20 segundos. Retire um dedo de cada vez apontando-o para o chão.

8 – Gire cada um dos dedos, estenda-os, flexione-os, abra-os e feche-os.

9 – Sentado em uma cadeira, com as costas apoiadas, estenda uma das pernas e movimente o tornozelo flexionando o pé para frente e para trás. Repita 5 vezes. Em seguida gire o tornozelo.

10 – Cruze uma perna sobre a outra e puxe com a mão oposta. Mantenha a posição por 20 segundos.

É isso, espero que gostem da dica.Forte abraço e beijo nas crianças!

Page 6: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200906

Delphi

Existe uma nova versão do Delphi no mercado, o Delphi 2010. Segundo o lança-mento da Embarcadero, é o melhor Delphi de todos os tempos. Você concorda? Eu con-cordo. Temos em mãos um IDE voltado para a principal faixa de desenvolvimento para os programadores Delphi, o Win32.

Além de inúmeras mudanças tanto no IDE quanto em componentes (para facilitar o desenvolvimento e a usabilidade do IDE), temos um ambiente de desenvolvi-

mento com suporte a touch, tecnologia que vem aumentando no mercado de hardware cada vez mais.

Nota: Algumas novidades mostradas aqui (principalmente componentes) estão presentes também no Delphi 2009. Para quem não acompanhou o lançamento do Delphi 2009, fica a informação sobre as novidades.

Delphi 2010 IDE

Agora você pode ter os componentes em uma paleta de componentes semelhante ao Delphi 7. Se você é saudosista (como eu) e gosta dos componentes colocados na parte superior do IDE, seus desejos foram atendidos. Clique com o botão direito sobre a barra de menus e escolha a opção Component.

Pronto, sua paleta de componentes estará disponível novamente. E ainda possui novidades, como uma caixa de texto que você usar para pes-quisa de componentes (Figura 1). Você ainda pode continuar usando a Tool Palette normalmente.

Veja a Figura 1.

Caso deseje transformar todo o IDE para o Del-phi 7, basta alterar para Classic Undocked na lista de seleção que fica na parte superior do IDE, assim

Figura 1. Paleta de componentes, semelhante do Delphi 7

todas as janelas ficarão “des-bloqueadas”. Ainda teremos o editor de código e o formulário da aplicação “docados”.

Para contornar, aperte F6 e digite “embed”. Será mostrado o item Embedded desig-ner, onde basta clicar para seremos direcionados para o editor de opções onde desmarcaremos a opção de mesmo nome. Após, será necessário reiniciar o IDE para que as alterações sejam rea-lizadas (Figura 2).

Veja a Figura 2.

IDE Insight (F6)

Temos em um único local a procura de qual-quer necessidade/funcionalidade do IDE do Delphi. Basta apertar a tecla F6 que um editor será aberto, assim, digite o que desejar e o Delphi retornará

Page 7: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 07

Figura 2. IDE igual ao layout do Delphi até a versão 7

todas as possibilidades (componentes, funciona-lidades, help etc) para que você possa escolher o que procura (Figura 3).

Veja a Figura 3.

Se escolher um componente, o Delphi adiciona o mesmo no formulário, ou seja, muita facilidade com o F6. As opções que aparecem, depende do projeto aberto no IDE, por exemplo, com um pro-jeto VCL Forms, os componentes serão mostrados como parte da busca, já se nenhum projeto estiver aberto, essa opção não estará acessível.

Compilação em background

Acesse o IDE Insight (F6) e digite “background”, um dos itens (Background Compilation) é para acessar as opções do IDE. Após isso, quando fi-zermos uma compilação no projeto (s), podemos trabalhar normalmente no IDE, alterando arquivos, adicionando componentes etc.

Mas lembre-se, a partir do momento que a compilação é iniciada, o IDE faz uma “imagem” dos arquivos e não atualiza as alterações que são feitas durante o processo.

Driver FB

O insistente pedido da comunidade Delphi que usa o Firebird como servidor de banco de dados, finalmente foi atendido. Não precisamos mais de driver de terceiros para conectar o banco de dados mais utilizado pela comunidade Delphi. Para saber como utilizar o driver, acompanhe a vídeo aula cria-da por mim, disponível no site da The Club.

VCL

Vamos conhecer algumas novidades para os componentes VCL. Temos várias atualizações, tanto em nível de componente (novas propriedades fun-cionalidades), como em novos controles.

Figura 3. Busca com o IDE Insight

Page 8: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200908

Edit

O Edit recebeu uma propriedade muita legal, chamada NumbersOnly, que indica que o controle receberá somente números. Agora não precisamos mais de codificação extra, nem de componentes de terceiros, basta configurar a propriedade como True, que o Edit aceitará somente números.

O mais legal fica por conta da validação “em-butida” no mesmo (Figura 4).

Veja a Figura 4.

ButtonedEdit

Com esse controle, podemos “adicionar” em uma caixa de texto dois botões, usando imagens. Os botões podem ficar alinhados a direta ou esquerda. Pessoalmente, achei o controle muito legal, pois utilizo em sistemas, botões para realizarem con-sultas auxiliares, onde o botão de pesquisa fica ao lado da caixa de texto.

Com o ButtonedEdit, basta indicar uma ima-gem para o botão direito e terei uma caixa de texto, que indica que tenho uma consulta para realizar ali. Sobre os eventos dos botões, temos os OnRight-ButtonClick e o OnLeftButtonClick, logicamente um evento Click para cada botão.

No controle, temos ainda a propriedade para somente números do Edit (ButtonedEdit descende de TCustomEdit), podemos indicar um Hint para o botão etc. Veja na Figura 5 o controle.

Veja a Figura 5.Figura 5. Usando o ButtonedEdit

Figura 4. Validação do Edit para aceitar somente números

Page 9: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 09

Para configurar essas imagens, primeiro, temos que configurar um ImageList para a propriedade Images do ButtonedEdit. Após, usando as proprie-dades RightButton e LeftButton, configuramos o índice da imagem e também por fim, configurando a propriedade Visible para True.

CategoryPanelGroup

Outro componente que achei muito bom, pois tem a capacidade de criar painéis e dentro desses, adicionar controles. Com isso, podemos fazer um painel de navegação semelhante ao NavBar da suíte DevExpress. Se você não conhece o NavBar, veja nesse link: www.devexpress.com/Products/VCL/ExNavBar.

Vamos criar um painel de navegação muito incrementado. Adicione o controle em um formu-lário. Adicione três painéis, clicando com o botão direito e escolhendo Add Panel.

Na propriedade Images do CategoryPanel-Group, vamos vincular um ImageList com imagens “grandes”, do tipo 24x24, que são as imagens que aparecerão no título dos painéis. Você pode configurar a imagem que vai aparecer quando o painel estiver “expandido” ou “recolhido”, quando o mouse passar sobre a imagem, tudo isso usando as propriedades: XXHotImageIndex, XXImageIndex e XXPressedImageIndex, onde o XX indica ser Collapsed ou Expanded.

Figura 6. Configurando títulos e imagens do painel

Vamos configurar a imagem dos painéis e dar títulos aos mesmos (propriedade Caption), exem-plificado pela Figura 6.

Veja a Figura 6.

Agora, vamos adicionar um Button ao primeiro painel. Altere as seguintes propriedades do Button: Align = alTop, Style = bsCommandLink. Adicione um ImageList no formulário com imagens do tamanho 16x16 ou a seu critério. As mesmas serão vincula-das aos botões.

Vincule o ImageList ao botão, através da pro-priedades Images e adicione a imagem através da

propriedade ImageIndex. Para finalizar a configu-ração do botão, vamos incluir um texto alternativo sobre o Caption do botão, usando a propriedade CommandLinkHint.

Veja que temos um Caption e um texto abai-xo do mesmo. Esse padrão é do Windows Vista, portanto essa configuração só funciona nesse SO (ou claro no Windows 7). Claro, que poderíamos ter uma ActionList para concentrar as regras dos botões, mas aqui, vamos apenas copiar e colar os botões, alterando apenas Caption, Comman-dLinkHint e ImageIndex.

Page 10: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200910

Figura 8. CategoryPanelroup configurado

Figura 7. CategoryPanelGroup configurado

Veja na Figura 7 como fica o componente na sua configuração final.

BallonHint

Outro controle bastante requisitado pelos desenvolvedores é um Hint mais incrementado. Agora, controles visuais, receberam uma nova propriedade chamada CustomHint, nela vamos vincular um BallonHint para mostrar dicas em for-mato de balão, com título, subtítulo e imagens. Se você não quiser usar o CustomHint do controle, não tem problema, seu hint continuará funcionando perfeitamente.

No BalonHint, configuramos um ImageList atra-vés da propriedade Imagens. Após, vinculamos o BallonHint, através do CustomHint do controle. Na propriedade Hint, escrevemos a dica que será mos-trada. Podemos “dividir” o texto em três partes: a primeira é o título do Hint, a segunda um texto auxiliar e a terceira, a imagem que vamos usar.

Elas devem ser separadas pelo caractere pipe “|”, assim um hint pode ser colocado com o se-guinte valor: “Cadastro|Cadastro de Clientes|2”. O primeiro texto, será o título do balão, o segundo a descrição do hint e o último o índice da imagem que temos no ImageList vinculado ao BallonHint.

Se quisermos, podemos “jogar” com essas três opções, por exemplo: “Cadastro||2”, não mostrará a descrição do hint, somente o título e a imagem. Assim, podemos mostrar várias formas diferentes, sem esquecer é claro, de colocar o caractere “|” para separar as partes (Figura 8).

Veja a Figura 8.

Atualizações

Tivemos algumas alterações nos componentes para a versão 2009/2010 do Delphi.

Button: recebeu uma propriedade chamada Style, onde podemos configurar o botão no estilo Vista com uma descrição auxiliar (como vimos no exemplo do CategoryPanelGroup). Temos também no Style uma configuração para que seja mostrado a opção de mostrar uma lista suspensa, usando o tipo bsSplitButton.

Page 11: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 11

Figura 9. Button com estilos diferentes

Figura 10. Vinculando o item ao grupo

Figura 11. ListView com grupos

Depois, basta configurar a propriedade Dro-pDownMenu com um PopupMenu para ter as opções ao clicar no botão (Figura 9).

veja a Figura 9.

ListView: agora podemos criar grupos para os itens do ListView. Vale ressaltar que essa fun-cionalidade esta presente apenas no ambiente do Windows Vista. Adicione um ListView e crie dois grupos, clicando com o botão direito e escolhendo o item Groups Editor. Em Header indicamos o texto que será mostrado no grupo.

Crie uma coluna e alguns itens. No editor de itens, agora temos mais uma opção que se refere ao grupo ao qual o item estará vinculado, como podemos ver na Figura 10.

Veja a Figura 10.

Basta indicar as imagens que deseja e temos um ListView com um layout com grupos (Figura 11).

Veja a Figura 11.

Outras novidades

Novo Search no editor de código

Aproveitando o padrão utilizado em browsers (FireFox e Internet Explorer) onde o texto a ser localizado fica sombreado, agora temos a mesma funcionalidade no IDE do Delphi. No editor de código, aperte Crtl+F e será mostrada uma barra inferior no editor para a digitação do texto de busca (Figura 12).

Veja a Figura 12.

Figura 12. Configurações para localizar texto

Page 12: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200912

Confira o video deste artigo no site do The Club na edição online da revista.

É Técnico em Processamento de Dados, desenvolvedor Delphi/C# para aplicações Web com ASP.NET e Windows com Win32 e Windows Forms. Palestrante da 4ª edição da Borland Conference (BorCon).

Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussi-ness em Florianópolis-SC.

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

Figura 13. Configurações para localizar texto

Digite o texto e veja que o mesmo é sombre-ado e todas as palavras encontradas são também destacadas (Figura 13)

Veja a Figura 13.

Melhoria no dialog Use Unit

Agora para adicionar uma unit (ALT + F11), po-demos filtrar pelo nome das mesmas e também po-demos escolher se vamos adicionar a referência na seção Interface ou Implementation (Figura 14).

Veja a Figura 14.

Melhoria no debugger para visualizar dados

Agora podemos visualizar valores para vari-áveis do tipo TDate, TDateTime ou TTime, o que ajuda em muito a usabilidade do debugger no desenvolvimento. Assista na vídeo-aula disponível, um exemplo da utilização dessa nova funcionali-dade do IDE.

Conclusão

Vimos neste artigo, algumas novidades do maior e melhor Delphi lançado até hoje. Temos muitas outras novidades que não cabem nesse artigo. Fica a dica para você se aprofundar mais, verificando vídeos e artigos no site da Embarcadero ou aqui na The Club.

Um grande abraço a todos e sucesso em seus projetos!

Figura 14. Novo editor para adicionar referencia de units

Page 13: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 13

Page 14: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200914

Nos últimos anos, no ramo do desenvol-vimento de aplicações distribuídas, muito se tem falado de DataSnap e os seus protocolos de comunicação. Criada e incorporada ao Delphi já algum tempo. DataSnap é uma tecnologia que vem passando por inúmeras melhorias ao longo das versões do Delphi e sem dúvida é uma alternativa segura e robus-ta quando queremos desenvolver aplicações distribuídas.

Quando falamos de distribuir em rede local, uma alternativa que sempre foi muito utilizada foi DataSnap com comunicação via socket (TCP/IP). Para essa alternativa, como a maioria deve se lembrar, era necessário a utilização do BSS (Borland Socket Server), que era o responsável por efetuar a comunicação e posterior exportação para o cliente dos recursos do servidor de aplicação.

Nas versões mais recentes do Delphi, a neces-sidade do BSS foi eliminada coma nova versão do DataSnap, com isso a distribuição de aplicações em redes locais se tornou bem mais produtiva e

Criando um Webservice em Delphi 2010

intuitiva.

Com redes locais a utilização de DataSnap/So-ckets é a mais recomendada e eficiente alternativa. Porém, e quando se trata de redes remotas? Ou seja, distribuição de aplicações via Web?

Nesse artigo estarei falando a respeito desse tipo de distribuição de aplicações através do uso de WebServices em conjunto com DataSnap e SOAP desenvolvidos no novíssimo ambiente de desenvolvimento Delphi 2010.

SOAP

SOAP (Simple Object Access Protocol) é um protocolo muito utilizado em computação distri-buída, já que pelo fato de ser baseado em XML, torna as trocas de informações entre aplicações distribuídas leves.

No contexto DataSnap, estaremos utilizando SOAP, para encapsular as informações a serem exportadas por nosso WebService em formato XML de acordo com as especificações dessa tec-

nologia.

WSDL

Para exportar métodos, estejam eles relacio-nados a componentes ou não, os Web Services fazem uso da WSDL que é uma linguagem de definição em XML.

Com isso, o tráfego de informações na rede fica mais rápido, devido a leveza do XML e clientes escritos em linguagens diferentes do Web Service podem fazer uso dos métodos exportados.

Criando o WebService

Iremos agora iniciar a criação de um WebServi-ce em Delphi 2010 que enviará dados provenientes de um banco de dados ao cliente e receberá do cliente informações para efetuar pesquisas na base de dados.

Estarei utilizando o banco Employee.gdb que acompanha o Firebird. Além disso, estarei utilizan-

Page 15: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 15

Criando um Webservice em Delphi 2010

do também o driver Firebird nativo do Delphi, uma novidade na versão 2010 da ferramenta.

O primeiro passo é ir ao menu File-New-Other, selecionar a opção WebServices e o template SOAP Server Application.

Será perguntado qual o tipo de aplicação SOAP queremos criar. Segue uma breve explicação sobre as três opções disponíveis no Delphi 2010:

Veja a Figura 1.

ISAPI/NSAPI- Aplicação que rodará como dll no servidor web, consumindo menores recursos do mesmo. É a opção que utilizarei no exemplo.

CGI- Roda como executável e portanto terá seu próprio espaço de memória na máquina servidora de Web, consumindo mais recursos.

Web App Debugger executable- Esse tipo de aplicação roda em um servidor interno do Delphi e portanto só utilizada para testes, não tendo efeito em situações reais com uso de servidores Web como o IIS.

Selecione a opção ISAPI/NSAPI e clique em ok. Na sequência será perguntado se deseja criar a interface para o SOAP module, clique em não, já que nesse exemplo não utilizaremos a interface do WebModule para abrigar nossas funções a serem exportadas.

Um novo projeto será criado contendo um WebModule com os seguintes objetos:

HTTPSoapDispatcher – Esse componente é o responsável por receber as mensagens enviadas ao Web Service e despachá-las para o componente indicado em sua propriedade Dispatcher.

HTTPSoapPascalInvoker- Esse componente re-cebe as mensagens do componente HTTPSoapDis-patcher e é o responsável por codificá-las para que atendam a chamada ao método determinado.

WSDLHTMLPublish – Esse componente é o responsável por publicar as informações exporta-das pelo Web Service no formato WSDL para que possam ser utilizadas por qualquer aplicação mes-mo que não tenha sido desenvolvida em Delphi.

Salve a unit do WebModule com o nome de unwebmodule e o projeto com o nome de Server. O nome do projeto é de fundamental importância

Figura 1.

já que será utilizado em conjunto com a interface SOAP para fazermos referência ao Web Service na aplicação cliente.

Iremos agora adicionar ao projeto o módulo que irá abrigar os componentes de conexão e as funções a serem exportadas pelo Web Service.

Acesse o menu File-New-Other, selecione a opção Web Services e o template SOAP Server Data Module. Será solicitado um nome para a interface do módulo.Esse nome será utilizado para fazermos referência a ele na aplicação cliente. No exemplo utilizarei o nome IServer. Como o Delphi por padrão inclui um I ao nome informado, o nome que utilizaremos será IIServer.

Esse módulo possui como característica princi-pal o fato de possuir uma interface que utlizaremos para exportar nossa conexão e as funções que adicionarmos a essa interface.

Salve essa unit com o nome de undatamo-dule.

Criando a conexão

O próximo passo é criarmos a conexão com o banco de dados. Acesse o menu View-Data Explorer. Será exibida uma lista com os diversos drivers de conexão que estão disponíveis no Delphi 2010:

Clique com o botão direito sobre o driver FIREBIRD e selecione add new connection. Na tela seguinte, em provider name escolha FIREBIRD e em connection name escreva EMPLOYEE, esse será o nome da conexão.

Figura 2.

Page 16: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200916

Com a conexão criada, selecione a mesma no Data Explorer e clique com o botão direito para selecionar modify connection.Será exibida a tela a seguir:

Veja a Figura 3.

Em Database Name, informe o caminho onde se encontra o banco exemplo.No caso aqui infor-mei: C:\Arquivos de programas\Arquivos comuns\Borland Shared\Data\EMPLOYEE.gdb.

As opções User Name e Password podem ser mantidas como padrão.

Clique em OK para confirmar as alterações.

Montando o módulo de conexão

Com a conexão devidamente criada, adicione ao SOAP Data Module um componente SQLCon-nection da aba dbexpress.Em sua propriedade Connection Name selecione EMPLOYEE e altere sua propriedade name para conexão.

Adicione um componente SQLDataset. Em sua propriedade name coloque sdsemployee, na propriedade sqlconnection selecione conexão e na propriedade commandtext informe o seguinte comando SQL:

SELECT * FROM Employee

Figura 3.

O último componente a ser adicionado ao Data Module e o datasetprovider da aba data access. Altere sua propriedade name para provemployee, na propriedade dataset selecione sdsemployee e altere as seguintes opções para true na proprie-dade options:

poautorefresh, poproporrogatechanges, poallowcommnandtext e poretainserver.

A opção exported também deve ser marcada como true.

Salve o projeto e compile. Será gerada uma dll com o nome de Server na pasta do projeto. Essa dll deverá ser copiada para uma pasta que está definida como diretório virtual no IIS.

Obs: Devido ao fato de não ser do escopo do artigo, não estarei explicando como criar e configurar o diretório virtual no IIS. Não utili-zei o Apache como servidor de testes já que são necessárias alterações em units da CLX do Delphi para que esse WebService funcione no Apache. Em artigos futuros poderemos abordar melhor esse assunto.

Para testar o WebService, abra o navegador de internet e digite:

http://localhost/nomediretoriovirtual/Server.dll/wsdl.

Se o WebService e o servidor estiverem fun-cionando corretamente, será exibida a seguinte tela no Browser:

Page 17: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 17

Veja a Figura 4.

Essa tela contém uma lista das intefaces contidas no WebService e suas respectivas defi-nições no formato WSDL (Web Services Definition Language).

A seguir iremos construir a aplicação cliente que irá consumir o WebService que acabamos de criar.

Criando a aplicação cliente

Inicie uma nova aplicação no Delphi 2010 e monte o layout da mesma conforme a figura a seguir:

Veja a Figura 5. Em seguida adicione ao projeto um DataModu-

le e adicione a ele os seguintes componentes:

TSOAPConnection – Esse componente fará a ligação de nossa aplicação com a interface expor-tada pelo Web Service e onde estão a conexão e a função de pesquisa que criamos.

A ligação será feita através da propriedade url, onde deverá ser informado o seguinte endereço:

http://localhost/nomediretoriovirtual/Ser-ver.dll/soap/IIServer

As demais propriedades do SOAPConnection podem ser mantidas default.

Coloque no data module um componente ClientDataSet da aba DataAccess, e aponte a pro-priedade remoteserver para o SOAPConnection que colocamos anteriormente e na propriedade providername deverá aparecer o provemployee que se encontra no Web Service e é exportado via

Figura 4.

Figura 5.

interface do mesmo.Mude a propriedade active do clientdataset

para true e os dados deverão aparecer no dbgrid

conforme a figura abaixo:

Veja a Figura 6.

Figura 6.

Page 18: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200918

A seguir faremos um procedimento simples

para pesquisas no banco de dados para demonstrar que o banco remoto responde à pesquisas assim como um banco local.

No evento onclick do botão ”Pesquisar” faça:

Veja o código 1.

Esse código bem simples fará uma pesquisa aproximada no banco de dados pelos campos FIRST_NAME e LAST_NAME da tabela mostrada no dbgrid.

Exportando métodos

Mostrarei agora como podemos implementar métodos em nosso Web service e exportá-los para nossa aplicação cliente.

Abra o projeto Server e localize a unit de nosso SOAP Data Module.

Criaremos em seguida uma função matemá-tica bem simples apenas para demonstrarmos a exportação.Na definição da interface IIServer, insira a seguinte linha:

function idade(datanascimento:string):integer;stdcall;

Essa função matemática fará o cálculo da idade em anos de um funcionario selecionado no grid de nossa aplicação cliente. Veja a implementação da função:

Veja o código 3.

Compile o projeto e substitua a mesma no diretório virtual do IIS, isso é necessário para que no WSDL gerado da interface seja incluído o código XML referente a essa nova função incluída na interface.

Como dito anteriormente, Web Services utilizam a linguagem WSDL para referenciar as interfaces exportadas. Como esse código é em XML, poderá ser exportado e utilizado por aplicações clientes feitas em qualquer linguagem que reco-

procedure Tfrmprincipal.btnpesquisaClick(Sender: TObject);var sql:string;begin sql:=Format(‘select * from EMPLOYEE where FIRST_NAME like %s or LAST_NAME like %s’,[quotedstr(‘%’+edtpesquisa.Text+’%’),quotedstr(‘%’+edtpesquisa.Text+’%’)]); dmwebclient.ClientDataSet1.Close; dmwebclient.ClientDataSet1.CommandText:=sql; dmwebclient.ClientDataSet1.Open;end;

Código 1.

function TIServer.idade(datanascimento:string): integer;var ano:string; anoatual:string; diferenca:integer;begin ano:=FormatDateTime(‘yyyy’,strtodate(datanascimento)); anoatual:=FormatDateTime(‘yyyy’,Now); diferenca:=StrToInt(anoatual)-StrToInt(ano); Result:=diferenca;end;

Código 3.

nheça a WSDL, e não apenas em Delphi.

Para utilizarmos o método em nossa aplicação cliente, precisamos importar o WSDL da interface que contém o mesmo. O Delphi oferece um tem-plate que facilita esse trabalho: O WSDL importer. É esse template que utilizaremos a seguir.

Abra a aplicação cliente vá ao menu File-New-Other, selecionar a opção WebServices e o template WSDL importer.

Informe o seguinte endereço em location WSDL file or URL:

http://localhost/antonio/Server.dll/wsdl/IIServer

Siga para os próximos passos mantendo as opções padrão e depois clique em finish. Será

gerada uma unit com uma espécie de cópia da unit que contém a interface no Web Service. Essa “cópia” é construída através das informações WSDL geradas pelo Server encapsuladas através do protocolo SOAP.

Após importamos o WSDL precisamos adicio-nar um componente HTTPRIO que permitirá que utilizemos o método contido em nosso WSDL. Adicione o componente ao datamodule e configure as seguintes propriedades:

Wsdllocation: http://localhost/antonio/Server.dll/wsdl/IIServer

Port: IIServerPortService: IIServerservice.

Em seguida iremos testar o método que impor-

Page 19: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 19

Consultor Técnico The Club.

Sobre o autor

Antonio Spitaleri Neto

[email protected]

tamos. No evento oncellclick do dbgrid faça:

Veja o código 4.

Criamos uma variável do tipo IISERVER, que representará um objeto válido para termos acesso aos métodos da interface importada. Essa variável recebe um type casting do objeto HTTPRIO que passa a fazer referência aos métodos do Web Service, feito isso usamos a função de cálculo de idade normalmente passando como parâmetro um valor contido no dbgrid.

Teste o aplicativo e salve as alterações.

Conclusão

Nesse artigo vimos que Web Services são uma excelente alternativa quando precisamos criar aplicações distribuídas, seja em rede local ou Web. Além de termos feito uso da nova versão do Delphi e seu driver nativo para Firebird.

Espero que tenham gostado e até a próxima!

procedure Tfrmprincipal.dbgpesquisaCellClick(Column: TColumn);var data:string; empidade:integer; Websrv:IIServer;begin Websrv:=(dmwebclient.HTTPRIO1 as IIServer); data:=FormatDateTime(‘dd/mm/yyyy’,dbgpesquisa.DataSource.DataSet.FieldByName(‘HIRE_DATE’).AsDateTime); empidade:=Websrv.idade(data); ShowMessage(‘A idade do funcionário selecionado é:’ + IntToStr(empidade));end;

Código 4.

Page 20: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200920

PL/SQL (Procedural Language/Struc-tured Query Language)

A PL/SQL é uma extensão da linguagem SQL para o SGBD Oracle. Com ela é possível construir desde aplicações simples até aplicações complexas e robustas.

Entre as vantagens vantagens da utilização do PL/SQL, temos:

- Integração com SQL - Melhor performance - Produtividade - Portabilidade - Segurança - Acesso a Packages - Suporte a programação orientada a ob-

jeto - Suporte a desenvolvimento de aplicações

Web

Apesar de ser uma linguagem robusta, ela também é uma linguagem simples de se trabalhar, com blocos e comandos bem definidos.

Blocos PL/SQL

Existem dois tipos de blocos PL/SQL, anônimos (Figura 1) e nomeados (Figura 2), que são blocos PL/SQL muito parecidos, tendo como diferença apenas o fato dos blocos nomeados serem identificados, compilados e armazenados no banco de dados,

Introdução

ao PL/SQLcomo por exemplo as Stored Procedures, Triggers e Functions.

Veja a Figura 1.

Veja a Figura 2.

Notem que usamos uma palvra revervada INTO para atribuir o valor recuperado no SELECT para a variavel.

Figura 1. Bloco Anônimo

Figura 2. Bloco Nomeado.

Page 21: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 21

Estruturas de controle

Veremos aqui as instruções de controle IF, CASE e LOOP. Acreditamos que o leitor tenha conhecimento da aplicação de cada um.

Instruções IF:

IF simples: IF .. THEN .. END IF; IF com ELSE: IF .. THEN .. ELSE .. END IF; IF encadeado: IF .. THEN .. ELSIF .. END IF;

Vejamos um exemplo na Figura 3, onde pe-gamos um valor randomico com ajuda da função Random do Oracle e verificamos se é positivo, negativo ou zero:

Veja a Figura 3. Veja a Figura 4.

Instruções LOOP:

• Existem três tipos de loop:

– Loop (Figura 5) - Utilizado sempre que as instruções precisem ser executados ao menos uma vez

– Loop FOR (Figura 6) - Utilizado sempre que a quantidade de veses a executar as instruções sejam conhecidas

– Loop WHILE (Figura 7) - Utilizado sempre que a quantidade de veses a executar as instruções não sejam conhecidas e que precisem ser executadas ao menos uma vez

Veja a Figura 5. Veja a Figura 6. Veja a Figura 7.

Sequences

Uma sequence, como o próprio nome ja diz, nada mais é do que um gerador de valores numé-ricos sequenciais.

A sintaxe de criação de Sequence é a se-guinte:

CREATE SEQUENCE NOME_DA_SEQUENCE [START WITH VALOR][INCREMENT BY VALOR][MAXVALUE VALOR | NOMAXVALUE] OR [MIN-

VALUE N | NOMINVALUE][CYCLE | NOCYCLE][CACHE VALOR | NOCACHE];

Onde:

Figura 3. Exemplo de uso da função Random.

Figura 4. Exemplo de uso da função CASE.

Figura 5. Exemplo de Loop.

Figura 6. Exemplo de Loop While.

Figura 7. Exemplo de Loop For.

Page 22: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200922

NOME_DA_SEQUENCE - Nome da sequencia (Obrigatório)

START WITH - Configura o valor inicial. (Opi-cional) O padrão é 1.

INCREMENT BY - Configura o valor do incre-mento ou decremento. (Opicional) O padrão é 1.

MAXVALUE e MINVALUE - MAXVALUE, confi-gura o valor máximo que a sequence pode atingir, enquanto que MINVALUE configura o valor mínimo que a sequence pode atingir.

CYCLE - Configura a seuqence de tal forma que ao atingir o valor máximo/mínimo a numeração retornará ao valor inicial. O padrão é NOCYCLE.

CACHE - Configura quantos valores da sequen-ce serão alocados em memória..

O comando abaixo cria uma sequence chama-da SEQ_CLIENTE, iniciada em 1, com incremento de 1 em 1, sem valor limite, sem reinicialização e sem definir a cache. (Figura 8)

Veja a Figura 8.

Para consultar o valor de uma sequence, utilizamos o comando CURRVAL (Figura 9), e para incrementar o valor dela, NEXTVAL (Figura 10).

Veja a Figura 9. Veja a Figura 10.

Com o entendimento do que é uma Sequence, de seus atributos e de como criá-la, vamos agora criar um exemplo.

Inicialmente vamos criar uma tabela Cliente, com os atributos Código, Nome e Sexo para nosso teste, comforme Figura 11.

Veja a Figura 11.

Criada a Sequence e criada a tabela, vamos agora criar uma trigger que será disparada após um comando Insert, porém antes dos dados serem efetivamente inseridos na tabela.

Esta trigger será chamada de TRG_GERACO-DIGO e será responsável por popular o valor do campo CODIGO a cada inserção de novo registro na tabela CLIENTE (Figura 12).

Veja a Figura 12.

Pronto, criada a Trigger. Agora vamos inserir registros na tabela CLIENTE e conferir o campo CODIGO da mesma. (Figura 13).

Como podemos ver na Figura 14, os valores

inseridos no campo CODIGO foram substituidos

Figura 8. Criação de sequence.

Figura 9. Valor atual da Sequence chamado pelo comando CURRVAL.

Figura 10. Incrementando o valor da Sequence chamado pelo comando NEXTVAL.

Figura 11. Criação da tabela CLIENTE.

Figura 12. Criação da Trigger para auto-incremento.

Figura 13. Inserindo dados em nossa tabela exemplo.

Page 23: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 23

pelo valor da Sequence criada e acionada pela Trigger.

Notem que os registros foram inseridos com os valores 3 e 4, isto porque já estavamos com a Sequence com valor corrente (CURRVAL) 2, por isso os próximos valores (NEXTVAL) foram 3 e 4;

Veja a Figura 14.

Cursores

Este poderoso recurso do PL/SQL é utilizado para retornar várias linhas de uma query em um objeto, chamado CURSOR.

Um Cursor, é um espaço de memória alocado na Private SQL Area, onde se pode trabalhar um a um dos registros selecionados através de uma consulta dentro de um código PL/SQL.

A PL/SQL tem dois tipos de cursores, implícitos e explícitos. Um cursor implícito é toda a instrução SQL de manipulação de dados. Um cursor explícito é declarado explicitamente(daí o nome) em blocos PL/SQL, subprogramas, ou packages. Um cursor deve ser declarado explicitamente sempre que uma consulta retorne mais do que um registro.

Atributos de um cursor:

%FOUND - Sempre que um comando INSERT, UPDATE ou DELETE afetar uma ou mais linhas, este atributo retornará o valor TRUE caso contrário, FALSE.

%ISOPEN - Para cursores implícitos, o valor é sempre FALSE pois o oracle fecha o cursor imedia-tamente após a execução do comando SQL.

%NOTFOUND - ? exatamente o contrário do atributo %FOUND. Sempre que um comando INSERT, UPDATE ou DELETE afetar uma ou mais linhas, este atributo retornará o valor FALSE caso contrário, TRUE.

%ROWCOUNT - ? a quantidade de registros afetados por um comando INSERT, UPDATE ou DELETE ou a quantidade de registros retornados em um comando SELECT.

Cursores Implícitos

São gerenciados automaticamente pelo PL/SQL. No entanto é possível consultar seus atri-butos.

Figura 14. Valores da tabela Cliente.

Cursores Explícitos

Existem três comandos essenciais, OPEN, FETCH e CLOSE.

OPEN - abre/inicializa o cursor;FETCH - Posiciona o cursor no próximo registro

encontrado. Isto pode ser feito repetidas veses(em um loop) até que todos os registros tenham sido retornados, ou ainda usar a clausula BULK COLLECT(não será abordado neste artigo) para retornar todos os registros de uma só vez ou em blocos, mais rápido porém há de se ter cuidado com consumo de memória.

CLOSE - fecha/finaliza o cursor.

Existem três tipos de cursores explícitos, cur-sores com parametros, cursores que retornam um cursor e cursores que não possuem parâmetros e nem retornam nada (o mais usado).

A sintaxe de declaração de cada um dos cur-sores é a seguinte:

Cursor: (Figura 15)

CURSOR <NOME_CURSOR> IS <SQL>;

Cursor com parametros: (Figura 16)

CURSOR <NOME_CURSOR> <(PARAM1 TYPE [DEFAULT n], PARAM2 TYPE [DEFAULT n], ...)> IS <SQL>;

Cursor com retorno: (Figura 17)

CURSOR <NOME_CURSOR> RETURN <TIPO_RETORNO> IS <SQL>;

Agora que já sabemos como funcionam os cursores, vamos testar alguns utilizando a tabela CLIENTE criada anteriormente. Apresentaremos nos exemplos as três formas de implementação de cursores explícitos utilizando uma variavel do tipo RECORD, um WHILE .. LOOP para percorrer os registros do cursor, e mostrar alguns dados desta tabela utilizando o comando DBMS_OUTPUT.PUT_LINE.

Veja a Figura 15.

Figura 15. Cursor

Page 24: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200924

Veja a Figura 16. Veja a Figura 17.

Notem que o exemplo do Cursor com retorno, criamos uma Package(será visto na sequencia do ar-tigo) para armazenar o cursor. Depois simplesmen-te abrimos o cursor chamando ele da Package e o resto permanece funcionando da mesma forma.

Agora, com o assunto cursores dominado, veremos na Figura 18 uma forma diferente de “aplicar” os comandos OPEN, FETCH, CLOSE im-plicitamente através de um comando FOR LOOP (claro que deixaríamos a forma mais fácil para o final), evitamos assim problemas como cursores alocados em memória sem estar mais em uso e loops infinitos por não aplicarmos o fetch em um LOOP por exemplo. Através de Cursores FOR LOOP isto se torna automático.

Veja a Figura 18.

Triggers, Packages, Functions e Stored Pro-cedures

Estes poderosos recursos do PL/SQL serão apresentados em breve, em um novo artigo. Agora vamos dar uma breve explicação sobre eles.

Triggers

Uma trigger, é um ‘gatilho’ que é disparado por algum evendo do Banco de Dados, como por exemplo a execução de comandos INSERT, UPDATE e DELETE de registros em uma tabela no nosso bando. No momento da criação da trigger, é defi-nido o momento (AFTER ou BEFORE) em que ele será disparado, e também qual o comando (Insert, Update, Delete). Dentro de uma trigger, podemos criar regras, tratamento de dados, e outras necessi-dades que podemos ter ao receber algum comando DML em determinada tabela.

Packages

As packages são divididas em 2 partes, a SPE-CIFICATION, e o BODY. Como o próprio nome diz, a primeira define a especificação das Functions, Stored Procedures, Cursores, e variáveis globais que serão utilizadas no corpo da package, que por sua vez, recebe a progra mação PL/SQL. Utilizar packages ajuda muito na organização dos objetos criados para executarem comandos PL/SQL.

Stored Procedures

São procedimentos, que podem ser execu-

Figura 16. Cursor com parâmetros

Figura 17. Cursor com retorno

Figura 18. Exemplo de uso de comandos do Cursor.

Page 25: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 25

tados por triggers, diretamente no banco, ou por sistemas externos. Nestes procedimentos, podemos passar parâmetros, e fazer programação de blocos em SQL ou PL/SQL, para executarem determinadas tarefas.

Functions

Funções, diferentemente de procedimentos, sempre retornam algum valor, de um tipo pré-definido. Simplificando a definição de Function, ela executa procedimentos e retorna um resultado.

Conclusão

Neste artigo mostramos uma introdução ao PL/SQL, onde ja pudemos demonstrar a grande utilização desta poderosa linguagem, uma vez que muita lógica de negócio pode ser tirada do sistema externo, e jogado ao banco de dados, aumentando a performance do sistema como um todo e inte-gridade dos dados.

Foram demonstrados hoje dois recursos que vão ser muito usados por quem vai trabalhar com PL/SQL, e não podíamos deixar de dar uma aten-ção especial a ambos, que são as Sequences e os Cursores. Em um próximo artigo, vamos colocar a mão na massa, desenvolvendo Packages, Functions, Stored Procedures e Triggers.

Consultor Desenvolvedor da SoftDesign Consultoria e Sistemas.Tecnologias Oracle, Delphi e Java. Trabalha com PL/SQL a 4 anos.Formado em Ciência da COmputação e Certificado OCA DBA Oracle

10g

Site: www.cvlink.com.br/site/crauss

Sobre o autor

Jacson Crauss

[email protected]

Consultor Analista da SoftDesign Consultoria e SistemasTecnologias Oracle, Delphi, JavaTrabalha com PL/SQL a 8 anos.Formado em Análise de SistemasCertificações OCA DBA 10g, SCJA

Sobre o autor

Robison Pereira

[email protected]

Page 26: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200926

Esse artigo vai de encontro a algumas solicitações de nossos associados, como um autocomplete para aplicações .net, assim como o Google, por exemplo?

A idéia é construir um página contendo um textoBox e o usuário irá digitar as iniciais dos clientes e irá buscar todos os clientes no servidor que se iniciam com as iniciais digitadas. Isso será feito sem o uso postba-cks no servidor. Utilizaremos o Ajax. Iremos enviar essas letras ao WebService que irá consultar um arquivo XML e nos retornará um popup com o resultado para a pesquisa, o autocomplete.

Utilizaremos um extender do ajaxcontroltollkit, que se chama AutoCompleteExtender. Faça o download do AjaxControlTookit em http://www.asp.net/ajax/downloads/. Veja também informa-ções sobre a instalação no Visual Studio 2008 no mesmo link.

É necessário criar um arquivo XML. Nomei como teste.xml. Veja a estrutura do arquivo XML exemplo (listagem 1).

Veja a Listagem 1.

Você pode utilizar qualquer XML que desejar e o mesmo deverá estar no mesmo diretório da aplicação.

Crie uma aplicação. Clique em file new

Auto complete utilizando

?xml version=”1.0” encoding=”ISO-8859-1”?><messages> <note id=”501”> <to>Alex</to> <from>Jani</from> <heading>Lembrete</heading> <body>Churrasco</body> </note> <note id=”502”> <to>Alexandre</to> <from>Marcos</from> <heading>Re: Lembrete</heading> <body>Eu não irei</body> </note>

<note id=”503”> <to>taciane</to> <from>alexandre</from> <heading>Re: Lembrete </heading> <body>Eu não irei</body> </note><note id=”504”> <to>marcos</to> <from>Antônio</from> <heading>Reunião </heading> <body>Reunião dia 10/10/09 </body> </note><note id=”505”> <to>Marco</to> <from>Vitor</from> <heading>Reunião</heading> <body>Churrasco </body> </note></messages> Listagem 1

Page 27: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 27

website. Vamos criar um WebService. Chame o mesmo de autocomplete.

Seu WebService terá essa estrutura padrão (listagem 2)

Veja a Listagem 2.

Iremos fazer algumas alterações no script do webservice criado.

Veja a Listagem 3.

using System;using System.Collections;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Linq;using System.Collections.Generic;// coleção generica para leitura das strings que serão enviadas para o cliente/// <summary>/// Summary description for WebService2/// </summary>[WebService(Namespace = “http://tempuri.org/”)][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService]public class WebService2 : System.Web.Services.WebService {

public WebService2 () {

//Uncomment the following line if using designed components //InitializeComponent(); }

[WebMethod] public string HelloWorld() { return “Hello World”; } } Listagem 2

using System;using System.Collections;using System.Linq;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;using System.Xml.Linq;

/// <summary>/// Summary description for WebService2/// </summary>[WebService(Namespace = “http://tempuri.org/”)][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)][System.Web.Script.Services.ScriptService]//assinatura do webservice //com atributo

Listagem 3

Page 28: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200928

// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService]public class WebService2 : System.Web.Services.WebService {

public WebService2 () {

//Uncomment the following line if using designed components //InitializeComponent(); }

[WebMethod] public string HelloWorld() { return “Hello World”; }// criação do web metodo[WebMethod] [System.Web.Script.Services.ScriptMethod]// assinatura public string[] GetCompletionList( string prefixText, int count)// método para retornar a lista //de clientes ... a assinatura dos parametros devem ser com esses //nomes obrigatóriamente....retorna uma coleção de strings { DataSet ds = new DataSet(); // instanciar a classe dataset //Para ler o xml ds.ReadXml(Server.MapPath(“teste.xml”)); // lendo o xml List<string> items = new List<string>(count);//leitura das //strings (estamos instanciando uma collection genérica) ds.Tables[0].DefaultView.RowFilter = “to like ‘” + prefixText + “%’”;// filtar o dataset de //acordo com as iniciais passadas como parametro no prefixtext foreach (DataRow linha in ds.Tables[0].DefaultView.ToTable().Rows) // varredura do datatable que foi filtrado em mémoria {

items.Add(linha[“to”].ToString());//collection genérica que será devolvida ao usuário no browser } return items.ToArray();// retorna um array

} }

Vamos testar nosso médoto GetComple-tionList. Clique em chamar e veja o resultado (Imagem 1)

Veja a Imagem 1.

Vamos criar a página default.aspx de acesso ao webservice e construir a interface do usuário.

Adicone um ScriptManager(seção ajax Exten-der) e um textbox conforme imagem2.

Listagem 3

Vincule o textbox a um AutocompleteExtender que se encontra na seção AjaxToolKit.

Veja a Imagem 2.

Page 29: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009 29

Técnologo em Processamento de Dados ,graduado pela Faculdade de Técnologia de Sorocaba, Consultor técnico do The Club.

Docente do curso técnico informática - Etec de Avaré e do curso Tecnologia em Redes de Computadores - Fatec Eduvale – Avaré

Sobre o autor

Luís Alexandre de Oliveira

[email protected]

No servicepath vamos colocar o caminho do webservice. No caso será o nome do arquivo Autocomplete.asmx. Em serviceMethod adicione o método GetCompletionList. Em MinimumPre-fixLength coloque 2(número de caractéres para busca) Veja imagem 3.

Imagem 3.

Observe o resultado na aplicação cliente conforme o usuário digita os valores para busca.(Imagem 4)

Veja a Imagem 4.

Conclusão

Com isso aprendemos a criar o mecanismo autocomplete para aplicaçãoes asp net com ajax onde os dados de determinado cliente são retor-nados de um servidor de acordo com a digitação do usuário num textbox. Para isso utilizamos um webservice e o controle AutocompleteExtender do AjaxToolKit.

Page 30: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 200930

VerticalHorizontal

Page 31: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009

Page 32: The Club - megazine · reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu a piada e disse que era problema de DNA ... coisa deu certo. Minhas dores

Novembro 2009