32
maio 2011

The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

  • Upload
    leliem

  • View
    220

  • Download
    0

Embed Size (px)

Citation preview

Page 1: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011

Page 2: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011

Page 3: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 03

Utilizando Subversion e TortoiseParte 2

23Desafio The Club

- Dicas Delphi

Dicas

- Cruzada

30

Banco de DadosDelphi

Delphi

Autor: Bruno Alcarás

Banco de Dados

índiceRAD PHP XE

Editorial

14Hoje em dia, cada vez mais progra-

madores “Desktop” estão se vendo na necessidade de obter pelo menos uma base em ... 04

GridView no Delphi Prism XE

05Trabalhando com SQL Server 2008 Express Editionparte 2 18 29

LegendaInicianteIntermediárioAvançado

Autor:Thiago Cavalheiro Montebugnoli

Autor: Eduardo MassudAutor:Luciano Pimenta

Page 4: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201104

Bem-vindo

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

pelos seus respectivos proprietários.

Antonio Spitaleri Neto - Editor [email protected]

Hoje em dia, cada vez mais programadores “Desktop” estão se vendo na necessidade de obter pelo menos uma base em desenvolvimento Web.

Para quem trabalha com Delphi, a Embarcadero possui duas ferra-mentas para ambiente Web nas quais programadores Delphi podem iniciar o aprendizado Web sem maiores sustos. São elas: RADPHP e Delphi Prism, ambas atualmente na versão XE.

Esse mês temos artigos para entusiastas de ambas as ferramentas: Para começar nosso colaborador Luciano Pimenta nos mostra como utilizar o controle GridView no Delphi Prism XE. GridView é um controle para exibição de dados amplamente utilizado em ambiente .NET.

Na sequência, nosso consultor Eduardo Massud nos mostra as prin-cipais funcionalidades do RAD PHP no artigo “RAD PHP XE”.

Voltando ao Delphi, nosso consultor Bruno Alcarás segue mostrando a utilização da ferramenta Tortoise SVN para controle de versões na segunda parte do artigo “Utilizando SubVersion e Tortoise” .

Para finalizar, nosso colaborador Thiago Montebugnoli segue nos mostrando o banco de dados Sql Server no artigo “Trabalhando com Sql Server Express Edition parte 2”.

É isso. Boa leitura a todos. Parabéns a todas as mães e até junho!

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

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

Internethttp://www.theclub.com.br

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

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr

Copyright The Club Megazine 2009

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoTassiane Fileto

ColunistasAntonio Spitaleri Neto

Bruno AlcarásEduardo MassudLuciano Pimenta

Thiago Cavalheiro Montebugnoli

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

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

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

Page 5: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 05

Delphi

Controles ASP.NET, a partir da versão 2.0 do framework, tornaram-se bastante customi-záveis e com muitas opções ao usuário, entre eles podemos destacar o GridView, onde facilmente, podemos implementar: inserção, atualização, exclusão e seleção de dados.

Com a atualização do .NET Framework, muitas novas funcionalidades são agregadas a um dos controles mais usados em aplicaçoes web. Neste artigo, veremos algumas dicas úteis para a utilização desse controle para customizá-lo em suas aplicações Web.

Não vou mostrar a parte de conexão com base de dados, isso é facilmente realizado com os assistentes do GridView.

Adicionando controles

O uso de templates do ASP.NET ajuda a custo-mização do GridView para a adição de controles. Basta criar um coluna do tipo TemplateField e adicionar os controles necessários.

Vamos adicionar um CheckBox, para podermos manipular os itens do Grid, para que possamos marcar/desmarcar todos, alterar estilo da linha (fonte) quando a mesmo for selecionada, retornar as linhas selecionadas etc.

Crie uma nova aplicação Web no Delphi Prism XE. Não vamos nos concentrar em conexões com o banco ou formatações do GridView. Formate o

GridView no Delphi Prism XEDICAS DO CONTROLE MAIS USADO EM APLICAÇÕES ASP.NET

GridView na opção que desejar e conecte ao banco de dados Northwind que acompanha o SQL Server ou outro banco de sua preferência.

Nota: o Delphi Prism possui conexão com o Interbase/Firebird, Oracle, Acess e drivers ODBC. Você pode usar esses bancos normalmente.

Nesse exemplo, usaremos o SQL Server Express

2008, e usaremos os dados da tabela Customer (não será necessário selecionar todos os campos, escolha apenas alguns). Altere a propriedade Allo-wPaging para True (paginação).

Na propriedade Columns do GridView, adicio-ne um campo do tipo TemplateField e clique em OK (Figura 1).

Veja a figura 1.

Na Smart Tag do GridView, clique na opção

Figura 1. Adicionando um TemplateField como coluna do GridView

Page 6: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201106

Edit Templates. Em ItemTemplate, adicione um CheckBox. Feche o editor, rode a aplicação e veja os controles adicionados ao GridView.

Vamos saber que linhas “selecionadas” com o CheckBox. Adicione um botão e um TextBox (altere TextMode para Multline) na página. No Click do botão adicione o código da Listagem 1.

Listagem 1. Obtendo a linha com o CheckBox marcado

uses System.Text;...method _Default.Button1_Click(sender: System.Object; e: System.EventArgs);var sb: StringBuilder := new StringBuilder(); ch: CheckBox;begin sb.Append(‘* Itens Selecionados *’); for each row: GridViewRow in GridView1.Rows do begin //”procura” pelo CheckBox ch := (row.FindControl(‘CheckBox1’) as CheckBox); //se achou e está marcado if (ch <> nil) and (ch.Checked) then begin sb.AppendLine(); sb.Append(row.Cells[1].Text + “ - “ + row.Cells[2].Text); end; end; TextBox1.Text := ‘’; TextBox1.Text := sb.ToString();end;

Criamos uma variável do tipo StringBuilder e percorremos todas as linhas do GridView a procura do CheckBox que adicionamos via template, com o FindControl. Esse método retorna um Control, então fizemos um cast para um CheckBox. Vale

salientar que o parâmetro do FindControl é o nome do controle e o mesmo deve ser digitado corretamente, claro.

Se o controle não for nulo (foi encontrado) e estiver marcado (Checked), então adicionamos na sb os valores das colunas 1 e 2.

Nota: As colunas do GridView começam com 0, incluindo a do tipo TemplateField.

Rode a aplicação, marque algumas linhas e clique no botão. Como mostra a Figura 2, o TextBox exibe as linhas “selecionadas”.

Veja a figura 2.

Que tal colocar um CheckBox no cabeçalho para marcar/desmarcar todas as linhas do Grid? Abra o Template do GridView e acesse o Header-Template na opção Display.

Adicione outro CheckBox, altere a propriedade AutoPostBack do controle para True, pois sem ela o exemplo não funcionará, pois o evento do mesmo

não será executado. Dê um duplo clique no controle e no evento adicione o código da Listagem 2.

Listagem 2. Marcando/desmarcando os CheckBoxes

var ch: CheckBox;begin for each row: GridViewRow in GridView1.Rows do begin ch := (row.FindControl(‘CheckBox1’) as CheckBox); if ch <> nil then ch.Checked := (sender as CheckBox).Checked; end;end;

O código é praticamente igual ao anterior, apenas verificamos se a variável ch não está nula e

Figura 2. Obtendo as linhas selecionados no GridView

Page 7: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 07

repassamos para a mesma o valor da propriedade Checked do controle que adicionamos no cabeça-lho da coluna. Rode e faça o teste. Ao selecionar o CheckBox no cabeçalho, somente os itens da página do GridView serão selecionados.

Alterando estilo da linha

E se ao clicar no CheckBox eu precisasse alterar a fonte da linha? Também fica muito simples. Aces-se o template do GridView para o CheckBox das linhas, alterando a propriedade AutoPostBack do mesmo para True. Dê um duplo clique no controle e adicione o código da Listagem 3.

Listagem 3. Alterando a fonte da linha marcada

uses System.Drawing;...var ch: CheckBox;begin for each row: GridViewRow in GridView1.Rows do begin ch := (row.FindControl(‘CheckBox1’) as CheckBox); if ch <> nil then begin if ch.Checked then begin //formata o tamanho, negrito e cor row.Font.Size := 12; row.Font.Bold := true; row.ForeColor := Color.Red; end else begin //volta ao padrão row.Font.Size := 10; row.Font.Bold := false; row.ForeColor := Color.Black; end; end; end; end;

O código continua semelhante, onde verifi-camos se a variável ch não é nula e depois se foi marcada. Se positivo, alteramos as configurações da fonte da linha. Senão, voltamos às configurações normais.

O código do else vai variar de acordo com as formatações do seu GridView. Rode a aplicação e teste (Figura 3).

Veja a Figura 3 .

A funcionalidade de adicionar controles no GridView é semelhante para outros tipos de con-troles. Você pode tomar por base essas dicas para adicionar um DropDownList, por exemplo.

Master/Detail

Crie uma nova página e adicione dois Grid-Views. Para o primeiro, crie uma conexão com a tabela Orders. Para o segundo, acesse os dados da tabela Order Details.

Na tela do wizard do segundo GridView, onde escolhemos os campos, marque a opção Specify a custom SQL statement or stored procedure, pois va-mos adicionar uma consulta SQL customizada. Cli-que em Next e digite a consulta SQL da Listagem 4.

Listagem 4. Consulta SQL

select OD.OrderID, P.ProductName, OD.Quantity, OD.UnitPricefrom [Order Details] ODinner join Products P on P.ProductID = OD.ProductIDwhere OD.OrderID = @OrderID

Ao clicar no Next, por termos um parâmetro na consulta, somos direcionados para a tela de configuração do parâmetro. Na tela, em Parameter source escolha Control, em ControlID selecione GridView1 (Figura 4).

Veja a figura 4.

Veja que em Parameters vamos pegar o valor do SelectValue do GridView para preencher o parâmetro da consulta. Finalize o wizard e no GridView1 acesse a Smart Tag, marcando a opção Enable Selection.

Rode a aplicação, selecione uma linha do GridView1 e veja que o GridView2 será preenchido com os dados referente aos itens da tabela master (Order) (Figura 5).

Figura 3. Alterando a fonte da linha marcada

Page 8: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201108

Veja a figura 5.

Master/detail com Templates

Mas se necessitar que os itens (no caso os details) sejam mostrados diretamente, sem a intervenção do usuário? Para isso, usaremos tem-plates no GridView master. Crie uma nova página e adicione um GridView, adicionando os dados da tabela Orders.

Acesse o editor de colunas do controle e re-mova todos os campos, adicionando apenas uma coluna do tipo TemplateField. Acesse o template e adicione uma tabela com duas linhas e três colunas (usando o menu Table>Insert Table).

Na linha superior, vamos adicionar os rótulos dos campos (digite ou use Labels), e na linha in-ferior, adicione três Labels. Para as Labels vamos usar DataBind para mostrar os valores dos campos. Acesse a Smart Tag do primeiro Label e acesse a opção Edit Databindings. No editor, configure o campo no item Bound to (Figura 6).

Veja a figura 6.

Faça o mesmo para os outros campos. Abaixo da tabela, adicione um GridView e configure para acessar os dados da tabela Orders Details e configu-re um parâmetro igual ao exemplo anterior, só que ao invés de escolher o GridView1, você escolherá o Label referente ao campo OrderID.

Finalize o wizard e rode a aplicação. Veja na Figura 7 que estamos visualizando os dados da mas-ter (Orders) e em seguida a detail (Order Details).

Veja a figura 7.

Note, que coloquei a paginação do GridView master para mostrar apenas 1 registro por vez, apenas para fins de melhor visualização.

Trabalhando com imagens

Mostrar imagens no GridView é simples. Por exemplo, para mostrar imagens nos comandos de seleção, exclusão, atualização e edição, basta con-figurar propriedades no editor de colunas.

Use a imagem que desejar na propriedade XXImageURL, onde o XX é o tipo de comando (Cancel, Delete, Insert, Update). Por último altere ButtonType para Image.

Figura 4. Parâmetros da consulta

Figura 5. Master/Detail com dois GridViews

Em uma tabela de clientes (pessoa física), certamente possuímos um campo indicador do sexo. Por que não, mostrar no GridView a listagem dos clientes e de acordo com o sexo, mostrar uma imagem diferente? Nesse exemplo, usei um arquivo

XML para preencher o GridView.

Nele temos um campo chamado SEXO, sal-vando: “M” ou “F”. Adicione o código da Listagem 5 na página.

Page 9: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 09

Figura 6. Opção de DataBinding no TemplateField

Figura 7. Master/detail sem a intervenção do usuário

Listagem 5. Criando um método que retorne o nome do arquivo

method RetornaImagem (sSexo: string): string;var sRetorno: string := ‘’;begin if (sSexo = ‘M’) then sRetorno := ‘~/imagens/M.gif’ else if (sSexo = ‘F’) then sRetorno := ‘~/imagens/F.gif’; result := sRetorno;end;

O código retorna o nome do arquivo, salvo na pasta imagens de acordo com o valor passado como parâmetro. No editor de colunas do GridView, para o campo SEXO, transforme-o em um TemplateField.

Acesse o editor de templates e adicione um Image. Acesse a Smart Tag e escolha a op-ção Edit DataBindings. Na tela, escolha Custom binding e digite: “RetornaImagem(Convert.ToString(Eval(“SEXO”)))”.

Com esse código, fizemos o Bind na proprieda-de ImageURL do controle, que passará o valor do campo SEXO através do Eval(“SEXO”). Feche o edi-tor, rode a aplicação e veja as imagens sendo mos-tradas de acordo com o sexo do cliente (Figura 8).

Veja a figura 8.

Podemos mostrar a imagem de outra maneira, sem o uso do controle. Adicione uma nova coluna do tipo TemplateFied. Crie um novo método com o seguinte código:

result := ‘<img src=”imagens/’ + sSexo + ‘.gif”>’;

Veja que temos apenas uma linha de código, pois o nome do arquivo é o mesmo do valor que esta sendo passado como parâmetro. Usamos a tag img do HTML para mostrar a imagem no GridView. No ASPX, altere a nova coluna Template, usando o código da Listagem 6.

Listagem 6. Modificando a coluna no ASPX

<asp:TemplateField> <ItemTemplate> <%# RetornaImagem2(Convert.ToString(Eval(“SEXO”))) %> </ItemTemplate></asp:TemplateField>

Rode a aplicação e veja que temos a imagem mostrada corretamente de acordo com o valor do

campo (igual ao exemplo anterior).

Validações

Podemos usar os controles de validação normalmente na edição/inserção de valores no GridView. Novamente, faremos uso de Templates. Conecte a uma tabela do banco e escolha uma formatação para o GridView.

Nesse caso, para que as opções de inserção,

Page 10: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201110

Figura 8. Mostrando imagens de acordo com o valor do campo

atualização sejam adicionadas no Grid, devemos configurar o mesmo. No wizard, onde configuramos os campos, clique no botão Advanced e será aberta uma janela (Figura 9).

Figura 9. Opções de manipulação de dados no GridView

Assim, o DataSource é o responsável pelos comandos de atualização, exclusão e inserção no banco de dados, o programador não precisa fazer nada. Transforme os campos que deseja colocar as validações, como templates. Acesse o editor de templates (TempletField) e escolha o item Edi-tItemTemplate na opção Display. Será mostrado o TextBox quando o usuário escolher a opção de inserção ou edição da linha.

Adicione um RequiredFieldValidator e aponte o ControlToValidate para o TextBox, e digite a mensa-gem de erro em ErrorMessage. Feche o editor, rode a aplicação e tente atualizar um registro deixando o campo em branco (Figura 10).

Veja a figura 10.

Somatório no rodapé

Se o GridView possui um campo com valores numéricos ou monetários, certamente você gos-taria de mostrar um total no rodapé da página. Primeiramente, altere para True a propriedade ShowFooter do GridView.

Neste exemplo, simplesmente vamos mos-trar a quantidade de registros do GridView, mas facilmente, poderíamos adicionar o somatório de um campo do Grid, usando variáveis no evento RowDataBound. Após, acesse o evento e adicione o seguinte código:

if (e.Row.RowType = DataControlRowType.Footer) then e.Row.Cells[1].Text := “Quant: “ + GridView1.Rows.Count;

Figura 10. Validando os campos no GridView

Primeiramente, verificamos se estamos no rodapé do GridView através da propriedade Ro-wType. Assim, colocamos na segunda coluna (inicia pelo valor “0”), um texto e a quantidade (Figura 11). Essa dica é ótima para colocarmos em carrinhos de compras para indicar a quantidade e valor total.

Veja a figura 11.

Agrupamento

Para fazer um agrupamento, usaremos a mes-ma técnica já bastante mostrada, templates. Será muito semelhante ao exemplo de master/detail usando templates. Para este exemplo, conectare-mos o GridView à tabela Categories do Northwind.

Deixe apenas um campo e transforme-o em

Page 11: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 11

TemplateField no editor de colunas. Adicione ou-tro GridView no editor de templates e configure para a tabela Products, mas que mostre apenas os produtos de uma categoria específica (ou seja, usaremos um parâmetro na consulta SQL). Nesse caso será um Label que você pode adicionar no editor de templates.

Na consulta, utilize a mesma técnica já apre-sentada, a seleção dos dados da tabela, devem ser filtradas pelo código da categoria que estará em um controle no primeiro GriView.

Depois basta rodar a aplicação e visualizar o agrupamento (Figura 12). Qualquer dúvida consulte o projeto que está para download (neste exemplo, removi o cabeçalho das colunas do GridView das categorias).

Veja a figura 12

Outra dica para agrupamento, sem usar duas consultas ao banco, seria o de remover os itens do agrupamento que se repetem. Para esse exemplo, crie um novo formulário e adicione um GridView. Use a consulta da Listagem 7 para esse GridView.

Listagem 7. Consulta SQL

select P.ProductID, P.ProductName, P.UnitPrice, C.CategoryNamefrom PRODUCTS Pinner join CATEGORIES C on C.CategoryID = P.CategoryIDorder by C.CategoryName

Faça a conexão normal do grid. Reorganize os campos para que fique primeiramente, o nome da categoria, após o código do produto, nome do produto e preço. Transforme o campo da categoria como um templatefield.

Acesso o evento RowDataBound e use o código da Listagem 8. O código esta comentado, para um melhor entendimento. A idéia é pegar o valor do templatefield e comparar com o ViewState do cam-po, tudo isso dentro do evento que é “executado” para cada linha do GridView.

Listagem 8. Código para agrupamento do GridView

Figura 11. Mostrando o somatório no GridView

Figura 12. Agrupamento com dois GridViews

var lbl: Label; sValor, sViewState: string;begin //verifica se é a “linha” do Grid if (e.Row.RowType =

DataControlRowType.DataRow) then begin //procura pelo controle que mostra a categoria lbl := (e.Row.FindControl(‘Label1’) as Label);

Page 12: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201112

sValor := lbl.Text; //pega o valor do campo sViewState := ViewState[‘CategoryName’].ToString();

//compara valores if (sValor = sViewState) then begin //se iguais, esconde o valor e limpa controle lbl.Visible := false; lbl.Text := ‘’; end else begin //mostra o valor e configure o ViewState sViewState := sValor; ViewState[‘CategoryName’] := sViewState; lbl.Text := sViewState; lbl.Visible := true; end;end;

Assim, removemos os campos duplicados e simulamos o agrupamento. No Page_Load adicione o seguinte código:

ViewState[‘CategoryName’] := ‘’;

Veja o resultado na Figura 13.

Outra técnica de agrupamento

Temos mais uma técnica para agrupar o Grid-View, fazendo um “merge” das linhas que não de-vem ser repetidas,. Adicione outra página com um GridView e use o mesmo SQL do exemplo anterior. No RowDataBound use o código da Listagem 9.

Listagem 9. Fazendo merge das linhas repe-tidas

//agrupamento pelo campo Dataif (e.Row.RowType = DataControlRowType.DataRow) thenbegin //pega o valor do grupo – Nome do produto sValorAtual := DataBinder.Eval(e.Row.DataItem, ‘CategoryName’).ToString(); //novo grupo if (not sValorAtual.Equals(sVlGrupo)) then begin if (sVlGrupo <> nil) then begin //”merge” das linhas e alinha no topo (sender as GridView).Rows[nVlLinhaGrupo].Cells[0].RowSpan :=

nVlLinhasGrupo; (sender as GridView).Rows[nVlLinhaGrupo].Cells[0].VerticalAlign := VerticalAlign.Top; end; nVlLinhaGrupo := e.Row.RowIndex; sVlGrupo := sValorAtual; nVlLinhasGrupo := 1; end //”normal” else begin sVlGrupo := sValorAtual; nVlLinhasGrupo := nvlLinhasGrupo + 1; e.Row.Cells[0].Visible := false; end;

Figura 13. Agrupamento com um GridView

Page 13: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 13

end;

//precisa fazer o “merge” no final, senão último agrupamento não funciona if (e.Row.RowType = DataControlRowType.Footer) then begin (sender as GridView).Rows[nVlLinhaGrupo].Cells[0].RowSpan := nVlLinhasGrupo; (sender as GridView).Rows[nVlLinhaGrupo].Cells[0].VerticalAlign := VerticalAlign.Top;end;

Declare as variáveis na seção protected da página:

protected sValorAtual, sVlGrupo: string; nVlLinhaGrupo, nVlLinhasGrupo: Int32;

Veja a Figura 14 do exemplo.

Caso deseje que o campo agrupado fique em outro alinhamento (centralizado, por exemplo), altere o valor da propriedade VerticalAlign.

Conclusão

Vimos neste artigo algumas dicas para a uti-lização do GridView no Delphi Prism XE, um dos controles mais utilizados em aplicações ASP.NET. Temos muitas customizações que podem ser feitas no controle, mas deixo a critério da necessidade do leitor.

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

Figura 14. Agrupando itens usando merge para não duplicar as linhas

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

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

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

Page 14: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201114

Para quem não conhece os outros aplica-tivos da Embarcadero, que compõem o pacote RAD Studio, além do Delphi e C++, ele tam-bém traz duas novas ferramentas de criação, a fim de facilitar a vida do usuário final, uma delas é o Delphi Prism, e a outra é o RadPHP XE, e é do RadPHP XE que iremos falar.

Essa ferramenta surgiu com o intuito de facilitar a vida do programador e interagir com o Delphi via world wide web, a fim de otimizar as aplicações Delphi na Intraweb, visando englobar uma gama maior de utilizações, e não somente limitá-la ao desktop.

No caso do RadPHP XE, ao inserirmos um novo formulário, ele gera um código padrão, que contém requisições herdadas de componentes do RadPHP XE

Veja a figura 1.

RAD PHP XE

Além do método de declaração das units exportadas ser diferente da tradicional conhecida no PHP.

Veja a figura 2.

Figura 1.

Mesmo com a linguagem em PHP, mantem a estrutura de construção do Delphi, baseado em eventos e de interface familiar, tornando assim, aos usuários do Delphi, uma familiarização mais rápida com a IDE.

Page 15: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 15

Figura 2.

São inúmeros os recursos disponíveis no Ra-dPHP XE, que vão desde a criação de um simples aplicativo online, a um site completo, utilizando componentes extremamente eficazes e de fácil aplicação.

A grande vantagem é a fácil utilização de com-ponentes que trabalham no sistema Drag&Drop, o que aumenta a eficácia e o aproveitamento na criação, uma vez que desprende o usuário de codificar para a exibição dos componentes, outro diferencial é a agilidade com que os aplicativos são construídos, sendo rapidamente elaborados e visualizados. Outra grande diferença é a geração de código PHP voltada à orientação a objeto, detalhe que difere um pouco do código tradicional, além da sua sintaxe, que vem a remeter os códigos Delphi.

O RadPHP XE foi otimizado de acordo com a sua evolução, sendo revisado a cada edição, desde quando ainda era Delphi 4 PHP. E com otimizações significativas nesta versão, porém há ainda muita coisa que deixa usuários novatos com certa duvida, uma delas é o método de conexão com o banco, por isso, irei exemplificar com um modelo básico de conexão com o banco de dados MySQL, utilizando para sua instalação do pacote XAMPP para Windo-ws no site oficial: http://www.apachefriends.org/pt_br/xampp-windows.html

Após instalado, criaremos um banco para exemplo, para isto, no browser, acesse 127.0.0.1/phpmyadmin e abrirá a pagina principal para criar-mos o banco de dados, o qual se chamará dbsite, e gerará os campos de acordo com a seguinte sintaxe SQL:

CREATE TABLE IF NOT EXISTS `cadastro` ( `ID_CADASTRO` int(10) unsigned NOT NULL auto_increment, `CADASTRO_NOME` varchar(50) , `CADASTRO_ENDERECO` varchar(50), PRIMARY KEY (`ID_CADASTRO`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Já no RadPHP XE, iremos adicionar 2 Labels,

2 QEdits e 1 QButton e 1 QDBGrid, das paletas do de uma das mais poderosas ferramentas de inter-face visual, o QooxDoo, nativa no RadPHP XE, nas abas Standard - qooxdoo, Additional - qooxdoo e Advanced – qooxdoo, sendo este um framework Ajax permitindo criar aplicações para uma ampla gama de plataformas. Orientada a objeto, é possível gerar aplicativos interativos (RIAs) nativos, para dispositivos móveis, aplicações web tradicionais ou até mesmo que rode fora do navegador.

Após adicioná-los, iremos primeiramente reconhecer o RadPHP XE com o banco de dados, para isso iremos inserir o componente Database da palheta Data Access, e em suas propriedades iremos efetuar a conexão, na propriedade Data-baseName, passaremos como registro o nome de nosso banco de dados, que, no caso, se chama dbsite, com o DriverName como mysql, pois é o banco utilizado, na propriedade Host, devemos informar qual o destino de rede a qual o banco pertence, no caso será localhost, pois é um banco de dados no próprio computador, a propriedade Name é o nome a qual será referenciado nosso componente aos formulários, definido para este exemplo como dbConexão, o UserName define o nome de acesso do usuário ao banco, neste caso no padrão será root e UserPassword também por default não recebe dado algum.

Adicionaremos também uma Query da paleta Data Access, também modificaremos algumas propriedades dela, sendo a primeira a propriedade Database, a qual iremos informar a conexão dese-jada, no caso dbConexao, alteraremos também sua propriedade Name para qCadastros, a propriedade SQL, iremos passa a seguinte sintaxe SQL:

select * from CADASTROS

E por fim, adicionaremos um DataSource da aba Data Access, onde na propriedade Name chamaremos de dsCadastros, e na propriedade DataSet direcionaremos nossa Query, qCadastros.

Feito desta forma, estamos quase completa-mente conectados com o banco de dados MySQL, porém existe um último, mas o mais importante passo para a conexão, que é a geração de um di-cionário de dados no banco a qual o projeto estará conectado, gerando uma tabela padrão no banco de dados, no componente Database, que aqui se chama dbConexao, e que, ao clicar com o botão direito do mouse e clicar em Create Dictionary:

Page 16: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201116

Ele irá criar uma nova tabela no banco de dados, com parâmetros e colunas pré-definidas:

Que no banco gera uma tabela padrão:

Veja a figura 5.

Com o nome da tabela definido de acordo com o nome do Dicionário:

E no sistema ele gera um script em JavaScript, onde referencia o banco de dados ao projeto:

Veja a figura 6.

Após conectado, vamos inserir alguns dados no nosso banco, que serão enviados quando o usuário da aplicação clicar no nosso botão inserido na aplicação, então codificaremos a parti do evento OnClick deste botão, a qual ele gerará uma função.

A primeira coisa a ser feita nessa função é informar quais dados ele resgatará e armazená-las em variáveis, no caso, armazenaremos o nome e o e-mail passados pelos edits:

Figura 5.

Figura 6.

$nome = $this->edtNome->Text; $email = $this->edtEmail->Text;

Obs.: Lembrando que no RadPHP, algu-mas alterações de código diferem do Delphi, e se não observadas, causam impossibilidade na compilação do código, uma delas é a re-ferenciação de todo valor, passado por com-ponente ou não, deve ser armazenado em uma variável, e o PHP não utiliza a definição de tipo destas variáveis, portanto elas podem

Page 17: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 17

receber qualquer tipo de dado, e também, a referenciação de objetos e suas classes se começando com a palavra reservada $this e pelos símbolos - e >, quando referindo-se as propriedades do objeto, unidos e nesta ordem.

Por fim iremos cadastrar o registro no banco de dados, a qual, diferentemente do Delphi, no RadPHP é sem recurso de componentes:

$this->qCadastros->SQL = mysql_query(“INSERT INTO cadastros (CADASTRO_NOME,CADASTRO_EMAIL) VALUES(‘”.$nome.”’,’”.$email.”’)”);

Obs.: Além de criarmos a SQL para inse-rir os dados em nosso banco, não podemos esquecer também da função mysql_query, que, no PHP é a responsável por enviar a consulta até o banco de dados.

Veja a figura 7

Conclusão

O RadPHP XE é uma ótima ferramenta ao que se propõe fazer e muito útil em criações de páginas web rápidas e completas, toda voltada a orientação à objeto e suas vantagens, sendo de grande agili-dade, pois ele minimiza os processos de trabalho com HTML, que dispendem muito tempo na pro-gramação web, e com a interação com o banco de dados, além de obter recursos que são de grande utilidade para as aplicações web, otimizando os aplicativos web e agilizando o processo criativo, reduzindo assim, o tempo de construção da estru-tura visual e estética dos mesmos, fazendo com que a elaboração do site fique dedicado somente a codificação e aos processos lógicos.

Figura 7.

Consultor Técnico The Club.

Sobre o autor

Eduardo Massud

[email protected]

Page 18: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201118

Neste artigo iremos explorar outras ca-racterísticas do SQL Server 2008 junto com sua ferramenta de gerenciamento de Banco de Dados. Demonstrarei algumas de suas muitas funcionalidades.

O SQL Server se tornou um dos princi-pais Bancos de Dados relacional dos últimos anos, esta versão abordada nestes artigos apesar de Express reúne muitas qualidades e características para desenvolvimento de sistemas de pequeno e médio porte para mui-tas empresas. A minha intenção, em artigos futuros, será de integrar o SQL Server com o uso do .NET. Este fato se torna muito favorável pelo fato de sua fácil integração com a IDE do Microsoft Visual Studio.

Sinônimos – Synonyms

Os denominados Sinônimos têm como obje-tivo proporcionar a possibilidade de criar apelidos para um ou mais objetos que façam parte deste sinônimo. A utilização do mesmo facilita o desen-volvimento de scripts quando existe a necessidade de utilizar objetos em locais distintos armazenados no Banco de Dados.

No SQL Server 2008 podemos criar Sinônimos facilmente, para isto clique com o Botão direito e escolha a opção “Novo Sinônimo”, Ver Imagem 01.

Trabalhando com o SQL

Server 2008 Express Edition Parte 2

Figura 01: Propriedades do Sinônimo.

Page 19: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 19

Podemos realizar esta tarefa por linha de comando, Veja abaixo a sintaxe:

CREATE SYNONYM [dbo].[MeuPedido] FOR [dbo].[TB_PED]

É importante destacar os Objetos do Banco de Dados que podemos utilizar como Sinônimos.

Procedimento armazenado de assembly Fun-ção com valor de tabela de assembly

Veja a tabela 1.

Podemos excluir um Sinônimo com o comando DROP, observe abaixo:

DROP SYNONYM DBO.MEUPEDIDO

Ou clicando no mesmo e escolhendo a opção “Excluir”. Notem que o SSMSE nos fornece muitas funcionalidades para se trabalhar com os objetos do SQL Server, ou seja, podemos fazer quase tudo por interface gráfica.

Procedimentos Armazenados – Stored Procedures

Para quem não sabe, Stored Procedures é um conjunto de instruções Transact-SQL que são executadas dentro do Banco de Dados. Ele pode ser chamado tanto pelo SGBD (Sistema Gerenciador de banco de Dados) quanto por um sistema que faz interface com o mesmo. Imaginemos que estamos criando uma aplicação em .NET e temos que criar rotinas para tal tarefa, num futuro próximo migra-mos nossa aplicação para outra linguagem, uma das vantagens de se trabalhar com Stored Procedures é que todo comando está armazenado dentro do SGBD, ou seja, teremos o trabalho apenas de invo-car este Stored Procedure na aplicação.

Nota Importante: Ao executar o Stored Procedure pela primeira vez ele é compilado e a cada execução são colocados em CACHE, caso seja executado novamente é utilizado o resultado do CACHE diminuindo o esforço do SQL Server e conseqüentemente aumentando a velocidade de acesso.

Procedimento armazenado de assembly Função com valor de tabela de assemblyFunção escalar de assembly Funções de agregação de assemblyProcedimento de filtro de replicação Procedimento armazenado estendidoFunção SQL escalar Função SQL com valor de tabelaFunção SQL com valor de tabela embutida Procedimento armazenado SQLExibição Tabela (definida pelo usuário)

Importante ressaltar que existem Stored Procedures do Sistema e definidas por usuários. Na Imagem 02 estão as de Sistema, mas especi-ficamente em nosso artigo iremos abordar as de usuário.

Figura 02: SP de Sistema.

Bem, vamos ao que interessa, abrindo o SSMSE clique no item Programação e logo em seguida em Procedimentos Armazenados. Aparecerá toda a sintaxe para se criar um SP, veja a seguir para melhores detalhes:

CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, ASBEGIN SET NOCOUNT ON;

Tabela 1.

SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>ENDGO

Em CREATE PROCEDURE definimos o nome do Stored Procedure, em seguida os parâmetros de Saída e os comandos necessários. No nosso caso criaremos uma SP para retornar os registros de acordo com o que será passado por parâmetro, Veja a seguir:

CREATE PROCEDURE SelecionaPedido@NUM_PED intASBEGIN SET NOCOUNT ON;

SELECT * FROM TB_ITE WHERE CODIGO = @NUM_PEDENDGO

Clique em executar e verifique que foi criado um Objeto no Banco de Dados chamado dbo.SelecionaPedido. Agora basta executá-lo com o seguinte comando:

EXECUTE [DB_THECLUB].[dbo].[SelecionaPedido] 1

Neste caso foi retornado todos os itens do Pedido cujo código seria o 1. Veja Imagem 03.

Figura 03: Resultado Stored Procedure.

Page 20: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201120

Podemos também alterar um SP já criado, para isto clique com o botão direito e escolha “Modificar”, ou podemos utilizar o seguinte código:

ALTER PROCEDURE [dbo].[SelecionaPedido]@NUM_PED intASBEGIN SET NOCOUNT ON; SELECT COD_PED, DAT_PED FROM TB_PED WHERE COD_PED = @NUM_PEDEND

Já o comando DROP exclui nosso Stored Pro-cedure criado.

DROP PROCEDURE SELECIONAPEDIDO

Não podemos esquecer que podemos executar estes comandos utilizando a interface gráfica, Ver Imagem 04.

Figura 04: Propriedades do Objeto.

Funções – Functions

É importante ressaltar que no caso das Funções elas sempre retornam valores ou tabelas. Podemos construir nossas próprias Funções, semelhantes a DATE(), LTRIM(), RTRIM() entre outras.

No SQL Server 2008 temos 4 tipos de Funções, as denominadas Funções de Valor de Tabela, Funções de Valor Escalar, Funções de Agregação e Funções do Sistema. No nosso artigo iremos estudar um pouco das duas primeiras.

Funções de valor de tabela: Este tipo de função

retorna especificamente tipo de dados de tabela. Para isto clique com o botão direito em “Funções com Valor de Tabela” e escolha “Nova Função com Valor de Tabela Embutida”. Veja o Script criado abaixo:

CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> ( <@param1, sysname, @p1> <Data_Type_For_Param1, , int>, <@param2, sysname, @p2> <Data_Type_For_Param2, , char>)RETURNS TABLE ASRETURN ( SELECT 0)

Para entendermos melhor criaremos uma Fun-ção para retornar os Itens de um Pedido de Venda, para isto verifiquem o código abaixo:

CREATE FUNCTION RETORNA_ITENS ( @NUM_PED int)RETURNS TABLE ASRETURN ( SELECT * FROM TB_ITE WHERE COD_PED = @NUM_PED)

Para executá-la:

SELECT * FROM RETORNA_ITENS(1)

Ver Figura 05.

Funções com valor escalar: Estes tipos de funções retornam um valor único de dados do tipo definido na cláusula RETURNS. É importante saber que o tipo de retorno destas funções pode retornar qualquer tipo de dados, exceto text, ntext, image, cursor e timestamp.

Para isto clique com o botão direito em “Fun-ções com Valor Escalar” e escolha “Nova Função com Valor Escalar”. Veja o Script criado abaixo:

CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName> ( <@Param1, sysname, @p1> <Data_Type_For_Param1, , int>)RETURNS <Function_Data_Type, ,int>ASBEGIN DECLARE <@ResultVar, sysname, @Result> <Function_Data_Type, ,int> SELECT <@ResultVar, sysname, @Result> = <@Param1, sysname, @p1> RETURN <@ResultVar, sysname, @Result>END

Iremos elaborar uma função simples que retira os espaços em branco do lado esquerdo e do lado direito de uma string. Usaremos duas funções internas no SQL Server, uma denominada LTRIM (retira o espaço em branco do lado esquerdo do texto) e outra RTRIM (retira os espaços em branco do lado direito do texto), Abaixo o script para isto:

CREATE FUNCTION RETIRA_ESPACO(@STR VARCHAR(100))RETURNS VARCHAR(100)BEGIN

Figura 05: Resultado Função.

Page 21: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 21

RETURN ( LTRIM(RTRIM(@STR)) ) END Para executá-la:SELECT DBO.RETIRA_ESPACO(NOM_CLI) AS CLIENTE FROM CAD_CLI

Figura 06: Resultado Função.

Clicando com o botão direito na função de-sejada, podemos realizar vários comandos como exclusão, Modificação. Veja abaixo o código refe-rente à Alteração e a Exclusão respectivamente.

Para Alterar:

ALTER FUNCTION [dbo].[RETORNA_ITENS] ( @NUM_PED int)RETURNS TABLE ASRETURN ( SELECT * FROM TB_ITE WHERE COD_PED = @NUM_PED)

E para excluir utilize o código abaixo:

DROP FUNCTION [dbo].[RETORNA_ITENS]

Gatilhos de Banco de Dados - Triggers

Resumindo, a Trigger (ou gatilho) é um objeto que é automaticamente executado assim que efe-tuado um INSERT, DELETE ou UPDATE na tabela. Podemos criá-las de duas maneiras, BEFORE (antes) e AFTER (após). Os gatilhos BEFORE disparam antes das modificações da instrução serem aplicadas, e antes de qualquer restrição ser aplicada. Já os AFTER disparam após todas as restrições terem sido satisfeitas, e após todas as alterações terem sido aplicadas à tabela de destino.

Algumas Limitações de sua utilização

- Não é possível criar um gatilho para uma View (Visão);

- Não podemos utilizar os seguintes coman-dos SQL:

ALTER DATABASE, ALTER TRIGGER, ALTER PROCEDURE, ALTER TABLE, CREATE DATABASE, CRE-ATE PROCEDURE CREATE TABLE, DROP DATABASE, DROP TABLE, DROP PROCEDURE, DROP TRIGGER, entre outros.

Para criar um Gatilho no SQL Server 2008, clique na tabela desejada e escolha a Opção “Gati-lho” e em seguida “Novo Gatilho”, Ver Imagem 07.

Figura 07: Criar um Gatilho.

Abaixo o código referente:

CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>

ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name> AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>AS BEGIN SET NOCOUNT ON;

END

No nosso caso iremos criar um gatilho que ao dar o comando INSERT na tabela de Pedidos de Venda atualizará um campo ULT_PED da tabela de Clientes, veja a seguir o código para isto.

CREATE TRIGGER UPDATE_CLIENTE ON TB_PED AFTER INSERTAS BEGIN DECLARE @COD_PED INT DECLARE @COD_CLI INT SELECT @COD_PED = COD_PED, @COD_CLI = COD_CLI FROM Inserted

UPDATE CAD_CLI SET ULT_PED = @COD_PED WHERE COD_CLI = @COD_CLI

END

Neste caso definimos duas variáveis com o co-mando DECLARE, COD_PED E COD_CLI em seguida recuperamos os valores inseridos utilizando o co-mando INSERTED para podermos posteriormente realizar o UPDATE na tabela de clientes.

Para Modificar o Gatilho podemos fazer da seguinte forma, clicando com o Botão direito sobre o mesmo escolhendo a opção “Modificar”, veja o código:

ALTER TRIGGER [dbo].[UPDATE_CLIENTE] ON [dbo].[TB_PED] BEFORE INSERT

Page 22: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201122

Thiago Cavalheiro Montebugnoli é tecnólogo, formado pela Faculdade de Tecnologia de Botucatu – SP (FATEC) foi consultor técnico do The Club, já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Proces-samento de Dados da Prefeitura Municipal de Itaí-SP. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certi-fied Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.

Sobre o autor

Thiago Cavalheiro Montebugnoli

[email protected]

AS BEGIN DECLARE @COD_PED INT DECLARE @COD_CLI INT SELECT @COD_PED = COD_PED, @COD_CLI = COD_CLI FROM Inserted

UPDATE CAD_CLI SET ULT_PED = @COD_PED WHERE COD_CLI = @COD_CLI

END

Seguindo a mesma lógica dos objetos criados anteriormente, para excluir este gatilho utilize o comando DROP.

DROP TRIGGER UPDATE_CLIENTE

Conclusão

Vimos neste artigo muitas funcionalidades do SQL Server 2008. Com estas dicas os senhores po-derão realizar muitas tarefas e conseqüentemente um aumento de produtividade . Vimos também

que o SQL Server Management Studio Express nos auxilia na utilização destes recursos junto com o Banco de Dados.

Fico aqui, um forte abraço e até o mês que vem!

Page 23: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 23

Esse mês darei continuidade ao artigo que trata sobre a utilização do SubVersion, através do Tortoise. Falarei sobre algumas opções desse maravilhoso programa, nada muito avançado, mas uma pequena introdução sobre cada uma dessas funções. Sugiro que caso não te-nha lido o artigo do último mês o faça, ele trata das funções básicas do Tortoise e lhe dá uma introdução ao funcionamento do mesmo. Esse artigo pode ser encontrado em nosso site, ou então na revista do mês de Abril de 2011.

Como dito no artigo passado, o Sub-Version é uma ferramenta de grande para empresas que querem ter um controle detalhado das alterações do seu software, pois ele guarda, através de um sistema próprio, todo ciclo de vida do aplicativo, podendo o usuário consultar todas as alterações que foram feitas no mesmo

Utilizando o SubVersion e o Tortoise

Parte 2

e até, caso julgue necessário, voltar os fontes a versões mais antigas de código.

Estrutura das Pastas

Como mencionei brevemente no artigo ante-rior, o SubVersion tem um padrão para criação da estrutura das pastas do repositório. Esse padrão é adotado pela maioria dos usuários, mas isso não quer dizer que só possa ser feito dessa maneira, caso você tenha alguma outra forma de organizar seus arquivos pode usar tranquilamente. Nessa parte do artigo explicarei essa forma padrão de organização das pastas.

As três pastas comumente usadas são: Trunk, Branches e Tags

1. Trunk – é o local onde todo trabalho é feito, nessa pasta são “comitadas” todas as alterações que serão feitas no projeto, todos os programadores que lidam com o código, “comitam” a todo momento as alterações nessa pasta.

2. Branches – quando o projeto está quase pronto, cria-se uma branches. Isso quer dizer que o projeto não sofrerá mais modificação em seu có-digo, só serão corrigidos possíveis bugs que forem encontrados durante os testes da versão. A bran-ches é criada através da “cópia” do estado atual da trunk, que foi definido entre os programadores como uma versão estável do projeto. O copiar ficou entre aspas porque não é feito exatamente uma cópia do arquivo, a branches só cria uma ligação aos arquivos da revisão considerada final da trunk e as guarda na pasta, não aumentando assim de maneira alguma o tamanho do seu repositório, essas “cópias” são chamadas de cheap copies.

3. Tags – quando verificado que a bran-ches está ok, já corrigimos os possíveis bugs e a versão já está liberada para o cliente, criamos a pasta tags. Nessa pasta ficam os arquivos que serão compilados e enviados aos nossos clientes. Podem ser criadas várias subpastas dentro da tag, com, por exemplo, Projeto 1.0 a próxima Projeto 1.1. Desta forma a história do seu aplicativo ficará

Page 24: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201124

toda guardada no SubVersion.

Mais adiante nesse artigo mostrarei como criar cada uma dessas pastas.

Criando um projeto de exemplo

Esse projeto exemplo é o mesmo criado no artigo do mês anterior.

Inicie um novo projeto no Delphi e insira três botões, adicione os seguintes códigos aos botões:

Button1:

ShowMessage(‘The

Club. O maior clube de

programadores do Brasil’);

Button2:

ShowMessage(‘The Club

Megazine’);

Button3:

ShowMessage(‘Avaré - SP’);

Salve o seu projeto com o nome e em uma pasta de sua preferência. Crie o repositório e faça os primeiros commits.

Não vou abordar nesse mês a criação do repositório e os primeiros passos da configuração do Tortoise, para tanto consulte o artigo do mês passado na revista ou então através do nosso site.

Faça o checkout desse projeto para duas pas-tas, para simularmos a situação em que mais de um programador esteja trabalhando no projeto ao mesmo tempo.

Opções do menu de contexto

Quando clicamos com o botão direito em um arquivo ou pasta e escolhemos a opção Tortoi-seSVN, somos apresentados a diversas opções do menu de contexto do TortoiseSVN, vou explicar algumas delas a partir de agora.

Veja a imagem 1.

• ShowLog – nessa opção, como mostra-do no artigo anterior, você confere o log de revisões no seu repositório, tudo o que foi alterado e todas as mensagens de commit são encontradas aqui;

• Repo-browser – em Repo-browser você confere as pastas que compõem o seu repositório, toda a estrutura organizada de forma hierárquica, escolhendo uma pasta você visualiza os arquivos presentes nessa pasta no repositório. Todos os seus projetos no repositório são mostrados, e não apenas o que você consulta. Perceba na imagem que os meus três projetos são mostrados.

Veja a imagem 2.

• Check for Modifications – nessa opção podem ser verificados os arquivos que estão dife-rentes dos arquivos da última revisão, as modifica-ções. Na imagem que segue um arquivo apresenta essa condição.

Veja a imagem 3. Nessa tela existe uma opção muito interessan-

te, essa opção é chamada de Blame e permite que você saiba quem é o autor de cada linha dos fontes, ou saber de que revisão é procedente esse código. Para acessa-la clique com o botão direito em algum arquivo que aparece nessa tela e escolha a opção Blame, surgirá uma tela com algumas configurações que não irei abordar aqui, bastando dar ok. Na imagem que segue é visto que apenas uma linha foi modificda pelo usuário Bruno, na revisão 24.

Veja a Imagem 4.

Imagem 2.

Imagem 1.

Page 25: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 25

Imagem 4.

Imagem 5.

• Revision graph – é mostrado um gráfico com informações sobre as revisões enviadas ao repositório.

• Resolved – essa opção marca alguma ação pendente como resolvida, como por exemplo, um merge em algum arquivo que ainda necessita de uma confirmação. Quando escolhida é mostra-da uma tela com os arquivos que necessitam do Resolved.

• Update to Revision – faz o update dos arquivos para uma revisão pré-definida, essa revisão é escolhida na tela que se segue após a escolha da opção. Essa opção é recomendada pra ser usada em um arquivo específico, pois podem ocorrer conflitos que necessitaram de merge.

• Revert – são listados os arquivos que estão diferentes da última revisão do repositó-rio, através dessa opção você pode voltar esses arquivos ao estado do repositório. São listados os arquivos que estão diferentes, basta escolhe-los e clicar em Ok.

• Clean up – caso ocorra algum proble-ma, como por exemplo algum comando que não foi executado corretamente, use o Clean up para limpar a lista de comando a ser executados.

• Get Lock – trava um arquivo, isso faz com que apenas o usuário que “travou” o arquivo possa fazer o “commit” no arquivo. Caso outro usuário edite o arquivo e tente fazer o commit, será prontamente bloqueado. O único que poderá modificar, deletar ou renomear o arquivo no repo-sitório é o usuário que o bloqueou, isso é mantido até que a trava seja liberada.

• Release Lock – quando não julgar mais necessário travar um arquivo, basta escolher essa opção, e na tela seguinte marcar os arquivos que deseja destravar(apareceram na lista apenas os travados). Isso vai liberar o arquivo para todos os usuários o editarem.

• Branche\tag – nessa opção é feita a criação da branche ou tag, de acordo com a necessidade do projeto, para fazer essa criação o processo é muito simples. Ao escolher essa opção

Imagem 3.

a seguinte tela será exibida: Veja a Imagem 5.

A primeira mudança a ser feita é em url, defina no caso da criação de um branche, file:///rep/projeto_teste/branches/RB_1, isso fará com que seja criada uma pasta no repositório uma pasta

branche com a subpasta RB_1, que fará o papel da Release Branche 1.0. No Raedio Group abaixo você define de onde virão os arquivos dessa Branche, se da última revisão do repositório(HEAD revision in the repository), se de uma revisão específica do repositório que deve ser definida pelo número logo a frente da opção(Specific revision in repository), ou se dos arquivos da pasta de trabalho(Woring

Page 26: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201126

Imagem 8.

Imagem 7.

Copy). Após isso defina uma mensagem para futu-ras consultas. Se você clicar em ok sem criar a pasta branche no repositório antes, lhe será retornado o seguinte erro:

Veja a Imagem 6.

Isso indica que a pasta branches ainda não foi criada no repositório, ppara faze-lo utilize a opção Repo-Browser. Depois de criada a pasta com o mesmo nome do definido , basta criar o branche.

• Switch – permite a mudança do ende-reço do repositório, recomendada apenas para usuários avançados.

• Merge – através dessa opção são feitos os merges, eles devem ser feitos, por exemplo, quando você, corrigindo alguns bugs da sua Release Branche quer as passar pra sua pasta de trabalho, para isso faça um merge. Essas opções devem ser usadas com cautela, e somente por usuários mais experientes. Existem três opções de merge:

Veja a Imagem 7.

1. Merge a range of revisions: através dessa opção, você faz o merge de uma correção de bug, por exemplo, e quer aplicar essa correção ao seu trunk, sua pasta de trabalho. Você faz um merge da sua branches e com isso o “bug” é corri-gido também na sua pasta de trabalho.

2. Reintegrate a Branche: quando você cria branches separadas e em um dado momento quer reintegra-las em uma só, utilize essa opção

3. Merger two diferente trees: por essa opção você pode dar um merge em duas branches diferentes diretamente para sua pasta de trabalho

• Export – nessa opção você pode expor-tar os arquivos da sua pasta selecionada para um caminho específico, definido depois de escolher a opção.

• Relocate – por essa opção você pode trocar o caminho do repositório dos seus projetos.

• Add – adiciona novos arquivos ao repo-

Imagem 6.

Page 27: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 27

Imagem 9.

Imagem 10.

Imagem 12.

sitório. Caso sejam criados novos arquivos na sua pasta de trabalho, por essa opção você os adiciona ao repositório. Isso pode ser feito também durante o commit.

• Create Patch – podem ser criados pa-tchs para controle das alterações do seu projeto. Quando muitas pessoas mexem no mesmo projeto, este pode se tornar instável, para controlar isso podem ser criados patchs de correção, para que o projeto sempre tenha uma versão estável, caso seja necessário usa-lá.

• Apply Patch – aplica os patchs criados a sua pasta de trabalho.

• Properties – adiciona propriedades ao Subversion. Essa é uma opção usada por usuários avançados.

• Settings – você pode configurar diversas opções no Tortoise. Esquema de cores, fontes, ícones etc, além de outras opções avançadas.

Veja a imagem 8.

Resolvendo conflitos

Quando você faz um update dos arquivos do repositório para sua pasta de trabalho, pode ocorrer que algumas vezes a versão que está no repositório, em uma linha determinada de código esteja diferente da que está na sua pasta, nesse momento o TortoiseSVN, na tela de log, lhe avisa que ocorreu um conflito:

Veja a imagem 9.

Antes de seguir com o seu trabalho, você terá que resolver esse conflito, ou o seu código ficará da seguinte forma:

Veja a imagem 10.

Esse código, “dividido” em dois e impossível de ser compilado significa o seguinte, mine é o que está na sua pasta de trabalho, r7 é o que está na revisão buscado no update. Os arquivos com con-flito, em seu ícone ganham um triângulo amarelo

Page 28: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201128

com uma exclamação.

Para resolver esse conflito clique com o botão

direito no arquivo e escolha a opção do menu de contexto do TortoiseSVN Edit Conflicts. A tela do seu programa de merge será exibida nesse momento.

Veja a imagem 12

Essa tela, caso use o TortoiseMerge, é dividida em três partes, as partes conflitantes ficam em vermelho.

1. Theirs – é o código que está na revisão que você tentou dar o update, o código da revisão no repositório;

2. Mine – é o seu código, que está presente na sua pasta de trabalho;

3. Merged – é o resultado final do merge, depois de definido qual código será usado, nessa parte da tela é demosntrado como o código ficará.

Em merged clique com o botão direito no conflito, e selecione uma das opções, Use text block from “theirs” ou Use text mine from “mine”. Depois de escolhido o trecho de código a ser usado você deve clicar no botão Mark as Resolved.

Win Merge

Existem vários programas de merge, entre eles o que mais gosto de usar é o WinMerge. É um programinha gratuito que quando instalado, automaticamente é colocado como padrão do TortoiseSVN. Ele pode ser baixado no seguinte endereço:

http://winmerge.softonic.com.br/

Esse programa se integra ao menu de con-texto, e pode ser facilmente acessado para outras comparações, que não só no TortoiseSVN. E ainda tem uma vantagem a mais que o TortoiseMerge, é em português.

Veja a imagem 13.

Consultor Técnico The Club.

Sobre o autor

Bruno Alcarás

[email protected]

Imagem 13.

Conclusão

Concluo assim a segunda parte dos artigos sobre controle de versão. Nesse artigo falei um pouco sobre algumas opções mais avençadas do TortoiseSVN, de como resolver conflitos e do WinMerge. Sugiro que para informações mais detalhadas sobre as funções, consulte o help do programa e alguns livros que podem ser facilmente encontrados na internet.

E isso é tudo pessoal! Até mais!!

Page 29: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011 29

Dicas DELPHI

Formulário Piscando

Esta é uma dica útil para ser usado em pequenas caixas de mensagem, onde necessita a atenção imediata do usuário, e uma boa estratégia é manter o formulário piscando intermitentemente, e, uma simples sequencia de código, podendo ser adaptado a qualquer sistema, que funciona como atrativo visual.

Basicamente necessitamos somente de um formulário, um Timer e a propriedade AlphaBlendValue do nosso formulário, onde no evento OnTimer de nosso objeto Timer vamos inserir o seguinte código:

if AlphaBlendValue = 0 then AlphaBlendValue := AlphaBlendValue + 255 else

if AlphaBlendValue = 255 then AlphaBlendValue := AlphaBlendValue - 255; Application.ProcessMessages;

Essa função faz com que o formulário suma e reapareça repetidamente, focando a atenção do usuário para este formulário, sendo muito útil em pe-quenas aplicações para foco de mensagens em um sistema.

Page 30: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 201130

VerticalHorizontal

Page 31: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011

Page 32: The Club - megazine · Trabalhando com SQL Server 2008 Express Edition parte 2 18 29 Legenda Iniciante Intermediário Avançado ... Checked do controle que adicionamos no cabeça-lho

maio 2011