Olá leitor(a), meu nome é Mauricio Junior e eu vou mostrar usando poucas palavras o problema que passei e como solucionei. O assunto é replace ou seja, troca de informações em momento de execução e isso pode ser feito de várias maneiras.

Utilizado no artigo:
Visual Studio Microsoft
Linguagem C#
Banco de dados SQL Server
Scripts PLSQL

Primeiro eu vou descrever o meu problema. Fiz um formulário de cadastro de aluno e nesse formulário tinha o campo CPF formatado com (.) ponto e (-) traço. Fiz uma função em JavaScript que formata os dados digitados e assim que o usuário digita apenas o número. Estava tudo bem até que o meu chefe pediu para exportar todos os dados para uma planilha. Você já viu algum chefe não gostar de planilha? Fala sério!

Mas voltando ao meu problema, tive que retirar usando SELECT os pontos e traços do campo CPF. Ao invés de fazer update no banco de dados, achei melhor fazer um SELECT que mostre os dados sem a formatação. Isso porque o chefe pediu os dados sem o formato específico.

REPLACE no banco de dados

O select no banco de dados é tranquilo, basta fazer um replace(cpf, “.”, “”) só que eu preciso fazer dois replace e não apenas um. Pra isso existe o comando (replace (replace)), isso mesmo, duas vezes o replace. Veja o comando no código 1.1

Código 1.1 - Fazendo replace no select
SELECT replace(replace(cpf, “.”, “”), “-“, “”) as CPF, Nome, Email from Aluno WHERE Ano=2015

Segue uma pequena explicação sobre o código 1.1. O comando SELECT retorna pra todos os campos que eu quiser, e nesse caso eu coloquei o CPF, Nome e Email. Lembrando que o CPF deve aparecer sem formato algum. No SELECT, para fazer duas vezes o replace, é necessário chamar duas seguindo a sintaxe. Depois de dois comandos, basta colocar o campo que desejar, depois o valor coloque o valor que será substituído. Por isso do “.”, “” - lê-se substituir de ponto para nada. Como são dois comandos, o segundo comando deve seguir a mesma sintaxe, só que agora de “-“, “” de traço para nada.


REPLACE no código

Para fazer o replace no código é bem, mais simples do que no banco de dados principalmente usando a linguagem C# da Microsoft. Vamos imaginar que eu precise fazer uma substituição em uma lista de informações. Vamos usar como exemplo o CPF. Vou mostrar no código 1.2 e mostrar como fazer replace e depois dois replaces. Veja o código.

// um replace
String _cpfFormatado;
String _cpfSemFormato = _cpfFormatado.ToString().Replace(“.”, “”);

// dois replaces
String _cpfFormatado;
String _cpfSemFormato = _cpfFormatado.ToString().Replace(“.”, “”).Replace(“-”, “”);
Código 1.2 - Replace no código


Exportando para Excel

Até agora foi fácil, o problema que enfrentei nem imaginava que enfrentaria. Exportar um número sem formatação pode acontecer alguns problemas como corte de valores. 

Existem CPFs que começam com o número 0 e o excel (geralmente) trata o 0 a esquerda como um valor nulo ou então substitui o 0 por nada automaticamente. Para quem não sabe como exportar dados para o Excel, acesse o endereço www.ecode10.com e veja como fazer, escrevi um artigo que mostra passo a passo.

Como o excel trata o zero a esquerda como um número não válido, a quantidade de caracteres no CPF fica inválido, isto é, ao invés de ficar 11 dígitos, fica 9 ou 10. Eu só percebi o erro dos dados depois de exportar. Até então, os dados estavam funcionando sem qualquer problema.

E como fazer com que o excel trate o zero a esquerda como um texto ou número normal? Procurando na Internet, achei várias maneiras mas só alguns faziam sentido. No final, consegui fazer com que os números sejam entendidos como texto dentro da planilha.

O número precisa ser aceito com o formato texto. Pra isso utilizei o método RowDataBound.


Vamos ao código

Para preencher o gridView, gerei um método e chame ele no Page_Load. Código 1.3.

Código 1.3 - Preenchendo o GridView
        private void preencheGrid()
        {
// preenchendo da dto para passar valor
            AlunoDTO dto = new AlunoDTO();
            dto.situacao = "P";
            dto.ano = 2015;


// chamando o método para busca
            AlunoBRL brl = new AlunoBRL();
            DataTable dt = brl.searchAlunoInscricao(dto);

//preenchendo o gridview via data source
            this.gridAluno.DataSource = dt;
            this.gridAluno.DataBind();

        }
Para formatar o número como texto é necessário identificar o campo como texto dentro do GridView. Veja o código 1.4.

Código 1.4 - Informando o número para ser entendido como texto.
protected void gridAluno_RowDataBound(object sender, GridViewRowEventArgs e)
{
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Cells[9].Attributes["style"] = @"mso-number-format:'\@'";
                e.Row.Cells[9].Text = "\t" + e.Row.Cells[9].Text;
            }
}

Note que o código 1.4 mexe com o estilo do dado dentro da GridView. Ele formata com o \@ e depois adiciona o \t antes do texto. Isso faz com que automaticamente os dados daquele campo número 9 seja entendido como texto e não como número. 

Com isso, o excel mantém o zero a esquerda do número de forma automática. E isso resolveu o meu problema de ficar com o CPF inválido. Ficou tudo válido e funcionou.

Espero que tenha gostado e qualquer dúvida favor entrar em contato pelo site www.mauriciojunior.org