the club - megazine developers day ... 04 6º firebird developers day05 backups com interbase - mais...

32
julho 2009

Upload: trinhdung

Post on 12-Apr-2018

218 views

Category:

Documents


2 download

TRANSCRIPT

julho 2009

julho 2009

julho 2009 03

Delphi

Dicas Delphi Desafio The Club

InfoNews

.NET .NET

índiceDicas da VCL

Editorial Delphi

06Inicio este editorial parabenizando nosso parceiro Carlos Cantu, pelo sucesso do 6º Firebird Developers Day ... 04

6º Firebird Developers Day

05Backups com Interbase - mais segurança para você e seu cliente 11

Integração de Aplicações C# WinForms e ASP.NET com BrOffice 16

Primeiros passos com JQuery e ASP.NET

24- Saber quantos dias tem o mês;- Rolar o Form utilizando Page Up e Page Down- Retornar o ultimo acesso a um... 28

Caça-Palavras

30LegendaInicianteIntermediárioAvançadoVão-se os arquivos, ficam os back-ups.

Momento de Reflexão

Autor: Luciano Pimenta

Autor: Felipe Santos Autor: Adilson Jr. Autor: Djonatas Tenfen

Autor: Carlos H. Cantu

julho 200904

Bem-vindo

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

pelos seus respectivos proprietários.

Marcos César Silva - Editor [email protected]

Inicio este editorial parabenizando nosso parceiro Carlos Cantu, pelo sucesso do 6º Firebird Developers Day realizado no ultimo dia 04 de julho na cidade de Piracicaba-SP, evento este onde nas palavras do próprio Cantu se tornou o maior evento de banco de dados Firebird no mundo! Veja mais detalhes do evento no artigo

de abertura desta edição.

Outro motivo de alegria que tenho este mês é de poder desejar boas vindas aos novos colaboradores, que neste mês entram para a família The Club enriquecendo as páginas desta revista com seus artigos e comparti-lhando seus conhecimentos com nossos sócios.

Este mês Luciano Pimenta mostra como dar uma “turbinada” no layout de nossas aplicações, sem a necessidade de usarmos componentes de terceiro, mas apenas suas Dicas de como manipular a VCL do Delphi. Com isto ficamos independentes da vontade dos desenvolvedores de componente em migrar seu componente para novas versões do Delphi.

O especialista em InterBase Felipe Santos aborda em seu artigo um tema considerado por unanimidade um dos pontos mais importantes quando se diz respeito a segurança de sistema, mas muitas vezes esquecido, o backup de banco de banco de dados. No artigo “Backups com Interbase – Mais segurança para você e seu Cliente” Felipe define os tipo de backups e o procedimento de como realizá-los.

Apresentamos também este mês o Diretor de Tecnologia da TDS Adilson Jr, que escreve sobre a “Integração de Aplicações C# WinForms e ASP.NET com BROffice”, considerando que a integração de nossos sistemas com soluções gratuitas vem sendo cobrada a cada dia por nossos clientes.

No artigo “Primeiros passos com jQuery e ASP.NET“, Djonatas Tenfen faz um introdução ao uso do JQuery, sendo este o primeiro de uma seqüência de artigos com o objetivo de apresentar o Framework jQuery baseado em JavaScript, que tem com objeto agilizar e Inovar o desenvolvimento WEB segundo palavras do próprio autor.

Acredito que todos devem ter percebido como esta edição está cheio de novidades.

Tenham todos uma boa leitura e até o próximo mês.

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

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

Internethttp://www.theclub.com.br

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

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

Copyright The Club Megazine 2009

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoMarcos César Silva

ColunistasAdilson Jr.

Carlos H. CantuDjonatas TenfenFelipe Santos

Luciano PimentaMarco Antonio Armando

Vitor M. Rodrigues

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

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

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

julho 2009 05

InfoNews

O tempo realmente passa muito rápido! Ainda me lembro do dia em que tive a idéia de realizar um evento dedicado somente ao Firebird, e aqui estamos nós, já na sexta edição do que acabou se tornando o maior evento de banco de dados Firebird no mundo!

A sexta edição do Firebird Developers Day aconteceu no dia 04 de Julho de 2009, na cidade de Piracicaba-SP, no Campus Taquaral da UNIMEP, e contou com a presença de 480 pessoas.

Mesmo o período complicado que estamos vivendo, com crise internacional, gripe “suína”, desenvolvedores perdendo

os cabelos com SPED fiscal, NF-e, etc, os brasileiros mostraram a força que o Firebird tem neste país, comparecendo em massa no FDD!

Visitando o Bra-sil pela primeira vez, tivemos a presença de Vlad Khorsun, um dos principais desenvolvedores do Firebird, vindo dire-tamente da Ucrânia. Dmitry Kuzmenko (IBSurgeon) voltou ao Brasil pela ter-ceira vez, como pa-lestrante do evento. Dmitry já está se tornando um brasileiro nativo, viciado em capirinha ;) Ambos partiram de Moscow, enfrentaram cerca de 18h de viagem, e logo de cara, 4h de congestionamento em São Paulo! Coitados...

Os palestrantes desta edição foram: Mauricio Longo, Carlos H. Cantu, Alexandre Benson Smith, Marcos P. Gomes, Bruno Lichot, Dmitry Kuzmenko (IBSurgeon), Luiz Paulo de Oliveira Santos, Vlad Khorsun, Andreano Lanusse e Eduardo Jedliczka.

N e m m e s m o o dia atípico, com muita neblina, foi suficiente para acal-mar os ânimos dos participantes, que passaram o dia todo aprendendo e re-forçando os conhe-cimentos relaciona-dos ao Firebird. As palestras abordaram

6º Firebird Developers Daytópicos variados, de grande interesse do público, como tran-sações, backups, views, dimensiona-mento de servido-res, segurança, etc. Também tivemos uma palestra sobre o futuro do Delphi, mostrando que, mais do que nunca, a ferramenta está

em boas mãos, e finalmente “quebrou o gelo” com os usuários do Firebird, adicionando suporte oficial ao Firebird no driver dbExpress.

Como sempre, os participantes do FDD puderam adquirir softwares com descontos incríveis, incluindo as ferramentas da IBSurgeon, Upscene, FastRe-ports, IBObjects, DevRace, etc.

O sorteio final foi recheado de licenças de diversas ferramentas, compo-nentes de acesso e um RAD Studio. Aproveitamos o momento para realizar uma coleta de última hora de doações para a Firebird Foundation. Somando as doações do dia, junto com as que foram feitas durante o processo de inscrição, arrecadamos US$ 1.250, que já estão com a Fundação Firebird.

Gostaria de agradecer a todos os palestrantes, patrocinadores, ao público presente, a UNIMEP, a IBSurgeon (que patrocinou as passagens do Vlad) e a todas as pessoas que de alguma forma estiveram envolvidas com a realização do FDD.

Para os que não puderam comparecer, em breve lançaremos um DVD contendo vá-rias das palestras que foram apresentadas no evento. Fiquem de olho na loja on-line da FireBase (www.fireba-se.com.br)

Up the Irons!Carlos H. Cantu

www.firebase.com.brwww.firebirddevelopersday.com.br

julho 200906

Delphi

É um prazer escrever esse artigo para a The Club, uma grande revista, que leva conhecimento aos desenvolvedores pelo Brasil. Neste artigo inaugural, vamos conhecer algumas dicas da VCL para criarmos projetos com um layout mais incrementado, arrojado sem a necessidade de usar componentes de terceiros.

Usar componentes de terceiros, depen-dendo do projeto, pode deixar a em-presa/projeto “preso” a atualizações do mesmo. Mesmo, ultimamente, as

melhores empresas de componentes para Delphi sempre atualizarem seus fontes quando é anuncia-da uma nova versão do Delphi.

As dicas mostradas a seguir, foram criadas no Delphi 2007, mas você pode usar qualquer versão Win32 para fazer os exemplos.

Dicas da VCL

procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);begin ListBox1.Canvas.FillRect(Rect); ListBox1.Canvas.TextOut(Rect.Left+18, Rect.Top, ListBox1.Items[Index]); ImageList1.Draw(ListBox1.Canvas, Rect.Left, Rect.Top, Index);end;

Pintando ícones

Componentes, como: ListBox, ComboBox, StatusBar entre outros, não possuem uma pro-priedade para que possamos ligar um item a uma imagem ou ícone. Mas, podemos mostrar essas imagens, “pintando” as mesmas nos componentes, utilizando a classe Canvas.

Para testar, coloque em um formulário o ListBox e um ImageList. Adicione alguns ícones, altere a propriedade Style do ListBox para lbOw-nerDrawFixed e no evento OnDrawItem adicione o código da Listagem 1.

Veja a Listagem 1.

Listagem 1. Pintado imagens no ListBox

julho 2009 07

Dicas da VCL

Esse código pode ser adaptado para qualquer componente onde podemos utilizar a classe Can-vas, como ComboBox, CheckListBox, StatusBar etc (Figura 1).

Veja a Figura 1.

StatusBar

Veremos a primeira dica desse componente, onde vamos colocar uma barra de progresso (Pro-gressBar) em um painel do StatusBar. Adicione em um formulário os seguintes componentes: um StatusBar, um ProgressBar e um Button.

Adicione painéis no StatusBar, clicando com o botão direito no componente e escolhendo Panels Editor. Altere a propriedade Style do primeiro pai-nel para psOwnerDraw. No evento OnDrawPanel do StatusBar digite o código da Listagem 2.

Veja a Listagem 2.

No código verificamos se é o primeiro pai-nel, pois podemos colocar o ProgressBar em um painel e utilizar os demais para outras tarefas. Agora no OnClick do botão adicione o código da Listagem 3.

Veja a Listagem 3.

No código, realizamos um laço entre o valor mínimo e o valor máximo da barra de progresso e incrementamos com valor da variável a sua posição (propriedade Position), repintamos o StatusBar e damos uma pausa (Sleep).

Depois do laço colocamos a posição da barra de progresso com o valor mínimo e repintamos novamente o StatusBar. Por fim, altere para False a propriedade Visible do ProgressBar. Rode a aplicação e teste a barra de progresso no painel do StatusBar.

Para colocar ícones nos painéis, utilize o mesmo código do exemplo do ListBox, apenas adaptando-o para utilizar as propriedades do StatusBar e seus painéis.

Apenas tome cuidado no evento OnDrawPa-nel, pois nele estamos verificando o painel a ser preenchido com a barra de progresso. Veja no código da Listagem 4, como seria a adaptação.

Figura 1. Adicionando ícones em ListBox, CheckListBox e ComboBox

procedure TForm3.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);begin if Panel.Index = 0 then begin ProgressBar1.Width := Rect.Right - Rect.Left + 1; ProgressBar1.Height := Rect.Bottom - Rect.Top + 1; ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top); end;end;

Listagem 2. Mostrando uma barra de progresso em um painel

procedure TForm3.Button1Click(Sender: TObject);var i: integer;begin for i := ProgressBar1.Min to ProgressBar1.Max do begin ProgressBar1.Position := i; StatusBar1.Repaint; Sleep(10); end; ProgressBar1.Position := ProgressBar1.Min; StatusBar1.Repaint;end;

Listagem 3. Configurando a barra de progresso

julho 200908

Veja a Listagem 4.

Separamos o primeiro painel do restante, onde serão mostrados os ícones, por que não podemos mostrar ícones e a barra de progresso ao mesmo tempo. Veja na Figura 2 o exemplo em execução.

Veja a Figura 2. Podemos adicionar em um painel do StatusBar

o Hint (dica) do componente selecionado ou que esta sendo mostrado pelo mouse. Para isso altere a propriedade AutoHint do StatusBar para True, e a propriedade Style do painel para psText.

Nota: O valor da propriedade Hint do item de menu, caso possua valor, também será mostrado no StatusBar quando o mouse “passar” sobre o mesmo.

Outra dica que podemos fazer no StatusBar seria mostrar ao usuário quando as teclas CAPSLO-CK, NUMLOCK e SCROLLLOCK estejam ativadas ou desativadas. Para isso, basta verificarmos a função GetKeyState (passando como parâmetro a tecla desejada), e verificar o valor retornado: par quando a tecla esta ativada e ímpar para desativada.

Para a tecla NUMLOCK podemos utilizar o código da Listagem 5 no evento OnKeyDown do formulário (alterando também KeyPreview para True).

Veja a Listagem 5.

Para saber o código das outras teclas procure por Virtual key codes no Help do Delphi. Rode a aplicação e ative/desative as teclas para testar. E para finalizar, caso deseje mudar a cor de fundo de um painel, basta adicionar o seguinte código:

StatusBar1.Canvas.Brush.Color := $00FFEECC;

Esse código deverá ser usado no bloco de có-digo onde configuramos os ícones para os painéis. A cor você coloca a que for mais conveniente para seu projeto. Veja na Figura 3 outra barra de status, usando as configurações de tecla e cor do painel.

Veja a Figura 3.

if Panel.Index = 0 then …endelsebegin StatusBar1.Canvas.FillRect(Rect); StatusBar1.Canvas.TextOut(Rect.left + 18, rect.Top, Panel.Text); ImageList1.Draw(StatusBar.Canvas,rect.left, rect.top,Panel.Index);end;

Listagem 4. Mostrando a barra de progresso e ícones nos painéis da StatusBar

Figura 2. ProgressBar dentro de um StatusBar com ícones nos painéis

procedure TForm4.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin if odd (GetKeyState(VK_NUMLOCK)) then StatusBar1.Panels[1].Text := ‘NUM’ else StatusBar1.Panels[1].Text := ‘’;end;

Listagem 5. Configurando teclas para serem mostradas nos painéis

Figura 3. Ativando teclas e pintando o fundo do painel

julho 2009 09

Menus

Um dos componentes mais usados em aplica-ções é o MainMenu, pois oferece ao usuário uma maneira rápida de acessar as diversas opções do sistema. Assim, com um visual mais “elegante”, podemos chamar a atenção para as nossas apli-cações.

Podemos, por exemplo, adicionar imagens a cada item do menu, através da propriedade Bitmap ou ícones, ligando o MainMenu a um ImageList e alterando a propriedade ImageIndex de cada item.

Vamos usar nesse exemplo, um ActionList para concentrar os itens do menu que podem ser usados em outros locais do formulário. Adicione o componente no formulário, crie algumas actions. Coloque um MainMenu no formulário e dê um duplo clique para abrir seu editor (Menu Designer). Adicione itens vinculando os mesmos as actions criadas anteriormente.

Vamos colocar um “banner” no menu. Adicio-ne no formulário um Image e carregue uma imagem de sua preferência. Altere a propriedade AutoHo-tkeys do MainMenu para maManual (faça o mesmo procedimento nos itens do menu). Selecione todos os itens do menu e no evento OnDrawItem digite o código da Listagem 6.

Veja a Listagem 6.

A última linha do código é utilizada para mostrar os ícones que estão em um ImageList, nos itens do menu, semelhante a “pintura” que fizemos em outros controles (ListBox, ComboBox, StatusBar etc).

Você pode fazer a mesma dica para PopupMe-nu. Adicione como itens do PopupMenu as actions que criamos e indique o ImageList do formulário. Faça a mesma técnica para adicionar o código que colocar o banner no menu.

Lembre-se apenas de criar uma imagem que seja do tamanho dos itens do menu, senão a mesma pode ficar “cortada” (como poderemos ver no exemplo do PopupMenu, onde foi usada uma quantidade menor de itens). Rode e teste a aplicação (Figura 4).

Vejaa Figura 4.

procedure TForm1.Exit1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);begin ACanvas.FillRect(ARect); ACanvas.TextOut(ARect.Left+48, ARect.Top, (Sender as TMenuItem).Caption); ACanvas.Draw(0, 0, Image1.Picture.Graphic); ImageList1.Draw(ACanvas, ARect.Left+30, ARect.Top, (Sender as TMenuItem).ImageIndex);end;

Listagem 6. Mostrando uma imagem no menu, como banner

Figura 4. Colocando um banner no menu

Barra de botões

A barra de botões facilita bastante a utilização dos projetos, onde podemos incrementá-lo com imagens de fundo (utilizando em conjunto com o Coolbar), agrupamento de botões (onde somente um botão pode ser marcado de cada vez) e a cus-tomização dos botões.

Adicione um Toolbar no formulário e alguns botões (clique com o botão direito e escolha New Button). Vamos deixar a barra como a do Internet Explorer, onde ao passarmos o mouse sobre os botões, os ícones mudam de cor.

Coloque dois ImageList no formulário e no pri-

meiro adicione ícones que serão mostrados na bar-ra. No segundo adicione os ícones que aparecerão quando o mouse passar pelo botão (disponha-os na mesma ordem do primeiro ImageList).

Na propriedade HotImages do Toolbar in-dique o ImageList1, e nas propriedades Images e DisabledImagens configure com o ImageList2. Rode e teste.

Para adicionar e remover os botões da barra em tempo de execução, altere a propriedade Customizable para True, e depois (com a aplicação rodando) dê um duplo clique no componente. Isso irá mostrar o assistente para personalizar a barra de ferramentas.

julho 200910

Incrementando os botões

Para mostrar o rótulo do botão utilize a pro-priedade ShowCaptions da barra, e em List o rótulo aparece ao lado do ícone.

Selecione alguns botões e altere para True a propriedade Grouped e em Style para tbsCheck. Quando o usuário clicar no botão, ele ficara “mar-cado”, e sairá desse estado somente quando outro botão do grupo for pressionado (no mesmo estilo dos botões de alinhamento). Caso você deseje que um botão fica pressionado e somente com um novo clique do mouse, volte ao estado normal (como por exemplo, os botões de formatação: negrito, Itálico, Sublinhado), altere a propriedade AlowAllUp para True e em Style configure para tbsCheck.

Podemos criar botões ao estilo do botão Run do Delphi, onde mostra um menu ao clicar na seta

Figura 5. Incrementando o Toolbar

Sobre o autor

Luciano Pimenta

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

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

CD de Treinamento em RAD Studio 2007: www.linhadecodigo.com.br/CDDVD.aspx?id=3361.

DVD de treinamento em Visual Web De-veloper: www.linhadecodigo.com.br/CDDVD.aspx?id=3795.

www.lucianopimenta.net

do botão. Altere a propriedade Style do botão para tbsDropDown, e ligue um PopupMenu na propriedade DropDowMenu. Na Figura 5 temos os exemplos citados anteriormente do Toolbar.

Veja a Figura 5.

Conclusões

Mostrei neste artigo algumas dicas e segredos da VCL, que em alguns casos não seria necessário utilizar componentes de terceiros, pois no Delphi encontramos todas as funcionalidades desejadas para incrementar os componentes da VCL. Agra-deço a atenção de todos e fico disponível para qualquer dúvida.

Um grande abraço a todos e até a próxima!

julho 2009 11

Olá pessoal,

Backups! Não poderia ser diferente falarmos sobre esse assunto em nosso primeiro artigo aqui na The Club Megazine. Esse assunto assombra todo desenvolvedor e todo usuário de tecnologia. E não tem jeito. Se nosso cliente perde alguma informação, perde dados, a culpa acaba sendo transferida para a empresa desenvolvedora. Será que estamos dando a devida atenção para nos-sos processos de backup? Podemos garantir para nossos clientes que seus backups estão íntegros? Estamos utilizando as ferramentas certas? Estamos explorando todas as possibi-lidades? Para quem utiliza bancos de dados Embarcadero InterBase, nas versões 2007 e superiores, realizar backups pode ser muito mais do que garantir uma recuperação de perda de dados. Pode garantir também um ambiente livre de problemas.

Nesse artigo quero mostrar detalhadamente os recursos de backup do Embarcadero InterBase e como eles podem nos ajudar não somente com cópias, mas também na melhoria de performance

BACKUPS COM INTERBASEMAIS SEGURANÇA PARA VOCÊ E SEU CLIENTE

e disponibilidade de informações. Tudo isso utili-zando tanto as ferramentas gráficas, quanto linhas de comando. A idéia é rever nossos conceitos de backup e melhorar nossas rotinas, garantindo ao cliente um ambiente o mais seguro possível.

TIPOS DE BACKUP

É muito comum, e chega a ser assustador, ver muitas em empresas utilizando os recursos de backups dos bancos de dados InterBase ou Fire-bird de forma inadequada. Desde cópias diretas dos arquivos de dados (simples copiar e colar), até mesmo o uso mal explorado das ferramentas. Não podemos jamais executar uma cópia simples (copiar / colar) do banco de dados. O copiar / colar pode facilmente gerar corrupções no banco de dados de produção que, com o tempo, podem causar falhas de difícil correção.

Por isso é muito importante saber que o Embarcadero InterBase disponibiliza dois tipo de backup: lógicos e físicos. Os backups lógicos são importantes principalmente em processos de ma-nutenção do banco de dados. Já os backups físicos são os mais adequados para cópias de segurança.

Vamos detalhar cada um dos tipos de ba-ckup.

BACKUPS LÓGICOS

Sempre que executamos um processo de ba-ckup completo, utilizando o conhecido comando gbak, estamos realizando um backup lógico. Esse backup extrai cada registro do banco de dados e armazena em um formato próprio. Assim, o destino do backup não é uma cópia do banco de dados ori-ginal e sim um arquivo que contém as informações do banco de dados original de forma organizada e compactada. Apesar de ser muito utilizado como o único processo de backup, vamos aprender que os backups lógicos são mais úteis para manutenção do banco de dados do que para processos de cópias de segurança. Com backups lógicos podemos:

• Realizar uma limpeza de registros ob-soletos do arquivo de banco de dados (também conhecido como versionamento de registros);

• Reorganizar a estrutura de índices, melhorando a estatística e performance e dos mesmos;

• Desfragmentar os blocos de dados, deixando arquivo do banco de dados mais “leve” e rápido;

• Reiniciar os controles de sistema, como contadores de transações, entre outros;

• Extrair estrutura de dados (metadados)

julho 200912

e dados dos bancos de dados;• Alterar a estrutura de paginação do ban-

co de dados (os pages sizes do banco de dados);• Dividir o banco de dados em múltiplos

arquivos;• Transportar o banco de dados entre

plataformas distintas;• Melhor a performance geral do banco

de dados.

Para realizarmos backups lógicos, podemos utilizar o utilitário de linha de comando gbak ou mesmo o console gráfico IBConsole. Por linha de comando podemos preparar rotinas que podem ser agendadas pelos gerenciadores de tarefas dos sistemas operacionais, automatizando o processo. Abaixo um exemplo de execução do comando gbak para backup com vários parâmetros:

c:\databases> gbak –b –g –ig –t –y backup_log.txt –user sysdba –pass masterkey banco.ib banco.ibk

Onde:–b: Indica que estamos iniciando um pro-

cesso de backup do banco de dados para um arquivo destino.

–g: Indica que durante o processo de ba-ckup, o sistema de garbage colletor não será realizado. Esse parâmetro muitas vezes causa uma falha de interpretação, pois não estamos ativando, e sim desativando a limpeza do banco antes da cópia. Assim, a execução do backup é feita mais rapidamente.

–ig: Indica que qualquer erro de checksum será ignorado durante o processo de backup. Essa flag é útil para garantirmos que o backup será realizado sem erro. Erros de checksum são, na grande maioria das vezes, corrigidos durantes a restauração do backup. Assim, se durante o backup aparecer alguma mensagem de erro devido a uma corrupção de checksum, realize o backup utilizando esse flag para que o gbak ignore o erro e possa corrigi-lo durante o processo de restauração backup.

–t: Indica que o backup será gravado em um formato transportável. Essa opção é fun-damental quando precisamos mudar nosso arquivo de banco de dados de plataforma. Se nosso banco de dados está em uma máquina com sistema operacional Windows e queremos levá-la para um servidor rodando em uma máquina Linux, por exemplo, precisamos rea-

lizar o processo de backup do banco de dados utilizando a flag –t. Esse parâmetro também deve ser utilizando sempre que queremos mudar a versão do gerenciado de banco de dados, como por exemplo, de InterBase 6 para InterBase 2009.

–y: Indica um arquivo destino para o log da execução do backup. Essa flag é muito impor-tante quando criamos rotinas de backups. Fun-damental além de fazer backups, é ter certeza que o mesmo foi executado com sucesso.

–user e –pass: Indica o usuário e a se-nha para realizar o backup. Normalmente o usuário SYSDBA com a senha definida pelo administrador.

Importante notar que o comando gbak pode ser executado mesmo com conexões ativas no banco de dados. Todos os dados consistentes no início do processo serão copiados. O arquivo resultante (banco.ibk) serve sim como nossa cópia de segurança. Você pode então copiar o arquivo de backup gerado para qualquer estrutura desejada, como outro disco, mídias externas, fitas, enfim. Mas, como já dito, o backup lógico é ideal para manutenção do banco de dados. Assim, devemos programar restaurações periódicas de nossos backups para garantir um arquivo mais limpo, sem fragmentação, com estruturas balanceadas e com tamanho menor. Abaixo vamos mostrar um exemplo de comando gbak para restauração do banco de dados:

c:\databases> gbak –c –p 8192 –pr 62500 –r –y restore_log.txt –user sysdba –pass masterkey banco.ibk banco.ib

Onde:–c: Indica que estamos iniciando o pro-

cesso de restauração do backup do banco de dados.

–p 8192: Indica o tamanho de página do banco de dados (Database Page Size). Atual-mente o Embarcadero InterBase SMP 2009 suporta os seguintes tamanhos: 1024, 2048, 4096, 8192, 16384, expressos em bytes. Páginas maiores permitem que mais informações sejam transferidas para memória cache no momento da leitura de dados. Hoje em dia, com o acesso cada vez mais fácil a recursos de hardware, principalmente memória RAM, podemos uti-lizar páginas de 8 Kb como padrão em nossos

bancos de dados. Vale a pena testar caso a caso e perceber a diferença de performance com a mudança. Páginas de 1 e 2 Kb não fazem mais sentido, pois teríamos páginas menores do que as do próprio sistema operacional, o que pode-ria causar uma queda na performance.

–pr 62500: Essa é uma nova opção que permite uma pré alocação do arquivo de banco de dados. Significa dizer, nesse exemplo, que o arquivo restaurado já terá 62500 páginas aloca-das (500 Mb se utilizarmos páginas de 8Kb). Ou seja, mesmo que o banco de dados seja menor que 500 Mb, o arquivo já será criado com esse tamanho. Esse recurso é interessante, pois podemos dimensionar o tamanho de nossos bancos de dados, conforme uma previsão de crescimento dos mesmos. É um parâmetro opcional. Se não for informado, o arquivo será criado até o tamanho real do mesmo.

–r: Indica que o arquivo destino (banco.ib) será substituído durante a restauração do backup. Não podemos ter nenhuma conexão ativa no momento dessa restauração.

–y: Indica um arquivo destino para o log da execução do backup. Novamente a importância de analisarmos o resultado da execução do pro-cesso e termos sempre isso documentado.

–user e –pass: Assim como no backup, esses parâmetros indicam o usuário e a senha para realizar o restore do backup.

Podemos também utilizar o console IBConsole para executar os processos de backups lógicos, conforme Imagem 1 abaixo:

Imagem 1

BACKUPS FÍSICOS

O backup físico do Embarcadero InterBase (versões 2007 ou superior), também conhecido como Online Dump, copia o banco de dados a nível de página e salva as informações em um arquivo no formato original. Significa que teremos uma réplica exata do banco de dados original ao final

julho 2009 13

do processo. Essa réplica é, por padrão, criada no formato read-only, por um motivo que veremos na sequência. Os backups físicos são os ideais para cópias de segurança.

Backups físicos podem ser criados não apenas nos discos do próprio servidor InterBase, mas também em qualquer unidade de rede mapeada no servidor. Com isso podemos preparar rotinas para gerar backups automaticamente em diversos computadores de nossa estrutura, de nossa rede, até mesmo remotamente através de uma conexão de rede segura, coma uma VPN por exemplo.

Uma das grandes vantagens dos backups físicos é a velocidade do processo. O backup físico analisa os dados consistentes no início do processo e dispara uma ação de cópia página a página do banco de dados original. Esse processo entra na fila de transações do servidor InterBase, que consegue administrar seus recursos de forma que o Online Dump não penalize a performance dos outros processos concorrentes. Enquanto um processo de backup lógico (gbak –b) demora cerca de 15 minutos para ser executado em uma banco de dados de 2 gigabytes, o backup físico não demora mais do que 2 minutos concluir sua cópia, claro, dependendo de seu equipamento.

Com os backups físicos podemos:

• Copiar rapidamente nossos bancos de dados, mesmo com ele em produção;

• Utilizar as cópias para validar os bancos de dados de produção sem a necessidade de retirar os usuários dos sistemas. Como o arquivo gerado é uma cópia fiel do banco de dados de produção, se a cópia apresentar falhas de corrupção, significa dizer que o nosso banco de dados de produção também está corrompido. Se isso acontecer, podemos então programar uma parada para manutenção da base de dados.

• Distribuir nossos bancos de dados remotamente. Podemos copiar nosso banco de dados rapidamente e transporta-lo para outro servidor, como por exemplo, um servidor Web para um sistema de consulta de dados;

• Alterar o caminho em bancos de dados multi arquivos de uma forma mais rápida do que pelo processo de backup lógico;

• Disparar vários backups ao longo do dia sem penalizar a performance. Sabendo que cada cópia demora cerca de 2 / 5 minutos, podemos configurar nossos ambientes para realizar backups

a cada 15 / 30 minutos. Normalmente no processo tradicional (backups lógicos), os backups são pro-gramados para rodar 1 a 2 vezes ao dia. Com isso diminuímos em muito a possibilidade de perda de dados;

• Atualizar nossos backups com o recurso de backups incrementais.

Da mesma forma que com os backups lógicos, utilizamos o utilitário de linha de comando gbak para realizarmos os backups físicos, ou mesmo podemos usar o console gráfico IBConsole. Vejamos como fica o comando gbak:

gbak –d –user sysdba –pass masterkey banco.ib banco_dump.ib

Em uma sintaxe mais simples, apenas altera-mos a flag para –d(ump). Assim o comando gbak irá dumpear o banco de dados banco.ib para a réplica banco_dump.ib. Reparem que a extensão propositadamente permanece a mesma (.ib), para mostrar que o banco destino está no mesmo formato do banco original. Assim, o processo de restauração do backup praticamente não existe. O arquivo banco_dump.ib já pode ser lido normal-mente. Lembrando apenas que esse arquivo está no formato read only.

O formato read only é essencial para que o backup incremental possa ser executado. E o que é o backup incremental? Se nós executarmos novamente o mesmo comando, o backup físico irá copiar apenas as páginas de dados alteradas desde o último backup. Para isso, o banco de dados de origem é totalmente scaneado (full scan) para identificar todas as páginas alteradas. A Imagem 2 abaixo mostra que apenas um total de 500 páginas foram copiadas de um total de 2193 páginas. Essas 500 páginas foram as que sofreram alteração desde o último backup. Se o arquivo destino não estiver no formato read only, não haveria como garantir uma cópia consistente dos dados.

Veja a Imagem 2

Esse processo torna o backup físico ainda mais rápido. Imaginem preparar um backup de um banco de dados muito grande. Copiar ele inteiro a cada backup tornaria o backup muito lento. Dessa forma, com o backup incremental, a atualização da primei-

ra cópia garante uma velocidade ainda melhor.

A Imagem 3 abaixo mostra o caminho para executarmos o processo de backup físico utilizando a ferramenta IBConsole:

Veja a Imagem 3

Caso desejarmos substituir o arquivo destino do backup físico, podemos acrescentar a flag –ov (overwrite).

gbak –d –ov –user sysdba –pass masterkey banco.ib banco_dump.ib

É possível preparar e rodar vários backups físicos de uma mesma origem para vários destinos diferentes. Assim, podemos manter um backup físi-co sendo atualizado a cada 15 minutos no mesmo servidor, por exemplo, outro sendo atualizado de hora em hora para outro servidor, e outro a cada 30 minutos para uma pen-drive ligada ao servidor. Esse tipo de recurso dinamiza as possibilidades e oferece muito mais segurança. Muito importante notar também que, por ser uma cópia fiel do banco de dados de origem, o arquivo dumpeado não é transportável. Ou seja, não podemos utilizar a cópia para levar o banco de dados para outro servidor InterBase 2007 com outro sistema operacional. Se desejarmos fazer esse processo, devemos utilizar o backup lógico com o parâmetro ¬–t ativado.

A restauração de um backup físico é pratica-mente instantânea. Precisamos apenas alterar o formato para read write. Para isso utilizamos a sintaxe abaixo:

gbak –mo read_write –user sysdba –pass masterkey banco_dump.ib

Uma vez transformado para o formato read write, o arquivos banco_dump.ib não poderá mais receber informações de um backup incremental. Precisaremos criar outra cópia full para iniciamos o processo novamente.

julho 200914

Sobre o autor

Felipe Santos

Felipe Santos é especialista em InterBase. Trabalha com o InterBase há mais de 8 anos, atuando como consultor e instrutor do produto em todo Brasil. Especialista em ambientes críticos. Atua e trabalha com os maiores clientes do InterBase no Brasil. Participante ativo na comunidade, com diversos artigos publi-cados. Participante do grupo de beta testers mundial do produto. Palestrante em eventos como IB Tour, Borcon Conference, CodeRage Latin América, Delphi Developers Day, Linux Day, entre outros. Atualmente trabalhando na área técnica do InterBase na Presence Tecnologia - distribuidora do produto no Brasil.

[email protected]

CONCLUSÃO

Backups lógicos ou backups físicos, cada um com sua função e facilidade. O importante é sempre criarmos as rotinas em nossos clientes, evitando qualquer eventual falha que possa com-prometer nosso trabalho. Lembrando que com o Embarcadero InterBase temos: backups lógico = manutenção periódica e melhoria de performance; backups físicos = cópias de segurança a qualquer momento. Assim são as ferramentas de backup do InterBase: muito mais segurança para você e seu cliente. Até a próxima!

Imagem 2

Imagem 3

Referência:

InterBase 2007 Operations Guide – cap. 8.InterBase 2009 Operations Guide – cap. 8.

julho 2009 15

julho 200916

É um grande prazer escrever para a comunidade de desenvolvedores The Club. Certamente esse será um relacionamento duradouro e produtivo.

A corrida por redução de custos com software pelas empresas e o advento das soluções gratuítas movimentou o mercado de desenvolvimento, e fez

com que aumentassem as exigências quando a adaptabilidade e interoperabilidade de nossos sof-twares. Abordo neste paper uma necessidade que sistematicamente tem sido alvo das solicitações de usuários: Assim no Calc, como no Excel.

O OpenOffice é um projeto open source para softwares de escritório de distribuição totalmente gratuíta, que foi a continuidade do antigo StarOffice da StarDivision, mais tarde comprado pela Sun. Aqui no Brasil, o projeto ganhou o nome BrOffi-ce. Usaremos a versão tupiniquim, que pode ser baixada em http://www.broffice.org/download (BrOffice.org 3.1.0). Segundo o site oficial do pro-jeto www.broffice.org, o BrOffice possui algumas vantagens em relação ao projeto internacional OpenOffice, que envolve o gerenciador de banco de dados Base e uma diversidade maior de funcio-nalidades. Brasil!!

O pacote BrOffice é composto do Writer (edi-tor de textos), Calc (planilha eletrônica), Impress (apresentação com slides), Draw (diagramas), Math (formulas científicas) e o mais recente Base (banco de dados). Usaremos o mais popular nos escritórios, o Calc.

Integração de Aplicações C# WinForms e ASP.NET com

BrOfficeInteroperabilidade

Aos que ainda não estão familiarizados com o termo “interoperabilidade”, o mesmo pode ter seu significado como “integração”. Softwares diferen-tes, de linguagens eventualmente diferentes porém interoperáveis, ou seja, integráveis, compartilhan-do componentes através de um contrato exposto através de uma API (Fachada). O BrOffice possui diversas formas de interoperabilidade, devido ao fato de sua essência ser multi-plataforma, o que faz com que não utilize apenas um modelo de interoperabildiade.

A API

O OpenOffice possui uma infraestrutura de in-teroperabilidade chamada UNO (Universal Network Objects), disponível para as plataformas Windo-ws, Linux, Solaris, Mac OS, Power PC e FreeBSD. O UNO pode ser incorporado por linguagens como C++, Java e o Basic do pró-prio OpenOffice, no entanto, se l evarmos em consideração o acesso via COM ( C o m p o n e n t Object Model)

da Microsoft aumentaríamos substancialmente o universo de interoperabilidades. À partir da ver-são 2.0, o BrOffice passou a permitir o acesso ao UNO por aplicações .NET CLI (Common Language Infrastructure).

Veja a Figura 1

Todas as bibliotecas do UNO para .NET (CLI) ficam disponíveis ao instalar a SDK, que pode ser baixada em http://download.openoffice.org/3.1.0/sdk.html. Os módulos da biblioteca CLI-UNO são: cli_uno.dll, cli_ure.dll, cli_basetypes.dll, cli_ure-types.dll, cli_cppuhelper.dll e cli_oootypes.dll. É possível encontrar estes assemblies no diretório: “C:\Program Files\BrOffice.org 3\Basis\sdk\cli”.

No assembly cli_oootypes.dll encontramos diversas interfaces, dentre as quais, usaremos a XComponentLoader, XMultiServiceFactory, XSprea-dsheet, XSpreadsheetDocumento e XSpreadsheets. Observe o diagrama na figura 2.

Figura 1

julho 2009 17

Veja a Figura 2

XComponentLoader carrega componentes especificados por uma URL, para uma janela nova ou existente. XMultiServiceFactory permite infocar fábricas de objetos através do nome do serviço. XSpreadsheet fornece métodos para criar inter-valos de células. XSpreadsheetDocument fornece um acesso a coleção de XSpreadsheets, que são as planilhas do documento. XSpreadsheets dispoe de métodos para acessar por nome, inserir e copiar e rearranjar planilhas.

O Problema e a Solução

A ZAP Sistemas é uma empresa de soluções de software para o setor financeiro, desenvolveu uma solução chamada ZAPNet Contábil, que está sendo migrado para .NET C#. Algumas páginas possuem a alternativa de exportar informações para o Excel. Alguns clientes adotaram o BrOffice e isso culminou no desenvolvimento desta solução: Criar fábricas abstratas que permintam que tanto Excel, quanto o Calc possar ser usados como canais de exportação.

À partir deste ponto, este paper focará na construção passo a passo de um assembly library que terá todos os serviços de exportação de dados para planilhas BrOffice Calc.

O Que Usei

Ferramentas utilizadas: Microsoft Visual Studio 2008 SP1, BrOffice 3.1.0, SDK 3.1.0 for Windows, Windows Vista Home Premium.

Criando Um Class Library

Construiremos a infraestrutura pela qual iremos interoperar com o BrOffice usando alguns padrões, segundo o diagrama da figura 3.

Veja a Figura 3

A b ra s e u V i s u a l S t u d i o 2 0 0 8 , e m File|New|Project, selecione o item “Class Libra-ry”. Dê o nome de BrOfficeLib ao projeto, como na figura 4.

Veja a Figura 4

Figura 2

Figura 3

Figura 4

julho 200918

No Solution Explorer, renomeie o arquivo .cs para Contracts.cs.

Figura 5

Em Contracts.cs criaremos a interface que fará o papel de simplificar e isolar a complexidade da interoperabilidade. Essa solução é a aplicação de um Design Pattern chamado Facade, que abstrai a complexidade de um subsistema, no nosso caso, a API do BrOffice. Este papel será cumprido pela interface IBrOfficeCalcFacade:

Veja o Código 01.

Observe que embora a API UNO disponha de uma infinidade de possibilidades, nossa “Fachada” simplificou e disponibiliza uma visão reduzida do que é oferecido pela API. Isto é positivo quando temos equipes numerosas, pois apenas um terá que estudar a API e criar a fachada simplificada, de modo que o restante da equipe possa utilizar eficientemente.

Adicione mais um item à solução pressionando as teclas Ctrl + Shift + A. Dê o nome de Facades.cs, conforme figura 6.

Veja a Figura 6

Neste arquivo implementaremos a interface IBrOfficeCalcFacade.

Antes de prosseguirmos, vamos adicionar as bibliotecas CLI-UNO à nossa BrOfficeLib. No Solution Explorer, clique com o botão direito sobre o item References e selecione a opção “Add Refe-rence...” conforme figura 7.

Figura 7

No diálogo Add Reference, selecione a aba Browse. Busque o caminho “C:\Program Files\BrOffice.org 3\Basis\sdk\cli” e adicione os assem-blies. Veja figura 8.

public interface IBrOfficeCalcFacade { string Cells(int rowIndex, int colIndex); bool ActivateSheetByIndex(int sheetIndex); void AddNewSheet(string sheetName); bool SaveDoc(); void Export(IEnumerable data); }

Vencida esta etapa, no arquivo Facade.cs, crie uma classe chamada BrOfficeCalcFacade conforme o código a seguir.

Veja o Código 02.

Vamos iniciar a implementação dos métodos da interface. Declare antes de tudo, os seguintes membros: _programa, _document, _desktop, _she-ets e _activeSheet.

Veja o Código 03.

Começaremos pelo método mais importante. O LoadBrOffice usa o método getServiceManager para criar uma instância do ServiceManager (com.

namespace BrOfficeLib{ public class BrOfficeCalcFacade : IBrOfficeCalcFacade { }}

Figura 8.

Código 01.

Código 02.

Figura 6

julho 2009 19

sun.star.ServiceManager), que é o ponto de partida para criação de qualquer objeto UNO.

Veja o Código 04. A classe Bootstrap oferece um meio para obter

um contexto, ou simplesmente um gerenciador de serviços. O gerenciador de serviços pode criar alguns serviços básicos, como: com.sun.star.comp.loader.JavaLoader, com.sun.star.comp.urlresolver.UrlResolver, com.sun.star.comp.bridgefactory.BridgeFactory, com.sun.star.comp.connections.Connector, com.sun.star.comp.connections.Acceptor e com.sun.star.comp.servicemanager.ServiceManager.

O método NewDoc criará um documento ini-cial que será preenchido com os dados que serão exportados.

Veja o Código 05.

O campo _desktop receberá a instância do objeto Desktop, que possui o método LoadCom-ponentFromURL, o qual é responsável por criar, importar e abrir documentos para o campo _do-cument. O LoadComponentFromURL aceita quatro parâmetros. Use o primeiro parâmetro para indicar o arquivo a ser aberto, ou use ‘private:factory/scalc’para criar um novo documento, onde o que está após a barra “/” é a identificação do produto, podendo ter as seguintes variações: scalc, swriter, simpress, sdraw, smath e sdatabase. O segundo parâmetro determina o frame da janela que será criado internamente para administração do docu-mento. O valor “_blank” faz com que uma nova janela seja criada. Alternativamente, é possivel usar o valor “_hidden”, para uma janela não visível. O quarto parâmetro oferece diversas maneiras de se criar ou abrir um documento. Este parâmetro é um array de PropertyValue, e sempre possui dois parâmetros essenciais: Name e Value, que podem receber os valores segundo a tabela 1.

Veja a Tabela 1

O método SaveDoc invoca o método StoreA-sUrl do documento.

Veja o Código 06. O primeiro parâmetro indica o caminho onde o

arquivo será gravado, o segundo, um PropertyValue que customiza a forma como esse arquivo será gravado, compreendendo as opções relacionadas na tabela 2:

public class BrOfficeCalcFacade : IBrOfficeCalcFacade { private XMultiServiceFactory _programa; private XSpreadsheetDocument _document; private XComponentLoader _desktop; private XSpreadsheets _sheets; private XSpreadsheet _activesheet; }

public void Load() { _programa = (XMultiServiceFactory)Bootstrap.bootstrap().getServiceManager(); }

public void NewDoc() { _desktop = (XComponentLoader)_programa.createInstance(“com.sun.star.frame.Desktop”); PropertyValue[] prop = new PropertyValue[1]; prop[0] = new PropertyValue(); prop[0].Name = “Hidden”; prop[0].Value = new uno.Any(true); XComponent xComponent = _desktop.loadComponentFromURL ( “private:factory/scalc”, “_blank”, 0, prop ); // _document = (XSpreadsheetDocument)xComponent; _sheets = _document.getSheets(); _activesheet = (XSpreadsheet)((XIndexAccess)_sheets).getByIndex(0).Value; }

Name Value DescriçãoAsTemplate Boolean Carrega ou não um novo template

CharacterSet String Tipo de caracter em que o documento está baseado

FilterName String Opções de filtro

JumpMark String Uma vez o documento aberto, salta para a posição definida no JumpMark

Password String Senha para arquivo protegido

ReadOnly Boolean Abre arquivo somente leituraTabela 1

public void SaveDoc() { PropertyValue[] prop = new PropertyValue[0]; ((XStorable)_document).storeAsURL(“file:///c:/arquivo.ods”, prop); }

Código 03.

Código 04.

Código 05.

Código 06.

julho 200920

Veja a Tabela 2

O método ActivateSheetByIndex posicionará na planilha indicada por seu índice. Observe que o campo _activeSheet receberá sempre a planilha ativa.

Veja o Código 07.

Observe o uso da instância do serviço Dispa-tchHelper, que fornece uma forma fácil de invocar funções úteis da interface gráfica do BrOffice, como copiar, colar, mover e outros.

O método AddNewSheet cria uma nova pla-nilha no documento. A interface XIndexAccess oferece uma forma de acesso a elementos de uma coleção através de um índice. Seu uso é restrito a estruturas indexadas.

Veja o Código 08.

O método Export receberá qualquer objeto de classes que implementam a interface IDataReader e exportará para uma planilha do BrOffice Calc.

Veja o Código 09.

Invocamos o método LoadBrOffice para cria-mos a instância do ServiceManager, em NewDoc criamos um novo documento, em seguida nos posicionamos na primeira planilha com o método ActivateSheetByIndex(1), e um loop é realizado por todos os registros do IDataReader, encaminhando-os às células da planilha, referenciadas através do método getCellByPosition.

Criando o Factory Method

Agora, vamos implementar um pattern co-nhecido por Factory Method. Como este padrão, removeremos a criação de instâncias concretas espalhadas pelo código (new) e concentrar em uma classe estática.

Adicione mais uma arquivo a nossa BrOfficeLib e a chame-a BrOffice.cs.

Veja o Código 10.

Deste modo, você poderá criar outros métodos que interoperam outros produtos, como GetBrO-fficeBase, GetBrOfficeMath, GetBrOfficeWriter, e outros.

Criando a Aplicação Windows Forms

Compile a library BrOfficeLib e no menu de

Name Value DescriçãoCharacterSet String Tipo de caracter em que o documento está baseado

FilterName String Opções de filtro

FilterOptions String Opções adicionais de filtro

Override Boolean Caso o arquivo exista, será sobreescrito sem consulta

Password String Senha para arquivo protegido

Unpacked Boolean Salva o documento nao compactado em sub- diretóriosTabela 2

public void ActivateSheetByIndex(int sheetIndex) { PropertyValue[] prop = new PropertyValue[1]; prop[0] = new PropertyValue(); prop[0].Name = “Nr”; prop[0].Value = new uno.Any(nIndex); XDispatchHelper dispatcher = (XDispatchHelper)_programa.createInstance(“com.sun.star.frame.DispatchHelper”); dispatcher.executeDispatch((XDispatchProvider)((XModel)_document).getCurrentController().getFrame(), “.uno:JumpToTable”, “”, 0, prop); _activesheet = (XSpreadsheet)((XIndexAccess)_sheets).getByIndex(nIndex-1).Value; }

public void AddNewSheet(string NewName) { int cont = ((XIndexAccess)_sheets).getCount(); _sheets.insertNewByName(NewName, (short)cont); ActivateSheetByIndex(cont + 1); }

public void Export(IDataReader dataReader) { Load(); NewDoc(); // for (int intCount = 0; intCount < dataReader.FieldCount; intCount++) _activesheet.getCellByPosition(intCount, 0).setFormula(dataReader.GetName(intCount)); // // int indexRow = 1; while (dataReader.Read()) { for (int indexColumn = 0; indexColumn < dataReader.FieldCount - 1; indexColumn++) _activesheet.getCellByPosition(indexColumn, indexRow).setFormula(dataReader[indexColumn].ToString()); // indexRow++; } }

Código 07.

Código 08.

Código 09.

julho 2009 21

contexto no Solution Explorer, adicione um novo projeto a solução, como nas figuras 9 e 10.

Figura 9

Figura 10

Criaremos uma nova aplicação Windows Forms. Identifique o projeto como WinFormA-ppBrOffice.

Veja a Figura 11

No formulário, adicione apenas um botão, como a figura 12 abaixo.

Em seguida, adicione o assemblie BrOfficeLib.dll na seção References do projeto, conforme figuras 13 e 14:

Veja a Figura 13 Veja a Figura 14

Agora, basta implementar o evento Click do botão.

Veja o Código 11.

A aplicação cliente em execução:

public static class BrOfficeFactory { public static IBrOfficeCalcFacade GetBrOfficeCalc() { return new BrOfficeCalcFacade(); } }

private void button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(“Data Source=.\\sqlexpress;Initial Catalog=NomeBanco;pwd=Senha;User=Usuario”); conn.Open(); SqlCommand command = new SqlCommand(“Select * from Tabela”, conn); // BrOfficeFactory.GetBrOfficeCalc().Export(command.ExecuteReader(CommandBehavior.CloseConnection)); }

Código 10.

Código 11.

Figura 11

Figura 13 Figura 14

julho 200922

Veja a Figura 15.

Usando a BrOfficeLib em uma Aplica-ção ASP.NET

A flexibilidade do assemblie BrOfficeLib.dll nos permite também usá-la em aplicações Web ASP.NET. Crie um novo projeto ASP.NET conforme as figuras 16 e 17. Identifique o projeto como AspNetAppBrOffice.

Figura 16 Veja a Figura 17

Adicione em References a blibioteca BrOffice-Lib.dll, conforme as figuras 18 e 19.

Figura 18 Veja a Figura 19

Adicione apenas um botão e implemente seu evento Click.

Veja a Figura 20

Veja o Código 12.

protected void Button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(“Data Source=.\\sqlexpress;Initial Catalog=BancoDeDados;pwd=tds2009;User=Usuario”); conn.Open(); SqlCommand command = new SqlCommand(“Select * from Tabela”, conn); // BrOfficeFactory.GetBrOfficeCalc().Export(command.ExecuteReader(CommandBehavior.CloseConnection)); }

Código 12.

Figura 15

Figura 17 Figura 19

julho 2009 23

A aplicação ASP.NET em execução: Veja a Figura 21

Simples assim!

Adilson Jr

Diretor de Tecnologia da TDS, centro de treinamentos oficiais CodeGear/Borland/Embarcadero no Rio de Janeiro. Professor, pal-estrante, conferencista, certificado CodeGear RAD Studio 2007, StarTeam e CaliberRM. Atua como Arquiteto, na área de análise e desenvol-vimento orientado a objetos em C# há 2 anos e em Delphi há mais de 12 anos. Atualmente trabalha com treinamentos, consultoria e de-senvolvimento de soluções para as plataformas Win32 e .NET.

e-mail: [email protected]

Sobre o autor

Conclusão

Vimos uma pequena amostra do potencial da API UNO. Melhore, extenda e compartilhe. Até a próxima.

Figura 21

julho 200924

Depois de uma breve apresentação pessoal vamos ao assunto de hoje, jQuery fra-mework baseada em JavaScript que agiliza e inova o desenvolvimento WEB, neste primeiro artigo irei fazer um apanhado geral sobre seletores ou seja vamos indicar elementos ou tipo de elementos da nossa página e vamos aplicar uma ação ao clicar ou ao receber o foca, nos próximos artigos vamos subir um pouco mais o nível e vamos aplicar efeitos em DIV e no terceiro artigo vamos acessar rotinas em código C# através do AJAX e va-mos popular nossa tela com uma velocidade impressionante resolvendo assim maior parte dos problemas de performace.

Olá, meu nome é Djonatas Tenfen sou residente da cidade de Blumenau, SC traba-lho a quase 7 anos com Delphi, atualmente trabalho na empresa Operacional Textil (www.operacionaltextil.com.br ) na área de tecnologia desenvolvendo ferramentas em Delphi e como hobby e visão de mercado estou migrando meus conhecimentos para a plataforma .NET. Atualmente possuo cer-tificação 70-536 (Microsoft .NET Framework 2.0 Application Development Foundation ) e estou me preparando para a certificação 70-562 ( Microsoft .NET Framework 3.5 – ASP.NET Application Development ).

Imagem01

Primeiro passo vamos fazer do-wnload da framework. Acesse o site www.jquery.com, neste site você vai encontrar uma grande quantidade de plugins e

toda a documentação para começarmos a “brincar”

com essa fabulosa framework. Na página inicial ela já nos apresenta o Link para o Download logo a direita, recomendo baixar a versão Development com 120 Kb.

Veja a Imagem01

Primeiros passos com jQuery e ASP. NET

julho 2009 25

Posterior a isso basta fazer download clicando no Link jQuery-1.3.2.js e salvar em algum diretório do seu computador.

Veja a Imagem02.

Ok. Agora com o Download realizado vamos ao nosso primeiro exemplo. Abrimos o Visual Studio 2008 depois clicamos em File > New > Web Site e selecionamos a opção ASP.NET Web Site conforme imagem 03.

Veja a Imagem 03

Selecione o local aonde irá salvar seu site e click na Ok. Depois do projeto criado vamos incluir a framework jQuery em nosso projeto. Por uma questão de organização costumo colocar todos os principais scripts JavaScript dentro de uma pasta Scripts no projeto, então clico com o botão direito sobre o projeto e seleciono a opção “New Folder” e renomeio a mesma para Scripts, depois da Pasta criada clico novamente com o botão direito do mouse sobre a pasta Scripts e seleciono a opção Add Existing Item conforme imagem 04.

Imagem 04

Depois disso navego até o diretório aonde salvei a framework e clico em Ok. O projeto deverá ficar com a seguinte cara ( imagem 05 ).

Iamgem 05

Na página Default.aspx primeiro vamos incluir o Script Manager da paleta AJAX Extensions, basta arrastar o mesmo para a nossa página ( imagem 06 ).

Veja a Imagem 06 Voltando ao código aspx ( Shift + F7 ) vamos

Imagem02

Imagem03

Imagem06

julho 200926

ter a codificação do ScriptManager já implemen-tada. Então entre as tag do script Manager vamos modificá-lo para ficar da seguinte maneira:

Veja o Código 01.

Esse código indica para o ASP.NET que usare-mos funções do arquivo jquery-1.3.2.js, ou seja, estamos vinculando uma biblioteca externa de JavaScript.

Depois disso voltamos ao nosso modo Design ( Shift + F7 ) e incluimos 2 Labels e 2 TextBox e aplicamos as seguintes alterações de propriedades tabela 01:

Veja a Tabela 01 Teremos o seguinte Layout ( Imagem 07 ).

Imagem 07

Depois das propriedades devidamente alte-radas voltamos ao código fonte ( Shift + F7 ), logo acima a tag HTML <\head> vamos codificar nosso JavaScript que vai alterar as cores dos nossos con-troles. O resultado final será:

Veja o Código 02.

Onde que a primeiras linhas são de controle do HTML depois temos a linha do Script indicando que é um script do tipo JavaScript, a segunda linha indica uma assinatura de uma função que é a função pageLoad() ( atenção JavaScript É case sensitive ) depois temos a linha $(“#txtNome”).css(“background-color”, “blue”); ou seja indica que quando carregar a página determinado controle com o ID txtNome deverá alterar o seu Style de background-color para blue. O código final deverá ser semelhante a isso:

Veja o Código 03.

Vamos compilar nossa página (F5) e ver o que acontece.

<asp:ScriptManager ID=”ScriptManager1” runat=”server”> <Scripts> <asp:ScriptReference Path=”~/Scripts/jquery-1.3.2.js” </Scripts> </asp:ScriptManager>

TextBox1ID txtID

Label1ID lbID

Text ID:

AssociatedControlID txtID

TextBox2ID txtNome

Label2ID lblNome

Text Nome:

AssociatedControlID txtNome

<head runat=”server”> <title></title>

<script type=”text/javascript”> function pageLoad() { $(“#txtNome”).css(“background-color”, “blue”); } </script></head>

<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”><head runat=”server”> <title></title>

<script type=”text/javascript”>

Código 01.

Código 02.

Código 03.

Tabela 01

julho 2009 27

Imagem 08

Legal em (Imagem 08). Então agora se quiser-mos que todos os controles recebam essa mesma ação basta fazer o seguinte:

Alterar a linha:

$(“#txtNome”).css(“background-color”, “blue”);

para

$(“.”).css(“background-color”, “blue”);

Ou podemos fazer outro teste que é alterar apenas atribuir os elementos de texto para a cor azul alterando a mesma linha para:

$(“:text”).css(“background-color”, “blue”);

Outra opção legal é alterar os elementos de uma determinada classe, para isso criamos uma classe de css chamada cssobrigatorio e aplicamos ela ao elemento txtID e acrescentamos a seguinte linha na função pageLoad(), atenção depois da linha já existente porque caso contrário uma instrução pode “anular” a anterior.

$(“.cssobrigatorio”).css(“background-color”, “red”);

O Nosso javaScript ficará assim:

Veja o Código 08

function pageLoad() { $(“#txtNome”).css(“background-color”, “blue”); } </script></head><body> <form id=”form1” runat=”server”> <div> <asp:ScriptManager id=”ScriptManager1” runat=”server”> <Scripts> <asp:ScriptReference Path=”~/Scripts/jquery-1.3.2.js” /> </Scripts> </asp:ScriptManager> <br /> <asp:Label ID=”lbID” runat=”server” AssociatedControlID=”txtID” Text=”ID”></asp:Label> <asp:TextBox ID=”txtID” runat=”server”></asp:TextBox> <br /> <asp:Label ID=”lblNome” runat=”server” Text=”Nome”></asp:Label> <asp:TextBox ID=”txtNome” runat=”server”></asp:TextBox> </div> </form></body></html>

Então é isso pessoal. No próximo artigo vamos ver outras coisas mais legais como efeitos que podemos usar com o jQuery, realmente o primeiro artigo é apenas para a gente entender o conceito e ver que existem uma porção de coisas e áreas a serem exploradas ainda na web.

Sucesso a todos e até o próximo artigo, qual-quer dúvida, sujestão, ou até mesmo uma troca de idéias meu e-mail é: [email protected] por favor enviem com o assunto DUVIDAS para que o email não seja qualificado como spam.

Obrigado.

Sobre o autor

Djonatas Tenfen Trabalha a quase 7 anos com Delphi, tra-

balha na empresa Operacional Textil (www.operacionaltextil.com.br ) na área de tecnologia desenvolvendo ferramentas em Delphi e como hobby e visão de mercado está migrando seus conhecimentos para a plataforma .NET. Faz parte do grupo .NET Blumenau http://dotnetblu-menau.ning.com/ . Possue certificação 70-536 (Microsoft .NET Framework 2.0 Application Development Foundation ) .

e-mail: [email protected]

<script type=”text/javascript”> function pageLoad() { $(“:text”).css(“background-color”, “blue”); $(“.cssobrigatorio”).css(“background-color”, “red”); } </script>

Código 03.

Código 04.

Código 05.

Código 06.

Código 07.

Código 08.

julho 200928

Dicas DELPHI

Saber quanto dias tem o mês

function GetIP:string; //--> Declare a Winsock na clausula uses da unit var WSAData: TWSAData; HostEnt: PHostEnt; Name:string; begin WSAStartup(2, WSAData); SetLength(Name, 255); Gethostname(PChar(Name), 255); SetLength(Name, StrLen(PChar(Name))); HostEnt := gethostbyname(PChar(Name)); with HostEnt^ do begin Result := Format(‘%d.%d.%d.%d’, [Byte(h_addr^[0]),Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]); end; WSACleanup; end;

Rolar o Form utilizando Page Up e Page Down

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);constPageDelta = 10;begin With VertScrollbar do if Key = VK_NEXT then Position := Position + PageDelta else if Key = VK_PRIOR then Position := Position - PageDelta;end;

Retornar o ultimo acesso a um arquivo

function GetFileLastAccessTime(sFileName : string ) : TDateTime;varffd : TWin32FindData;dft : DWord;lft : TFileTime;h : THandle;begin// get file informationh := Windows.FindFirstFile(PChar(sFileName), ffd);if(INVALID_HANDLE_VALUE <> h)thenbeginWindows.FindClose( h );FileTimeToLocalFileTime(ffd.ftLastAccessTime, lft );FileTimeToDosDateTime(lft,LongRec(dft).Hi, LongRec(dft).Lo);Result := FileDateToDateTime(dft);end;end;

Retornar a versão de um aplicativo

function GetBuildInfo:string;varVerInfoSize: DWORD;VerInfo: Pointer;VerValueSize: DWORD;VerValue: PVSFixedFileInfo;Dummy: DWORD;V1, V2, V3, V4: Word;Prog : string;beginProg := Application.Exename;VerInfoSize := GetFileVersionInfoSize(PChar(prog), Dummy);GetMem(VerInfo, VerInfoSize);

julho 2009 29

GetFileVersionInfo(PChar(prog), 0, VerInfoSize, VerInfo);VerQueryValue(VerInfo, ‘\’, Pointer(VerValue), VerValueSize);with VerValue^ dobeginV1 := dwFileVersionMS shr 16;V2 := dwFileVersionMS and $FFFF;V3 := dwFileVersionLS shr 16;V4 := dwFileVersionLS and $FFFF;end;FreeMem(VerInfo, VerInfoSize);result := Copy (IntToStr (100 + v1), 3, 2) + ‘.’ + Copy (IntToStr (100 + v2), 3, 2) + ‘.’ + Copy (IntToStr (100 + v3), 3, 2) + ‘.’ + Copy (IntToStr (100 + v4), 3, 2);end;

Retorna a idade atual de uma pessoa

function IdadeAtual(Nasc : TDate): Integer;Var AuxIdade, Meses : String;MesesFloat : Real;IdadeInc, IdadeReal : Integer;beginAuxIdade := Format(‘%0.2f’, [(Date - Nasc) / 365.6]);Meses := FloatToStr(Frac(StrToFloat(AuxIdade)));if AuxIdade = ‘0’ thenbeginResult := 0;Exit;end;if Meses[1] = ‘-’ thenbeginMeses := FloatToStr(StrToFloat(Meses) * -1);end;Delete(Meses, 1, 2);if Length(Meses) = 1 thenbeginMeses := Meses + ‘0’;

end;if (Meses <> ‘0’) And (Meses <> ‘’) thenbeginMesesFloat := Round(((365.6 * StrToInt(Meses)) / 100) / 30.47)endelsebeginMesesFloat := 0;end;if MesesFloat <> 12 thenbeginIdadeReal := Trunc(StrToFloat(AuxIdade)); // + MesesFloat;endelsebeginIdadeInc := Trunc(StrToFloat(AuxIdade));Inc(IdadeInc);IdadeReal := IdadeInc;end;Result := IdadeReal;end;

Retirar acentos de uma String

function RemoveAcento(Str:String): String;ConstComAcento = ‘àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ’;SemAcento = ‘aaeouaoaeioucuAAEOUAOAEIOUCU’;Varx : Integer;beginFor x := 1 to Length(Str) doif Pos(Str[x],ComAcento)<>0 ThenStr[x] := SemAcento[Pos(Str[x],ComAcento)];Result := Str;end;

julho 200930

HIGIENEVCLSTATUSBAR

BOOLEANINTERBASEBACKUP

BROFFICEVOIDPRIVATE

OVERRIDEJQUERYCSS

SCRIPTMANAGERRUNATFUNCTION

julho 2009

julho 2009