Flickr Images

Pages

Banner 468

quarta-feira, 29 de maio de 2013

Visualizando atributos de entidades utilizando o DebuggerDisplay

0 comentários
 
Olá para todos! Como vão? Resolvi escrever este post pois existe uma coisa que me incomoda muito. Sabe quando criamos uma entidade qualquer. E depois adicionamos a entidade em uma coleção. Ai precisamos debugar e ver quais os valores que estão dentro da coleção. Quando ai vamos nós expandir item a item da coleção... Isso é algo realmente chato. Pesquisando sobre como melhorar isto acabei encontrando o DebuggerDisplay. Ele é responsável por exibir o valor de alguma propriedade na janela do debug. Bom agora vamos aos códigos:
Criei um projeto do tipo console application.
Crie uma Classe com o nome de AlunoEntity

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsandoDebuggerDisplay
{
    
    public class AlunoEntity
    {
        public string Nome { get; set; }
        public int Matricula { get; set; }
        public DateTime DataMatricula { get; set; }
    }
}

Agora dentro da nossa class Program crio um List de alunos:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsandoDebuggerDisplay
{
    class Program
    {
        static void Main(string[] args)
        {
            var alunos = new List();

            alunos.Add(new AlunoEntity() { Nome = "Pedro Marques", Matricula = 1, DataMatricula = DateTime.Now.AddDays(-4) });
            alunos.Add(new AlunoEntity() { Nome = "Adriana Freitas", Matricula = 2, DataMatricula = DateTime.Now.AddDays(-5) });
            alunos.Add(new AlunoEntity() { Nome = "Joana Almeida", Matricula = 3, DataMatricula = DateTime.Now.AddDays(-3) });
            alunos.Add(new AlunoEntity() { Nome = "Marcelo José", Matricula = 4, DataMatricula = DateTime.Now.AddDays(-6) });

        }
    }
}
Bom agora se formos debugar olha bem o que acontece:

Isso me irrita muito....

Agora vamos usar o DebuggerDisplay. Nossa classe AlunoEntity vai ficar assim:


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UsandoDebuggerDisplay
{
    [DebuggerDisplay("Nome: {Nome} Matricula: {Matricula} Data de Matricula:{DataMatricula}")]
    public class AlunoEntity
    {
        public string Nome { get; set; }
        public int Matricula { get; set; }
        public DateTime DataMatricula { get; set; }
    }
}


Observe bem a linha:
[DebuggerDisplay("Nome: {Nome} Matricula: {Matricula} Data de Matricula:{DataMatricula}")]


Agora o resultado:



Show não é?

Bom por hoje é apenas isto. Qualquer coisa comentem e mandem as dúvidas e/ou sugestões!

Referência:
http://msdn.microsoft.com/en-us/library/x810d419.aspx
Readmore...
domingo, 17 de junho de 2012

Visualizador de notícias usando SharePoint Designer e Jquery

0 comentários
 


Olá pessoal tudo bom? A um bom tempo que não posto nada no blog, mas como hoje foi um dia calmo consegui escrever uma postagem. Vamos lá!
 Em quase todas os clientes que passei todos pediam uma especie de visualizador de notícias. Para isso sempre tinha uma web part pronta para isso. Contudo resolvi mudar um pouco a forma de fazer utilizando apenas algumas funcionalidades do SharePoint 2010 em conjunto com Jquery.

A ideia:

Criar uma visualização de notícias que será exibida a partir de dados de uma lista.

O que utilizarei?

  • REST Interface;
  • Jquery; 
  • Json; 

 Apenas um detalhe: Não sou um designer então desculpe o layout, prometo que quando puder converso com um amigo meu para deixar mais bacana o layout.

Bom ao trabalho:
Primeiro vou criar minha lista de Avisos:


Após criada a lista vamos nas configurações da lista e adicionar 2 colunas:

Mensagem: Coluna que irá conter o texto que será exibido na nossa página principal;


TipoMensagem: Coluna que irá informar se o aviso é uma noticia ou um anuncio;


Resultado final da nossa lista com alguns dados cadastrados:


Feito isso agora vamos na nossa biblioteca de estilos e adicionar a biblioteca do Jquery que pode ser baixada em http://docs.jquery.com/Downloading_jQuery. Aqui estou usando a versão 1.7.2. Apenas fiz o download no link informado e fiz o upload do arquivo jquery-1.7.2.js para a biblioteca de estilos.


Feito isso agora vamos a parte interessante: A nossa funcionalidade de notícias deverá ser atualizada a cada 10 segundos, exibindo sempre os últimos 3 avisos do tipo notícia. Dessa forma sempre que um uma notícia nova for cadastrada ela irá aparecer em nossa listagem. Para fazer isso utilizei o ajax "do" jquery para buscar  dados via rest (wcf?) da lista do SharePoint. Os dados são recebidos em formato Json. Logo abaixo do post colocarei todas as referências. Agora a pergunta: Porque utilizou Rest? Simples: Com ele consigo filtrar, ordenar, paginar, etc, os dados que vem da minha lista!!!! : )
Chega de conversar, vamos a funcionalidade:

  • Vá até a página onde as noticias deverão ser exibidas.  
  • Vá no menu: Ações do Site > Editar Página;
  • Na tela que será aberta seleciona a zona de web part onde você quer que as notícias apareçam e clique em Adicionar uma web part.


  • No menu que será exibido selecione: Mídia e Conteúdo > Editor de Conteúdo > Adicionar;

  • Após adicionar clique no link "Clique aqui para adicionar novo conteúdo".
  • Observe o menu superior e clique em HTML > Editar Origem HTML;



Na janela que será aberta informe o seguinte código:





<div>

<style>

.geral {

        WIDTH: 500px; FONT-FAMILY: verdana; COLOR: #56564b; FONT-SIZE: 11px

    }

.mensagem {

    BORDER-BOTTOM: #73b5de 1px solid;

    BORDER-LEFT: #73b5de 1px solid;

    PADDING-BOTTOM: 1px;

    LIST-STYLE-TYPE: none;

    MARGIN: 3px 1px;

    PADDING-LEFT: 2px;

    PADDING-RIGHT: 1px;

    HEIGHT: 50px;

    BORDER-TOP: #73b5de 1px solid;

    FONT-WEIGHT: normal;

    BORDER-RIGHT: #73b5de 1px solid;

    PADDING-TOP: 2px

}

.tituloMensagem {

        MARGIN: 1px 1px 4px 4px;

        FONT-WEIGHT: bold

}

</style>

<script src="/Style%20Library/jquery-1.7.2.js" type="text/javascript"></script>

<script type="text/javascript">

function CarregarRss()

    {

        $("#dvProcessandoFeed").toggle('fast');

        $("#dvFeeds").toggle('slow');                                   

       

        var Url = "http://srv/_vti_bin/ListData.svc/Avisos?$filter=(TipoMensagemValue eq 'Noticia')&$orderby=ID desc&$top=3";

         $.ajax({

           url: Url,

           dataType: 'json',

           success: CallBack

           });

    }

    function CallBack(retorno) {

        $("#dvFeeds > div").remove();

        $.each(retorno.d, function (dado) {

            var elemento = $("#dvGeralFeed");

            $("#dvFeeds").append('<div class="mensagem"><div class="tituloMensagem">'+retorno.d[dado].Título+'</div>'+retorno.d[dado].Mensagem+'</div>');

        });

        $("#dvProcessandoFeed").toggle('slow');

        $("#dvFeeds").toggle('slow');   

    }

    setInterval(CarregarRss,10000);

    </script>

    <div id="dvProcessandoFeed" style="display: none">

        <img alt="Pesquisando feeds" src="/_layouts/images/loadingcirclests16.gif"/> Processando feeds

    </div>

<div class="geral" id="dvFeeds" style="display: block">

</div>

</div>


Com relação ao código o maior destaque vai para a seguinte linha:


var Url = "http://srv/_vti_bin/ListData.svc/Avisos?$filter=(TipoMensagemValue eq 'Noticia')&$orderby=ID desc&$top=3";

Vamos explica-la com mais detalhes:

Estamos acessando a lista de Avisos via rest. nesse caso executamos um filtro para buscar apenas os avisos que são do tipo noticia:

$filter=(TipoMensagemValue eq 'Noticia')

Aqui temos uma pegadinha: quando efetuamos filtros por campos do tipo opção(choice) temos que adicionar a palavra Value no final. Logo nosso campo que se chamava TipoMensagem virou TipoMensagemValue. Em seguida fazemos a comparação se ele e igual (eq) a Noticia. 
Outro ponto importante é a ordenação. Como eu disse deveriamos exibir apenas as últimas 3 noticias, por isso ordenei pelo ID de forma decrescente e busquei apenas os 3 primeiros registros dessa consulta. Tudo isso apenas fazendo:

$orderby=ID desc&$top=3"

Legal não?

Outro "pulo do gato" é a linha:

setInterval(CarregarRss,10000);


Essa linha faz com que o código que busca os dados seja sempre executado a cada 10 segundos, dessa forma sempre pegamos as notícias mais atualizadas.

Resultado:

Processando noticias:
Exibindo as notícias:



Alguns detalhes sobre a função $.ajax poderão ser encontradas nos links de referência.

Agora já pensaram nas possibilidades que isso pode fazer? Bem rápido e prático, com um bom designer para ajudar vai ficar show!!!!

E ai acharam legal? Qualquer dúvida ou sugestão postem ai!

Readmore...
sexta-feira, 7 de outubro de 2011

Validar formato de CPF e CNPJ em Lista

9 comentários
 
Olá para todos!!!
Bom vamos para mais um problema que tive que resolver e achei uma solução agradável:

Problema:

Em uma determinada lista do Sharepoint precisava validar se um campo o formato do CPF ou do CPNJ estavam corretos. Lembrando:
CPF: xxx.xxx.xxx-xx
CPNJ: xx.xxx.xxx/xxxx-xx

Observação:
Apenas validar se o formato está correto, não valido os dígitos verificadores.
Bom vamos lá, estrutura da lista:
Bom vamos agora nas definições da coluna CPF/CNPJ:
Observe que o tamanho máximo do campo é 18 caracteres. Feito isso agora vamos na opção de validação de coluna e colocamos a seguinte fórmula:
=OR(AND(MID([CNPJ/CPF];3;1)=".";MID([CNPJ/CPF];7;1)=".";MID([CNPJ/CPF];11;1)="/";MID([CNPJ/CPF];16;1)="-";LEN([CNPJ/CPF])=18);AND(MID([CNPJ/CPF];4;1)=".";MID([CNPJ/CPF];8;1)=".";MID([CNPJ/CPF];12;1)="-";LEN([CNPJ/CPF])=14))
Como ficou:
E agora vamos ao teste, lembrando que o cpf é falso!
Observe que quando esta mal formatado ele dispara o erro de formato inválido. Bom é isso qualquer coisa postem ai. Abraços!!!
Readmore...
quinta-feira, 29 de setembro de 2011

Filtro Usuário Corrente em Campo Texto

0 comentários
 
Olá para todos mais uma vez!!!! Após um tempo sem postagem resolvi falar um pouco sobre um problema que tive. Baseado nesse problema vou criar uma situação semelhante para poder exibir a funcionalidade.
Cenário:
Temos uma lista que tem o cadastro de projetos e seus responsáveis. O problema ocorre porque essa lista é alimentada por um outro sistema e o campo que guarda responsável é do tipo texto e não Pessoa ou Grupo, como deveria ser. Precisamos criar uma visão que filtre quais são os projetos que o usuário corrente é responsável.
Vamos lá, a estrutura da lista:
Alguns dados de exemplo:
Bom agora vamos ao que interessa: Abrimos o site com o Sharepoint designer a acessamos a lista de Projetos:
Na tela que irá aparecer selecione, na direita Views e o botão New e, em seguida, damos o nome da view de Meus Projetos e marcamos a opção de ser a view padrão:
Na página que é exibida role a barra de rolagem até encontrar a query da view:
Altere essa query da seguinte forma:
Salve essa view e acesse a lista pelo browse.


Visão todos os itens:


Observe que é a view Todos os itens e que está sendo exibido todos os itens. Observe também o usuário corrente. Agora selecionamos a view que criamos no sharepoint designer e observe o resultado:

Meus Projetos:
Pronto! Problema resolvido! Qualquer dúvida postem ai!
Readmore...
domingo, 21 de agosto de 2011

70-573: Microsoft SharePoint 2010, Application Development

0 comentários
 
A todos boa noite!!!!
Após muito estudo passei na prova 70-573 Sharepoint Application Development.
Já li em alguns outros blogs algumas informações sobre a prova. Como existem várias e várias questões vou falar um pouco só sobre a minha:
Caiu o que é novo no Sharepoint 2010 e como utilizar bem o Visual Studio. Nesse último item a ajuda do @rojao333 foi muito útil pois ele adora ver o que tem de novo em cada versão do VS.
Outra coisa que me chamou a atenção foi a parte de Client Object Model e interfaces. WCF para quem ainda não começou a estudar é melhor correr atrás do prejuízo...
Caíram umas 2 questões mais "bobinhas" estilo a prova 70-571, creio que somente para ninguém zerar a prova.
Outra coisa que gostei muito foi que, apesar de ser uma prova para desenvolvedores, agora são expostos alguns cenários que são resolvidos apenas usando conceitos e boas práticas. Dessa forma acho que a prova fica uma coisa mais real.
Agora um lado bem chato: O curso 10175 que deveria ser o preparatório não achei que prepara muito bem não... tem que buscar fontes em muitos outros locais.
Bom agora alguns sites que usei de referência:

http://msdn.microsoft.com/en-us/library/ee557253.aspx
http://msdn.microsoft.com/en-us/library/ee556427.aspx
http://fabiangehrke.com.br/
http://larahvidotti.wordpress.com/
http://blogs.msdn.com/b/alexschulz/
http://rodrigoromano.net

Abraços a todos!!!


Readmore...
terça-feira, 2 de agosto de 2011

Monitorar Mudanças de Propriedades

0 comentários
 
Olá para todos!!!!!
Essa semana, que começou ontem, tive a necessidade de monitorar quando uma determinada propriedade de minha classe teve seu valor alterado. Dei uma pesquisada por ai até que cheguei na interface INotifyPropertyChagend. Ela basicamente cria um evento que será disparado quando a propriedade for alterada.
Para demonstrar o uso dessa interface criei um exemplo bem bobo. Nesse caso tenho uma classe com o nome de Aluno com as propriedades: Nome, AnoNascimento, Horario que é um enum do tipo Turno. Vamos ao código?

Primeiro vou criar um projeto do tipo console application. Em seguida adicionar uma classe com o nome de Aluno.

Não esqueça de adicionar using System.ComponentModel.

Agora informamos que a classe Aluno implementa a interface INotifyPropertyChaged. Observe que a interface gerou o seguinte evento:




Agora criamos o metodo Notify, que será responsável por invocar o evento criado.


Vamos agora na propriedade que queremos monitorar, no caso a propriedade turno. Nela chamamos o método Notify quando a propriedade receber um novo valor. Observe:


Apenas para o exemplo falei que o set é um tipo privado, logo poderemos alterar o valor da propriedade Horario somente pela própria classe aluno.

Por fim criamos um método que apenas irá alterar o valor da propriedade Horario.


Feito isso vamos a classe Program do nosso projeto. Dentro do método main vou criar um objeto da classe Aluno e preencher algumas propriedades. Em seguida adicionar o evento ProperyChanged.


No método gerado vamos exibir os novos valores da propriedade Horario da variável aluno:

Agora todas as classes:



   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.ComponentModel;
   6:   
   7:  namespace TrabalhandoComPropriedades
   8:  {
   9:      public class Aluno : INotifyPropertyChanged
  10:      {
  11:          public enum Turno
  12:          {
  13:              Manha,
  14:              Tarde,
  15:              Noite
  16:          }
  17:   
  18:          #region INotifyPropertyChanged Members
  19:   
  20:          public event PropertyChangedEventHandler PropertyChanged;
  21:   
  22:          #endregion
  23:   
  24:          public string Nome
  25:          {
  26:              get;
  27:              set;
  28:          }
  29:   
  30:          public int AnoNascimento
  31:          {
  32:              get;
  33:              set;
  34:          }
  35:   
  36:          private Turno _horario = Turno.Manha;
  37:          public Turno Horario
  38:          {
  39:              get
  40:              {
  41:                  return _horario;
  42:              }
  43:              private set
  44:              {
  45:                  _horario = value;
  46:                  Notify("Horario");
  47:              }
  48:          }
  49:   
  50:          private void Notify(string property)
  51:          {
  52:              if (PropertyChanged != null)
  53:              {
  54:                  PropertyChanged.Invoke(this, new PropertyChangedEventArgs(property));
  55:              }
  56:          }
  57:   
  58:          internal void ProcessarTurnos()
  59:          {
  60:              this.Horario = Turno.Tarde;
  61:              System.Threading.Thread.Sleep(1000);
  62:              this.Horario = Turno.Noite;
  63:          }
  64:      }
  65:  }





   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.ComponentModel;
   6:   
   7:  namespace TrabalhandoComPropriedades
   8:  {
   9:      class Program
  10:      {
  11:          static void Main(string[] args)
  12:          {
  13:              Aluno aluno = new Aluno();
  14:              aluno.Nome = "Pedro Marques";
  15:              aluno.AnoNascimento = 1984;
  16:              aluno.PropertyChanged += new PropertyChangedEventHandler(aluno_PropertyChanged);
  17:              aluno.ProcessarTurnos();
  18:              Console.ReadKey();
  19:          }
  20:   
  21:          static void aluno_PropertyChanged(object sender, PropertyChangedEventArgs e)
  22:          {
  23:              Console.WriteLine("Propriedade {0} alterada para {1}", e.PropertyName, ((Aluno)sender).Horario.ToString());
  24:          }
  25:      }
  26:  }

E o resultado:

Readmore...
quinta-feira, 21 de julho de 2011

CRUD Listas Sharepoint

0 comentários
 

Apenas para mostrar como fazer um CRUD na lista do sharepoint que criamos no post Criação de Listas Programaticamente. Para isso utilizei novamente um console aplication referenciando a dll Microsoft.Sharepoint.dll

Vamos ao código:


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using Microsoft.SharePoint;
   6:   
   7:  namespace Sharepoint.Crud
   8:  {
   9:      class Program
  10:      {
  11:          static void Main(string[] args)
  12:          {
  13:              using (SPSite oSite = new SPSite("http://intranet.contoso.com/"))
  14:              {
  15:                  using (SPWeb oWeb = oSite.OpenWeb())
  16:                  {
  17:                      bool allowUnsafeUpdates = oWeb.AllowUnsafeUpdates;
  18:                      oWeb.AllowUnsafeUpdates = true;
  19:                      try
  20:                      {
  21:                          SPList oList = oWeb.Lists.TryGetList("Ramais Empresa");
  22:                          if (oList != null)
  23:                          {
  24:                              //Adiciona um novo item e pega o id gerado
  25:                              int id = AdicionarRamal(oList, "João Carlos", "Administativo", "Filial - São Paulo", "Somente pode ser encontrado após as <b>18:00</b>.");
  26:   
  27:                              //Atualiza o Ramal
  28:                              AtualizarRamal(oList, id, "Maria Antônia", "Administrativo", "Filial - Rio de Janeiro", "");
  29:   
  30:                              //Envia o item criado para a lixeira
  31:                              RemoverRamal(oList, id, false);
  32:   
  33:                              //Adiciona um novo item
  34:                              id = AdicionarRamal(oList, "Joaquina Ferreira", "Financeiro", "Filial - São Paulo", "Trabalho apenas nas quartas e sextas.");
  35:   
  36:                              //Remove o item permanentemente
  37:                              RemoverRamal(oList, id, true);
  38:                          }
  39:                      }
  40:                      finally
  41:                      {
  42:                          oWeb.AllowUnsafeUpdates = allowUnsafeUpdates;
  43:                      }
  44:                  }
  45:              }
  46:          }
  47:   
  48:          private static void RemoverRamal(SPList oList, int id, bool excluirPermanentemente)
  49:          {
  50:              try
  51:              {
  52:                  SPListItem oListItem = oList.GetItemById(id);
  53:                  if (excluirPermanentemente)
  54:                  {
  55:                      //Exclui o item permanentemente
  56:                      oListItem.Delete();
  57:                  }
  58:                  else
  59:                  {
  60:                      //Envia o item para a lixeira do site
  61:                      oListItem.Recycle();
  62:                  }
  63:              }
  64:              catch
  65:              {
  66:                  throw new Exception("Item inexistente!");
  67:              }
  68:          }
  69:   
  70:          private static void AtualizarRamal(SPList oList, int id, string nome, string setor, string unidade, string observacao)
  71:          {
  72:              try
  73:              {
  74:                  SPListItem oListItem = oList.GetItemById(id);
  75:                  oListItem[SPBuiltInFieldId.Title] = nome;
  76:                  oListItem["Setor"] = setor;
  77:                  oListItem["Unidade"] = unidade;
  78:                  oListItem["Observacao"] = observacao;
  79:                  oListItem.Update();
  80:              }
  81:              catch
  82:              {
  83:                  throw new Exception("Item inexistente!");
  84:              }
  85:          }
  86:   
  87:          private static int AdicionarRamal(SPList oList, string nome, string setor, string unidade, string observacao)
  88:          {
  89:              SPListItem oListItem = oList.AddItem();
  90:              oListItem[SPBuiltInFieldId.Title] = nome;
  91:              oListItem["Setor"] = setor;
  92:              oListItem["Unidade"] = unidade;
  93:              oListItem["Observacao"] = observacao;
  94:              oListItem.Update();
  95:              return oListItem.ID;
  96:          }
  97:      }
  98:  }

Algumas observações:

Linha 17:

oWeb.AllowUnsafeUpdates: Esse AllowUnsafeUpdates permite atualizações não seguras no banco de dados. Para atualizações via código devemos setar essa propriedade para true, o que ocorre na linha 18.

Linha 56 e 61:

Na linha 56 o item é enviado para a lixeira do site através do método Recycle(). Já se utilizarmos o método Delete() o item é excluído permanentemente.

Linha 89:

O Objeto SPList agora possui o método AddItem(). Esse método não existia nas versões anteriores então era necessário fazer da seguinte forma: SPList.Items.Add();
E os resultados:

Cadastro do primeiro item:

Atualização do item:

Item enviado para a lixeira do site:

Cadastro de um novo item:


Bom então é isso, até a próxima e qualquer dúvida postem ai!
Readmore...