none
Separar CPF de CNPJ RRS feed

  • Pergunta

  • Boa Tarde 

    Preciso de ajuda para definir quais registros do meu BD são PF ou PJ

    Teria que ser uma forma que incluisse um coluna na tabela e inserisse a siglas PF ou PJ

    a estrutura da minha tabela esta assim:

    CPF Cliente

    00086231000160 ROTAL HOSPITALAR LTDA                                                           

    00002888386100 JOSE SILVERIO    

    o campo CPF é vachar (14) e o cpf foi igualado a qtd de caracteres do cnpj com tres 0, mesmo assim existem cnpj´s que começam com 000, como exemplo acima

    obrigado, pela atenção

                                              

    terça-feira, 13 de setembro de 2016 19:42

Respostas

  • Boa tarde Dznedin,
    Acredito que você possa realizar essa validação verificando o inicio, se forem 3 zeros, pode ser CNPJ ou CPF, caso contrário é CNPJ.

    Se for com início zeros, utilize uma validação para ver ser é aceito como CPF, caso não valide ele será um CNPJ.

    Acredito que deva resolver o seu problema.

    Segue abaixo:

    CREATE TABLE #TEMP
        (
         CGC VARCHAR(14),
         NOME VARCHAR(50)
        )
    
    CREATE TABLE #RESULT
        (
         CGC VARCHAR(14),
         NOME VARCHAR(50),
    	 TIPO VARCHAR(4)
        )
    
    INSERT INTO #TEMP VALUES
    ('00086231000160','ROTAL HOSPITALAR LTDA  '),
    ('00002888386100','JOSE SILVERIO'),
    ('77746224000171','TESTE PJ'),
    ('14545005000104','TESTE PJ1'),
    ('59241855000157','TESTE PJ2'),
    ('00014939200574','TESTE PF'),
    ('00097278540100','TESTE PF1'),
    ('00021123113521','TESTE PF2')
    
    DECLARE @CGC AS VARCHAR(14),
    		@NOME VARCHAR(50),
    		@INDICE INT,
            @SOMA INT,
            @DIG1 INT,
            @DIG2 INT,
            @CPF_TEMP VARCHAR(11),
            @DIGITOS_IGUAIS CHAR(1),
            @RESULTADO CHAR(1)
    
    
    DECLARE vCursor CURSOR FOR
    SELECT * FROM #TEMP
    
    OPEN vCursor;
    
    FETCH NEXT FROM vCursor INTO @CGC, @NOME
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    	IF LEFT(@CGC,3) <> '000'
    	BEGIN
    		SET @RESULTADO = 'N'
    	END
    	ELSE
    	BEGIN
    	--tenta validar como CPF
    	   SET @CPF_TEMP = RIGHT(@CGC,11)
    	   SET @SOMA = 0  
    	   SET @INDICE = 1
    
    	   WHILE (@INDICE <= 9)
    	   BEGIN
    		  SET @SOMA = @SOMA + CONVERT(INT,SUBSTRING(@CPF_TEMP,@INDICE,1)) * (11 - @INDICE);
    		  SET @INDICE = @INDICE + 1
    	   END
    
    	   SET @DIG1 = 11 - (@SOMA % 11)
    
    	   IF @DIG1 > 9
    		  SET @DIG1 = 0;
    
    	   
    	   SET @SOMA = 0
    	   SET @INDICE = 1
    
    	   WHILE (@INDICE <= 10)
    	   BEGIN
    		  SET @SOMA = @SOMA + CONVERT(INT,SUBSTRING(@CPF_TEMP,@INDICE,1)) * (12 - @INDICE);
    		  SET @INDICE = @INDICE + 1
    	   END
    
    	   SET @DIG2 = 11 - (@SOMA % 11)
    
    	   IF @DIG2 > 9
    		  SET @DIG2 = 0;
    
    	   IF (@DIG1 = SUBSTRING(@CPF_TEMP,LEN(@CPF_TEMP)-1,1)) AND (@DIG2 = SUBSTRING(@CPF_TEMP,LEN(@CPF_TEMP),1))
    		  SET @RESULTADO = 'S'
    	   ELSE
    		  SET @RESULTADO = 'N'
    	END
    	
    	IF @RESULTADO = 'S'
    		INSERT INTO #RESULT VALUES (@CGC,@NOME,'CPF')
    	ELSE
    		INSERT INTO #RESULT VALUES (@CGC,@NOME,'CNPJ')
    
    	FETCH NEXT FROM vCursor INTO @CGC, @NOME
    END
    CLOSE vCursor;
    DEALLOCATE vCursor;
    
    SELECT * FROM #RESULT
    
    DROP TABLE #TEMP
    DROP TABLE #RESULT
    


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Dznedin quarta-feira, 14 de setembro de 2016 17:51
    terça-feira, 13 de setembro de 2016 20:52

Todas as Respostas

  • Olá,

    Uma ideia para fazer tal verificação, primeiro deveria converter esse campo para BIGINT, aí fazer os seguintes passos:

    1) Separar os que tenham tamanho acima de 11 dígitos, pois já serão CNPJ's

    2) Nos restantes ainda podem existir CNPJ's, aí terás que fazer um filtro um pouco mais manual para identificar os casos desses CNPJs que iniciam com 000 (Você pode até fazer um filtro por uma parte do nome, como "LTDA", "SA", etc)

    3) Após ter separado devidamente os registros, identificando na coluna que criou como PF ou PJ, aí se quiser converter os números novamente para VARCHAR ou CHAR, terás que adicionar os 0's novamente no início dos números

    Espero ter ajudado na lógica de resolução do problema.

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco


    terça-feira, 13 de setembro de 2016 19:51
  • Boa tarde Dznedin,
    Acredito que você possa realizar essa validação verificando o inicio, se forem 3 zeros, pode ser CNPJ ou CPF, caso contrário é CNPJ.

    Se for com início zeros, utilize uma validação para ver ser é aceito como CPF, caso não valide ele será um CNPJ.

    Acredito que deva resolver o seu problema.

    Segue abaixo:

    CREATE TABLE #TEMP
        (
         CGC VARCHAR(14),
         NOME VARCHAR(50)
        )
    
    CREATE TABLE #RESULT
        (
         CGC VARCHAR(14),
         NOME VARCHAR(50),
    	 TIPO VARCHAR(4)
        )
    
    INSERT INTO #TEMP VALUES
    ('00086231000160','ROTAL HOSPITALAR LTDA  '),
    ('00002888386100','JOSE SILVERIO'),
    ('77746224000171','TESTE PJ'),
    ('14545005000104','TESTE PJ1'),
    ('59241855000157','TESTE PJ2'),
    ('00014939200574','TESTE PF'),
    ('00097278540100','TESTE PF1'),
    ('00021123113521','TESTE PF2')
    
    DECLARE @CGC AS VARCHAR(14),
    		@NOME VARCHAR(50),
    		@INDICE INT,
            @SOMA INT,
            @DIG1 INT,
            @DIG2 INT,
            @CPF_TEMP VARCHAR(11),
            @DIGITOS_IGUAIS CHAR(1),
            @RESULTADO CHAR(1)
    
    
    DECLARE vCursor CURSOR FOR
    SELECT * FROM #TEMP
    
    OPEN vCursor;
    
    FETCH NEXT FROM vCursor INTO @CGC, @NOME
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
    	IF LEFT(@CGC,3) <> '000'
    	BEGIN
    		SET @RESULTADO = 'N'
    	END
    	ELSE
    	BEGIN
    	--tenta validar como CPF
    	   SET @CPF_TEMP = RIGHT(@CGC,11)
    	   SET @SOMA = 0  
    	   SET @INDICE = 1
    
    	   WHILE (@INDICE <= 9)
    	   BEGIN
    		  SET @SOMA = @SOMA + CONVERT(INT,SUBSTRING(@CPF_TEMP,@INDICE,1)) * (11 - @INDICE);
    		  SET @INDICE = @INDICE + 1
    	   END
    
    	   SET @DIG1 = 11 - (@SOMA % 11)
    
    	   IF @DIG1 > 9
    		  SET @DIG1 = 0;
    
    	   
    	   SET @SOMA = 0
    	   SET @INDICE = 1
    
    	   WHILE (@INDICE <= 10)
    	   BEGIN
    		  SET @SOMA = @SOMA + CONVERT(INT,SUBSTRING(@CPF_TEMP,@INDICE,1)) * (12 - @INDICE);
    		  SET @INDICE = @INDICE + 1
    	   END
    
    	   SET @DIG2 = 11 - (@SOMA % 11)
    
    	   IF @DIG2 > 9
    		  SET @DIG2 = 0;
    
    	   IF (@DIG1 = SUBSTRING(@CPF_TEMP,LEN(@CPF_TEMP)-1,1)) AND (@DIG2 = SUBSTRING(@CPF_TEMP,LEN(@CPF_TEMP),1))
    		  SET @RESULTADO = 'S'
    	   ELSE
    		  SET @RESULTADO = 'N'
    	END
    	
    	IF @RESULTADO = 'S'
    		INSERT INTO #RESULT VALUES (@CGC,@NOME,'CPF')
    	ELSE
    		INSERT INTO #RESULT VALUES (@CGC,@NOME,'CNPJ')
    
    	FETCH NEXT FROM vCursor INTO @CGC, @NOME
    END
    CLOSE vCursor;
    DEALLOCATE vCursor;
    
    SELECT * FROM #RESULT
    
    DROP TABLE #TEMP
    DROP TABLE #RESULT
    


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Dznedin quarta-feira, 14 de setembro de 2016 17:51
    terça-feira, 13 de setembro de 2016 20:52
  • Deleted
    terça-feira, 13 de setembro de 2016 22:01
  • Bom primeiro passo é separar os registros que com certeza não são CPF, ai ficaremos com registros que podem ou não ser um CNPJ, detalhe, a maneira como é feita o calculo do digito verificador dos dois é diferente, sendo assim, basta validar o CNPJ, se for valido é um CNPJ, caso contrario é um CPF.

    Encontrei este script em SQL para validar CNPJ

    RETURNS BIT
    AS
    BEGIN
     
        DECLARE
            @INDICE INT,
            @SOMA INT,
            @DIG1 INT,
            @DIG2 INT,
            @VAR1 INT,
            @VAR2 INT,
            @RESULTADO CHAR(1)
     
     
        SET @SOMA = 0
        SET @INDICE = 1
        SET @RESULTADO = 0
        SET @VAR1 = 5 /* 1a Parte do Algorítimo começando de "5" */
     
        WHILE ( @INDICE <= 4 )
        BEGIN
            SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR1
            SET @INDICE = @INDICE + 1 /* Navegando um-a-um até < = 4, as quatro primeira posições */
            SET @VAR1 = @VAR1 - 1       /* subtraindo o algorítimo de 5 até 2 */
        END
     
           
        SET @VAR2 = 9
        WHILE ( @INDICE <= 12 )
        BEGIN
            SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR2
            SET @INDICE = @INDICE + 1
            SET @VAR2 = @VAR2 - 1            
        END
     
        SET @DIG1 = ( @SOMA % 11 )
     
     
       /* SE O RESTO DA DIVISÃO FOR < 2, O DIGITO = 0 */
        IF @DIG1 < 2
            SET @DIG1 = 0;
        ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/
            SET @DIG1 = 11 - ( @SOMA % 11 );
     
     
        SET @INDICE = 1
        SET @SOMA = 0
        SET @VAR1 = 6 /* 2a Parte do Algorítimo começando de "6" */
        SET @RESULTADO = 0
     
     
        WHILE ( @INDICE <= 5 )
        BEGIN
            SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR1
            SET @INDICE = @INDICE + 1 /* Navegando um-a-um até < = 5, as quatro primeira posições */
            SET @VAR1 = @VAR1 - 1       /* subtraindo o algorítimo de 6 até 2 */
        END
     
     
     
        /* CÁLCULO DA 2ª PARTE DO ALGORÍTIOM 98765432 */
        SET @VAR2 = 9
        WHILE ( @INDICE <= 13 )
        BEGIN
            SET @SOMA = @SOMA + CONVERT(INT, SUBSTRING(@CNPJ, @INDICE, 1)) * @VAR2
            SET @INDICE = @INDICE + 1
            SET @VAR2 = @VAR2 - 1            
        END
     
     
        SET @DIG2 = ( @SOMA % 11 )
     
     
       /* SE O RESTO DA DIVISÃO FOR < 2, O DIGITO = 0 */
     
        IF @DIG2 < 2
            SET @DIG2 = 0;
     
        ELSE /* SE O RESTO DA DIVISÃO NÃO FOR < 2*/
            SET @DIG2 = 11 - ( @SOMA % 11 );
     
     
        IF ( @DIG1 = SUBSTRING(@CNPJ, LEN(@CNPJ) - 1, 1) ) AND ( @DIG2 = SUBSTRING(@CNPJ, LEN(@CNPJ), 1) )
            SET @RESULTADO = 1
        ELSE
            SET @RESULTADO = 0
     
     
     
        RETURN @RESULTADO
     
     
    END

    ai é só salvar o campo onde identifica se é pessoa física ou jurídica

    Se a resposta contribuiu com seu aprendizado por favor marque como Útil
    Se solucionou seu problema por favor marque como Resposta
    Atenção, se seu problema foi resolvido não deixe o post aberto 

    Visite : www.codigoexpresso.com.br

     
    • Sugerido como Resposta Código Expresso quarta-feira, 14 de setembro de 2016 22:17
    terça-feira, 13 de setembro de 2016 22:47
  • DZNedin,

    Na minha opinião o primeiro passo é pensar como você vai guardar este "Tipo do Cliente" PF ou PJ, até ai tudo bem é algo bem simples, basta criar um campo na sua tabela do tipo Char(2) que guarde justamente estes valores de acordo com o tipo do cliente.

    O segundo passo é identificar qual é realmente o cliente, existem algumas regras que podem ser encontradas para tentar estabelecer quando é CNPJ ou CPF, por padrão os CNPJ normalmente possuem 14 dígitos contando somente os números e sempre deverá ter uma inscrição estadual e municipal, é justamente neste sentido que você vai poder ter a garantia e certeza que aquele dado digitado realmente é um CNPJ, criando uma regra onde quando os três campos:

    -CNPJ;

    -INSCRICAOESTADUAL; e

    -INSCRICAOMUNICIPAL, forem preenchidos de forma correta o campo Tipo de Cliente vai receber o valor de PJ, caso contrário será repassado o valor PF.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 14 de setembro de 2016 15:52
  • Valew Kannaâm

    estou conferindo aqui, mas parece ter separado direitinho

    abs

    quarta-feira, 14 de setembro de 2016 17:52
  • Beleza!!
    Abraços!!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quarta-feira, 14 de setembro de 2016 19:12