Anda di halaman 1dari 32

Novembro 2009

Novembro 2009
índiceEditorial InfoNews Delphi

04 05 06
Nos dias que vivemos hoje as novidades Xô preguiça Delphi 2010
vem surgindo de
forma exponencial,
principalmente na
área de informática,
muitas das novidades Autor: Vitor Manuel Autor: Luciano Pimenta
podemos... Rodrigues

Delphi Banco de Dados .NET

14 20 26
Criando um WebService em Delphi Introdução ao PL/SQL Auto complete utilizando Ajax
2010

Autores: Jacson Crauss Autor: Luis Alexandre


Autor: Antonio Spitaleri e Robison Pereira de Oliveira

Desafio The Club

30
- Cruzada

Legenda
Iniciante
Intermediário
Avançado

Novembro 2009 03
Bem-vindo Av. Profº Celso Ferreira da Silva, 190

Nos dias que vivemos hoje as novidades vem surgindo de forma ex- Jd. Europa - Avaré - SP - CEP 18.707-150
Informações: (14) 3732-1529
ponencial, principalmente na área de informática, muitas das novidades Suporte: (14) 3733-1588

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. Internet
A grande novidade que tivemos este ano no mundo dos desenvolvedores http://www.theclub.com.br

foi o lançamento do Delphi 2010, sem dúvida umas das melhores versões Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br
do Delphi dos últimos tempos, com novos recursos visuais e suporte a Informações: info@theclub.com.br

Touch, de melhorias na sua IDE à compilação em background. Neste mês Skype Cadastro: theclub_cadastro
Skype Suporte: theclub_linha1
temos em nossa revista a contribuição do colunista Luciano Pimenta que theclub_linha2
aborda estas novidades de forma bastante detalhada, sendo um artigo theclub_linha3

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 www.twitter.com/theclubbr
performance quando o assunto é o acesso de dados remotos.
Copyright The Club Megazine 2009

Agora mudando de assunto e irmos para bancos de dados, um dos


mais robustos e conhecidos mundialmente encontramos podemos citar Diretor Técnico
Marcos César Silva
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 Diagramação e Arte
Vitor M. Rodrigues
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,
Revisão
com seu artigo “Introdução ao PL/SQL”, um artigo introdutório sobre os Tassiane Fileto
recursos da linguagem que vai desde Blocos PL/SQL e Estruturas de con-
trole, ate criação de Sequences e o uso de Cursores. Colunistas
Antonio Spitaleri Neto
Neste mês em nossa seção .Net o consultor Luis Alexandre de Oliveira Jacson Crauss
Luciano Pimenta
esta de volta com o artigo “Auto complete utilizando Ajax”, este artigo ele Luis Alexandre de Oliveira
aborda a criação de um mecanismo de autocomplete para aplicaçãoes web Robison Rodrigues
utilizando a tecnologia ajax, um recurso simples mas que sem dúvida pode Vitor M. Rodrigues

“turbinar” nossos sites.


Impressão e acabamento:

Espero que todos gostem da edição deste mês, e desejo que tenham GRIL - Gráfica e Editora
Taquarituba-SP - Tel. (14) 3762-1345
uma boa leitura e tirem o máximo de aproveitamento dos assuntos que
estamos levando a todos vocês. Reprodução
A utilização, reprodução, apropriação, armazenamento em banco

Um grande abraço.
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.

Marcos César Silva - Editor Chefe


marcos@theclub.com.br Delphi é marca registrada da Borland International,
as demais marcas citadas são registradas
pelos seus respectivos proprietários.

04 Novembro 2009
InfoNews
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,
Esse mês vou mudar drasticamente o assunto. Como diria o “Leão da
mantendo o queixo apoiado no peito.
Montanha” - “Saída pela direita...”. rsrs
Conversando com uma amiga que é professora de educação física eu estava
5 – Apoie a mão na mesa, man-
reclamando de dores no ombro, braços, joelho, etc.. É claro que ela não perdeu
tendo o tronco reto, as orelhas devem ficar
a piada e disse que era problema de DNA (data de nascimento avançada).
entre os braços. Mantenha a posição por 20
Piadas a parte ela me sugeriu alguns exercícios de alongamento pra fazer
segundos.
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,
6 – Coloque as mãos atrás da cabeça, olhan-
nem tecnologia, é apenas criar vergonha na cara e ao invés de relaxar no you-
do ligeiramente para cima, levando os cotovelos
tube vendo a loira da faculdade, você pode fazer isso e ainda um alongamento
para trás. Cuidado: contraia o abdome e não
pra relaxar mais ainda.
deixe formar um arco grande na região lombar
(costas). Mantenha a posição por 20 segundos.
Antes de mais nada é preciso saber:
7 – Apoie a ponta dos dedos na mesa,
Como alongar-se mantenha os cotovelos estendidos. Mantenha
a posição por 20 segundos. Retire um dedo de
A maneira correta de alongar-se:
cada vez apontando-o para o chão.
- Respirar naturalmente;
- Relaxar;
- Prestar atenção ao corpo;
- Concentrar-se nos músculos e articulações sendo alongados;
8 – Gire cada um dos dedos, estenda-os,
- Sentir o alongamento;
flexione-os, abra-os e feche-os.
- Orientar-se pela sensação do alongamento;
- Não balançar;
- Sem dor.
9 – Sentado em uma cadeira, com as
costas apoiadas, estenda uma das pernas e
A maneira errada de alongar-se
movimente o tornozelo flexionando o pé para
- Prender a respiração;
frente e para trás. Repita 5 vezes. Em seguida
- Estar com pressa;
gire o tornozelo.
- Não prestar atenção ao corpo;
- Alongar quando estiver tenso;
- Balançar;
10 – Cruze uma perna sobre a outra e
- Alongar-se até sentir dor.
puxe com a mão oposta. Mantenha a posição
por 20 segundos.
Agora sim, Vamos lá!

1- Mantenha a coluna reta, encostado na


cadeira. Vire o pescoço de um lado para o ou-
É isso, espero que gostem da dica.
tro, lentamente, na primeira vez mantendo os
Forte abraço e beijo nas crianças!
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.

Novembro 2009 05
Delphi

Delphi 2010
IDE todas as janelas ficarão “des-
Existe uma nova versão do Delphi no bloqueadas”. Ainda teremos o
mercado, o Delphi 2010. Segundo o lança- Agora você pode ter os componentes em uma editor de código e o formulário
mento da Embarcadero, é o melhor Delphi paleta de componentes semelhante ao Delphi da aplicação “docados”.
de todos os tempos. Você concorda? Eu con- 7. Se você é saudosista (como eu) e gosta dos
cordo. Temos em mãos um IDE voltado para componentes colocados na parte superior do IDE, Para contornar, aperte F6 e digite
a principal faixa de desenvolvimento para os seus desejos foram atendidos. Clique com o botão “embed”. Será mostrado o item Embedded desig-
programadores Delphi, o Win32. direito sobre a barra de menus e escolha a opção ner, onde basta clicar para seremos direcionados
para o editor de opções onde desmarcaremos a

A
Component.
opção de mesmo nome. Após, será necessário
lém de inúmeras mudanças tanto Pronto, sua paleta de componentes estará reiniciar o IDE para que as alterações sejam rea-
no IDE quanto em componentes disponível novamente. E ainda possui novidades, lizadas (Figura 2).
(para facilitar o desenvolvimento como uma caixa de texto que você usar para pes-
e a usabilidade do IDE), temos quisa de componentes (Figura 1). Você ainda pode Veja a Figura 2.
um ambiente de desenvolvi- continuar usando a Tool Palette normalmente.
mento com suporte a touch, tecnologia que vem IDE Insight (F6)
aumentando no mercado de hardware cada vez Veja a Figura 1.
mais. Temos em um único local a procura de qual-
Caso deseje transformar todo o IDE para o Del- quer necessidade/funcionalidade do IDE do Delphi.
phi 7, basta alterar para Classic Undocked na lista Basta apertar a tecla F6 que um editor será aberto,
Nota: Algumas novidades mostradas de seleção que fica na parte superior do IDE, assim assim, digite o que desejar e o Delphi retornará
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.
Figura 1. Paleta de componentes, semelhante do Delphi 7

06 Novembro 2009
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 Figura 2. IDE igual ao layout do Delphi até a versão 7

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 Figura 3. Busca com o IDE Insight
componentes VCL. Temos várias atualizações, tanto
em nível de componente (novas propriedades fun-
cionalidades), como em novos controles.

Novembro 2009 07
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.
Figura 4. Validação do Edit para aceitar somente números

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

08 Novembro 2009
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. Figura 6. Configurando títulos e imagens do painel

Vamos criar um painel de navegação muito Vamos configurar a imagem dos painéis e dar propriedade ImageIndex. Para finalizar a configu-
incrementado. Adicione o controle em um formu- títulos aos mesmos (propriedade Caption), exem- ração do botão, vamos incluir um texto alternativo
lário. Adicione três painéis, clicando com o botão plificado pela Figura 6. sobre o Caption do botão, usando a propriedade
direito e escolhendo Add Panel. CommandLinkHint.
Veja a Figura 6.
Na propriedade Images do CategoryPanel- Veja que temos um Caption e um texto abai-
Group, vamos vincular um ImageList com imagens Agora, vamos adicionar um Button ao primeiro xo do mesmo. Esse padrão é do Windows Vista,
“grandes”, do tipo 24x24, que são as imagens painel. Altere as seguintes propriedades do Button: portanto essa configuração só funciona nesse SO
que aparecerão no título dos painéis. Você pode Align = alTop, Style = bsCommandLink. Adicione um (ou claro no Windows 7). Claro, que poderíamos
configurar a imagem que vai aparecer quando o ImageList no formulário com imagens do tamanho ter uma ActionList para concentrar as regras dos
painel estiver “expandido” ou “recolhido”, quando 16x16 ou a seu critério. As mesmas serão vincula- botões, mas aqui, vamos apenas copiar e colar
o mouse passar sobre a imagem, tudo isso usando das aos botões. os botões, alterando apenas Caption, Comman-
as propriedades: XXHotImageIndex, XXImageIndex dLinkHint e ImageIndex.
e XXPressedImageIndex, onde o XX indica ser Vincule o ImageList ao botão, através da pro-
Collapsed ou Expanded. priedades Images e adicione a imagem através da

Novembro 2009 09
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, Figura 7. CategoryPanelGroup configurado
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.
Figura 8. CategoryPanelroup configurado

10 Novembro 2009
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. Figura 9. Button com estilos diferentes

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 Figura 10. Vinculando o item ao grupo

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 11. ListView com grupos

Figura 12. Configurações para localizar texto

Novembro 2009 11
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- Figura 13. Configurações para localizar texto
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

Sobre o autor
Luciano Pimenta Confira o video deste
É 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
artigo no site do The
da Borland Conference (BorCon).
Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas
Club na edição online
e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra da revista.
cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussi-
ness em Florianópolis-SC.

www.lucianopimenta.net

12 Novembro 2009
Novembro 2009 13
Criando um Webservice
em Delphi 2010

intuitiva. nologia.
Nos últimos anos, no ramo do desenvol-
vimento de aplicações distribuídas, muito se Com redes locais a utilização de DataSnap/So-
tem falado de DataSnap e os seus protocolos ckets é a mais recomendada e eficiente alternativa. WSDL
de comunicação. Criada e incorporada ao Porém, e quando se trata de redes remotas? Ou
Delphi já algum tempo. DataSnap é uma seja, distribuição de aplicações via Web? Para exportar métodos, estejam eles relacio-
tecnologia que vem passando por inúmeras nados a componentes ou não, os Web Services
melhorias ao longo das versões do Delphi e Nesse artigo estarei falando a respeito desse fazem uso da WSDL que é uma linguagem de
sem dúvida é uma alternativa segura e robus- tipo de distribuição de aplicações através do uso definição em XML.
ta quando queremos desenvolver aplicações de WebServices em conjunto com DataSnap e
distribuídas. SOAP desenvolvidos no novíssimo ambiente de Com isso, o tráfego de informações na rede
desenvolvimento Delphi 2010. fica mais rápido, devido a leveza do XML e clientes
escritos em linguagens diferentes do Web Service
Quando falamos de distribuir em rede local, podem fazer uso dos métodos exportados.
uma alternativa que sempre foi muito utilizada SOAP
foi DataSnap com comunicação via socket (TCP/
IP). Para essa alternativa, como a maioria deve se SOAP (Simple Object Access Protocol) é um Criando o WebService
lembrar, era necessário a utilização do BSS (Borland protocolo muito utilizado em computação distri-
Socket Server), que era o responsável por efetuar a buída, já que pelo fato de ser baseado em XML, Iremos agora iniciar a criação de um WebServi-
comunicação e posterior exportação para o cliente torna as trocas de informações entre aplicações ce em Delphi 2010 que enviará dados provenientes
dos recursos do servidor de aplicação. distribuídas leves. de um banco de dados ao cliente e receberá do
cliente informações para efetuar pesquisas na
Nas versões mais recentes do Delphi, a neces- No contexto DataSnap, estaremos utilizando base de dados.
sidade do BSS foi eliminada coma nova versão do SOAP, para encapsular as informações a serem
DataSnap, com isso a distribuição de aplicações exportadas por nosso WebService em formato Estarei utilizando o banco Employee.gdb que
em redes locais se tornou bem mais produtiva e XML de acordo com as especificações dessa tec- acompanha o Firebird. Além disso, estarei utilizan-

14 Novembro 2009
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.
Figura 1.
Web App Debugger executable- Esse tipo de
aplicação roda em um servidor interno do Delphi já que será utilizado em conjunto com a interface
e portanto só utilizada para testes, não tendo SOAP para fazermos referência ao Web Service na
efeito em situações reais com uso de servidores aplicação cliente.
Web como o IIS.
Iremos agora adicionar ao projeto o módulo
Selecione a opção ISAPI/NSAPI e clique em que irá abrigar os componentes de conexão e as
ok. Na sequência será perguntado se deseja criar funções a serem exportadas pelo Web Service.
a interface para o SOAP module, clique em não, já
que nesse exemplo não utilizaremos a interface do Acesse o menu File-New-Other, selecione a
WebModule para abrigar nossas funções a serem opção Web Services e o template SOAP Server
exportadas. Data Module. Será solicitado um nome para a
interface do módulo.Esse nome será utilizado para
Um novo projeto será criado contendo um fazermos referência a ele na aplicação cliente. No
Figura 2.
WebModule com os seguintes objetos: exemplo utilizarei o nome IServer. Como o Delphi
por padrão inclui um I ao nome informado, o nome Clique com o botão direito sobre o driver
HTTPSoapDispatcher – Esse componente é o que utilizaremos será IIServer. FIREBIRD e selecione add new connection. Na tela
responsável por receber as mensagens enviadas seguinte, em provider name escolha FIREBIRD e em
ao Web Service e despachá-las para o componente Esse módulo possui como característica princi- connection name escreva EMPLOYEE, esse será o
indicado em sua propriedade Dispatcher. pal o fato de possuir uma interface que utlizaremos nome da conexão.
para exportar nossa conexão e as funções que
HTTPSoapPascalInvoker- Esse componente re- adicionarmos a essa interface.
cebe as mensagens do componente HTTPSoapDis-
patcher e é o responsável por codificá-las para que Salve essa unit com o nome de undatamo-
atendam a chamada ao método determinado. dule.

WSDLHTMLPublish – Esse componente é o


responsável por publicar as informações exporta- Criando a conexão
das pelo Web Service no formato WSDL para que
possam ser utilizadas por qualquer aplicação mes- O próximo passo é criarmos a conexão com
mo que não tenha sido desenvolvida em Delphi. o banco de dados. Acesse o menu View-Data
Explorer. Será exibida uma lista com os diversos
Salve a unit do WebModule com o nome de drivers de conexão que estão disponíveis no
unwebmodule e o projeto com o nome de Server. Delphi 2010:
O nome do projeto é de fundamental importância

Novembro 2009 15
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.

Figura 3.
Montando o módulo de conexão

Com a conexão devidamente criada, adicione O último componente a ser adicionado ao Data
ao SOAP Data Module um componente SQLCon- Module e o datasetprovider da aba data access. Obs: Devido ao fato de não ser do escopo
nection da aba dbexpress.Em sua propriedade Altere sua propriedade name para provemployee, do artigo, não estarei explicando como criar e
Connection Name selecione EMPLOYEE e altere na propriedade dataset selecione sdsemployee e configurar o diretório virtual no IIS. Não utili-
sua propriedade name para conexão. altere as seguintes opções para true na proprie- zei o Apache como servidor de testes já que
dade options: são necessárias alterações em units da CLX
Adicione um componente SQLDataset. Em do Delphi para que esse WebService funcione
sua propriedade name coloque sdsemployee, na poautorefresh, poproporrogatechanges, no Apache. Em artigos futuros poderemos
propriedade sqlconnection selecione conexão e poallowcommnandtext e poretainserver. abordar melhor esse assunto.
na propriedade commandtext informe o seguinte
comando SQL: A opção exported também deve ser marcada
como true. Para testar o WebService, abra o navegador
de internet e digite:
SELECT * FROM Employee Salve o projeto e compile. Será gerada uma dll
com o nome de Server na pasta do projeto. Essa http://localhost/nomediretoriovirtual/
dll deverá ser copiada para uma pasta que está Server.dll/wsdl.
definida como diretório virtual no IIS.
Se o WebService e o servidor estiverem fun-
cionando corretamente, será exibida a seguinte
tela no Browser:

16 Novembro 2009
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). Figura 4.

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:
Figura 5.

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- Figura 6.
priedade remoteserver para o SOAPConnection
que colocamos anteriormente e na propriedade interface do mesmo. conforme a figura abaixo:
providername deverá aparecer o provemployee Mude a propriedade active do clientdataset
que se encontra no Web Service e é exportado via para true e os dados deverão aparecer no dbgrid Veja a Figura 6.

Novembro 2009 17
A seguir faremos um procedimento simples procedure Tfrmprincipal.btnpesquisaClick(Sender:
para pesquisas no banco de dados para demonstrar TObject);
que o banco remoto responde à pesquisas assim var sql:string;
como um banco local. begin
sql:=Format(‘select * from EMPLOYEE where FIRST_
No evento onclick do botão ”Pesquisar” faça: NAME like %s or LAST_NAME like %s’,
[quotedstr(‘%’+edtpesquisa.Text+’%’),quotedstr(‘%’+
Veja o código 1. edtpesquisa.Text+’%’)]);
dmwebclient.ClientDataSet1.Close;
Esse código bem simples fará uma pesquisa dmwebclient.ClientDataSet1.CommandText:=sql;
aproximada no banco de dados pelos campos dmwebclient.ClientDataSet1.Open;
FIRST_NAME e LAST_NAME da tabela mostrada end;
no dbgrid.
Código 1.

Exportando métodos
function TIServer.idade(datanascimento:string):
Mostrarei agora como podemos implementar
integer;
métodos em nosso Web service e exportá-los para
var ano:string;
nossa aplicação cliente.
anoatual:string;
diferenca:integer;
Abra o projeto Server e localize a unit de nosso
begin
SOAP Data Module.
ano:=FormatDateTime(‘yyyy’,strtodate(datanascimen
to));
Criaremos em seguida uma função matemá-
anoatual:=FormatDateTime(‘yyyy’,Now);
tica bem simples apenas para demonstrarmos a
diferenca:=StrToInt(anoatual)-StrToInt(ano);
exportação.Na definição da interface IIServer, insira
Result:=diferenca;
a seguinte linha:
end;

Código 3.
function idade(datanasci
mento:string):integer;st
dcall;
nheça a WSDL, e não apenas em Delphi. gerada uma unit com uma espécie de cópia da
unit que contém a interface no Web Service. Essa
Essa função matemática fará o cálculo da idade Para utilizarmos o método em nossa aplicação “cópia” é construída através das informações
em anos de um funcionario selecionado no grid cliente, precisamos importar o WSDL da interface WSDL geradas pelo Server encapsuladas através
de nossa aplicação cliente. Veja a implementação que contém o mesmo. O Delphi oferece um tem- do protocolo SOAP.
da função: plate que facilita esse trabalho: O WSDL importer.
É esse template que utilizaremos a seguir. Após importamos o WSDL precisamos adicio-
Veja o código 3. nar um componente HTTPRIO que permitirá que
Abra a aplicação cliente vá ao menu File-New- utilizemos o método contido em nosso WSDL.
Compile o projeto e substitua a mesma no Other, selecionar a opção WebServices e o template Adicione o componente ao datamodule e configure
diretório virtual do IIS, isso é necessário para WSDL importer. as seguintes propriedades:
que no WSDL gerado da interface seja incluído o
código XML referente a essa nova função incluída Informe o seguinte endereço em location
na interface. WSDL file or URL: Wsdllocation: http://localhost/antonio/
Server.dll/wsdl/IIServer
Como dito anteriormente, Web Services http://localhost/antonio/Server.dll/wsdl/ Port: IIServerPort
utilizam a linguagem WSDL para referenciar as IIServer Service: IIServerservice.
interfaces exportadas. Como esse código é em XML,
poderá ser exportado e utilizado por aplicações Siga para os próximos passos mantendo as
clientes feitas em qualquer linguagem que reco- opções padrão e depois clique em finish. Será Em seguida iremos testar o método que impor-

18 Novembro 2009
tamos. No evento oncellclick do dbgrid faça:
procedure Tfrmprincipal.
Veja o código 4. dbgpesquisaCellClick(Column: TColumn);
var data:string;
Criamos uma variável do tipo IISERVER, que empidade:integer;
representará um objeto válido para termos acesso Websrv:IIServer;
aos métodos da interface importada. Essa variável begin
recebe um type casting do objeto HTTPRIO que Websrv:=(dmwebclient.HTTPRIO1 as IIServer);
passa a fazer referência aos métodos do Web data:=FormatDateTime(‘dd/mm/yyyy’,dbgpesquisa.
Service, feito isso usamos a função de cálculo de DataSource.DataSet.FieldByName(‘HIRE_DATE’).
idade normalmente passando como parâmetro um AsDateTime);
valor contido no dbgrid. empidade:=Websrv.idade(data);
ShowMessage(‘A idade do funcionário selecionado
Teste o aplicativo e salve as alterações. é:’ + IntToStr(empidade));
end;
Código 4.
Conclusão

Nesse artigo vimos que Web Services são uma


Sobre o autor
excelente alternativa quando precisamos criar Antonio Spitaleri Neto
aplicações distribuídas, seja em rede local ou Web. Consultor Técnico The Club.
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!


antonio@theclub.com.br

Novembro 2009 19
Introdução
ao PL/SQL
PL/SQL (Procedural Language/Struc- como por exemplo as Stored Procedures, Triggers Veja a Figura 2.
tured Query Language) e Functions.
Notem que usamos uma palvra revervada
A PL/SQL é uma extensão da linguagem SQL Veja a Figura 1. INTO para atribuir o valor recuperado no SELECT
para o SGBD Oracle. Com ela é possível construir para a variavel.
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 Figura 1. Bloco Anônimo

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, Figura 2. Bloco Nomeado.

20 Novembro 2009
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 Figura 3. Exemplo de uso da função Random.
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 Figura 4. Exemplo de uso da função CASE.
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.
Figura 5. Exemplo de Loop.

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:
Figura 6. Exemplo de Loop While.
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 7. Exemplo de Loop For.

Novembro 2009 21
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- Figura 8. Criação de sequence.
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- Figura 9. Valor atual da Sequence chamado pelo comando CURRVAL.
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.
Figura 10. Incrementando o valor da Sequence chamado pelo comando NEXTVAL.
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.
Figura 11. Criação da tabela CLIENTE.
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). Figura 12. Criação da Trigger para auto-incremento.

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 13. Inserindo dados em nossa tabela exemplo.

22 Novembro 2009
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;
Figura 14. Valores da tabela Cliente.

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.
Figura 15. Cursor
Atributos de um cursor: Cursores Explícitos
CURSOR <NOME_CURSOR> IS
%FOUND - Sempre que um comando INSERT, Existem três comandos essenciais, OPEN, <SQL>;
UPDATE ou DELETE afetar uma ou mais linhas, este FETCH e CLOSE.
atributo retornará o valor TRUE caso contrário, Cursor com parametros: (Figura 16)
FALSE. OPEN - abre/inicializa o cursor;
%ISOPEN - Para cursores implícitos, o valor é FETCH - Posiciona o cursor no próximo registro CURSOR <NOME_CURSOR>
sempre FALSE pois o oracle fecha o cursor imedia- encontrado. Isto pode ser feito repetidas veses(em <(PARAM1 TYPE [DEFAULT n],
tamente após a execução do comando SQL. um loop) até que todos os registros tenham PARAM2 TYPE [DEFAULT n],
%NOTFOUND - ? exatamente o contrário sido retornados, ou ainda usar a clausula BULK ...)> IS <SQL>;
do atributo %FOUND. Sempre que um comando COLLECT(não será abordado neste artigo) para
INSERT, UPDATE ou DELETE afetar uma ou mais retornar todos os registros de uma só vez ou em Cursor com retorno: (Figura 17)
linhas, este atributo retornará o valor FALSE caso blocos, mais rápido porém há de se ter cuidado
contrário, TRUE. com consumo de memória. CURSOR <NOME_CURSOR>
%ROWCOUNT - ? a quantidade de registros CLOSE - fecha/finaliza o cursor. RETURN <TIPO_RETORNO> IS
afetados por um comando INSERT, UPDATE ou <SQL>;
DELETE ou a quantidade de registros retornados Existem três tipos de cursores explícitos, cur-
em um comando SELECT. sores com parametros, cursores que retornam um Agora que já sabemos como funcionam os
cursor e cursores que não possuem parâmetros e cursores, vamos testar alguns utilizando a tabela
Cursores Implícitos nem retornam nada (o mais usado). CLIENTE criada anteriormente. Apresentaremos
nos exemplos as três formas de implementação
São gerenciados automaticamente pelo PL/ A sintaxe de declaração de cada um dos cur- de cursores explícitos utilizando uma variavel do
SQL. No entanto é possível consultar seus atri- sores é a seguinte: tipo RECORD, um WHILE .. LOOP para percorrer
butos. os registros do cursor, e mostrar alguns dados
Cursor: (Figura 15) desta tabela utilizando o comando DBMS_OUTPUT.
PUT_LINE.

Veja a Figura 15.

Novembro 2009 23
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. Figura 16. Cursor com parâmetros

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- Figura 17. Cursor com retorno
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 18. Exemplo de uso de comandos do Cursor.

24 Novembro 2009
tados por triggers, diretamente no banco, ou
por sistemas externos. Nestes procedimentos, Sobre o autor
podemos passar parâmetros, e fazer programação
de blocos em SQL ou PL/SQL, para executarem Jacson Crauss
determinadas tarefas. 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
Functions 10g

Site: www.cvlink.com.br/site/crauss
Funções, diferentemente de procedimentos,
sempre retornam algum valor, de um tipo pré- crauss@gmail.com
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 Sobre o autor
externo, e jogado ao banco de dados, aumentando
a performance do sistema como um todo e inte- Robison Pereira
gridade dos dados. Consultor Analista da SoftDesign Consultoria e Sistemas
Tecnologias Oracle, Delphi, Java
Foram demonstrados hoje dois recursos que Trabalha com PL/SQL a 8 anos.
vão ser muito usados por quem vai trabalhar com Formado em Análise de Sistemas
Certificações OCA DBA 10g, SCJA
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 robison.rd@terra.com.br
mão na massa, desenvolvendo Packages, Functions,
Stored Procedures e Triggers.

Novembro 2009 25
Auto complete
utilizando

Esse artigo vai de encontro a algumas ?xml version=”1.0” encoding=”ISO-8859-1”?>


solicitações de nossos associados, como um <messages>
autocomplete para aplicações .net, assim <note id=”501”>
como o Google, por exemplo? <to>Alex</to>
A idéia é construir um página contendo <from>Jani</from>
um textoBox e o usuário irá digitar as iniciais <heading>Lembrete</heading>
dos clientes e irá buscar todos os clientes <body>Churrasco</body>
no servidor que se iniciam com as iniciais </note>
digitadas. Isso será feito sem o uso postba- <note id=”502”>
cks no servidor. Utilizaremos o Ajax. Iremos <to>Alexandre</to>
enviar essas letras ao WebService que irá <from>Marcos</from>
consultar um arquivo XML e nos retornará <heading>Re: Lembrete</heading>
um popup com o resultado para a pesquisa, <body>Eu não irei</body>
o autocomplete. </note>

<note id=”503”>
Utilizaremos um extender do ajaxcontroltollkit, <to>taciane</to>
que se chama AutoCompleteExtender. Faça o <from>alexandre</from>
download do AjaxControlTookit em http://www. <heading>Re: Lembrete </heading>
asp.net/ajax/downloads/. Veja também informa- <body>Eu não irei</body>
ções sobre a instalação no Visual Studio 2008 no </note>
mesmo link. <note id=”504”>
<to>marcos</to>
É necessário criar um arquivo XML. Nomei <from>Antônio</from>
como teste.xml. Veja a estrutura do arquivo XML <heading>Reunião </heading>
exemplo (listagem 1). <body>Reunião dia 10/10/09 </body>
</note>
Veja a Listagem 1. <note id=”505”>
<to>Marco</to>
Você pode utilizar qualquer XML que desejar <from>Vitor</from>
e o mesmo deverá estar no mesmo diretório da <heading>Reunião</heading>
aplicação. <body>Churrasco </body>
</note>
Crie uma aplicação. Clique em file new </messages>
Listagem 1

26 Novembro 2009
website. Vamos criar um WebService. Chame o
mesmo de autocomplete. using System;
using System.Collections;
Seu WebService terá essa estrutura padrão using System.Linq;
(listagem 2) using System.Web;
using System.Web.Services;
Veja a Listagem 2. using System.Web.Services.Protocols;
using System.Xml.Linq;
Iremos fazer algumas alterações no script do using System.Collections.Generic;// coleção
webservice criado. generica para leitura das strings que serão
enviadas para o cliente
Veja a Listagem 3. /// <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
Novembro 2009 27
// 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

}
Listagem 3
Vamos testar nosso médoto GetComple- Vamos criar a página default.aspx de acesso ao Vincule o textbox a um AutocompleteExtender
tionList. Clique em chamar e veja o resultado webservice e construir a interface do usuário. que se encontra na seção AjaxToolKit.
(Imagem 1) Adicone um ScriptManager(seção ajax Exten-
der) e um textbox conforme imagem2. Veja a Imagem 2.
Veja a Imagem 1.

28 Novembro 2009
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.

Sobre o autor
Luís Alexandre de Oliveira
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é

alexandre@theclub.com.br

Novembro 2009 29
Horizontal Vertical

30 Novembro 2009
Novembro 2009
Novembro 2009