sexta-feira, 25 de julho de 2008

JPAjaxControlToolkit no CodePlex

Olá a todos,

Dando continuidade à evolução da biblioteca de controles AJAX que estou desenvolvendo, publiquei-a no CodePlex a fim de melhorar a distribuição, versionamento e colaboração entre os interessados.

O projeto foi publicado com o nome JPAjaxControlToolkit sob a licença BSD.
Escolhi a “New BSD License” pois não tenho qualquer pretensão de restringir o acesso e distribuição de seu código fonte, bem como sua utilização em projetos comerciais (este último, restrito pela licença GPL).

O endereço do projeto é http://www.codeplex.com/jpajaxcontroltoolkit e, além do download de releases, terei um canal de comunicação com os usuários para discussões, aviso sobre bugs e solicitação de funcionalidades. O projeto também pode ser acessado via Visual Studio por meio do Team Foundation Server Explorer pelos colaboradores.

Inicialmente a biblioteca terá três componentes: HierarchicalGridExtender, WizardSideBarExtender e RSAEncryptExtender.

  • O HierarchicalGridExtender já foi explicado em um post do dia 2 de maio (http://jpdotnet.blogspot.com/2008/05/hierarchicalgridextender-um-controle.html).
  • O WizardSideBarExtender está disponível no projeto do CodePlex mas vou escrever sobre ele aqui no blog no próximo post. Seu objetivo é bem simples: proporcionar ao usuário do controle Wizard do ASP.Net a possibilidade de posicionar sua sidebar no topo, no rodapé, a direita ou a esquerda do Wizard, sendo esta última opção a única possível originalmente no controle da framework.
  • Já o RSAEncryptExtender é um controle que estende uma TextBox a fim de criptografar seu conteúdo antes de enviar para o servidor HTTP. A criptografia é feita em JavaScript e a decriptografia é feita no lado do servidor usando as classes de segurança da framework. Esta solução é extremamente útil quando utilizamos, por exemplo, autenticação Forms sem SSL. Neste caso pode-se criptografar o campo senha que o usuário digitou no browser antes de enviá-la ao servidor.

Creio que o RSAEncryptExtender seja meu controle mais complexo até agora e, por isso mesmo, preciso terminar alguns testes antes de publicar uma versão minimamente estável. Estou testando em um de nossos sistemas e em breve disponibilizarei seu código e um post explicando sua utilização.

Bom, por enquanto é isso ai.

Aguardem o próximo post com exemplo de uso do WizardSideBarExtender.

Abraços, JP.

sexta-feira, 2 de maio de 2008

HierarchicalGridExtender - Um controle ASP.NET Ajax para adicionar hierarquia aos GridViews

Olá.

Hoje venho apresentar a primeira versão de uma coleção de controles ASP.Net Ajax que pretendo implementar baseado na AjaxControlToolKit e em seu template para desenvolvimento de Extender Controls.

Chamarei esta biblioteca de JPAjaxControlToolKit e distribuirei o código fonte de tudo o que desenvolver.

Nesta primeira versão apresento um controle que chamei de HierarchicalGridExtender que tem por finalidade adicionar o comportamento de grid hierárquico ao controle GridView nativo do ASP.Net. A imagem abaixo resume bem o objetivo deste extender:



Propriedades do HierarchicalGridExtender:

  • TargetControlID: ID do objeto Image que deverá responder ao click do mouse e provocar o Collapse e Expand;
  • PanelToCollapse: ID do objeto Painel que comporta o conteúdo a ser escondido e exibido;
  • ImageURLCollapsed e ImageURLExpanded: URLs para configurar a imagem em TargetControlID quando o painel estiver escondido e exibido, respectivamente.

Alguns pontos importantes a considerar:


  • O HierarchicalGridExtender deve ser colocado em uma coluna do GridView, no caso, uma TemplateField;

  • O HierarchicalGridExtender não é um grid para substituir o GridView, ele apenas adiciona um comportamento ao GridView existente na framework. Você não precisa se preocupar em substituir os objetos GridView que já possui em sua aplicação, basta adicioná-lo ao GridView conforme item anterior;

  • O HierarchicalGridExtender não é um controle visual. Você pode configurar o seu GridView, Image, Panel e quaisquer outros objetos contidos neste com suas cores, comportamentos e demais recursos existentes, da mesma maneira que faz normalmente;

  • O Panel em PanelToCollapse pode conter qualquer conteúdo, inclusive outro GridView, o que permite um design bem interessante como o mostrado na figura abaixo:


A imagem acima representa o uso que dei ao HierarchicalGridExtender em um de nossos sistemas. Como o conteúdo do GridView interno é relacionado a uma linha do GridView externo (o que creio ser padrão na maioria dos casos), eu adotei a seguinte estratégia:


  • Faço a consulta de todos os dados montando um DataSet e seus relacionamentos;

  • Coloco este DataSet em uma variável local da página;

  • No GridView externo faço o bind com a tabela pai;

  • No evento RowDataBound do GridView externo eu utilizo os métodos disponibilizados pelo próprio DataSet para retornar os “registros filhos”.

Exemplo:


Dim gvConsultasFilhas As GridView = CType(e.Row.FindControl("gvConsultasFilhas"), GridView)
gvConsultasFilhas.DataSource = _dsConsultasPendentes.FLX_Fluxo.Rows.Find(e.Row.DataItem("FLX_Codigo")).GetChildRows("FluxoFluxoFilho")
gvConsultasFilhas.DataBind()

Você também pode querer ocultar a imagem e desabilitar o HierarchicalGridExtender quando não houver registros filhos.


Exemplo:


If gvConsultasFilhas.Rows.Count = 0 Then
CType(e.Row.FindControl("hgeExpandir"), DPRAjaxControlToolkit.DPRAjaxControlToolkit.HierarchicalGridExtender).Enabled = False
CType(e.Row.FindControl("imgIcone"), WebControls.Image).Visible = False
End If

Estas foram apenas algumas dicas de uso do HierarchicalGridExtender porém, como ele foi projetado para dar total flexibilidade no desenvolvimento, você pode usá-lo de variadas maneiras em diferentes problemas.

Melhorias neste controle podem ser sugeridas. Prometo estudar cada uma e verificar sua viabilidade, porém não garanto a implementação das mesmas nem o prazo para tal, logo fiquem a vontade para modificar o componente. Caso também queiram compartilhar uma melhoria feita no controle, podem contatar-me que terei prazer em adicionar e compartilhar tal melhoria.

Até o próximo post.

Download: www.codeplex.com/jpajaxcontroltoolkit

quarta-feira, 23 de abril de 2008

Copiando um diagrama do SQL Server 2005 para outro banco de dados

Olá,

A muito tempo não atualizo o blog e em conseqüência disso creio que perdi o público que havia conquistado.
Pena... meu público já estava em quase 3 pessoas. :-)

O blog é para mim, além de uma ferramenta de distribuição de conhecimento, uma ferramenta de preservação de conhecimento.
Isto quer dizer que eu o uso como uma biblioteca para referência futura e o post de hoje tem basicamente este último objetivo.

Antes de seguir uma das dicas aqui apresentadas, é importante que a estrutura do banco de dados de destino esteja igual ao banco de origem, pelo menos as tabelas que fazem parte do diagrama que se quer importar.

Segue script que encontrei prontinho em C# articles and tutorials on SharpDeveloper.NET:

use Old_Database
go
--this will copy your database diagrams into a temporary table
select * into dbo.#tempsysdiagrams from sysdiagrams

use New_Database
go
insert into sysdiagrams ([name],principal_id,version,definition)
select [name],principal_id,version,definition from dbo.#tempsysdiagrams where [name] = 'Name_of_your_Diagram'

O script acima usa uma tabela temporária para armazenar o conteúdo da SysDiagrams do banco de origem e, após mudar para o banco de destino, realizar o insert neste.
Em meu caso os bancos estavam em servidores diferentes, logo precisei usar o nosso amigo Integration Services (ferramenta ETL do SQL Server 2005).
O caminho mais curto para realizar esta exportação/importação é clicar com o botão direito do mouse no banco de origem ou destino e selecionar “Tasks” -> “Export Data” ou “Import Data”, conforme o caso.

O importante aqui é lembrar que na tela “Select Source Table and Views” você deve selecionar a tabela “SysDiagrams” e clicar no botão “Edit mappings”. Na tela que se abre, ignore o campo “diagram_id”. O resto vai funcionar perfeitamente.

Abraços e até o próximo post. Daqui a um ano. :-)
Brincadeira.