Report Viewer – criando e usando uma função

Após a criação do post Report Viewer – Formatando CNPJ e CPF dentro da tabela , o Rodrigo me questionou em um comentário que se o campo CNPJ não viesse preenchido, o campo exibia “#erro” conforme figura 1.

criandoFuncao_figura2

Figura 1 – Exibindo “#erro”.

Para tentar solucionar, tentei colocar uma condição “iif” verificando se o campo fosse diferente de vazio “string.empty” realizasse a formatação conforme listagem 1.

=iif(Fields!cnpj.Value <> string.Empty, Format(Int(Fields!cnpj.Value), "00\.000\.000\/0000\-00"), "")

Listagem 1 – Exibindo condição.

Mas ainda continuou dando o mesmo “#erro” da figura 1. Fiz um teste para ver se a condição estava com algum problema, então retirei o “format”. Alterei o código retirando o comando “Format” e somente validei se o valor for diferente de vazio “String.Empty” exiba o valor do campo, caso contrário, exiba o texto “Em branco” conforme listagem 2.

=iif(Fields!cnpj.Value <> string.Empty, Fields!cnpj.Value, "Em branco")

Listagem 2 – Exibindo a alteração do código.

Ao executar, notamos que não será mais exibido o #erro conforme figura 2.

criandoFuncao_figura3

Figura 2 – Exibindo com a alteração do código.

Então a condição estava correta, porém notei que o a função “Format” estava impactando na condição “iif“. =(

Achei uma forma diferente de resolver o problema. Valeu pelo aprendizado, pois aprendi que posso criar minhas funções e chamá-las no relatório. Mas, caso alguém saiba como resolver para que o código da listagem 1 exiba sem o #erro, deixe seu comentário nesse post. =)

Este post não ensinará como criar um relatório usando Report Viewer. O objetivo desse post é mostrar como criar uma função e chamá-la no  campo dentro da tabela.

 Vamos começar ?!

A minha tabela terá dois campos: Código e CNPJ conforme figura 3.

criandoFuncao_figura4

Figura 3 – Exibindo os campos da tabela.

No meu caso, o campo “CNPJ” terá uma função criada para formatação conforme listagem 3.

Public Function FormatarCNPJ(Valor As String) As String

 If Trim(Valor) = "" Then 
 'o campo informado já está formatado ou é vazio
 FormatarCNPJ = "Em branco"
 
 Else
 'CNPJ
 FormatarCNPJ = Format(Int(Valor), "00\.000\.000\/0000\-00")
 
 End If

End Function

Listagem 3 – Exibindo a minha função para formatar o CNPJ.

Essa função será adicionada no “code” que está nas propriedades do relatório. Para isso, clique com o botão direito do mouse no corpo do relatório -> opção “Report Properties…” (figura 4),

criandoFuncao_figura5

Figura 4 – Clicando na opção “Report Properties…”

Na opção “Code”, cole o código criado na caixa “Custom code” (figura 5).

criandoFuncao_figura6

Figura 5 – Adicionando a função criada.

Vamos voltar ao campo “CNPJ” e incluir a expressão da listagem 4.

=code.FormatarCNPJ(cstr(Fields!cnpj.Value))

Listagem 4 – Incluindo a expressão no campo “CNPJ”.

Pronto. Ao executar será exibido o resultado da figura 6.

criandoFuncao_figura7

Figura 6 – Exibindo resultado.

Disponibilizo o projeto desenvolvido no Visual Studio 2012 em C#: CriandoRelatorio

SQL – Criando procedure com parâmetro opcional

Esses dias desenvolvendo uma tela de cadastro/alteração de usuários de um sistema, me deparei que na funcionalidade de pesquisa poderia ser informado ou não determinada informação para a busca de usuários.

Pensando.. E agora ??? E após umas pesquisas…

Usei parâmetros opcionais na procedure que busca os usuários. \o/ Se informar o parâmetro exibirá somente o usuário correspondente, caso contrário, exibirá todos os usuários cadastrados.

Resolvi escrever este post para outras pessoas que poderiam estar passando por um momento parecido, então vou compartilhar para que possa ajudar mais alguém. =D

Vamos começar ?!

Usarei o banco de dados  Adventure Works 2014 em SQL Server. Caso não tenham instalado, podem consultar o post Instalando o banco de dados Adventure Works 2014

A procedure que será criada listará nome e código de todos os produtos ou, se informado o código, o produto especifico.

O nome da procedure será “ListarProdutos” (Listagem 1).

use AdventureWorks2014
go
-- ============================================================
-- Author:		Fernanda Sallai
-- Create date: 18/03/2016
-- Description:	Listar código e nome dos produtos cadastrados
-- ============================================================
CREATE PROCEDURE ListarProdutos  
	-- o parâmetro será incluido aqui	
AS
BEGIN
    -- a consulta será incluida aqui	
END
GO

Listagem 1 – Exibindo a estrutura inicial da procedure.

Usaremos a tabela “Production.Product” e os respectivos campos: “ProductID” e “Name” (Listagem 2).

use AdventureWorks2014
go
-- ============================================================
-- Author:		Fernanda Sallai
-- Create date: 18/03/2016
-- Description:	Listar código e nome dos produtos cadastrados
-- ============================================================
CREATE PROCEDURE ListarProdutos  
	-- o parâmetro será incluido aqui	
AS
BEGIN
    SELECT ProductID as CODIGO
       , Name as NOME 
	FROM Production.Product		
END
GO

Listagem 2 – Adicionando a instrução para exibir todos os produtos.

Se parássemos na listagem 2, a instrução da procedure exibirá como resultado: o código e o nome de todos os produtos cadastrados.

Porém.. entretanto.. Vamos continuar porque queremos ter a opção de buscar o produto pelo código informado.

O parâmetro a ser recebido será o campo “ProductID“. Declararemos  uma variável do tipo inteiro chamada “codigo. Porém como será opcional, atribuiremos “null” (Listagem 3).

use AdventureWorks2014
go
-- ============================================================
-- Author:		Fernanda Sallai
-- Create date: 18/03/2016
-- Description:	Listar código e nome dos produtos cadastrados
-- ============================================================
CREATE PROCEDURE ListarProdutos  
(	
	@codigo int = null
)	
AS
BEGIN
    SELECT ProductID as CODIGO
       , Name as NOME 
	FROM Production.Product		
END
GO

Listagem 3 – Adicionando o parâmetro opcional.

Para finalizar precisamos incluir a condição na instrução “select”. A condição “where” buscará o produto conforme código informado ou se o campo não for informado, este não existirá para a consulta e serão exibidos todos os produtos cadastrados.

use AdventureWorks2014
go
-- ============================================================
-- Author:		Fernanda Sallai
-- Create date: 18/03/2016
-- Description:	Listar código e nome dos produtos cadastrados
-- ============================================================
CREATE PROCEDURE ListarProdutos 
(	
	@codigo int = null
)
AS

BEGIN
	SELECT ProductID as CODIGO
       , Name as NOME 
	FROM Production.Product	
	WHERE (ProductID = @codigo OR @codigo is null)
END
GO

Listagem 4 – Adicionando a condição na procedure.

Pronto. Vamos executar a procedure no SQL Server Management para verificarmos os resultados.

 Primeira execução: Informando o código do produto (Figuras 1 e 2)

varivelOpcional_figura3

Figura 1 – Informando o código do produto.

varivelOpcional_figura4

Figura 2 – Resultado obtido.

Segunda execução: Não informando o código (Figuras 3 e 4).

varivelOpcional_figura1

Figura 1 – Não informando o código do produto.

varivelOpcional_figura2

Figura 4 – Resultado obtido.

Report Viewer – usando gráfico

Pessoal,

Report Viewer é um recurso que integrado ao Visual Studio permite a criação de relatórios. Os primeiros passos de como se criar um relatório pode ser visualizado no post http://www.fernandasallai.com.br/?p=1925.

O objetivo desse post é mostrar como incluir gráfico no relatório.

Utilizaremos um  relatório pronto que possui três colunas conforme figura 1.

 UsandoGrafico_figura1

Figura 1 – Exibindo o relatório.

O gráfico exibirá os cursos existentes e a quantidade de alunos para cada curso.

 Vamos iniciar a inclusão do gráfico ?!

Existem duas formas de adicionar o gráfico no relatório:

  1. Clique com o botão direito do mouse no relatório e escolha a opção “Insert” -> “Chart” (figura 2)
  2. Arraste o componente “Chart” contido na toolbox

UsandoGrafico_figura2

Figura 2 – Adicionando opção “Chart”.

Serão exibidos vários tipos de gráficos (figura 3). Escolheremos o primeiro gráfico do tipo “Column” (figura 4).

UsandoGrafico_figura3

Figura 3 – Exibindo tipos de gráfico.

UsandoGrafico_figura4

Figura 4 – Exibindo o gráfico escolhido.

Duplo clique do mouse em cima do gráfico será exibida as opções para inserir as informações que aparecerão no gráfico.

Nesse caso, o campo “values” será a quantidade de pessoas por curso e o “Series Groups” os tipos de cursos existentes (figura 5).

UsandoGrafico_figura5

Figura 5 – Exibindo informações do gráfico.

OBS: para o campo “values” usaremos a expressão conforme figura 6.

UsandoGrafico_figura7

Figura 6 – Exibindo a expressão do campo “values”.

Pronto. Vamos executar o projeto e o resultado será conforme a figura 7.

UsandoGrafico_figura8

Figura 7 – Exibindo relatório e o gráfico.

Disponibilizo o projeto desenvolvido no Visual Studio 2012 em C#: CriandoRelatorio

Acesso ao Pluralsight por 6 meses

Pluralsight disponibiliza cursos muito bons, porém é necessário pagar para acessá-los.

Através da dica de um amigo fiquei sabendo que estão disponibilizando código de ativação para acessar por 6 meses gratuito. \o/

Acesse o site: https://www.visualstudio.com/

Clique na opção “Ingressar agora” figura 1.

plural_figura1

Figura 1 – Ingressar agora.

Informe seus dados de acesso “Microsoft” na figura 2.

plural_figura2

Figura 2 – Informando dados de acesso.

Encontrará a opção para ativar o código conforme figura 3.

plural_figura3

Figura 3 – Opção disponilizada.

Após ativar o código prossiga com o cadastro e demais etapas que pedirem.

Aproveitem e bons estudos =D

Criando e usando o DataTable

Neste post iremos aprender como criar o DataTable e usá-lo para popular GridView e ListBox.

OBS: Para simplificar, o DataTable será criado com dados fixos no código. Não buscarei nenhuma informação no banco de dados.

DataTable representa uma tabela de dados que será alocada em memória e serve para popular componentes asp.net ou usar as informações em algum lugar do código.

Vamos começar?!

Criaremos um projeto, no Visual Studio clique no Menu File -> New Project -> C# -> Web -> ASP.NET Empty Web Application, escolha onde irá salvar, inclua um nome no projeto e clique no botão OK. O nome incluído “usandoDataTable”.

Adicionaremos uma página ao projeto. Para isso, clique onde deseja inclui-la com botão direito do mouse em cima do nome do projeto “usandoDataTable” -> escolha a opção ADD –> New Item –> Web Form. Manterei o nome padrão “WebForm1.aspx”.

  •  “WebForm1.aspx”

Incluiremos um GridView e um ListBox para receber os dados do DataTable, o layout ficará conforme listagem 1.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="usandoDataTable.WebForm1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>



<form id="form1" runat="server">



<div>



<h1>Populando GridView</h1>



            <asp:GridView ID="GridView1" runat="server"></asp:GridView>
        </div>



        



<div>



<h1>Populando ListBox</h1>



            <asp:ListBox ID="ListBox1" runat="server"></asp:ListBox>
        </div>



 
    </form>



</body>
</html>

Listagem 1 – Layout da página.

  •  “WebForm1.aspx.cs”

Iremos começar a codificação.

  • Criando o DataTable

Para usarmos o DataTable será necessário usar o namespace Data conforme listagem 2.

// Namespace para o datatable
using System.Data;

Listagem 2 – Informando namespace Data.

A listagem 3 exibe o código comentado do DataTable criado.

// Instanciando DataTable
DataTable dados = new DataTable();

// Criando as colunas
dados.Columns.Add("Código");
dados.Columns.Add("Nome");

// Criando linhas
dados.Rows.Add("1", "Fernanda");
dados.Rows.Add("2", "Victor");

Listagem 3 – Criando DataTable.

Pronto… DataTable criado… Vamos usá-lo \o/

  • Populando GridView usando DataTable

O código ficará conforme listagem 4.

// Populando GridView
GridView1.DataSource = dados;
GridView1.DataBind();

Listagem 4 – Populando GridView usando dados do DataTable.

Ao executar o projeto teremos o resultado da figura 1.

DataTable_figura1

Figura 1 – Exibindo GridView.

  • Populando ListBox usando DataTable

O código ficará conforme listagem 5.

// Populando ListBox
for (int i = 0; i &amp;amp;lt; dados.Rows.Count; i++)
{                
   ListItem item = new ListItem();

   // linha referente a coluna "Nome"
   item.Text = dados.Rows[i].ItemArray.GetValue(1).ToString();

   // linha referente a coluna "Código"
   item.Value = dados.Rows[i].ItemArray.GetValue(0).ToString();

   ListBox1.Items.Add(item);
}

Listagem 5 – Populando ListBox usando dados do DataTable.

Ao executar o projeto teremos o resultado da figura 2.

DataTable_figura2

Figura 2 – Exibindo ListBox.

A listagem 6 contém o código completo da página “WebForm1.aspx.cs”.

using System;
using System.Collections.Generic;
// Namespace para o datatable
using System.Data;
using System.Web.UI.WebControls;

namespace usandoDataTable
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Instanciando DataTable
            DataTable dados = new DataTable();

            // Criando as colunas
            dados.Columns.Add("Código");
            dados.Columns.Add("Nome");

            // Criando linhas
            dados.Rows.Add("1", "Fernanda");
            dados.Rows.Add("2", "Victor");

            // Populando GridView
            GridView1.DataSource = dados;
            GridView1.DataBind();

            // Populando ListBox
            for (int i = 0; i &amp;lt; dados.Rows.Count; i++)
            {                
                ListItem item = new ListItem();

                // linha referente a coluna "Nome"
                item.Text = dados.Rows[i].ItemArray.GetValue(1).ToString();

                // linha referente a coluna "Código"
                item.Value = dados.Rows[i].ItemArray.GetValue(0).ToString();

                ListBox1.Items.Add(item);
            }

        }
    }
}

Listagem 6 – Código completo da página “WebForm1.aspx.cs”.

Disponibilizo o projeto desenvolvido no Visual Studio 2012 em C#: usandoDataTable

Validando formato de e-mail através de Expressão Regular (regex)

Podemos entender “expressão regular como o brinquedo LEGO, com várias pecinhas diferentes, e cada uma com sua característica, que juntas compõem estruturas completas e podem ser arranjadas com infinitas combinações diferentes”. Aurelio Marinho Jargas

Aurelio é autor de um livro (figura 1) bem didático e que super recomendo para quem quer se aprofundar no assunto de uma maneira divertida.

Livro_ExpressaoRegular_Aurelio

Figura 1 – Livro de expressão regular indicado.

O objetivo deste post é ensinar como validar se o campo informado corresponde possui um formato correto de e-mail usando a expressão regular. Salientando que essa é uma das inúmeras formas de realizar essa verificação.

Passo 1: Criando a expressão

A expressão regular que utilizei foi: “^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$” e vamos entendê-la por pedaços:

  • ^[A-Za-z0-9] -> indica:
    •  corresponde ao início da linha
    • [ ]” -> uma lista de
      • A-Za-z” -> letras maiúsculas e/ou minusculas   
      • 0-9 -> números.  

O primeiro carácter deve ser número ou letra maiúscula ou letra minuscula.

  • (([_\.\-]?[a-zA-Z0-9]+)*) -> indica:
    • ( )” -> um grupo
    • [_\.\-]” -> uma lista de “underline”, “ponto final” e “hífen”
    • ?” -> opcional (pode ou não conter o conteúdo anterior ao “?”)
    • [a-zA-Z0-9] -> lista contendo: letra maiúscula/minuscula e número
    • + -> o conteúdo anterior ao “+” deve aparecer no mínimo 1 vez
    • *” deixa repetir em qualquer quantidade. Nesse caso poderá ter um, vários, infinitos números.

OBS: a diferença entre o “*” e o “+” é que se usar o “+” o conteúdo deve aparecer pelo menos 1 vez.

Pode ter ou não os caracteres: “_”, “.” e “-“. Pelo menos 1 ou mais números ou letras maiúscula e/ou minuscula. Isso tudo pode ser repetido em qualquer quantidade.

  • @ -> deve ter um “@”.
  • \.([A-Za-z]{2,} -> indica:
    • “\.” -> essa barra antes do “.” está aparecendo para dizer que nesse caso interpretaremos como ponto final mesmo. No REGEX, o ponto final também pode ter uma função diferente, mas não entraremos nesse detalhe aqui.
    • “[A-Za-z]” -> lista contendo: letra maiúscula/minuscula
    • “{2,}” -> e essa lista (acima) deve ter no mínimo 2 caracteres.

Deve ter um ponto final seguido de pelo menos 2 letras maiúsculas e/ou minusculas.

  •  “$” corresponde ao final da linha.

Passo 2: Testando a expressão criada

Para testar as expressões regulares utilizo uma ferramenta online gratuita chamada Regex Tester disponível através da url: http://regexpal.com/  (figuras 2 e 3).

validacaoEmail_figura2

Figura 2 – O valor informado tem formato válido de e-mail.

OBS: Esse não é meu e-mail. =)

validacaoEmail_figura1

Figura 3 – O valor informado não é somente número.

Passo 3: Usando a expressão criada

Criei um projeto no Visual Studio 2012. Para criar o projeto clique em File > New Project > escolha C# > Windows > Windows Forms Application e nomeie como ValidandoEmail.

A figura 4 exibe o layout que foi criado.

validacaoEmail_figura3Figura 4 – Exibindo layout.

A listagem 1 exibirá o código comentado.

using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace ValidandoEmail
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Se o for formato de e-mail for válido
            if (IsEmail(textBox1.Text))
                MessageBox.Show("Formato de e-mail correto.");
            // Se não for 
            else
                MessageBox.Show("Informe um formato válido de e-mail.");
        }

        ///
<summary>
        /// Validar o formato do e-mail
        /// </summary>

        /// <param name="valorInformado">valor informado</param>
        /// <returns>true se for um formato válido. Caso contrário, retornará false</returns>
        public bool IsEmail(string valorInformado)
        {
            return Regex.IsMatch(valorInformado, @"^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$");
        }
    }
}

Listagem 1 – Exibindo código.

Executando o projeto

Ao executar o projeto, os possíveis resultados conforme figuras 5 ou 6.

validacaoEmail_figura4

Figura 5 – Se o valor informado tem um formato válido de e-mail.

validacaoEmail_figura5

Figura 6 – Se o valor informado não tem formato válido de e-mail.

Disponibilizo o projeto desenvolvido no Visual Studio 2012 em C#: ValidandoEmail

Exemplos de templates (modelos) disponibilizados no SQL

O SQL Server Management Studio disponibiliza  alguns modelos de templates que exibem a estrutura de comandos em SQL, como por exemplo, para criação de tabelas, banco de dados, tabelas, etc com inclusão ou não de parâmetros e até mesmo nos possibilita criar novos modelos.

Esses modelos estão disponíveis no barra chamada “Template Explorer” e existem duas formas para visualizá-los:

  • Menu View -> opção “Template Explorer” conforme figura 1.

templateExplorer_figura1

Figura 1 – Através do menu View.

  • Teclas de atalho: CTRL+ALT+T.

A figura 2 exibe as categorias existentes.

templateExplorer_figura2

Figura 2 – Exibindo “Template Explorer”.

Escolhendo, por exemplo, a categoria “Table” serão exibidos os modelos disponíveis conforme figura 3.

templateExplorer_figura3

Figura 3 – Exibindo modelos da categoria “Table”.

Abrindo o modelo “Create Table” será exibida a estrutura para a criação de uma tabela conforme listagem 1.

-- =========================================
-- Create table template
-- =========================================
USE <database, sysname, AdventureWorks>
GO

IF OBJECT_ID('<schema_name, sysname, dbo>.<table_name, sysname, sample_table>', 'U') IS NOT NULL
  DROP TABLE <schema_name, sysname, dbo>.<table_name, sysname, sample_table>
GO

CREATE TABLE <schema_name, sysname, dbo>.<table_name, sysname, sample_table>
(
	<columns_in_primary_key, , c1> <column1_datatype, , int> <column1_nullability,, NOT NULL>, 
	<column2_name, sysname, c2> <column2_datatype, , char(10)> <column2_nullability,, NULL>, 
	<column3_name, sysname, c3> <column3_datatype, , datetime> <column3_nullability,, NULL>, 
    CONSTRAINT <contraint_name, sysname, PK_sample_table> PRIMARY KEY (<columns_in_primary_key, , c1>)
)
GO

Listagem 1 – Exibindo template para criação de tabela.

É possível informar os valores dos parâmetros conforme figura 4. Para acessar o formulário existe duas formas:

  • Menu Query  -> opção “Specify Values for Template Parameters” ou;
  • Teclas de atalho: CTRL+SHIFT+M

templateExplorer_figura4

Figura 4 – Alterando os valores dos parâmetros.

A listagem 2 exibe o modelo preenchido com os parâmetros informados.

-- =========================================
-- Create table template
-- =========================================
USE AdventureWorks
GO

IF OBJECT_ID('dbo.Estudos', 'U') IS NOT NULL
  DROP TABLE dbo.Estudos
GO

CREATE TABLE dbo.Estudos
(
	ID int NOT NULL, 
	nome varchar(100) NULL, 
	dataMatricula datetime NULL, 
    CONSTRAINT PK_estudos PRIMARY KEY (ID)
)
GO

Listagem 2 – Exibindo o modelo com os parâmetros informados.

 Agora só resta executar o comando =D

Ativar Windows Identity Foundation no Windows 8

Neste post não irei entrar em detalhes do que é e como funciona. O objetivo é ensinar como ativá-lo para o pessoal que está usando o Windows 8.

Uma breve descrição: É uma estrutura que dá suporte para autenticação e autorização de usuário da aplicação.

Maiores informações acesse: https://msdn.microsoft.com/en-us/library/ee748475.aspx. Achei muito bacana a explicação nesse vídeo https://www.youtube.com/watch?v=hJZBWxCagTo&list=PLMj6LwrAFbv479k0x1-uhTeQfPa-mTe3x.

Não estava conseguindo instalar o Windows Identity Foundation e descobri que ele já vem instalado no Windows 8 e que era somente necessário ativá-lo.

Para ativar existem duas formas:

  • 1ª forma: Pela opção “Programas e Recursos” -> Ativar ou desativar recursos do Windows e checar opção “Windows Identity Foundation 3.5” conforme figura 1.

identity_figura1

Figura 1 – Ativar pela opção de recursos do Windows.

  • 2ª forma: Pelo prompt de comando (CMD) usando o comando da listagem 1.
dism.exe /online /enable-feature /featurename=Windows-Identity-Foundation

Listagem 1 – Exibindo comando para ativação.

O resultado seria conforme a figura 2.

identity_figura2

Figura 2 – Ativar pelo prompt de comando (CMD).

Incluir várias linhas usando um único comando de inserção (insert)

Você já se deparou com a necessidade de inserir várias linhas no banco de dados ?

Pois é… Eu deparei hoje com essa necessidade e pensei… Poxa terei que fazer vários comandos “insert” conforme a listagem 1.

insert into [HumanResources].[Department] (Name, GroupName)
values ('Contabilidade','Contabil')
go

insert into [HumanResources].[Department] (Name, GroupName)
values ('Recursos Humanos','RH')
go

insert into [HumanResources].[Department] (Name, GroupName)
values ('Tecnologia','TI')
go

-- e pode ter mais linhas como essas...

Listagem 1 –  inserindo várias linhas.

Pesquisando um pouco descobri que a partir do SQL 2008 é possível inserir várias linhas usando apenas um comando “Insert” conforme listagem 2.

  insert into [HumanResources].[Department]
  (Name, GroupName)
  values ('Contabilidade','Contabil'),
         ('Recursos Humanos','RH'),
         ('Tecnologia','TI')

Listagem 2 – Inserindo várias linhas com um único comando “insert”.

Vamos executar o comando?!

Iremos usar o banco de dados “AdventureWorks2014” conforme listagem 3.

   use AdventureWorks2014
   go

Listagem 3 – Escolhendo o banco de dados.

Ao executar o comando, nesse caso, será exibido que 3 linhas foram incluídas conforme figura 1.

insertComMultiplasLinhas_figura1

Figura 1 – Executando o código.

A figura 2 exibe as 3 linhas que foram incluídas na tabela.

insertComMultiplasLinhas_figura2

Figura 2 – Exibindo registros incluídos.

Validando campo CNPJ

Neste post iremos aprender como verificar se o CNPJ é válido usando regex e conhecer o passo-a-passo de como funciona o algoritmo de validação do CNPJ.

Usarei durante a explicação o CNPJ “46.377.222/0001-29” que foi gerado no http://www.geradorcnpj.com/.

Para conhecimento:

  • O CNPJ é composto por 14 números;
  • Esses números são divididos em 3 blocos sendo:
    • 46377222  -> número da inscrição do CNPJ;
    • 0001           -> código único da matriz ou filial;
    • 29               -> dígitos verificadores (DV).

 Vamos começar?!

Criaremos um projeto, no Visual Studio clique no Menu File -> New Project -> C# -> Windows -> Windows Forms Application, escolha onde irá salvar, inclua um nome no projeto e clique no botão OK.

Incluiremos no “Form1″ (figura 1):

  • Label com texto “CNPJ”;
  • TextBox com nome “txtValor”;
  • Button com nome “btnValidar”.

validandoCNPJ_figura1

Figura 1 – Exibindo layout do “Form1”.

O código inicial está conforme listagem 1.

using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace ValidandoCNPJ
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

Listagem 1 – Exibindo código inicial.

A funcionalidade será chamada ao clicarmos no botão e validará o retorno do método “IsCNPJ” (esse método logo será criado) exibindo uma mensagem (listagem 2).

 private void btnValidar_Click(object sender, EventArgs e)
 {
	   // Se for cnpj válido
   if (IsCNPJ(txtValor.Text))
       MessageBox.Show("CNPJ válido.");
   // Se não for
   else
       MessageBox.Show("CNPJ inválido.");
 }

Listagem 2 – Criando método.

Criaremos o método “IsCNPJ” que receberá o valor informado no “txtValor” e   retornará se o valor informado é válido ou não conforme listagem 3.

        /// <summary>
        /// Realiza a verificação se o valor informado corresponde a um CNPJ válido
        /// </summary>
        /// <param name="valor">valor recebido</param>
        /// <returns>Verdadeiro ou Falso</returns>
        public bool IsCNPJ(string valor)
        {
	    // variável de retorno
            bool retorno = true;

            // terá mais linhas de código

            return retorno;
        }

Listagem 3 – Criando método “IsCNPJ”.

Irei realizar a implementação do método por partes visando o melhor entendimento. Iremos implementar o código na parte do comentário “// terá mais linhas de código” da listagem 3 e no final do post, incluo o código completo.

Salientando que estou considerando somente os números do CNPJ.

1º passo: verificaremos se o valor informado  (listagem 4):

  • contém 14 números;
  • e se eles são diferentes de “00000000000000” e “99999999999999”.
     // Valida com regex se são 14 números e se são diferentes dos valores "00000000000000" e "99999999999999"
     if ((Regex.IsMatch(valor, "^[0-9]{14}$", RegexOptions.Compiled)) && (valor != "00000000000000") && (valor != "99999999999999"))
      {
		          // terá mais código
      }
      // Caso a verificação do primeiro if seja falsa
      else
      {
                retorno = false;
      }

Listagem 4 – Verificando valor informado.

Vamos iniciar o algoritmo que  será adicionado no lugar do comentário “// terá mais código” da listagem 4.

2º passo: realizaremos um cálculo para validar o 1º dígito verificador que nesse caso “2” (listagem 5).

  • Os 12 primeiros números do CNPJ “652705380001” serão multiplicados pelos pesos (valores que estão em vermelho).
cnpj 4 6 3 7 7 2 2 2 0 0 0 1
vezes x x x x x x x x x x x x
peso 5 4 3 2 9 8 7 6 5 4 3 2
igual = = = = = = = = = = = =
total 20 24 9 14 63 16 14 12 0 0 0 2
  • Soma a linha do “total” -> 174.
  • Obtém o resto (mod) do total por 11 -> (174 % 11) =  9.
  • Realiza a subtração de 11 pelo resto ->  (11 – 9) = 2
  • Verifica se o valor obtido da subtração (2) é igual ao primeiro digito verificador (2). Se for igual será válido, caso contrário, inválido.
                // Cáculo com a parte do CNPJ (652705380001) sem os 2 últimos digitos
                int somaDigitoUm = Convert.ToInt32(valor.Substring(0, 1)) * 5
                                 + Convert.ToInt32(valor.Substring(1, 1)) * 4
                                 + Convert.ToInt32(valor.Substring(2, 1)) * 3
                                 + Convert.ToInt32(valor.Substring(3, 1)) * 2
                                 + Convert.ToInt32(valor.Substring(4, 1)) * 9
                                 + Convert.ToInt32(valor.Substring(5, 1)) * 8
                                 + Convert.ToInt32(valor.Substring(6, 1)) * 7
                                 + Convert.ToInt32(valor.Substring(7, 1)) * 6
                                 + Convert.ToInt32(valor.Substring(8, 1)) * 5
                                 + Convert.ToInt32(valor.Substring(9, 1)) * 4
                                 + Convert.ToInt32(valor.Substring(10, 1)) * 3
                                 + Convert.ToInt32(valor.Substring(11, 1)) * 2;

                // % (mod -> verifica o resto)
                int resto = 11 - (somaDigitoUm % 11);

                if (resto > 9)
                {
                    resto = 0;
                }

                // O resto calculado em cima do (463772220001) não pode ser diferente do valor da 12º posição (penúltimo digito)
                if (Convert.ToInt32(valor.Substring(12, 1)) != resto)
                {
                    retorno = false;
                }

Listagem 5 – Realizando cálculo em cima do 1º digito verificador.

 3º passo: realizaremos um cálculo para validar o 2º dígito verificador que nesse caso “9” (listagem 6).

  • Os 13 primeiros números do CNPJ “6527053800012” serão multiplicados pelos pesos (valores que estão em vermelho).
cnpj 4 6 3 7 7 2 2 2 0 0 0 1 2
vezes x x x x x x x x x x x x x
peso 6 5 4 3 2 9 8 7 6 5 4 3 2
igual = = = = = = = = = = = = =
total 24 30 12 21 14 18 16 14 0 0 0 3 4
  • Soma a linha do “total” -> 156.
  • Obtém o resto (mod) do total por 11 -> (156 % 11) =  2.
  • Realiza a subtração de 11 pelo resto ->  (11 – 2) = 9
  • Verifica se o valor obtido da subtração (9) é igual ao segundo digito verificador (9). Se for igual será válido, caso contrário, inválido.
                 // Cálculo com a parte do CNPJ (6527053800016) sem a último digito
                int somaDigitoDois = Convert.ToInt32(valor.Substring(0, 1)) * 6
                                   + Convert.ToInt32(valor.Substring(1, 1)) * 5
                                   + Convert.ToInt32(valor.Substring(2, 1)) * 4
                                   + Convert.ToInt32(valor.Substring(3, 1)) * 3
                                   + Convert.ToInt32(valor.Substring(4, 1)) * 2
                                   + Convert.ToInt32(valor.Substring(5, 1)) * 9
                                   + Convert.ToInt32(valor.Substring(6, 1)) * 8
                                   + Convert.ToInt32(valor.Substring(7, 1)) * 7
                                   + Convert.ToInt32(valor.Substring(8, 1)) * 6
                                   + Convert.ToInt32(valor.Substring(9, 1)) * 5
                                   + Convert.ToInt32(valor.Substring(10, 1)) * 4
                                   + Convert.ToInt32(valor.Substring(11, 1)) * 3
                                   + Convert.ToInt32(valor.Substring(12, 1)) * 2;

                // % (mod -> verifica o resto)
                resto = 11 - (somaDigitoDois % 11);

                if (resto > 9)
                {
                    resto = 0;
                }

                // O resto calculado em cima do (4637722200016) não pode ser diferente do valor da 13º posição (último digito)
                if (Convert.ToInt32(valor.Substring(13, 1)) != resto)
                {
                    retorno = false;
                }

Listagem 6 – Realizando cálculo em cima do 2º digito verificador.

A listagem 7 exibe o código completo.

using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace ValidandoCNPJ
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnValidar_Click(object sender, EventArgs e)
        {
            // CNPJ gerado e que será usado nesse teste 65270538000161

            // o cnpj estará seguindo as posições:
            // 0 ->  6
            // 1 ->  5
            // 2 ->  2
            // 3 ->  7
            // 4 ->  0
            // 5 ->  5
            // 6 ->  3
            // 7 ->  8
            // 8 ->  0
            // 9 ->  0
            // 10 -> 0
            // 11 -> 1
            // 12 -> 6
            // 13 -> 1

            // Se for cnpj válido
            if (IsCNPJ(txtValor.Text))
                MessageBox.Show("CNPJ válido.");
            // Se não for
            else
                MessageBox.Show("CNPJ inválido.");
        }

        /// <summary>
        /// Realiza a verificação se o valor informado corresponde a um CNPJ válido
        /// </summary>
        /// <param name="valor">valor</param>
        /// <returns>Verdadeiro ou Falso</returns>
        public bool IsCNPJ(string valor)
        {
            bool retorno = true;

            // Valida com regex se são 14 números e se são diferentes dos valores "00000000000000" e "99999999999999"
            if ((Regex.IsMatch(valor, "^[0-9]{14}$", RegexOptions.Compiled)) && (valor != "00000000000000") && (valor != "99999999999999"))
            {
                // Cáculo com a parte do CNPJ (652705380001) sem os 2 últimos digitos
                int somaDigitoUm = Convert.ToInt32(valor.Substring(0, 1)) * 5
                                 + Convert.ToInt32(valor.Substring(1, 1)) * 4
                                 + Convert.ToInt32(valor.Substring(2, 1)) * 3
                                 + Convert.ToInt32(valor.Substring(3, 1)) * 2
                                 + Convert.ToInt32(valor.Substring(4, 1)) * 9
                                 + Convert.ToInt32(valor.Substring(5, 1)) * 8
                                 + Convert.ToInt32(valor.Substring(6, 1)) * 7
                                 + Convert.ToInt32(valor.Substring(7, 1)) * 6
                                 + Convert.ToInt32(valor.Substring(8, 1)) * 5
                                 + Convert.ToInt32(valor.Substring(9, 1)) * 4
                                 + Convert.ToInt32(valor.Substring(10, 1)) * 3
                                 + Convert.ToInt32(valor.Substring(11, 1)) * 2;

                // % (mod -> verifica o resto)
                int resto = 11 - (somaDigitoUm % 11);

                if (resto > 9)
                {
                    resto = 0;
                }

                // O resto calculado em cima do (463772220001) não pode ser diferente do valor da 12º posição (penúltimo digito)
                if (Convert.ToInt32(valor.Substring(12, 1)) != resto)
                {
                    retorno = false;
                }

                // Cálculo com a parte do CNPJ (6527053800016) sem a último digito
                int somaDigitoDois = Convert.ToInt32(valor.Substring(0, 1)) * 6
                                   + Convert.ToInt32(valor.Substring(1, 1)) * 5
                                   + Convert.ToInt32(valor.Substring(2, 1)) * 4
                                   + Convert.ToInt32(valor.Substring(3, 1)) * 3
                                   + Convert.ToInt32(valor.Substring(4, 1)) * 2
                                   + Convert.ToInt32(valor.Substring(5, 1)) * 9
                                   + Convert.ToInt32(valor.Substring(6, 1)) * 8
                                   + Convert.ToInt32(valor.Substring(7, 1)) * 7
                                   + Convert.ToInt32(valor.Substring(8, 1)) * 6
                                   + Convert.ToInt32(valor.Substring(9, 1)) * 5
                                   + Convert.ToInt32(valor.Substring(10, 1)) * 4
                                   + Convert.ToInt32(valor.Substring(11, 1)) * 3
                                   + Convert.ToInt32(valor.Substring(12, 1)) * 2;

                // % (mod -> verifica o resto)
                resto = 11 - (somaDigitoDois % 11);

                if (resto > 9)
                {
                    resto = 0;
                }

                // O resto calculado em cima do (4637722200016) não pode ser diferente do valor da 13º posição (último digito)
                if (Convert.ToInt32(valor.Substring(13, 1)) != resto)
                {
                    retorno = false;
                }
            }
            // Caso a verificação do primeiro if seja falsa
            else
            {
                retorno = false;
            }

            return retorno;
        }
    }
}

Listagem 7 – Exibindo código completo.

Ao executar o projeto, os resultados obtidos serão conforme figuras 2 e 3.

cnpj_valido

Figura 2 – Informando um CNPJ válido.

cnpj_invalido

Figura 3 – Informando um CNPJ inválido.

Disponibilizo o projeto desenvolvido no Visual Studio 2012 em C#: ValidandoCNPJ