Arquivo

Posts Tagged ‘C#’

Evolua o MessageBox com TaskDialog

Olá Pessoal.

Neste post lhes apresento o Task Dialog. Perfeito para o cenário Windows Forms + C#, onde você precisa transmitir uma mensagem em tela para o operador do seu sistema.

Na versão Windows Vista em diante, a microsoft incluiu uma API de mensagens a TaskDialog, que expande muito as possibilidades de apresentação de mensagens em tela.

Você está limitado as possibilidades abaixo?

aparência de um message box

aparência de um message box

Porquê não expandir suas possibilidades de customização para isto?

Demonstrativo com todas as opções de customização da task dialog

Demonstrativo com todas as opções de customização da task dialog

Veja que você pode adicionar Radio Buttons, Botões de Comando, área expansível, para exibir detalhes da mensagem, mensagem de rodapé com ícone, etc.

Vai melhorar a legibilidade das suas mensagens, facilitando o entendimento, e criando a possibilidade do seu operador executar ações diretamente na mensagem.

API com Task Dialog: https://msdn.microsoft.com/en-us/library/windows/desktop/bb787471%28v=vs.85%29.aspx

Para não se preocupar com os detalhes da invocação desta API seguem 2 dicas:

Wrapper para Windows Vista ou superior: http://www.codeproject.com/Articles/17026/TaskDialog-for-WinForms

Wrapper que funciona também em versões anteriores do windows: http://www.codeproject.com/Articles/21276/Vista-TaskDialog-Wrapper-and-Emulator 

Valeu pessoal.

Abraço.

Anúncios

BoletoBr – Validando arquivo remessa Cnab 400 Itau

10 - 14 10 comentários

Olá pessoal.

Desenvolvi em conjunto com o https://www.facebook.com/SamuelR.sro uma biblioteca para geração de boletos em .NET.

É open source e está disponível no github: https://github.com/gabrielrb/boletobr.

Gera boletos nos principais bancos nacionais: Itaú, Caixa, Bradesco, Banco do Brasil, HSBC. É uma biblioteca fácil de manter e expandir.

Hoje passamos por uma dificuldade ao validar o arquivo de remessa CNAB 400 Itaú.

O validador do Itaú apontava que o arquivo estava incorreto, apontava uma posição errada ao preencher o CEP.

Erro ao validar layout 400

Verificamos todo o layout gerado pelo BoletoBr, campo a campo, olhando a documentação do Itaú e não encontramos um erro sequer.

Então conseguimos um arquivo de remessa válido com um cliente, e observamos que estava igual ao nosso as posições do campo.

Conclusão: Codificação. O BoletoBr gerava o arquivo de remessa no formato UTF-8, e o validador do Itaú, só reconhece corretamente arquivos de remessa codificados em ANSI.

É uma informação que não é informada na documentação dos bancos, e é muito importante, pois impede a leitura correta do arquivo de remessa.

Após descobrir esta solução inesperada, escrevi este post para ajudar os colegas desenvolvedores.

Um abraço.

Categorias:BoletoBr Tags:, , , , ,

Conversão de número e porcentagem para extenso em C#

12 - 13 1 comentário

A partir da necessidade de converter valores em Reais R$ para extenso, encontrei na internet um código que fazia essa conversão.

Artigo original: http://ivanmeirelles.wordpress.com/2012/10/27/escrever-valores-por-extenso-em-c/

Posteriormente, precisei fazer uma conversão de porcentagem %% para extenso, e fiz uma pequena modificação no código para suportar essa conversão.

O Snippet de código está no link abaixo:

A classe suporta a conversão de decimal, valor monetário e porcentagem para extenso, em PT-BR.

public static class Extenso
    {
        public enum TipoValorExtenso
        {
            Monetario,
            Porcentagem,
            Decimal
        }

        public static string toExtenso(double Valor, TipoValorExtenso tipoValorExtenso)
        {
            decimal valorEscrever = new decimal(Valor);

            return toExtenso(valorEscrever, tipoValorExtenso);
        }

        // O método toExtenso recebe um valor do tipo decimal
        public static string toExtenso(decimal valor, TipoValorExtenso tipoValorExtenso)
        {
            if (valor <= 0 | valor >= 1000000000000000)
                throw new ArgumentOutOfRangeException("Valor não suportado pelo sistema. Valor: " + valor);

            string strValor = String.Empty;
            strValor = valor.ToString("000000000000000.00#");
            //strValor = valor.ToString("{0:0.00#}");
            string valor_por_extenso = string.Empty;
            int qtdCasasDecimais =
                strValor.Substring(strValor.IndexOf(',') + 1, strValor.Length - (strValor.IndexOf(',') + 1)).Length;
            bool existemValoresAposDecimal = Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) > 0;

            for (int i = 0; i <= 15; i += 3)
            {
                var parte = strValor.Substring(i, 3);
                // se parte contém vírgula, pega a substring com base na quantidade de casas decimais.
                if (parte.Contains(','))
                {
                    parte = strValor.Substring(i+1, qtdCasasDecimais);
                }
                valor_por_extenso += escreva_parte(Convert.ToDecimal(parte));
                if (i == 0 & valor_por_extenso != string.Empty)
                {
                    if (Convert.ToInt32(strValor.Substring(0, 3)) == 1)
                        valor_por_extenso += " TRILHÃO" +
                                             ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                    else if (Convert.ToInt32(strValor.Substring(0, 3)) > 1)
                        valor_por_extenso += " TRILHÕES" +
                                             ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                }
                else if (i == 3 & valor_por_extenso != string.Empty)
                {
                    if (Convert.ToInt32(strValor.Substring(3, 3)) == 1)
                        valor_por_extenso += " BILHÃO" +
                                             ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                    else if (Convert.ToInt32(strValor.Substring(3, 3)) > 1)
                        valor_por_extenso += " BILHÕES" +
                                             ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                }
                else if (i == 6 & valor_por_extenso != string.Empty)
                {
                    if (Convert.ToInt32(strValor.Substring(6, 3)) == 1)
                        valor_por_extenso += " MILHÃO" +
                                             ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                    else if (Convert.ToInt32(strValor.Substring(6, 3)) > 1)
                        valor_por_extenso += " MILHÕES" +
                                             ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0)
                                                  ? " E "
                                                  : string.Empty);
                }
                else if (i == 9 & valor_por_extenso != string.Empty)
                    if (Convert.ToInt32(strValor.Substring(9, 3)) > 0)
                        valor_por_extenso += " MIL" +
                                             ((Convert.ToDecimal(strValor.Substring(12, 3)) > 0)
                                                  ? " E "
                                                  : string.Empty);

                if (i == 12)
                {
                    if (valor_por_extenso.Length > 8)
                        if (valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "BILHÃO" |
                            valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "MILHÃO")
                            valor_por_extenso += " DE";
                        else if (valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "BILHÕES" |
                                 valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "MILHÕES" |
                                 valor_por_extenso.Substring(valor_por_extenso.Length - 8, 7) == "TRILHÕES")
                            valor_por_extenso += " DE";
                        else if (valor_por_extenso.Substring(valor_por_extenso.Length - 8, 8) == "TRILHÕES")
                            valor_por_extenso += " DE";

                    if (Convert.ToInt64(strValor.Substring(0, 15)) == 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " REAL";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                if (existemValoresAposDecimal == false)
                                    valor_por_extenso += " PORCENTO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }

                    else if (Convert.ToInt64(strValor.Substring(0, 15)) > 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " REAIS";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                if (existemValoresAposDecimal == false)
                                    valor_por_extenso += " PORCENTO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }

                    if (Convert.ToInt32(strValor.Substring(16, 2)) > 0 && valor_por_extenso != string.Empty)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " E ";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                valor_por_extenso += " VÍRGULA ";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }
                }

                if (i == 15)
                    if (Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) == 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " CENTAVO";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                valor_por_extenso += " CENTAVO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }

                    else if (Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) > 1)
                    {
                        switch (tipoValorExtenso)
                        {
                            case TipoValorExtenso.Monetario:
                                valor_por_extenso += " CENTAVOS";
                                break;
                            case TipoValorExtenso.Porcentagem:
                                valor_por_extenso += " PORCENTO";
                                break;
                            case TipoValorExtenso.Decimal:
                                break;
                            default:
                                throw new ArgumentOutOfRangeException("tipoValorExtenso");
                        }
                    }
            }
            return valor_por_extenso;
        }

        private static string escreva_parte(decimal valor)
        {
            if (valor <= 0)
                return string.Empty;
            else
            {
                string montagem = string.Empty;
                if (valor > 0 & valor < 1)
                {
                    valor *= 100;
                }
                string strValor = valor.ToString("000");
                int a = Convert.ToInt32(strValor.Substring(0, 1));
                int b = Convert.ToInt32(strValor.Substring(1, 1));
                int c = Convert.ToInt32(strValor.Substring(2, 1));

                if (a == 1) montagem += (b + c == 0) ? "CEM" : "CENTO";
                else if (a == 2) montagem += "DUZENTOS";
                else if (a == 3) montagem += "TREZENTOS";
                else if (a == 4) montagem += "QUATROCENTOS";
                else if (a == 5) montagem += "QUINHENTOS";
                else if (a == 6) montagem += "SEISCENTOS";
                else if (a == 7) montagem += "SETECENTOS";
                else if (a == 8) montagem += "OITOCENTOS";
                else if (a == 9) montagem += "NOVECENTOS";

                if (b == 1)
                {
                    if (c == 0) montagem += ((a > 0) ? " E " : string.Empty) + "DEZ";
                    else if (c == 1) montagem += ((a > 0) ? " E " : string.Empty) + "ONZE";
                    else if (c == 2) montagem += ((a > 0) ? " E " : string.Empty) + "DOZE";
                    else if (c == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TREZE";
                    else if (c == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUATORZE";
                    else if (c == 5) montagem += ((a > 0) ? " E " : string.Empty) + "QUINZE";
                    else if (c == 6) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSEIS";
                    else if (c == 7) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSETE";
                    else if (c == 8) montagem += ((a > 0) ? " E " : string.Empty) + "DEZOITO";
                    else if (c == 9) montagem += ((a > 0) ? " E " : string.Empty) + "DEZENOVE";
                }
                else if (b == 2) montagem += ((a > 0) ? " E " : string.Empty) + "VINTE";
                else if (b == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TRINTA";
                else if (b == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUARENTA";
                else if (b == 5) montagem += ((a > 0) ? " E " : string.Empty) + "CINQUENTA";
                else if (b == 6) montagem += ((a > 0) ? " E " : string.Empty) + "SESSENTA";
                else if (b == 7) montagem += ((a > 0) ? " E " : string.Empty) + "SETENTA";
                else if (b == 8) montagem += ((a > 0) ? " E " : string.Empty) + "OITENTA";
                else if (b == 9) montagem += ((a > 0) ? " E " : string.Empty) + "NOVENTA";

                if (strValor.Substring(1, 1) != "1" & c != 0 & montagem != string.Empty) montagem += " E ";

                if (strValor.Substring(1, 1) != "1")
                    if (c == 1) montagem += "UM";
                    else if (c == 2) montagem += "DOIS";
                    else if (c == 3) montagem += "TRÊS";
                    else if (c == 4) montagem += "QUATRO";
                    else if (c == 5) montagem += "CINCO";
                    else if (c == 6) montagem += "SEIS";
                    else if (c == 7) montagem += "SETE";
                    else if (c == 8) montagem += "OITO";
                    else if (c == 9) montagem += "NOVE";

                return montagem;
            }
        }
    }

30 novos motivos para desenvolver para Windows Phone 8

O ecossistema de ferramentas de desenvolvimento para Windows Phone está crescendo a cada dia com a adesão de novos parceiros e a portabilidade alcançada com o Windows Phone 8 que agora roda apps nativos c++. Você pode encontrar a lista de recursos parceiros para plataforma Windows Phone aqui, com alguns recursos open-source e comerciais para ajudar no desenvolvimento para Windows Phone:

  • Tools: Ambientes de desenvolvimento, utilitários, frameworks e bibliotecas para ajudá-lo a construir, debugar e manter apps.
  • UI components: Elementos de interface como listas, botões, gráficos e outros componentes visuais..
  • Web API: Serviços baseados em Cloud para notifications, processamento back-end, redes de anúncios e outros serviços que podem ser consumidos.

ThirtyPlusPartnersA Microsoft está correndo atrás de mais parcerias com grandes companhias e outros parceiros, e com isso foi anunciado mais 30+ novos (alguns não tão novos) recursos de desenvolvimento na //BUILD conference que aconteceu nos EUA.

Native gaming

Um feature significativo do Windows Phone 8 é o suporte para apps C++. O suporte a código nativo oferece várias facilidades para a reutilização de código, como por exemplo portar engines, physics, animações, bibliotecas de áudio e mais. Nessa categoria foram anunciados os seguintes recursos:

Ferramentas, frameworks multi plataforma, HTML5, bibliotecas e UI

Agora para facilitar o desenvolvimento com C#/XAML para Windows Phone 8 eis algums recursos:

  • MVVM Light Toolkit agora com suporte a Windows Phone 8. Mais detalhes.
  • Telerik lançou a nova versão da suíte RadControls, com novos e únicos controles para Windows Phone 8.
  • Infragistics agora inclui suporte a Windows Phone 8 com a suíte NetAdvantage
  • XAML Spy, uma ferramenta para inspeção da árvore de controles xaml, em runtime da First Floor Software, adicionou suporte para Windows Phone 8.
  • Xamarin lançou Xamarin.Mobile, uma API única para desenvolvedores usarem serviços do dispositivo como acesso a contatos, camera, geo-localização etc. com suporte a Windows 8 e Windows Phone 8.

Além disso também há inúmeras novidades em Web API, back-end as a service, e cloud services.

Então, quem ainda não faz parte desse ecossistema, seja bem vindo, e tenha certeza, que a plataforma Windows Phone ainda vai crescer muito. Tem um futuro promissor!

Steve Ballmer está investindo seriamente nisso.

“Com o trabalho que fizemos com a Nokia, HTC, Samsung e outros, existe agora uma oportunidade para criar um terceiro participante realmente forte”, disse


Enfim um breve snapshot dos parceiros anunciados:

WPDevEcosystem

Tradução livre do original: http://blogs.windows.com/windows_phone/b/wpdev/archive/2012/10/30/new-tools-for-windows-phone-8-save-developers-time-and-money.aspx

Tipos Anônimos em C#

A utilização de tipos anônimos pode ser útil em diversas situações.
Fica a critério do desenvolvedor C#.

Utilizando um objeto com tipo anônimo:

var meuTipoAnonimo = new { IdProduto = 1, Descricao = "Produto1" };

Utilizando um array de objetos com tipo anônimo:

var arrayObjetos = new [] {
    new { IdProduto = 1, Descricao = "Produto 1"},
    new { IdProduto = 2, Descricao = "Produto 2"}
};

foreach (var produto in arrayObjetos)
{
   Console.WriteLine("Descrição Produto: {0}", produto.Descricao);
}

Ao utilizar um objeto tipado anonimamente, o editor de código do visual studio reconhece automaticamente os atributos do objeto.

Categorias:C#, Dicas / Tips Tags:, , , ,

Encontrando System.Runtime.Serialization.Json – Silverlight for Windows Phone

Olá Pessoal,
Desenvolvendo para Windows Phone com Silverlight me deparei com um problema, e compartilho a solução.

Se você precisar utilizar os recursos da biblioteca System.Runtime.Serialization.Json, mas adicionando referência para System.Runtime.Serialization não encontrar a classe Json.

Eis a solução:

Adicione referência para System.Servicemodel.Web.

Otimizando C#: String e StringBuilder

O objeto String é imutável. Toda vez que é realizado uma operação com um objeto do tipo system.String, você cria um novo objeto na memória, ou seja, na memória RAM do seu computador, é alocado um novo espaço para o resultado da operação.  É como se o objeto fosse movido de lugar a cada operação.

Concatenando string da forma comum:
PERCA DE PERFORMANCE:

var texto = "linha1";
texto = texto + "linha2";
texto = texto + "linha3";
Console.WriteLine(texto);

A cada concatenação de texto subsequente, será percebida uma perca de performance cada vez maior. Em situações onde é necessário executar repetidas operações com strings, é fortemente recomendado o uso de StringBuilder.

A classe System.Text.StringBuilder pode ser usada quando você quer modificar uma string sem criar/alocar um novo objeto. Consequentemente você aumenta a performance na concatenação de várias strings.

OTIMIZAÇÃO DE PERFORMANCE:

StringBuilder StringBuilderConcatena = new StringBuilder("Linha 1!");
StringBuilderConcatena.Append("Linha2.");
StringBuilderConcatena.Append("Linha3.");
Console.WriteLine(StringBuilderConcatena);

Fica aí mais uma dica que espero ser útil.

Até a próxima.

Operador Yield em C#

Recentemente criando um método que retorna IEnumerable, fiz um esforço pra lembrar desse operador mas só consegui lembrar dele agora, depois de constatar sua existência no Ruby: “yield é a palavra reservada de Ruby que pega um ou mais objetos, envia para um bloco para processá-los e devolve o retorno do bloco.”.
No C# podemos utilizar o yield na seguinte situação:

Exemplo Comum de método que retorna uma Estrutura de Dados IEnumerable SEM Yield:

public static IEnumerable<int> Exemplo1(int numero)
        {
            var res = new List<int>();

            for (int i = 0; i < numero; i++)
            {
                res.Add(i);
            }

            return res;
        }

Exemplo Comum de método que retorna uma Estrutura de Dados IEnumerable COM Yield:

public static IEnumerable<int> Exemplo2(int numero)
        {
            for (int i = 0; i <= numero; i++)
                yield return i;
        }

Yield deixa o código mais limpo.
Vale a pena utilizá-lo.


Fontes:
http://blastersystems.com/blog/2009/10/o-operador-yield-c/
http://umamao.com/questions/O-que-faz-a-palavra-reservada-yield-em-Ruby/answers/4dace8c4d196cb6feb0001b0
http://unplugged.giggio.net/unplugged/post/Porque-eu-adoro-C-yield.aspx

Categorias:C#, Dicas / Tips Tags:, , , ,

Executando SQL ou HQL com NHibernate 3.2

Executar uma SQL (Structured Query Language) ou HQL (Hibernate Query Language) com NHibernate é muito simples.

1º Configure uma SessionFactory.
2º Gere uma sessão: ISession.
3º A partir da ISession vamos criar um objeto adequado para cada um dos casos.

EXECUTANDO SQL:

ISession sessaoCriada;
// Utilizando CreateSQLQuery para SQL
var sqlUpdate= sessaoCriada.CreateSQLQuery(
                    "update CLIENTE set DATACADASTRO = current_date where DATACADASTRO is null";
sqlUpdate.ExecuteUpdate();

EXECUTANDO HQL:

ISession sessaoCriada;
// Utilizando CreateQuery para HQL
var hqlUpdate= sessaoCriada.CreateQuery(
"update CLIENTE set DATACADASTRO = current_date where DATACADASTRO is null";
sqlUpdate.ExecuteUpdate();

Utilizando corretamente o objeto adequado você evitará que a exception: “could not execute native bulk manipulation query” seja levantada.

Até a próxima.

Validar CNPJ em C#

Mais uma dica no estilo: Copiar, colar e utilizar.

public static bool TestaCnpj(string Cnpj)
{
    string Cnpj_1 = Cnpj.Substring(0, 12);
    string Cnpj_2 = Cnpj.Substring(Cnpj.Length - 2);
    string Mult = "543298765432";
 
    string Controle = String.Empty;
    int Digito = 0;
    for (int j = 1; j < 3; j++)
    {
 
        int Soma = 0;
        for (int i = 0; i < 12; i++)
        {
            Soma += Convert.ToInt32(Cnpj_1.Substring(i, 1)) * Convert.ToInt32(Mult.Substring(i, 1));
        }
 
        if (j == 2)
        {
            Soma += (2 * Digito);
        }
 
        Digito = ((Soma * 10) % 11);
 
        if (Digito == 10)
        {
            Digito = 0;
        }
 
        Controle = Controle + Digito.ToString();
        Mult = "654329876543";
    }
 
    return (Controle != Cnpj_2);
}
Categorias:Dicas / Tips Tags:, , , ,
dotnettips.wordpress.com/

Helping Programmers Since 1994

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

blog

so long

Fernando Franzini Blog

Engenharia de Software e Arquitetura Ágil

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: