Trabalhar com paginação de dados no PostgreSQL é muito fácil. As cláusulas usadas para paginação são LIMIT e OFFSET. A fórmula básica seria o seguinte:

   1: SELECT * FROM tabela 
   2:     LIMIT <número de itens por página> 
   3:     OFFSET(<página> - 1) * <número de itens por página>

Agora, os exemplos… Para trazer os 20 registros da página 2:

   1: SELECT * FROM tabela 
   2:     LIMIT 20
   3:     OFFSET (2 - 1) * 20
Muito fácil! :)

Posted in: PostgreSQL  Tags: ,

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Admin posted on September 15, 2009 08:59

Uma dica rápida, mas que pode poupar um bom tempinho. Usar ORDER BY em queries que usam a cláusula UNION é bem mais simples do que parece. Suponhamos que temos duas tabelas, tb_cidades e tb_paises, e queremos trazer em uma única query o id e o nome tanto de tb_cidades quanto de tb_paises. Para isso combinamos duas queries SELECT usando a cláusula UNION:

SELECT c.cidade_id, c.nome FROM tb_cidades c
UNION
SELECT p.pais_id, p.nome FROM tb_paises p

Teremos assim, em uma única query, tanto cidades quanto países. Mas, e a ordenação?? É aí que muita gente se atrapalha, mas a solução é bem simples:

1) Atribua um alias em comum para as colunas que serão ordenadas. Se for a coluna de ID, coloque o mesmo alias tanto para cidades quanto para países.

2) Utilize este alias no ORDER BY.

Então vamos alterar a query acima para ordenar pela coluna nome de tb_cidades e tb_paises:

SELECT c.cidade_id, c.nome AS coluna_nome FROM tb_cidades c
UNION
SELECT p.pais_id, p.nome AS coluna_nome FROM tb_paises p
ORDER BY coluna_nome

Simples assim. Wink


Posted in: PostgreSQL  Tags: , ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Admin posted on August 19, 2009 05:11

Os arquivos de configuração .INI há um bom tempo foram substituídos no .Net pelos arquivos XML, muito mais flexíveis e padronizados. Entretanto, quando trabalhamos com sistemas legados, seja para fazer integrações, migrações ou o que quer que seja, acabamos nos deparando com os saudosos arquivos .INI. Ao invés de criar rotinas caseiras para trabalhar com estes arquivos, que tal uma biblioteca em C# que cumpra esse papel com louvor? A biblioteca Nini faz isto e muito mais: além dos arquivos .INI, ela abstrai o acesso a arquivos de configuração XML, .Net Config, Registry e argumentos de linha de comando. O site do projeto não possui nada, apenas os links para poder baixar, mas a documentação vem junto com o arquivo baixado.

Segue um exemplo do próprio manual da Nini:

; MyApp.ini
[Logging]
File Name = MyApp.log
MessageColumns = 5
MaxFileSize = 40000000000000

   1: // Usando C#
   2: using Nini.Config;
   3: IConfigSource source = new IniConfigSource("MyApp.ini");
   4:  
   5: string fileName = source.Configs["Logging"].Get("File Name");
   6: int columns = source.Configs["Logging"].GetInt("MessageColumns");
   7: long fileSize = source.Configs["Logging"].GetLong("MaxFileSize");
   1: 'E usando VB.Net
   2: Imports Nini.Config
   3:  
   4: Dim source As New IniConfigSource("MyApp.ini")
   5:  
   6: Dim fileName As String = source.Configs("Logging").Get("File Name")
   7: Dim columns As Integer = source.Configs("Logging").GetInt("MessageColumns")
   8: Dim fileSize As Long = source.Configs("Logging").GetLong("MaxFileSize")

Posted in: .Net , C#  Tags: , , ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Neste post vou apresentar um aplicativo para Windows Mobile 6 que recebe como entrada o valor do litro do álcool, da gasolina e exibe uma mensagem dizendo qual dos dois é mais vantajoso abastecer, bastante útil quando o seu veículo é flex. Faça o download do código fonte do projeto: AlcoolGasolina.zip (56,97 kb). Caso você queira apenas o .cab do aplicativo para instalar em seu smartphone, ele está na pasta AlcoolGasolinaSetup/Release.

Requisitos:

O código é bem simples, o valor do litro do álcool é dividido pelo valor do litro da gasolina, se o resultado for maior ou igual a 0,7 compensa abastecer com gasolina, caso contrário, abasteça com álcool.

   1:  using System;
   2:  using System.Text;
   3:  using System.Windows.Forms;
   4:   
   5:  namespace AlcoolGasolina
   6:  {
   7:      public partial class frmPrincipal : Form
   8:      {
   9:          public frmPrincipal()
  10:          {
  11:              InitializeComponent();
  12:          }
  13:   
  14:          /// <summary>
  15:          /// Método de validação da entrada. Considera inválidos strings vazias e 
  16:          /// valores menores ou iguais a zero.
  17:          /// </summary>
  18:          /// <param name="valor">O valor de entrada, formato string</param>
  19:          /// <returns>True para válido, False para inválido.</returns>
  20:          private bool isValid(string valor)
  21:          {
  22:              // Não deve ser uma string vazia ou nula
  23:              if (String.IsNullOrEmpty(valor))
  24:                  return false;
  25:              try
  26:              {
  27:                  // deve ser um valor numérico válido
  28:                  double num = Convert.ToDouble(valor);
  29:   
  30:                  // não deve ser menor ou igual a zero
  31:                  if (num > 0)
  32:                      return true;
  33:                  else
  34:                      return false;
  35:              }
  36:              catch (Exception)
  37:              {
  38:                  return false;
  39:              }
  40:          }
  41:   
  42:          /// <summary>
  43:          /// Verifica se os valores digitados são válidos e, em caso positivo, 
  44:          /// faz o cálculo e apresenta a mensagem para o usuário informando
  45:          /// qual é mais viável abastecer, álcool ou gasolina. Se os valores 
  46:          /// não forem válidos para o cálculo, será exibida uma mensagem de 
  47:          /// alerta, informando que os valores de entrada são inválidos.
  48:          /// </summary>
  49:          /// <param name="sender"></param>
  50:          /// <param name="e"></param>
  51:          private void btnCalcular_Click(object sender, EventArgs e)
  52:          {
  53:              if (isValid(txtAlcool.Text.Trim()) && isValid(txtGasolina.Text.Trim()))
  54:              {
  55:                  double alcool = Convert.ToDouble(txtAlcool.Text.Trim());
  56:                  double gasolina = Convert.ToDouble(txtGasolina.Text.Trim());
  57:   
  58:                  double resultado = alcool / gasolina;
  59:                  if (resultado >= 0.7)
  60:                      lblResultado.Text = "Abasteça com Gasolina";
  61:                  else
  62:                      lblResultado.Text = "Abasteça com Álcool";
  63:              }
  64:              else
  65:              {
  66:                  MessageBox.Show("Valores de entrada inválidos.", 
  67:                                  "Erro", 
  68:                                  MessageBoxButtons.OK, 
  69:                                  MessageBoxIcon.Exclamation, 
  70:                                  MessageBoxDefaultButton.Button1);
  71:              }
  72:              txtAlcool.Text = string.Empty;
  73:              txtGasolina.Text = string.Empty;
  74:          }
  75:   
  76:          /// <summary>
  77:          /// Fecha a aplicação.
  78:          /// </summary>
  79:          private void mnuSair_Click(object sender, EventArgs e)
  80:          {
  81:              Application.Exit();
  82:          }
  83:   
  84:          /// <summary>
  85:          /// Menu "Sobre...", exibe uma mensagem com o nome da aplicação, 
  86:          /// nome do autor e endereço do blog do autor.
  87:          /// </summary>
  88:          private void mnuSobre_Click(object sender, EventArgs e)
  89:          {
  90:              StringBuilder mensagem = new StringBuilder("Álcool ou Gasolina\n\n");
  91:              mensagem.Append("Por Rogério Bragil\n\nBlog do Bragil - www.bragil.net");
  92:              MessageBox.Show(mensagem.ToString(), 
  93:                              "Sobre", 
  94:                              MessageBoxButtons.OK, 
  95:                              MessageBoxIcon.None, 
  96:                              MessageBoxDefaultButton.Button1);
  97:          }
  98:      }
  99:  }

 

 


Posted in: .Net , C# , Windows Mobile  Tags: , ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Admin posted on August 6, 2009 10:12

Precisa fazer parsing de HTML em .Net? Experimente o HTML Agility Pack. Com ele você pode facilmente ler uma página HTML e acessar os seus elementos através de expressões XPath, ou então percorrer os nós da estrutura de árvore da página HTML. Vou mostrar aqui um exemplo prático, uma pequena aplicação Windows Forms que, dada uma URL, retorna todos os elementos a (links) existentes na página. Você pode alterar o programa para poder extrair conteúdo de sites, efetuar buscas, etc.

Acesse o site do HTML Agility Pack e faça o download do código fonte. Descompacte, abra o projeto no Visual Studio (2005 ou superior) e compile o projeto HtmlAgilityPack, que deverá gerar a dll com o mesmo nome na pasta bin do projeto. Com a dll criada, feche a solução atual (com o código do HTML Agility Pack) e crie um novo projeto Windows Application usando a linguagem C#. Adicione a referência para a dll do HTML Agility Pack, criada anteriormente. Adicione os seguintes controles no form:

  • TextBox, ID "txtUrl", onde será digitada a URL.
  • Button, ID "btnBusca", ao clicar esse botão, vai buscar a URL e processar.
  • ListBox, ID "lsbResultado", exibir os links encontrados na página.

 Agora, vamos para o código:

   1:  using System;
   2:  using HtmlAgilityPack;
   3:  using System.Windows.Forms;
   4:   
   5:  namespace PegaLinks
   6:  {
   7:      public partial class Form1 : Form
   8:      {
   9:          public Form1()
  10:          {
  11:              InitializeComponent();
  12:          }
  13:   
  14:          private void btnBusca_Click(object sender, EventArgs e)
  15:          {
  16:              try 
  17:              {
  18:                  HtmlWeb web = new HtmlWeb();
  19:                  // O método Load da classe HtmlWeb busca a página HTML e faz o parsing, atribuindo a
  20:                  // árvore do DOM (document object model) gerada ao objeto HtmlDocument
  21:                  HtmlAgilityPack.HtmlDocument doc = web.Load(@txtUrl.Text.Trim());
  22:                  
  23:                  // Aqui pegamos apenas o que interessa, os links (tags <a>), usando XPath
  24:                  HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("/html/body//a");
  25:                  if (nodes != null)
  26:                  {
  27:                      // Percorremos a coleção dos nós encontrados (elementos <a>) e pegamos apenas o 
  28:                      // atributo href e o inner text de cada nó.
  29:                      foreach (HtmlNode node in nodes)
  30:                      {
  31:                          HtmlAttribute att = node.Attributes["href"];
  32:                          // Colocamos cada elemento no ListBox
  33:                          lsbResultado.Items.Add(node.InnerText + "  (" + att.Value + ")");
  34:                      }
  35:                  }
  36:                  else
  37:                  {
  38:                      MessageBox.Show("Nenhum link encontrado");
  39:                  }
  40:              }
  41:              catch (Exception ex)
  42:              {
  43:                  MessageBox.Show(ex.Message);
  44:              }   
  45:          }
  46:      }
  47:  }

 

Com poucas linhas você tem o que precisa: a informação limpinha. Sem precisar mexer com complexas expressões regulares ou parsing manual de strings... Tudo rápido e fácil! Não se esqueça de associar o evento Click do botão com o método btnBusca_Click.


Posted in: C# , .Net  Tags: , , , ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Validação é algo de suma importância, e que muitas vezes é colocada em segundo ou até terceito plano no desenvolvimento de aplicações. O NHibernate Validator é um poderoso framework de validação, que torna simples e objetiva a tarefa de validar os dados fornecidos pelos usuários para a sua aplicação. Ele possui vários recursos, como configuração dos validadores através de XML e de atributos, integração com NHibernate, entre outros. Vamos mostrar um exemplo simples, onde a configuração dos validadores será feita através de atributos decorando as propriedades da classe Usuario abaixo:

   1:  using NHibernate.Validator;
   2:   
   3:  public class Usuario
   4:  {
   5:      private int id;
   6:      private string nome;
   7:      private string email;
   8:      private DateTime dataNascimento;
   9:   
  10:      [Min(1, Message = "Id deve ser positivo")]
  11:      public int Id
  12:      {
  13:          get { return id; }
  14:          set { id = value; }
  15:      }
  16:   
  17:      [NotNullNotEmpty(Message = "Nome é obrigatório."),
  18:       Length(Max= 80, Message = "Nome deve ter no máximo 80 caracteres.")]
  19:      public string Nome
  20:      {
  21:          get { return nome; }
  22:          set { nome = value; }
  23:      }
  24:   
  25:      [Email(Message = "E-mail inválido."),
  26:       NotNullNotEmpty(Message = "E-mail é obrigatório.")]
  27:      public string Email
  28:      {
  29:          get { return email; }
  30:          set { email = value; }
  31:      }
  32:   
  33:      [Past(Message = "Data de nascimento deve estar no passado."),
  34:       NotNull(Message = "Data de nascimento é obrigatório.")]
  35:      public DateTime DataNascimento
  36:      {
  37:          get { return dataNascimento; }
  38:          set { dataNascimento = value; }
  39:      }
  40:  }

 

  Lembrando que é necessário referenciar a dll NHibernate.Validator.dll no projeto. Existem muitos outros atributos, como Digits (para valores numéricos), CreditCardNumber (número de cartões de crédito), IPAddress (endereços IP), além da possibilidade de criar atributos de validação customizados. Com a configuração dos validadores feita, é hora de testar se os dados recebidos pelo objeto serão válidos:

   1:  using NHibernate.Validator.Engine;
   2:   
   3:  static void Main(string[] args)
   4:  {
   5:       Usuario user = new Usuario();
   6:       user.Id = 10;
   7:       user.Nome = "Rogério Bragil";
   8:       user.Email = "rogerio";
   9:       user.DataNascimento = new DateTime(1978, 1, 27);
  10:       ValidatorEngine validator = new ValidatorEngine();
  11:       InvalidValue[] erros = validator.Validate(user);
  12:       foreach (InvalidValue erro in erros)
  13:       {
  14:           Console.WriteLine(erro.Message);
  15:       }
  16:       Console.ReadKey();
  17:  }

 

A execução deste exemplo exibe a seguinte mensagem:

E-mail inválido

devido ao fato da propriedade Email ter recebido a string "rogerio" (que não é um e-mail válido).

Esse exemplo foi uma pequena amostra dos recursos do NHibernate Validator. Há muito mais o que ser explorado, vale muito a pena dar uma lida na documentação e explorar mais recursos dessa poderosa ferramenta de validação.


Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Admin posted on March 19, 2009 11:03

A inspiração para essa brincadeirinha veio deste post do fechaTag. Fiz o mesmo, com algumas adaptações para o FreeBSD.

Baixando e instalando o curl

A instalação do curl é através do Ports, o gerenciador de pacotes do FreeBSD.

  • Primeiro,  logue-se como root.
  • Entre no diretório /usr/ports
  • Putz, onde será que está o diretório do curl? Fácil!
    •  find . -name "curl" -type d
  •  A resposta é imediata: ./ftp/curl
  • Agora que descobri onde estava o diretório do curl, entro nele:
    •  cd ftp/curl
  • Para baixar, compilar e instalar, digite:
    •  make install
  • Deve aparecer uma janela de configuração, deixe marcado apenas "OpenSSL support" e dê Ok.
  • Aguarde baixar, compilar e instalar.  ; )

Começando a brincadeira

É simples, muito simples "twittar" pelo console. Basta um comandinho (chupinhado do post do fechaTag):

curl -u usuário:senha -d status="Twittando do terminal." http://twitter.com/statuses/update.json

Já que o comando tá muito grande, dá para enxugar um pouco. Siga os passos do post do fechaTag, não tem erro... Feito isso, basta o comandinho:

twitter "Twittando pelo terminal do FreeBSD, API show de bola hein..."

Bom, com isso dá para criar bastante coisa interessante, como por exemplo enviar mensagens de erro para o Twitter quando acontecer alguma coisa de errado com o sistema... É só ter criatividade.


Posted in: Linux/Unix  Tags: , ,

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Busca

Publicidade