revista_programar_44
TRANSCRIPT
-
EDITORIAL
2
EQUIPA PROGRAMAR Try { } catch{ }
"(...)dentro de poucos anos as pessoas tero mais facilidade de comunicar atravs
de mquinas do que pessoalmente, cara a cara."
Joseph Licklider,
In: THE COMPUTER AS A COMMUNICATION DEVICE
num misto de receio e orgulho que escrevo o editorial desta edio que a
primeira do ano 2014. Cresci a ler os editoriais da nossa revista e hoje encontro-me
a pensar no que escrever nestas linhas, esperando estar altura dos Grandes que
por aqui deixaram a sua marca e a sua experincia.
Numa poca em que hoje o que j no o ser amanh, marcada principalmente
pela evoluo tecnolgica, desejo-vos a todos um ano marcado positivamente pela
evoluo. Aos amadores e aos profissionais, passando pelos iniciantes, acabando
nos especialistas, sem nunca esquecer os curiosos a todos, que o ano seja de
conquistas.
Chegados a mais uma edio da Programar, a n 44, e aproveitando o facto de o
nmero desta edio, curiosamente, ser uma capicua em que o fim se pode tornar o
incio, quero recordar aos leitores que esta uma revista de ns para vs, mas
tambm de ns por vs. Porque sis vs, leitores que ns movem edio a edio.
Por mais e melhor.
E porque nesta nossa equipa cabe sempre mais um , a todos os que lem estas
linhas deixo o convite Se tiverem uma ideia, concretizem-na. Se tiverem vontade
de partilhar, fora!
Porque a partilha de ideias promove o crescimento intelectual e boas equipas
provocam mudanas. E porque a Programar um reflexo da partilha que existe na
nossa comunidade do P@P.
Numa altura que a tecnologia o mote e que o longe se torna perto Sonhem,
escrevam, programem e concretizem. E se por ventura, tropearem recomecem
de novo. Tornando cada falha um melhoramento pessoal, caminhando em prol da
evoluo. Porque se todos temos dias de Segmentation Fault, a verdade que
tambm todos aprendemos que no haver nunca um try sem um catch.
Porque ns, programadores, somos gente de ideias, e no desistimos!
Por isso e por muito mais Programar ontem, hoje e amanh!
At prxima edio.
Rita Peres
A revista PROGRAMAR um projecto voluntrio sem fins lucrativos. Todos os artigos so da responsabilidade dos autores, no
podendo a revista ou a comunidade ser responsvel por alguma impreciso ou erro.
Para qualquer dvida ou esclarecimento poder sempre contactar-nos.
Coordenador Antnio Pedro Cunha Santos
Editor Antnio Pedro Cunha Santos
Design Srgio Alves
Twitter: @scorpion_blood
Redaco Andr Vala
Cristiano Ramos Igor Nunes
Lus Soares Nuno Santos
Paulo Morgado Pedro Pinto Rita Peres Sara Silva
Virgnia Barata
Staff Antnio Santos
Antnio Silva Jorge Paulino
Rita Peres Rui Gonalves
Contacto revistaprogramar@portugal-a-
programar.org
Website http://www.revista-programar.info
ISSN
1 647-071 0
-
NDICE
3
TEMA DE CAPA
Criando Extenses para Google Chrome (Rafael Almeida)
A PROGRAMAR
COLUNAS
EVENTOS
28 a 28 de Fevereiro XXI SINFO IST Lisboa
11 a 17 de Abril 9 Encontro Nacional de Estudantes de Informtica (Universidade de Aveiro)
Para mais informaes/eventos: http://bit.ly/PAP_Eventos. Divulga os teus eventos para o email [email protected]
JSF - Parte 2 - Como Criar um Projeto JSF (Lus Soares)
Aplicao de Licenas de Utilizador no SharePoint 2013 (Andr Vala)
Funes Annimas (Cristiano Ramos, Joo Silva)
Pascal - Operator Overloading (Igor Nunes)
Quero fazer uma aplicao simples! E agora? Por onde comeo? (Rita Peres)
Desbravando o goto! (Tiago Sousa)
Arduino: const vs #define (Nuno Santos)
Mitos do jQuery (Lus Soares)
C# - Resoluo de Sobrecarga de Mtodo (Paulo Morgado)
6
9
COMUNIDADES
NetPonto - Integrar o Facebook numa aplicao Windows Phone (Sara Silva)
49
52
45
12
15
ANLISES
Gesto de Sistemas e Redes em Linux - 3 Edio (Pedro Pinto)
JavaScript (2. Edio Atualizada) (Sara Freixo)
NO CODE
O Impacto das Novas Tecnologias nas Crianas com Necessidades Educativas Especiais (Virgnia Belo Barata)
58
17
21
36
38
41
50
-
NOTICIAS
4
O seu telemvel pode ajudar a curar
cancro
Num projeto semelhante ao Folding@Home, tambm o poder
de processamento dos telemveis pode ser usado para ajudar
na investigao da luta contra o cancro.
A app Power Sleep, disponvel na Play Store, permite usar o
poder de processamento dos smartphones Android e usar
essa capacidade na investigao contra o cancro. A app foi
criada pela Samsung ustria e pela Universidade de Viena, e
funciona tambm como um alarme. Assim que o utilizador
programa o alarme, a app percebe que o telefone j no vai
ser usado e comea a processar os dados necessrios para o
clculo de comparaes entre sequncias de protenas.
A app est ligada SIMAP, a Similarity Matrix of Proteins,
uma base de dados que usada por investigadores da genti-
ca, bioqumica, biologia molecular e da luta contra o cancro.
O entendimento de como as protenas so dispostas um
dos primeiros passos nestas investigaes, mas requer bas-
tante poder de processamento. Numa altura em que j exis-
tem redes de computadores ligados em todo o mundo para
esta investigao, acrescentar o poder de processamento dos
smartphones vai contribuir para acelerar as descobertas, ex-
plica o Quartz.
Para os utilizadores mais zelosos de bateria e dos custos de
ligaes de dados, os responsveis indicam que a app s usa
o dispositivo se este estiver completamente carregado, ligado
corrente eltrica e com o Wi-Fi ligado.
Veja o vdeo preparado pela Samsung.
Fonte: Exame Informtica
AMD anuncia Opteron A1100 octa-
core ARM de 64 bits para servidores
Quem poderia pensar que os pequenos CPUs ARM, outrora
relegados para utilizaes mais modestas onde o baixo con-
sumo era o factor crtico, viriam a fazer repensar a arquitectu-
ra usada nos servidores? No entanto isso mesmo que est
a acontecer, e a AMD quer estar na vanguarda desta ofensiva
com o seu Opteron A1100.
O mundo de hoje depende da "cloud" para funcionar, e a sus-
tentar essa mesma cloud esto milhes de servidores espa-
lhados pelo mundo - mquinas que esto a funcionar 24h por
dia, 7 dias por semana - e onde os custos energticos, tanto
do seu funcionamento como do seu arrefecimento, acabam
por tambm ser factor decisivo. por isso que o que importa
hoje em dia a relao potncia/consumo e no a "potncia
pura". Ser mais eficiente ter uma dzia de mquinas menos
potentes mas que aqueam menos e gastem menos energia
do que uma s, com potncia idntica, mas que gaste muito
mais energia.
Este Opteron A1100 da AMD um SoC octa-core com cpus
ARM Cortex A57 de 64 bits, e que foi expressamente concebi-
do para ser utilizado em servidores: suportando at 128GB de
RAM, 8 portas SATA3 (com largura de banda suficiente para
utilizar todas ao mximo simultaneamente), 2 portas ethernet
de 10Gbps, e PCIe 3.0.
No me parece difcil imaginar que no vo faltar interessa-
dos... e j dou comigo a imaginar quanto mais tempo faltar
at que estes chips ARM e seus derivados comecem a surgir
em mquinas desktop destinadas ao grande pblico. Mas...
tambm ser de esperar que a Intel esteja a preparar a sua
resposta a esta "ameaa" arquitectura x86 na qual tem do-
minado nas ltimas dcadas. De uma forma ou de outra, vai
ser interessante ver o impacto dos ARM nesta nova rea me-
nos "mobile" a que normalmente os associamos.
Fonte http://abertoatedemadrugada.com/
-
TEMA DE CAPA Criando Extenses para Google Chrome
-
TEMA DA CAPA
6
Atualmente o browser do nosso computador um dos
softwares mais utilizados diariamente, adicionalmente, temos
inmeros plugins que acrescentam funcionalidades extra.
Um plugin um pequeno software desenvolvido para
adicionar funcionalidades extra a softwares maiores, como o
exemplo dos browsers que utilizamos. Os plugins podem-nos
ajudar a automatizar pequenas tarefas no dia-a-dia ou at
melhorar a nossa experincia enquanto utilizadores da Web.
Neste artigo que vos trago hoje, vou explicar como podemos
desenvolver o nosso prprio plugin para o Google Chrome.
Antes de comearmos devers ter como requisitos mnimos,
os seguintes conhecimentos:
HTML
CSS
JavaScript
Para que possamos comear a desenvolver, basta criar um
novo directrio no nosso computador, abrir o nosso editor de
texto preferido e voil, estamos prontos!
Se alguma vez desenvolveste um Website ou aplicao
Web, ento vais habituar-te rapidamente ao desenvolvimento
de plugins
Declaraes
Devemos comear por criar um ficheiro de manifesto, ficheiro
este que contm todas as informaes do nosso plugin,
chamado manifest.json. Este ficheiro nada mais nada
menos do que um ficheiro com o contedo em formato
JSON.
Neste artigo vamos criar um plugin para que nos informe
quais as medidas do browser de uma forma simples.Para
isso, criamos um ficheiro manifest.json com o seguinte
aspecto:
Criando extenses para Google Chrome
Passando explicao:
manifest_version - a verso do ficheiro manifest.json que
acabamos de criar, est atualmente na verso 2, sendo que
ficheiros na verso 1 no sero aceites pelos Google
Chrome.
name - Nome do nosso plugin, o que for definido neste
campo ser visvel publicamente na pgina dos plugins do
Chrome.
description - Breve descrio do plugin, tal como o nome, a
descrio ser visvel na pgina dos plugins do Chrome.
version - Verso atual do nosso plugin, dever ser definido
pelo programador.
icons - Aqui definimos quais os ficheiros a utilizar para as
diversas dimenses dos cones, os
mesmos devem estar no directrio criado anteriormente e
devero ser especificados no manifest.json
browser_action - Aqui definimos o aspecto do cone que
est visvel ao lado da omnibar do
Chrome, especificando quais os cones a utilizar bem como o
ttulo que ser visvel no tooltip por cima do cone.
background - Conjunto de pginas ou scripts a serem
utilizados em plano de fundo. Mais para a frente irei
regressar a este assunto.
{ "manifest_version": 2, "name": "Ruller", "description": "Este plugin diz-nos quais as medi-das atuais do nosso browser.", "version": "1.0", "icons": { "16": "icons/16x16.png", "48": "icons/48x48.png", "128": "icons/128x128.png" }, ! "browser_action": { "default_icon": { "19": "icons/19x19.png", "38": "icons/38x38.png" }, "default_title": "Ruller" }, ! "background": { "scripts": ["background.js"] }, ! "content_scripts": [ { "matches": ["http://*/*", "https://*/*"], "js": ["jquery.min.js","content.js"] } ] } !
-
TEMA DA CAPA
7
content_scripts - So os ficheiros que fazem com que
o nosso plugin funcione. Devemos ter ateno s
dependncias do nosso cdigo, neste caso
necessrio a framework jQuery, logo tempos de
importar primeiro o jQuery. Neste exemplo vamos
usar o ficheiro do jQuery e o content.js, ficheiro que
contm o cdigo a ser desenvolvido. Aqui podemos
acrescentar regras e carregar estes ficheiros apenas
em alguns Websites, neste caso carregamos os
ficheiros para todos!
Background:
O ficheiro que definimos como background no manifesto,
neste caso ir servir como vigia, estando espera que o
utilizador o chame. Neste ficheiro colocamos o seguinte
cdigo:
Explicando, estamos a dizer ao nosso background.js que
assim que for feito um clique no cone do Plugin, este envia
uma mensagem indicando que o clique foi efetuado. Na
mensagem obrigatrio passarmos o id do Tab em que
estamos, bem como uma mensagem, que neste caso uma
string vazia.
Listener
Como vimos anteriormente, assim que o utilizador efetua o
clique no boto do nosso plugin, enviada uma mensagem.
Mas para quem? aqui que entra o ficheiro content.js, que
definimos no manifest.json. No content.js temos o seguinte
cdigo:
O cdigo acima, est espera que seja enviada uma
mensagem. Assim que a mesma enviada este adiciona um
listener, que vai fazer com que ele seja o receptor da
mensagem, executando assim a sua funo. Neste caso, ir
mostrar-nos quais as medidas do nosso browser, no
momento em que damos o clique no nosso plugin.
Utilizao
Agora que temos o nosso plugin feito, vamos colocar o
mesmo em funcionamento, mos obra!
Para isso, basta activarmos o modo de programador do
Google Chrome. Abrimos a pgina dos plugins do Google
Chrome e selecionamos a caixa que diz Modo de
programador.
De seguida, clicamos em Carregar extenso
descomprimida e indicamos onde est o directrio criado
anteriormente. Assim que estiver concludo, podemos ver o
nosso recm criado plugin activado e pronto a utilizar.
Agora que est tudo terminado, podemos testar o nosso
plugin!
Concluses
Com este artigo aprendemos a dar os primeiros passos na
criao de plugins para o Google Chrome.
Aproveito a ocasio para dar a conhecer um plugin
desenvolvido por mim, que tem como objectivo desbloquear
o contedo social em que somos obrigados a dar Like para
que o possamos ver. O plugin chama-se Social Unlocker e
podem obter mais informaes em: http://
www.rafaelalmeida.pt/socialunlocker/
Gostaria de agradecer ao Jorge Paulino pelo convite e pela
oportunidade. Espero que tenham gostado e espero que
este artigo sirva de ajuda para que possam criar os vossos
plugins!
CRIANDO EXTENSES PARA GOOGLE CHROME
chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.getSelected(null, function(tab) { chrome.tabs.sendMessage(tab.id, ""); }); });
chrome.extension.onMessage.addListener(function() { var width = $(window).width(); var height = $(window).height(); alert("Largura:" + width + "\nAltura: " + height); });
Escrito por Rafael Almeida
Aluno de Eng. Informtica da Universidade Fernando Pessoa. Programador Free-Lancer e autor do Plugin Social Unlocker.
http://www.rafaelalmeida.pt
-
A PROGRAMAR JSFParte 2 Como Criar um Projeto JSF
Aplicao de Licenas de Utilizador no SharePoint 2013
Funes Annimas
PascalOperator Overloading
Quero fazer uma aplicao simples! E agora? Por onde comeo?
Desbravando o goto!
Arduino: const vs #define
Mitos do jQuery
-
A PROGRAMAR
9
Este segundo artigo da srie incidir sobre o processo de
instalao e configurao do ambiente de desenvolvimento
para um projeto JSF, que comprovar o sucesso da opera-
o. De seguida, analisaremos a estrutura do mesmo e fare-
mos as primeiras modificaes. Em resumo, o artigo divide-
se em:
Instalao do JDK: o SDK do Java
Instalao do IDE: o NetBeans com plugins Java EE
Instalao e registo de um servidor aplicacional para
Java: o Tomcat
Configurao e explicao de um projeto JSF
(se j tem o NetBeans e o JDK no sistema ento salte
para o passo 4)
Se ainda no tem nada instalado, pode obter um 2
em (JDK+IDE) no site de downloads da Oracle. Aqui,
procure pelo link da verso do JDK com o NetBeans;
no ecr posterior, realize o download para o seu S.O./
arquitetura.
Se, por outro lado, j tem o JDK no sistema, ento deve ir
diretamente ao site de downloads do NetBeans. Aqui, deve
sacar a verso do NetBeans Java EE.
2. Instale a verso que tiver transferido.
3. Abra o NetBeans
Nota: no caso de ter obtido a verso IDE+SDK, h um passo
adicional: deve ir a Tools > Plugins > Available Plugins,
JSF - parte 2 - Como Criar um Projeto JSF selecionar os plugins da categoria Java Web and EE e ins-
tal-los (em Install). De seguida, deve reiniciar o IDE.
4. (se j tem o Tomcat no seu PC, salte para o passo 6)
Vamos instalar agora o servidor aplicacional (web
server).
Dirija-se pgina de downloads do Tomcat e opte
pelo download adequado ao seu S.O./arquitetura.
5. Descompacte o ficheiro do servidor para uma pasta
sua escolha.
6. Agora que tem o JDK, o IDE e o servidor aplicacional
instalados, est pronto para criar um projeto JSF.
-
A PROGRAMAR
10
Vamos criar um projeto do zero. Para tal, v a File >
New Project e selecione Java Web > Web Applica-
tion.
Nota: Com o tipo de projeto criado, quem ir gerir as bibliote-
cas (dependncias) associadas aos projeto ser o NetBeans.
O Maven uma alternativa quando as coisas se complicam
(nesse caso deve escolher Maven > Web Application).
Se preferir, pode criar um projeto com base num sample pro-
ject. Para tal, no ecr de New Project, deve selecionar
Samples e escolher um projeto que lhe agrade, partida den-
tro de HTML5, Java EE ou Maven.
Em ambos os casos, o resto do tutorial no se aplica.
Clique em Next.
7. Deve agora dar um nome ao projeto e fazer Next:
8. (se j tinha o Tomcat registado no NetBeans salte para
o passo 11)
Como o NetBeans ainda no sabe da existncia do
Tomcat, devemos agora regist-lo (num prximo projeto
ele j estar disponvel e isto no ser mais necess-
rio). Para tal, clique em Add, ao lado de Server:
9. Selecione Apache Tomcat e clique em Next:
10. Neste ecr de configurao:
- indique a pasta base para onde descompactou o
Tomcat no passo 5 (Browse);
- insira admin/admin nos campos Username e
Password;
- clique em Finish.
11. Nesta altura j dever ter o Tomcat presente e seleci-
onado na listagem, pelo que dever pressionar Next:
12. Poder agora indicar as bibliotecas iniciais (jars) a
associar ao projeto. Selecione o JavaServer Fa-
ces (JSF) e faa Finish:
JSF - PARTE 2 - COMO CRIAR UM PROJECTO JSF
-
A PROGRAMAR
11
13. Agora j tem tudo configurado, est pronto para correr o
projeto. Para tal, clique no boto de Run Project:
Voil depois de alguns instantes ver uma pgina do
browser com um Hello from Facelets!
Vamos ento conhecer um pouco melhor as entranhas do pro-
jeto. A melhor maneira olhar para a tab Projects. Esta tab
tem a organizao lgica do projeto, organizando os ficheiros
por categoria e no por como realmente esto no sistema de
ficheiros (para isso, use a tab Files).
Web Pages: onde encontrar os Facelets do projeto. Em
MVC, so a view. Estes ficheiros representam o markup (com
componentes JSF) que ser convertido para HTML (so substi-
tutos dos JSP). So materializados em ficheiros .xhtml.
Source Packages: o cdigo Java propriamente dito, nomea-
damente os managed beans. Os managed beans so o
controller em MVC, ou seja, o backing code (ou seja API)
disponibilizada aos componentes presentes nos Facelets. Por
exemplo, poderiamos ter um managed bean chamado
Carrinho.java com os mtodos getProdutos, compra,
adicionaProduto, retiraProduto, etc. Depois, num Facelet,
era possvel ter a expresso #{carrinho.produtos} (o get
implcito e o p passa a minsculo).
Esta mesma pasta pode tambm conter servios, DAOs,
validadores, conversores, classes do domnio, DTOs, entre
outros.
Libraries: onde esto representadas as bibliotecas neces-
srias ao projeto. Encontrar l, no mnimo, o JDK e uma
implementao da norma JSF. Futuramente, poder ter uma
biblioteca de componentes (ex.: o PrimeFaces) (se o projeto
fosse do tipo Maven, esta pasta seria substituida por
Dependencies e Java Dependencies).
Configuration Files: os ficheiros de configurao do pro-
jeto. Por exemplo, o ficheiro web.xml que contem algumas
configuraes de alto nvel do projeto (por exemplo, o servlet
do JSF). O context.xml define em que endereo o projeto
lanado no browser (se o projeto fosse do tipo Maven, esta
pasta seria substituida pela Project Files e teria um
pom.xml para gerir as bibliotecas incluidas).
O prximo artigo ensinar a criar um managed bean e a fa-
zer uso do mesmo num Facelet.
JSF - PARTE 2 - COMO CRIAR UM PROJECTO JSF
AUTOR Escrito por Lus Soares
Formado em Engenharia Informtica e de Computadores no Instituto Superior Tcnico (Licenciatura e Mestrado). Sou web developer, _tendo j colaborado em projetos de telecomunicaes e dos _media. Gosto de linguagens de alto nvel, de reutili-
zar cdigo, de refactoring para simplificar. Gosto de ensinar. Escrevi um livro sobre jQuery (goo.gl/nw2Zb). Os meus contactos esto em luissoares.com, para qualquer dvida sobre o artigo ou outra informao.
O Maven e uma al-
ternativa quando as
coisas se complicam
(nesse caso deve esco-
lher Maven > Web Ap-
plication).
-
A PROGRAMAR
12
De entre as vrias novas funcionalidades includas no Share-
Point 2013, h uma que injustamente me passou desperce-
bida at recentemente: User License Enforcement
(Aplicao de Licenas de Utilizador). Digo injustamente
porque uma funcionalidade que j fazia falta h muito tem-
po e acho que merece mais ateno do que tem recebido.
At agora, qualquer utilizador com acesso a uma farm de
SharePoint teria acesso a todas as funcionalidades includas
na edio instalada do SharePoint (Standard ou Enterprise),
independentemente do nvel de CAL (Client Access License)
que lhe esteja associado. Isto significa que, se uma empresa
possui uma farm de SharePoint com licena Enterprise, qual-
quer utilizador conseguir aceder a todas as funcionalidades
Enterprise, mesmo que lhe tenha sido atribuda uma CAL
Standard.
Na maioria das grandes empresas, por questes de otimiza-
o de custos, bastante comum encontrar cenrios em que
apenas so atribudas licenas Enterprise a alguns utilizado-
res, ficando todos os outros com licenas Standard. Uma das
formas de assegurar que cada utilizador consegue aceder
apenas s funcionalidades includas no seu nvel de licena
ter duas farms de SharePoint separadas, uma com edio
Standard e outra com a edio Enterprise. No entanto, esta
no uma soluo aceitvel na maioria dos casos.
O SharePoint 2013 resolve esta questo com a nova capaci-
dade de Aplicao de Licenas de Utilizador (ou User Licen-
se Enforcement) que permite mapear licenas com utilizado-
res especficos ou com grupos de Active Directory. Quando o
User License Enforcement est ativo, os utilizadores conse-
guem aceder apenas s funcionalidades includas na sua
licena, as restantes sero bloqueadas. Quando est inativo,
que a opo por omisso, o SharePoint funciona como nas
verses anteriores.
A gesto do User License Enforcement realizada exclusi-
vamente atravs de cmdlets de PowerShell na SharePoint
2013 Management Shell. Existem oito cmdlets que so expli-
cados em detalhe mais abaixo:
Get-SPUserLicensing
Enable-SPUserLicensing
Disable-SPUserLicensing
Get-SPUserLicense
Get-SPUserLicenseMapping
New-SPUserLicenseMapping
Aplicao de Licenas de Utilizador no SharePoint 2013 Add-SPUserLicenseMapping
Remove-SPUserLicenseMapping
Ativar e Desativar o User License Enforcement
Para validar se esta funcionalidade est ativa, deve ser utili-
zado o cmdlet Get-SPUserLicensing na consola de gesto
do SharePoint 2013. Retornar true se a funcionalidade est
ativa, e false caso contrrio (ver Figura 1). Como indicando
anteriormente, o User License Enforcement est inativo por
omisso.
Figura 1 Utilizao do cmdlet Get-SPUserLicensing
Para o ativar, basta executar o cmdlet Enable-
SPUserLicensing. Para o desativar, basta executar o cmdlet
Disable-SPUserLicensing. Nenhum dos cmdlets requer
parmetros ou retornar (ver Figura 2).
Figura 2 Utilizao dos cmdlets Enable-SPUserLicensing e Disable
-SPUserLicensing
Agora que j falmos sobre como ativar e desativar o User
License Enforcement, aconselhvel mant-lo desativado
at que esteja corretamente configurado. De outra forma
poder, involuntariamente, bloquear o acesso s funcionali-
dades Enterprise para utilizadores que deveria ter acesso a
elas, ou permitir o acesso a funcionalidades que os utilizado-
res no deveriam ser autorizados a aceder.
-
A PROGRAMAR
13
Obter Licenas Disponveis
Para validar quais as licenas que esto disponveis na sua
farm de SharePoint, poder utilizar o cmdlet Get-
SPUserLicense (ver figura 3).
Figura 3 Utilizao do cmdlet Get-SPUserLicense
Existem cinco tipos de licena (embora na minha farm existam
apenas quatro):
Enterprise
Standard
Project
OfficeWebAppsEdit
Duet
As licenas Enterprise e Standard correspondem s duas
edies do SharePoint Server, que j existem h vrias ver-
ses do produto. Para consultar as diferenas entre as duas,
basta aceder ao TechNet: http://technet.microsoft.com/en-us/
library/sharepoint-online-service-
description.aspx#bkmk_FeaturesOnPremise.
Quanto aos outros tipos: a licena Project utilizada para con-
trolar o acesso s funcionalidades de Project Server, a licena
OfficeWebAppsEdit utilizada para permitir aos utilizadores a
edio de documentos nas Office Web Apps, e a licena Duet
utilizada para permitir o acesso s funcionalidades do Duet
(integrao entre SharePoint e SAP).
Mapeamento de Licenas de Utilizador
Mapear utilizadores em licenas , na prtica, mapear claims
em direitos. Para criar um novo mapeamento necessrio
executar o cmdlet New-SPUserLicenseMapping que pode ser
utilizado de vrias formas, dependendo do tipo de claim que
est a ser mapeado.
Pode mapear-se um grupo de Active Directory numa licena,
executando o seguinte comando:
tambm possvel mapear um Forms-based Role numa
licena usando os parmetros RoleProvider e Role em
vez do parmetro SecurityGroup:
Finalmente, possvel mapear uma claim numa licena utili-
zando os parmetros ClaimType, -OriginalProvider e
Value, ou apenas o parmetro Claim com uma referncia
para um objecto SPClaim.
Figura 4 Utilizao do cmdlet New-SPUserLicenseMapping
Aquando da criao do mapeamento, ainda possvel espe-
cificar qual a Web Application a que o mesmo se aplica, per-
mitindo a configurao de licenas de utilizador por web ap-
plication. Se no for especificada uma web application, o
mapeamento aplicado a toda a farm.
Uma vez criado o mapeamento, necessrio executar o
cmdlet Add-SPUserLicenseMapping para o adicionar
farm:
Obter Mapeamentos de Licenas de Utilizador
Para verificar quais os mapeamentos configurados na farm,
pode utilizar-se o cmdlet Get-SPUserLicenseMapping sem
quaisquer parmetros. Note-se que os mapeamentos defini-
dos ao nvel de uma web application no sero retornados
quando se obtm os mapeamentos definidos para toda a
farm.
Figura 5 Utilizao do cmdlet Get-SPUserLicenseMapping
APLICAO DE LICENAS DE UTILIZADOR NO SHAREPOINT 2013
$mapping = New-SPUserLicenseMapping SecurityGroup Enterprise Users License Enterprise
$mapping = New-SPUserLicenseMapping RoleProvider MyRoleProvider Role Enterprise Users License Enterprise
Add-SPUserLicenseMapping Mapping $mapping
-
A PROGRAMAR
14
Para listar os mapeamentos configurados para uma web appli-
cation especfica, basta adicionar o parmetro Web Applicati-
on com o respetivo endereo URL.
Remover Mapeamentos de Licenas de Utilizador
Para remover um mapeamento utiliza-se o cmdlet Remove-
SPUserLicenseMapping. O nico parmetro obrigatrio a
identidade do mapeamento (um GUID) que facilmente obtido
executando o cmdlet Get-SPUserLicenseMapping.
Efeitos do User License Enforcement
No que respeita ao User License Enforcement, as duas per-
guntas mais comuns so:
Onde que a licena aplicada?
O que acontece quando um utilizador tenta aceder a
uma funcionalidade que no est disponvel para o seu
tipo de licena?
Sobre a primeira pergunta, a licena aplicada nas seguintes
situaes:
Quando acedida uma pgina com web parts que re-
querem uma licena especfica (por exemplo a Excel
Viewer Web Part ou InfoPath Form Viewer);
Ao aceder galeria de web parts para adicionar uma
nova web part a uma pgina;
Ao selecionar um site template na criao de um novo
site;
Ao tentar editar um documento nas Office Web Apps.
Em relao ao que acontece nestas situaes, h duas hipte-
ses:
Um utilizador sem a licena exigida no ver os compo-
nentes aos quais no tem acesso (web parts e site tem-
plates); ou
O SharePoint negar o acesso ao componente para o
qual o utilizador no tem licena, apresentando-lhe uma
mensagem que explica a razo pela qual no pode ace-
der-lhe.
Notas Adicionais
H algumas notas adicionais que me parece importante lem-
brar:
A funcionalidade de User License Enforcement est
disponvel apenas para ambientes SharePoint 2013
On Premise. O SharePoint Online utiliza um modelo
de licenciamento por utilizador pelo que no necessita
desta funcionalidade para controlar o acesso a funcio-
nalidades especficas.
O User License Enforcement s funciona com Web
Applications que usem autenticao baseada em
Claims.
Uma vez ativado, ter que ser associada uma licena
a todos os utilizadores, at s contas de servio. Se
nos esquecermos de associar uma licena a um utili-
zador, este ser classificado como Unlicensed e ser-
lhe- vedado o acesso maioria das funcionalidades
do SharePoint.
RefernciasPoder encontrar informao adicional sobre
cmdlets PowerShell no TechNet: http://
technet.microsoft.com/en-us/library/jj219609.aspx.
APLICAO DE LICENAS DE UTILIZADOR NO SHAREPOINT
AUTOR Escrito por Andr Vala
Licenciado e Mestre em Engenharia Informtica e de Computadores pelo Instituto Superior Tcnico, actualmente consul-
tor snior na |create|it| e co-fundador da Comunidade Portuguesa de SharePoint. Autor do blog http://bit.ly/WxtVLz,
trabalha com SharePoint desde 2006, altura em que surgiu a primeira verso beta do SharePoint 2007. Tem participado
em vrios projectos nacionais e internacionais sobre SharePoint, e participa frequentemente como orador em eventos da
Microsoft relacionados com o mesmo tema.
a nova capacida-
de de Aplicacao de Li-
cencas de Utilizador
que permite mapear li-
cencas com utilizado-
res especificos ou com
grupos de Active Direc-
tory.
-
A PROGRAMAR
15
Neste artigo vamos falar de funes annimas, da sua histria,
a sua usabilidade e ainda mostrar dois exemplos de implemen-
tao. Um ser em Python, enquanto o segundo ser em Ja-
vaScript, ou seja, mais orientado para o contexto Web. Mas
antes de falarmos em funes annimas vamos primeiro refletir
sobre o que uma funo, que algo, ligeiramente, complica-
do de explicar a um leigo em programao.
J pensaram no que responderiam se lhes perguntssem o
que uma funo? A mais simples resposta era fazer uma
analogia com a matemtica: algo que aceita valores de entra-
da, transforma-os de alguma maneira e retorna algo no fim.
Continuando com a analogia, em matemtica, costumamos dar
nome s funes, assim como damos enquanto estamos a
programar, mais corretamente designado por identificador.
Agora imagine que tem uma funo, mas que esse identifica-
dor no existia. Esta seria uma funo que no tinha de estar
ligada a qualquer identificador. Aqui temos o princpio bsico
das funes annimas.
No presente artigo, vamos trat-las por funes anni-
mas, mas so tambm conhecidas por funes lambda, por
terem sido criadas a partir do trabalho de Alonzo Church en-
quanto desenvolvia o clculo lambda. Elas so tpicas de lin-
guagens funcionais, como o Haskell, Lisp, Ocaml, entre outras.
Com o passar dos anos, outras linguagens arranjaram meca-
nismos de implementar estas funes como por exemplo C#,
JavaScript, Python ou ainda Ruby.
Coloca-se uma nova questo: se estamos felizes com as fun-
es comuns e parecem funcionar to bem, porque devemos
usar funes annimas? E quando devemos us-las? Depen-
dendo da linguagem com que estamos habituados a progra-
mar, j deve ter surgido aquela situao em que o parmetro
de uma funo outra funo. Aqui teriamos de declarar uma
funo no incio ou no fim do bloco de cdigo para ser usada
uma nica vez. Com as funes annimas, e caso a linguagem
suporte closure ganhamos uma maior simplicidade no cdigo,
escrevendo estas funes estrategicamente colocadas onde
so usadas. So tambm muito utilizadas na tcnica de Cur-
rying, para transformar funes de mltiplos parmetros numa
cadeia de funes, onde apenas passado um de cada vez.
Posto tudo isto, e como cada caso um caso, vamos meter
mos obra, primeiro com Python e depois com JavaScript,
como j havia sido referido.
Em Python, ao contrrio de JavaScript, o uso de funes an-
nimas assegurado atravs da palavra reservada lambda,
baseando-se no nome original dado a este tipo de funes, tal
como descrito em cima. Este tipo de funes podem ser defini-
das em qualquer local do cdigo e, como j referido anterior-
mente, sem um identificador respetivo. So muito utilizadas
como complemento s funes de manuseamento de listas e
outras estruturas semelhantes, tal como o map, filter e redu-
ce. Para tornar mais claro esta informao segue em baixo a
respresentao de duas funes, uma annima e outra no.
A verso utilizada do Python foi a 2.7.
1 Clculo do nmero N da sequncia de Fibonacci, utilizan-
do funes normais.
2 Clculo do nmero N da sequncia de Fibonacci, utilizan-
do funes annimas.
No exemplo em cima apresentado podemos ver que em am-
bos os casos calculado a soma dos N primeiros elementos
da sequncia de Fibonacci. No primeiro caso apresentada
a funo fib_normal(N) que retorna essa soma, enquanto
que no segundo caso o clculo feito recorrendo declara-
o do lambda, que retorna essa mesma soma na varivel
fib_anonima.
Em JavaScript, no se torna muito diferente do exemplo an-
terior. Para declararmos uma funo em JavasScript pode-
mos fazer de duas formas:
1 Declarando uma funo com o seu nome, neste
caso myFunction:
2 Ou ainda, usando o operador de funo, tornando assim
a funo annima:
Repare-se que neste ltimo caso a funo no tem nome.
A grande diferena entre estes dois tipos, em termos de exe-
cuo em JavaScript, que as funes declaradas normal-
mente so movidas para o incio do cdigo e so criadas
desde que o programa comea a execuo. As que so es-
critas com o operador apenas so geradas quando chega o
momento de as utilizar.
Este mecanismo permite uma diminuio do tempo de com-
pilao, no entanto no permite a avaliao, por parte do
compilador, de potenciais erros de execuo que possam
ocorrer durante a execuo do programa.
Funes Annimas
def fib_normal(N): return N if N
-
A PROGRAMAR
16
Vamor ver outro exemplo em que as funes annimas so
habitualmente usadas em JavaScript:
Neste exemplo, podemos ver que as instrues a desempe-
nhar pela funo representada pela varivel myFunction sero
diferentes consoante o valor de x.
Concluso:
As funes annimas devem ser usadas conforme a experi-
ncia, a linguagem de desenvolvimento e o objetivo do pro-
gramador, tendo em conta que, normalmente, as solues
desenvolvidas com recurso a estas so mais elegantes e
fceis de ler. Mais ainda podemos concluir que com o apare-
cimento do paradigma funcional nas linguagens de progra-
mao possvel utilizar todo potencial deste tipo de fun-
es.
Esperamos ter agradado os leitores.
FUNES ANNIMAS
var myFunction; if (x != 0) { myFunction = function () { alert("!=0") } } else { myFunction = function () { alert("= 0") } }
AUTOR Escrito por Joo Silva
Estudante de Engenharia Informtica na UBI
www.linkedin.com/in/joaopfsilva
AUTOR Escrito por Cristiano Ramos
Estudante de Engenharia Informtica na UBI
www.cdgramos.com
[...] se estamos fe-
lizes com as funcoes
comuns e parecem fun-
cionar tao bem, porque
devemos usar funcoes
anonimas? E quando
devemos usa-las?
Agora imagine
que tem uma funcao,
mas que esse identifica
- dor nao existia. Esta
seria uma funcao que
nao tinha de estar liga-
da a qualquer identifi-
cador. Aqui temos o
principio basico das
funcoes anonimas.
-
A PROGRAMAR
17
Vrias so as linguagens nas quais podemos fazer overload
de funes; esta funcionalidade permite que uma funo
possua vrias verses que admitam diferentes conjuntos de
argumentos, ficando o compilador encarregue de seleccionar
qual dos overloads o correcto aquando da invocao des-
sa funo. Uma das linguagens com essa capacidade o
Object Pascal moderno.
Em Pascal, este tipo de polimorfismo tambm se aplica aos
operadores, os quais podem de igual forma ser overloaded.
Na definio da linguagem Pascal segundo a documentao
do Free Pascal, os tokens (palavras que constituem o cdigo
do nosso programa) podem pertencer a vrias categorias,
cada uma delas com funes ou caractersticas particulares.
Uma dessas categorias a dos operadores, os quais so
um smbolo ou conjunto de dois smbolos, com uma funo
especfica, admitindo um ou dois operandos e devolvendo
um resultado. Os operadores so habitualmente funes
com nomes e sintaxe especiais (nomes compostos por sm-
bolos e invocao infixa, por oposio tradicional invoca-
o prefixa).
Dentro destes operadores, muitos deles podem ser overloa-
ded, permitindo ao programador defini-los para novos tipos
de operandos, e com comportamentos diferentes do habitu-
al, aumentando assim a expressividade do cdigo. A isto
chamamos operator overloading, objecto de estudo do
presente artigo.
Todo o cdigo do artigo foi compilado com Free Pascal Com-
piler, verso 2.6.2, em ambiente GNU/Linux (Ubuntu 12.04
LTS).
Overload de operadores aritmticos
Nem todos os operadores podem ser overloaded, mas os
mais comuns podem: os operadores de atribuio, aritmti-
cos e de comparao.
Vamos partir de casos prticos para entender como se faz
overload de operadores em Free Pascal. Imagine-se, por
exemplo, que pretendemos multiplicar os valores de um ar-
ray de nmeros inteiros, do tipo Integer, por um nmero tam-
bm ele Integer, retornando um novo array.
Regra geral, o que ns fazemos iterar pelos elementos do
array, aplicando o dito clculo. O resultado pode ficar no
mesmo array ou ser atribudo a um novo. Decerto o leitor j
teve situaes nas quais necessitou de realizar aplicao de
clculos simples a um array e tornou-se possivelmente can-
Pascal operator overloading sativo implementar estes ciclos, mesmo com recurso a fun-
es.
Com a capacidade de overloading dos operadores torna-se
possvel reduzir o rudo do cdigo. Para tal, implementamos
numa unit os overloads que nos forem teis.
Podemos, ento, comear a tirar apontamentos acerca da
sintaxe da implementao de operating overloading:
Operator uma palavra reservada comummente no reco-
nhecida pela esmagadora maioria dos editores de texto e
IDE's (embora muitos nos permitam definir palavras reserva-
das adicionais). No entanto, uma palavra reservada que
equivale essencialmente function ou procedure. Neste
caso, indica ao programa que vai haver um overload de um
operador pr-existente, representado por simbolo.
Entre parntesis indicamos os operandos, tal como o faze-
mos com os argumentos de uma funo (afinal de contas,
um operador uma funo com dois argumentos). De segui-
da, vem algo que difere da sintaxe comum: aparece um novo
identificador. Em Pascal (Standard e Free Pascal), o resulta-
do de uma funo atribudo a uma varivel local com nome
igual ao da prpria funo; no caso de um operador no
existe um identificador alfanumrico mas sim um smbolo (o
operador), o qual um nome vlido para uma varivel, e ao
qual no pode ser atribudo um valor. Portanto, temos de
criar o identificador que represente o resultado. Especifica-
mos o seu nome, por conseguinte, aps a declarao dos
operandos, seguido do tipo de dados de output.
Vejamos com mais pormenor a seguinte implementao:
Estamos a fazer overload ao operador de multiplicao *, o
qual tem dois operandos: n, do tipo integer, que vai ficar
esquerda do operador, e list, do tipo TIntegerArray, que vai
ficar direita. O resultado da operao ser atribudo ao
identificador res, e -nos indicado que o output do tipo TIn-
tegerArray.
No podemos indicar de forma explcita que o tipo de dados
array of integer, uma vez que o compilador no o aceita.
operator simbolo (operando1 : tipo1; operando2 : tipo2) resultado : tipo3;
operator * (n : integer; list : TIntegerAr-ray) res : TIntegerArray; var i : word; begin SetLength(res, Length(list)); for i := Low(list) to High(list) do res[i] := n * list[i]; end;
-
A PROGRAMAR
18
Deste modo, temos de criar um novo tipo de dados de modo a
que possamos fornecer este tipo na forma de um identificador.
A partir do momento em que temos este overload definido,
podemos utilizar o operador * para multiplicar uma varivel do
tipo integer por outra do tipo TIntegerArray. No entanto, foi
referido que um ficava direita e outro esquerda. Vejamos o
que acontece se tentarmos compilar o seguinte cdigo (o over-
load do operador est na unit operover (de Operator Overlo-
ading) uma unit prpria onde iremos colocar o cdigo).
O Free Pascal vai indicar o seguinte:
Ns definimos que o primeiro operando integer, e ns forne-
cemos-lhe um TIntegerArray. Isto acontece porque o overlo-
ading de operadores sensvel ordem pela qual recebe os
operandos. Vamos, portanto, criar um segundo overload que
define a ordem inversa dos operandos:
Desta vez, a varivel do tipo TIntegerArray aparece esquerda
do operador, e a integer direita. Para implementar este over-
load recorremos ao overload definido anteriormente. A partir
deste momento, podemos multiplicar um integer por um TInte-
gerArray em qualquer ordem. Vamos testar o cdigo anterior, e
consideremos que list1 tem os valores {2, 7, 5, 9, 4}; este o
output do programa:
Como podemos verificar, list2 possui os valores de list1 multi-
plicados por 2 e pela ordem original. O nosso operador overlo-
aded funcionou. Podemos fazer o mesmo para a soma. No
entanto, a subtraco e a diviso no tm a propriedade comu-
tativa, ou seja, a-b no o mesmo que b-a, e a/b no o mes-
mo que b/a. Nestes casos, talvez seja de vital importncia
definir bem o overloading para cada ordem de operandos.
Isto , 5-list dever dar um resultado diferente de list-5.
Vamos continuar com o overload do operador de adio +.
Como se pode verificar, em tudo igual ao overload do ope-
rador *. De seguida iremos implementar o overload do ope-
rador de subtraco -. No entanto, para aumentar a versati-
lidade dos operadores e tornar, por ltimo, esta implementa-
o mais compacta, iremos primeiro implementar o menos
unrio (o operador - que indica um valor negativo, como -
4):
Este operador s tem um operando, direita. Neste momen-
to podemos definir o overload do operador -, de subtraco,
de forma bastante compacta:
Repare-se que recorremos ao operador + e, no primeiro
caso, ao menos unrio para definir estes overloads. Poda-
mos ter feito com ciclos, mas esta uma tcnica que permite
poupar algumas linhas de cdigo, tornando o cdigo mais
legvel.
Resta-nos o operador de diviso /, que retorna um nmero
real. Todavia, o nosso output tem sido um array of integer.
Para este caso, necessitaremos de um novo tipo de dados
para o output:
PASCAL - OPERATOR OVERLOADING
type TIntegerArray = array of integer;
{$mode objfpc} program artigo44; uses operover; var list1 : TIntegerArray = nil; list2 : TIntegerArray = nil; i : integer; begin (* Cdigo que adiciona valores a list1 *) list2 := list1 * 2; for i := Low(list1) to High(list1) do writeln('2 * ', list1[i] : 2, ' = ', list2[i] : 2); end.
artigo44.pas(16,20) Error: Operator is not over-loaded: "TIntegerArray" * "ShortInt"
operator * (list : TIntegerArray; n : integer) res : TIntegerArray; begin res := n * list; end;
2 * 2 = 4 2 * 7 = 14 2 * 5 = 10 2 * 9 = 18 2 * 4 = 8
operator + (n : integer; list : TIntegerArray) res : TIntegerArray; var i : word; begin SetLength(res, Length(list)); for i := Low(list) to High(list) do res[i] := n + list[i]; end; operator + (list : TIntegerArray; n : integer) res : TIntegerArray; begin res := n + list; end;
operator - (list : TIntegerArray) res : TIntegerArray; var i : word; begin SetLength(res, Length(list)); for i := Low(list) to High(list) do res[i] := -list[i]; end;
operator - (n : integer; list : TIntegerArray) res : TIntegerArray; begin res := n + (-list); end; operator - (list : TIntegerArray; n : integer) res : TIntegerArray; begin res := (-n) + list; end;
type TRealArray = array of real;
-
A PROGRAMAR
19
Repare-se que recorremos ao operador + e, no primeiro caso,
ao menos unrio para definir estes overloads. Podamos ter
feito com ciclos, mas esta uma tcnica que permite poupar
algumas linhas de cdigo, tornando o cdigo mais legvel.
Resta-nos o operador de diviso /, que retorna um nmero
real. Todavia, o nosso output tem sido um array of integer.
Para este caso, necessitaremos de um novo tipo de dados
para o output:
Vamos trocar por midos: se fizermos {1,2,3}>={1,4,2} iremos
obter False. Os arrays tm o mesmo tamanho, mas o segundo
par de elementos (o 2 do primeiro array, e o 4 do segundo) no
cumprem a comparao: 2>=4 falso, pelo que a comparao
dos arrays vai retornar False.
No implementamos os operadores de igualdade e de diferen-
a pelo simples motivo de estes, por defeito, j terem a capaci-
dade de comparar arrays.
Para implementar estes overloads de forma compacta, vamos
analisar a seguinte propriedade matemtica:
a>b o mesmo que b (list1, list2 : TIntegerArray) res : boolean; var i : word; begin res := Length(list1) = Length(list2); if res then for i := Low(list1) to High(list1) do if not(list1[i] > list2[i]) then begin res := false; break; end; end;
operator < (list1, list2 : TIntegerArray) res : boolean; begin res := list2 > list1; end;
operator in (n : integer; list : TIntegerArray) res : boolean; var elem : integer; begin res := false; for elem in list do if n = elem then begin res := true; break; end; end;
type TIntegerArray = array of integer; TByteSet = set of byte; operator := (list : TByteSet) res : TIntegerArray; var elem : byte; begin res := nil; for elem in list do begin SetLength(res, Length(res)+1); res[High(res)] := elem; end; end;
-
A PROGRAMAR
20
Concluso
Consideremos a implementao de todos estes overloads nu-
ma unit denominada operover, tal como foi referido ao longo do
artigo. Vamos test-la com o seguinte programa:
O output deste programa o seguinte:
Como podemos constatar, apesar do set ter sido fornecido
numa ordem aleatria, os dados foram colocados por ordem
crescente, isto por causa do modo como funciona o tipo de
dados set. Podemos portanto concluir que os operadores
esto a funcionar conforme era a nossa inteno.
Desta forma terminamos esta incurso pelo mundo do over-
loading de operadores em Free Pascal. Basicamente qual-
quer tipo de dados pode ser fornecido a um operador, desde
que seja feito o seu overload. Esta uma ferramenta que
permite tornar a linguagem muito mais expressiva, compacta
e at intuitiva.
PASCAL - OPERATOR OVERLOADING
{$mode objfpc} program artigo44; uses operover; var list1 : TIntegerArray = nil; list2 : TIntegerArray = nil; i : integer; begin list1 := [2,7,5,9,4]; list2 := -list1 * 2; for i := Low(list1) to High(list1) do writeln('2 * ', -list1[i]:2, ' = ', list2 [i]:3); writeln('list1 > list2? ':16, list1 > list2); writeln('list1
-
A PROGRAMAR
21
No artigo da edio anterior falamos em rvores de vanta-
gem na linguagem C, em que utilizamos como exemplo prti-
co um stand de automveis. Aproveitando o mote do stand
de automveis, nesta edio trago-vos um programa simples
acerca da gesto dessas viaturas.
Ao contrrio do que costume, desta vez a linguagem base
deste artigo o C# com uma ajuda por parte do SQL. Desta
vez a escolha recaiu na linguagem C# pelo simples motivo
de que no meu entender, criar interfaces grficas mais
rpido e simples faz-lo usando o C# do que o C.
Ao longo do artigo vamos explicar de forma simples e sem
grandes algoritmos como fazer de forma rpida uma peque-
na aplicao que interaja com uma base de dados.
Este portanto um artigo mais vocacionado a todos os nos-
sos os leitores que ainda esto a dar os primeiros passos
neste tipo de aplicao, at porque a ideia deste artigo sur-
giu das dificuldades que eu prpria senti quando recente-
mente iniciei numa nova etapa.
Vamos por partes ento o que precisamos para este arti-
go?
Do SQL Server, que para este artigo foi utilizada a
verso Express que pode ser obtida gratuitamente no
site da Microsoft (http://www.microsoft.com/en-us/
download/details.aspx?id=29062).
Do No-IP, que para este artigo foi utilizado a sua ver-
so Free que pode ser obtido em (http://
www.noip.com/)
Do Visual Studio (neste artigo foi utilizado a verso
VS 2010)
Se poderamos ter utilizado outros softwares para este arti-
go? Sim, de facto poderamos, e o leitor caso queira experi-
mentar por si implementar o nosso exemplo pode utilizar
outros equivalentes que prefira.
1 Fase No-IP e o IP Fixo
Agora que j temos tudo o que precisamos, vamos comear
por registarmo-nos no No-IP para termos uma conta free e
vamos instalar o programa no computador que queremos
que tenha a nossa Base de Dados. Para quem no conhece,
o No-IP traduz o nosso IP dinmico para um IP Esttico que
pode ser acedido em qualquer parte. Isto porque a maior
parte das nossas ligaes internet quando nos ligamos
rede nunca temos o mesmo IP Pblico, este IP altera-se
quase sempre que tentamos estabelecer uma nova ligao.
O No-IP uma forma simples de termos sempre o mesmo IP
Quero fazer uma aplicao simples! E agora? Por onde comeo?
pblico, isto porque este software faz a traduo entre o IP
pblico da ligao que temos no momento, para o host que
criamos na nossa conta free.
Quando executamos o No-IP colocamos o email usado e a
password escolhida.
Ilustrao 1 - Ecr de Login No-IP
Seguidamente escolhemos o host que criamos (neste artigo
foi usado como host o artigoprogramar.no-ip.biz como mos-
tra a imagem seguinte)
Ilustrao 2 - Escolha de Host No-IP
Ao clicarmos em Save, o No-IP actualiza-se e como mostra
a figura seguinte passa a verificar periodicamente qual o IP
pblico que temos no momento, para que o host que esco-
lhemos anteriormente.
-
A PROGRAMAR
22
Ilustrao 3 - Verificao de IP pblico do No-IP
Agora que j temos o No-IP activo precisamos de o nosso rou-
ter saiba que os pedidos que receber de fora da sua rede tm
que ser enviados para o computador que tem instalado a nos-
sa base de dados. A forma mais rpida de fazermos isso dar
um IP Fixo ao computador em questo.
Neste caso, indo a Painel de Controlo Ligaes de Rede
Propriedades e depois Propriedades TCP/IPv4 demos por
exemplo o ip 192.168.2.100.
Ilustrao 4 - Propriedade de rea Local do Computador da BD
Ilustrao 5 - Dar um IP Fixo na nossa rede interna ao computador da
BD
Ou seja neste momento na nossa rede privada, o computa-
dor onde iremos instalar o SQL Server ir sempre responder
no IP 192.168.2.100.
Nota: Caso apenas quisssemos implementar este exemplo
na nossa rede de casa por exemplo, no precisaramos de
utilizar o No-IP. Isto porque dentro da nossa rede interna, os
computadores iriam reconhecer-se entre si.
2 Fase SQL SERVER
Nesta fase vamos ento instalar a nossa Base de Dados.
Aps fazermos o download da verso indicada ao nosso
sistema operativo, basta executarmos o assistente de insta-
lao e seguirmos os passos que nos vo sendo mostrados.
Ilustrao 6 - Aceitar as condies da Verso EXPRESS do SQL
SERVER
Ilustrao 7 - Opes de Instalao
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
-
A PROGRAMAR
23
Ilustrao 8 - Opes de Instalao - Continuao
Ora heis que neste momento chegmos a meio da nossa insta-
lao da Base de Dados. Ser-nos- pedido que confirmemos
como queremos aceder nossa BD. Neste ecr devemos es-
colher a opo Mixed Mode que ns ir permitir aceder BD
quer por meio da autenticao da sesso do Windows quer por
meio da autenticao no SQL Server. Neste momento ser-nos-
pedido para escolhermos uma password de acesso para o
login sa (System Administrator).
Ilustrao 9 - Escolher a password de acesso BD
Convm no esquecermos qual a password escolhida para
que mais tarde consigamos aceder facilmente base de dados
e podermos de forma rpida e eficaz alterarmos a informao
nela guardada.
Para este artigo os dados utilizados foram:
Login: sa
Password: p@ppassword
Mais frente neste artigo voltaremos a utilizar estes dados.
Por fim chegaremos ao menu que nos indica que instalamos
o SQL Server com sucesso como mostra a imagem seguinte.
Ilustrao 10 - Menu de confirmao de Instalao
Ilustrao 11 - Menu de confirmao de Instalao
Neste momento aps termos instalado o SQL Server (neste
caso a BD e o Management Studio SQL Server), se formos
aos programas instalados j poderemos ver que nos apare-
cem os novos programas como mostra a figura seguinte.
Ilustrao 12 - Instalao bem sucedida SQL Server
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
-
A PROGRAMAR
24
Neste momento estamos quase prontos para comear a criar a
Base de Dados que vai suportar este nosso artigo.
Mas antes de comearmos convm tomar em conta alguns
pormenores que apesar de serem pequenos, tm uma impor-
tncia extrema ao bom funcionamento que pretendemos.
O SQL Server responde em duas portas especificas, a porta
1433 (TCP) e a porta 1434 (UDP). Contudo por defeito, quando
o instalamos pela primeira vez essa opo vem desactivada.
Convm portanto activarmos essa opo antes de prosseguir.
Para activar basta ir ao Painel de Controlo Programas Mi-
crosoft SQL Server 2012 Configuration Tools e abrir o SQL
Server Configuration Manager.
Ilustrao 13 - Menu SQL Server Configuration Manager
Como podemos ver pela figura anterior o protocolo TCP/IP est
desactivado, devemos ento activa-lo (isto , passa-lo de
Disabled para Enable).
Posto isto vamos ento executar o SQL Server Management
Studio que nos ir permitir facilmente criar a nossa BD.
Executando-o, ir aparecer-nos o seguinte ecr.
Ilustrao 14 - Menu de entrada SQL Server
Carregando em Connect entraremos no SQL Server. No lado
esquerdo do ecr visvel o Object Explorer que nos ir aju-
dar a atingir o nosso objectivo
Para criar uma nova base de dados, clicamos com o boto
do lado direito do rato em cima de Databases e escolhe-
mos New Database como mostrado na figura seguinte.
Ilustrao 15 - Criar uma nova BD
Aparecer um novo menu onde devemos colocar o nome da
BD assim como as caractersticas que queremos que a mes-
ma tenha. Com possvel ver na imagem seguinte demos o
nome de PAP base de dados e deixmos as definies de
defeito.
Ilustrao 16 - Criar nova BD
Agora que j temos a base de dados precisamos de lhe adi-
cionar as tabelas correspondentes.
De forma anloga quando expandimos a nossa PAP (a base
de dados que acabamos de criar), so nos mostradas as sub
pastas que compe a mesma. Clicando mais uma vez com o
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
-
A PROGRAMAR
25
boto do lado direito em cima da subpasta Tables escolhemos
a opo New Table como ilustra a figura seguinte.
Ilustrao 17 - Criar nova tab
Agora basta-nos inserir os campos na mesma e escolher qual
o tipo de campos que queremos guarda nessa tabela da BD.
Por fim ao guardarmos a tabela que acabamos de criar damos-
lhe o nome que escolhermos, a figura seguinte mostra como foi
criada a tabela Carro que ir ser usada no nosso projecto
para este artigo.
Ilustrao 18 - Criao da Tabela Carro
Ao irmos criando as diferentes tabelas que compem a BD as
alteraes vo-se tornando visveis, como mostra a figura se-
guinte.
Ilustrao 19 - Criao de vrias tabelas BD
Neste exemplo consideramos quatro tabelas, que nos permi-
tiro guardar toda a informao dos nossos veculos.
Ilustrao 20 - Tabelas Usadas no Exemplo
Antes de passarmos ltima fase deste artigo vamos voltar
a fazer o ponto de situao.
Neste momento temos o No-IP que nos permite ter um ip fixo
pblico, temos o SQL Server com a base de dados PAP que
criamos, em que essa mesma base de dados tem 4 tabelas
(Carro, Utilizador, Revisao e KmsAnuais).
Agora que j temos tudo, podemos passar ento nossa
aplicao propriamente dita.
3 Fase A aplicao
Nesta fase, executamos o Visual Studio e criamos um novo
projecto, neste caso criamos um projecto do tipo Windows
Forms Application que j bastante conhecido.
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
-
A PROGRAMAR
26
Ilustrao 21 - Criao do Projecto Windows Forms
Nota: Para o bom funcionamento deste projecto deve estar
instalado tambm a .NET Framework 4.0 ou superior.
Para ser mais simples explicar a aplicao em si, foram coloca-
do diversos botes cada um contendo um cdigo especifico de
forma a que todos os leitores pudessem facilmente observar as
alteraes de que vamos falar neste artigo.
Ento a que nos propormos executar no projecto ilustra este
artigo?
1. Inserir um utilizador no sistema
2. Inserir um carro no sistema
3. Actualizar os Kms Mensais feitos pelo carro
4. Saber quais os carros que esto prximos de ir prxi-
ma reviso.
5. Gerir as revises feitas pelos carros
6. Gerir os Kms feitos por essas mesmas viaturas
Como foi referido para melhor ilustrar o cdigo de cada parte
destes pressupostos, foram criados diversos botes, cada um
com a sua funcionalidade especfica.
Ilustrao 22 - Menu entrada da Aplicao
A imagem anterior mostra os carros que esto na base de
dados assim como o utilizador e os Kms que faltam para que
seja necessria a prxima inspeco desse veiculo.
Para isso foi criada a funo mostraCarros:
Vamos agora tomar um pouco de ateno funo anterior.
Lembram-se do nome do host que criamos com o No-IP e do
login e da password que escolhemos quando instalamos a
BD? nesta ligao que iremos usar esses dados.
Traduzindo: Informamos o nosso programa que a BD a
usar a que est no endereo artigoprogramar.no-ip.org, em
que faremos o login com o utilizador sa, com a password
p@ppassword, usando a base de dados PAP.
Seguidamente dizemos-lhe para abrir a conexo base de
dados e atravs da instruo SQL, pedimos os dados que
nos interessam da tabela que queremos.
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void mostraCarros() { //Separador Tabela Litros SqlConnection conexao = new SqlConnection(); conexao.ConnectionString = @"Data Source=artigoprogramar.no-ip.biz;user id=sa;password=p@ppassword;Trusted_Connection=no; database=PAP;connection timeout=30"; conexao.Open(); string sql2 = "select * from Carro"; SqlCommand cmd2 = new SqlCommand(sql2, conexao); cmd2.Connection = conexao; cmd2.CommandText = sql2; // cria o dataadapter... SqlDataAdapter adapter2 = new SqlDataAdapter(); adapter2.SelectCommand = cmd2; try { // preenche o dataset... System.Data.DataSet dataSet2 = new System.Data.DataSet(); adapter2.Fill(dataSet2); dataGridView1.DataSource = dataSet2; dataGridView1.DataMember = dataSet2.Tables[0].TableName; } catch { // MessageBox.Show("Erro !"); } conexao.Close(); }
SqlConnection conexao = new SqlConnection(); conexao.ConnectionString = @"Data Source=artigoprogramar.no-ip.biz;user id=sa;password=p@ppassword;Trusted_Connection=no; database=PAP;connection timeout=30"; conexao.Open();
-
A PROGRAMAR
27
Neste caso string sql2 = "select * from Carro";, ou seja, quere-
mos tudo (*) o que est presente na tabela Carro.
Guardamos essa mesma informao num SQLAdapter e de-
pois escolhemos usando um datagridview1, mostramos essa
informao aos nossos utilizadores finais. Ou seja, o data-
gridview usa como fonte de dados, a informao presente no
SQLAdapter que crimos.
Comecemos ento pelo boto Adicionar:
Ora como visvel, o boto adicionar instancia a classe Adicio-
nar enviando-nos para a interface grfica dessa mesma classe.
Assim que fizermos as alteraes nesse submenu, ao voltar-
mos ao menu inicial, novamente chamada a funo mostra-
Carros que vai actualizar novamente a listagem a ser mostra-
da.
Quando entramos na Classe Adicionar vemos o seguinte
Layout:
Ilustrao 23 - Classe Adicionar
Temos um TabControl com duas TabPages uma para
Adicionar Carro e outra para Adicionar Utilizador.
Comecemos pela TabPage Adicionar Carro, para adicionar
um carro temos que inserir a matricula do mesmo, o utilizador
do carro, assim como os Kms que o veiculo tem e com quantos
Kms dever essa viatura ir prxima reviso.
Neste exemplo obrigamos o utilizador a escolher um nome de
um utilizador que se encontre nos dados da ComboBox, ou
seja, quando adicionamos um carro, somos obrigados a esco-
lher um utilizador que esteja j inserido no sistema.
Mas como podemos dizer nossa ComboBox qual o conjunto
de dados que a mesma deve apresentar?
Uma das formas mais simples usar DataBindings. E como?
Se clicarmos na ComboBox com o boto direito do rato, ir
aparecer a imagem seguinte.
Ilustrao 24 - Criao de DataBinding
Escolhendo a opo Use Data Bound Items, poderemos
adicionar uma nova Data Source ao nosso projecto. Na
figura seguinte so visveis as diversas opes que podemos
adquirir assim como a que foi escolhida para este exemplo.
Ilustrao 25 - Criao de DataBinding
No menu seguinte devemos ento colocar os dados referen-
tes nossa BD.
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void adicionarbutton_Click(object sender, EventArgs e) { Adicionar add = new Adicionar(); add.ShowDialog(); mostraCarros(); }
-
A PROGRAMAR
28
Ilustrao 26 - Inserir Dados da ligao
Depois disto efectuada a ligao nossa BD e so-nos mos-
tradas as tabelas que compem a mesma.
Ilustrao 27 - Escolher Campos da Tabela Utilizador
Neste caso escolhemos o campo Nome da Tabela Utilizador.
Aps isso o wizzard traz-nos de volta ao ponto inicial, e esco-
lhemos quer para o Display Member, como para o Value Mem-
ber o tal campo Nome que escolhemos na BD.
Ilustrao 28 - Fonte de Dados da ComboBox
(Por curiosidade, caso tivssemos escolhido no wizzard am-
bos os campos da tabela Utilizador, poderamos escolher
para o Display Member e para o Value Member valores dife-
rentes caso o desejssemos. )
Quando executamos a nossa aplicao ir aparecer ento o
utilizador Rui no valor da ComboBox. (Aparece o utilizador
Rui, pois foi o que adicionamos previamente BD.)
Ilustrao 29 - ComboBox
Mas supondo agora que queramos inserir um novo carro na
BD, o qual queramos que tivesse o utilizador Guilherme.
Para que isso acontecesse, tendo em conta que explicitamos
anteriormente que os dados a aparecer na ComboBox seri-
am o nome de todos os utilizadores inseridos na BD, apenas
teremos que adicionar um novo utilizador ao sistema. Posto
isto, clicando na TabPage Novo Utilizador.
Vamos adicionar o Guilherme assim como o seu contacto
telefnico.
Ilustrao 30 - Adicionar novo utilizador
Clicando ento no boto adicionar Utilizador, -nos dada a
informao de que o utilizador foi inserido com sucesso, e -
nos mostrada toda a informao da tabela Utilizador, mos-
trando que o Guilherme j faz parte do nosso sistema.
Ilustrao 31 - Novo utilizador Adicionado
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
-
A PROGRAMAR
29
Quando voltamos ao separador Adicionar Carro, clicando na
ComboBox, j temos no nosso conjunto de dados o
Guilherme, como mostra a figura seguinte.
Ilustrao 32 - Dados da ComboBox
Mas voltando um pouco atrs, qual o cdigo do boto
Adicionar Utilizador?
Mais uma vez recapitulamos a ConnectionString BD, s que
desta vez em vez de seleccionarmos todos os dados presentes
na tabela, usamos a instruo simples da linguagem SQL de
forma a inserir uma nova linha na tabela Utilizador, com os
dados que inserimos nas textBoxs anteriormente preenchidas
por ns. Atravs do SqlCommand pedimos a execuo da
nossa String sql, usando a ConnectionString da nossa BD.
Caso os dados sejam introduzidos com sucesso essa men-
sagem mostrada ao utilizador, e fechamos conexo BD.
Depois disso, voltamos a chamar a funo verUtilizadores
(anloga funo mostraCarros()), de forma a mostrar no
datagridview a lista actualizada de utilizadores presentes no
sistema.
Gostaria ainda de chamar ao leitor a ateno para outra li-
nha de cdigo que chamamos neste boto.
Esta linha de cdigo foi originada pelo nosso DataBinding
quando usamos o wizzard para criarmos a fonte de dados
que iria preencher a nossa ComboBox, quando chamamos
novamente a linha de cdigo, ela vai renovar novamente a
fonte de dados desse elemento e por isso que o
Guilherme aparece logo na ComboBox da TabPage
Adicionar Carro. Caso no chamssemos esta funo, o
Guilherme apenas iria aparecer nas opes da ComboBox
na prxima vez que voltssemos a fazer load da classe Adi-
cionar (clicando no boto Adicionar do Menu Principal).
Para adicionar o novo veculo vamos faze-lo de forma anlo-
ga insero de um novo utilizador:
Ilustrao 33 - Inserir novo Carro
Carregando no boto adicionar carro, o novo carro inserido
e a informao da tabela Carro mostrada no datagridview.
Ilustrao 34 - Novo carro adicionado
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void AdicionarUtilizadorbutton_Click(object sender, EventArgs e) { string nome = nometextBox.Text; int contacto = Convert.ToInt32 (contactotextBox.Text); SqlConnection myConnection = new SqlConnection(); myConnection.ConnectionString = @"Data Source=artigoprogramar.no-ip.biz;user id=sa;password=p@ppassword;Trusted_Connection=no; database=PAP;connection timeout=30"; myConnection.Open(); try { String sql = "INSERT INTO Utilizador (Nome, Contacto)" + " VALUES('" + nome + "'," + contacto + ")"; SqlCommand commandTarefa = new SqlCommand(sql, myConnection); commandTarefa.ExecuteNonQuery(); MessageBox.Show("Novo utilizador Introduzido com sucesso."); myConnection.Close(); } catch { MessageBox.Show("ERRO ao Inserir novo utilizador.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } nometextBox.Text = ""; contactotextBox.Text = ""; verUtilizadores(); this.utilizadorTableAdapter.Fill (this.pAPDataSet.Utilizador); }
this.utilizadorTableAdapter.Fill (this.pAPDataSet.Utilizador);
-
A PROGRAMAR
30
Cdigo Boto Adicionar Carro:
Como o leitor pode verificar, o cdigo anlogo ao do boto
Adicionar Utilizador, com a excepo de que a informao do
Carro colocada em duas tabelas. Na tabela Carro e na tabela
KmsAnuais (em que falaremos mais frente no nosso artigo).
Voltemos agora novamente ao nosso Menu Principal. Um dos
outros botes que colocamos neste menu o boto Ver Prxi-
mos Reviso, e isto porque? No nosso exemplo para ser mais
simples visualizar neste momento temos apenas 2 carros, mas
poderamos ter muitos mais. Como seria a forma mais simples
de verificar quais os carros que tm que ir reviso num futuro
prximo? Poderamos fazer mais uma chamada BD para que
atravs de instrues SQL nos fossem mostrados os carros
cuja diferena entre os Kms Atuais e os Kms da prxima revi-
so fossem iguais ou inferiores a 2000 Kms. Ou j que temos
os dados da BD no datagridview podemos tambm facilmente
percorrer todas as linhas presentes nesse elemento e pintar
por exemplo, de azul todas as linhas dos veculos que estejam
dentro dessas condies, correcto?
Ilustrao 35 - Mostra carros prximos da reviso
Como o leitor pode verificar, ao carregar no boto Ver Prxi-
mos Reviso a primeira linha do datagridview foi pintada de
azul porque faltam precisamente 2000 Kms para a reviso
do veiculo utilizador pelo Rui.
Cdigo do Boto Ver Prximos Reviso:
Ou seja, de forma simples, a aplicao verifica o valor da
clula dos Kms Actuais e o valor da clula dos Kms da Prxi-
ma Reviso, v a diferena, e caso esteja dentro das carac-
tersticas procuradas ele pinta a linha com a cor azul.
Passemos agora ao Boto Revises
Esse boto leva-nos ao submenu Revises em que nos so
mostradas todas as revises feitas pelos carros do sistema.
(o cdigo anlogo ao da funo mostraCarros e verUtiliza-
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void adicionarCarrobutton_Click(object sender, EventArgs e) { string matricula = matriculatextBox.Text; string utilizador = comboBox1.Text; int kms = Convert.ToInt32 (kmstextBox.Text); int kmsProximaRevisao = Convert.ToInt32 (kmsProximatextBox.Text); myConnection.Open(); try { String sql = "INSERT INTO Carro (Matricula, Utilizador, Kms, ProximaRevisao)" + " VALUES('" + matricula + "','" + utilizador + "', "+kms+", "+kmsProximaRevisao+")"; SqlCommand command = new SqlCommand (sql, myConnection); command.ExecuteNonQuery(); String sql2 = "INSERT INTO KmsAnuais (Matricula)" + " VALUES('" + matricula + "')"; command = new SqlCommand(sql2, myConnection); command.ExecuteNonQuery(); MessageBox.Show("Carro Introduzido com sucesso."); myConnection.Close(); } catch { MessageBox.Show("ERRO ao Inserir novo carro.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } matriculatextBox.Text = ""; kmstextBox.Text = ""; kmsProximatextBox.Text = ""; mostraCarros(); }
private void colorirRevisaobutton_Click(object sender, EventArgs e) { foreach (DataGridViewRow linha in dataGridView1.Rows) { try { int kms = Convert.ToInt32(linha.Cells [2].Value.ToString()); int kmsProximaRevisao = Convert.ToInt32 (linha.Cells[3].Value.ToString()); int kmsfalta = kmsProximaRevisao - kms; if (kmsfalta
-
A PROGRAMAR
31
dor, com a diferena de que a funo verRevises selecciona e
mostra todos os dados da tabela Revisao)
Ilustrao 36 - Mostra Revises
Carregando no boto Nova Reviso, nos mostrada uma
janela de forma a inserirmos os dados da reviso. Na combo-
Box aparecem todas as matrculas dos carros que esto no
sistema.
Ilustrao 37 - Inserir nova reviso
pedido para colocarmos os kms actuais do carro e os Kms
em que o carro deve ir reviso assim como o que foi feito.
Para inserirmos a informao basta-nos clicar no boto inse-
rir e a informao ser actualizada da BD.
Cdigo do Boto Inserir Reviso:
Como o leitor pode verificar, neste boto inserimos mais uma
linha nova na tabela Revisao e actualizamos (UPDATE) os
campos Kms e ProximaRevisao da tabela Carro. Mas que
linha vamos actualizar nessa tabela? A linha que correspon-
de aquela matrcula especfica.
Antes de passarmos ao boto que nos falta (Gerir Kms)
vamos ponderar um cenrio. Imaginemos que tanto o Rui
como o Guilherme fazem diversos Kms para angariar clien-
tes para o nosso stand, pode ser conveniente sabermos
quantos Kms fazem eles num ms. E ao fim do ano pode-
mos querer saber quantos Kms fizeram eles nesse ano, a
sua mdia, etc. Ento convm irmos actualizando de ms a
ms a informao sobre as deslocaes deles.
No Menu Principal se clicarmos na linha correspondente ao
veiculo ser-nos- apresentada uma janela de forma a poder-
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void inserirRevisaobutton_Click(object sender, EventArgs e) { int kmsActuais = Convert.ToInt32 (kmsActuaistextBox.Text); int kmsProximaRevisao = Convert.ToInt32(proximaRevisaotextBox.Text); int id = Convert.ToInt32 (idRevisaotextBox.Text); string feito = feitotextBox.Text; string matricula = comboBox1.Text; try { SqlConnection myConnection = new SqlConnection(); myConnection.Open(); String revisao = "INSERT INTO Revisao (ID, Matricula, Feito)" + " VALUES(" + id + ",'" + matricula + "', '"+feito+"')"; SqlCommand commandTarefa = new SqlCommand(revisao, myConnection); commandTarefa.ExecuteNonQuery(); SqlCommand c = new SqlCommand ("UPDATE Carro SET Kms = " + kmsActuais + ", ProximaRevisao = "+kmsProximaRevisao+" WHERE Matricula = '" + matricula + "'; ", myConnection); c.ExecuteNonQuery(); myConnection.Close(); MessageBox.Show("Inserido com sucesso."); this.Close(); } catch { } }
-
A PROGRAMAR
32
mos actualizar essa informao:
Ilustrao 38 - Actualizar Kms Mensais
Clicando no boto actualizar, o carro com a matrcula 22-BB-22
actualizado, passando a datagridview do Menu Inicial a mos-
trar a nova informao.
Ilustrao 39 - Mostra Carros com Valores actualizados
Na janela Kms se o leitor reparar bem, so mostrados os Kms
anteriores e quando estamos a colocar os Kms actuais, o pro-
grama mostra-nos a diferena de Kms percorrida. Assim quan-
do escolhemos o ms na ComboBox o que acontece que
iremos guardar essa diferena calculada na tal tabela de
KmsAnuais.
Para calcular a diferena entre os Kms que estamos a inserir
e os Kms Anteriores do carro temos o evento:
Isto , cada vez que estamos a inserir o valor dos Kms Actu-
ais, o programa converte o valor inserido e calcula novamen-
te a diferena, apresentando-a ao utilizador na label corres-
pondente.
No boto Actualizar
Como o leitor pode verificar, actualizamos os valores da Ta-
bela Carro, e os valores da tabela KmsAnuais na coluna do
ms correspondente.
No exemplo, a diferena de Kms entre os Kms Actuais e os
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void kmstextBox_TextChanged(object sender, EventArgs e) { int kmsAnteriores = Convert.ToInt32 (kmslabel.Text); int kmsActuais = Convert.ToInt32 (kmstextBox.Text); diferencaKmslabel.Text = "" + (kmsActuais - kmsAnteriores); }
private void actualizarbutton_Click(object sender, EventArgs e) { String ms = comboBox1.Text; int kms = Convert.ToInt32(kmstextBox.Text); int difKms = Convert.ToInt32 (diferencaKmslabel.Text); try { SqlConnection myConnection = new SqlConnection(); myConnection.Open(); //Actualizar Tabela Carro - Actualizacao SqlCommand c = new SqlCommand("UPDATE Carro SET Kms = " + kms + " WHERE Matricula = '" matriculalabel.Text + "'; ", myConnection); c.ExecuteNonQuery(); //Actualizar Tabela KmsAnuais - Kms SqlCommand comma = new SqlCommand("UPDATE KmsAnuais SET " + mes + " = " + difKms + " WHERE Matricula = '" + matriculalabel.Text + "'; ", myConnection); comma.ExecuteNonQuery(); myConnection.Close(); MessageBox.Show("Actualizado com sucesso."); this.Close(); } catch { } }
-
A PROGRAMAR
33
Kms Anteriores 3000 Kms e escolhemos actualizar o ms de
Janeiro, se verificarmos o interior da nossa BD, podemos ver
que o valor foi realmente actualizado com sucesso.
Ilustrao 40 - Valor correctamente inserido na BD
Suponha agora o leitor que com o passar do tempo actualiza-
mos mensalmente todos os dados pertencentes a estes dois
veculos, tendo assim na nossa tabela KmsAnuais todos os
dados que correspondem aos kms que o Rui e o Guilherme
fizeram durante um ano.
Vamos ento agora falar do boto Gerir Kms. Este boto leva
-nos at ao SubMenu Gerir Kms que nos mostra a tabela
KmsAnuais.
Ilustrao 42 - Menu Gerir Kms
Quando clicamos nesse boto nos apresentado no data-
gridview2 a soma de todas os valores de todos os meses, as-
sim como o total de de todos os carros assim como a mdia.
Ou seja temos os valores dos kms que a nossa frota percorreu
mensalmente, o total de kms anuais e a mdia desses dozes
meses. Essa mesma informao mostrada em grfico e a
mdia representada pela linha vermelha que aparece no gr-
fico. Ou seja nas barras do grfico que aparecem abaixo da 1
linha vermelha significa que nesse ms os dois carros percor-
reram menos Kms que a mdia. A barra que corresponde ao
ms de Fevereiro que ultrapassa a 2 linha vermelha significa
que nesse ms os dois carros ultrapassaram o correspondente
a 2 vezes o valor da mdia.
Quando ao cdigo do Boto Ver Grfico vamos por partes.
QUERO FAZER UMA APLICAO SIMPLES! E AGORA? POR ONDE COMEO?
private void graficobutton_Click(object sender, EventArgs e) { SqlConnection conexao = new SqlConnection(); conexao.Open(); string sql1 = "select SUM(Janeiro) AS Janeiro from KmsAnuais;"; SqlCommand cmd1 = new SqlCommand (sql1, conexao); cmd1.Connection = conexao; cmd1.CommandText = sql1; String janeiro = cmd1.ExecuteScalar() .ToString(); string sql2 = "select SUM(Fevereiro) AS Fevereiro from KmsAnuais;"; SqlCommand cmd2 = new SqlCommand (sql2, conexao); cmd2.Connection = conexao; cmd2.CommandText = sql2; String fevereiro = cmd2.ExecuteScalar().ToString(); string sql3 = "select SUM(Marco) AS Marco from KmsAnuais;"; SqlCommand cmd3 = new SqlCommand (sql3, conexao); cmd3.Connection = conexao; cmd3.CommandText = sql3; String marco = cmd3.ExecuteScalar().ToString(); string sql4 = "select SUM(Abril) AS Abril from KmsAnuais;"; SqlCommand cmd4 = new SqlCommand (sql4, conexao); cmd4.Connection = conexao; cmd4.CommandText = sql4; String abril = cmd4.ExecuteScalar().ToString(); string sql5 = "select SUM(Maio) AS Maio from KmsAnuais;"; SqlCommand cmd5 = new SqlCommand (sql5, conexao); cmd5.Connection = conexao; cmd5.CommandText = sql5; String maio = cmd5.ExecuteScalar().ToString(); string sql6 = "select SUM(Junho) AS Junho from KmsAnuais;"; SqlCommand cmd6 = new SqlCommand (sql6, conexao); cmd6.Connection = conexao; cmd6.CommandText = sql6; String junho = cmd6.ExecuteScalar().ToString(); string sql7 = "select SUM(Julho) AS Julho from KmsAnuais;"; SqlCommand cmd7 = new SqlCommand (sql7, conexao); cmd7.Connection = conexao; cmd7.CommandText = sql7; String julho = cmd7.ExecuteScalar().ToString();
-
A PROGRAMAR
34
Primeiro calculamos a Soma de todas as colunas da BD, e
colocamos essa mesma informao dentro do datagridview2,
assim como o total de todas as somas e a mdia das mes-
mas.
Depois seguidamente pegmos nos valores que estavam
nas clulas do datagridview2 e com esse vecto