revista_programar_44

62

Upload: bene-ramos

Post on 25-Nov-2015

51 views

Category:

Documents


16 download

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

    [email protected]

    www.linkedin.com/in/joaopfsilva

    AUTOR Escrito por Cristiano Ramos

    Estudante de Engenharia Informtica na UBI

    [email protected]

    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