Ir para conteúdo
Fórum Script Brasil
  • 0

Validar código de barras / EAN de produtos


Rodrigo A. M.

Pergunta

9 respostass a esta questão

Posts Recomendados

  • 0

Bom dia,

segue exemplo:

create or replace function fn_get_codbarras_ean13(p_codbarras varchar(12))
returns varchar(13) as $$
declare
    v_soma integer;
    v_digitos smallint[12];
    v_DV smallint;
begin
    --Verifica a quantidade de dígitos informados no parâmetro da função
    if length(p_codbarras) > 12 then
        raise exception 'O valor informado no parâmetro possui mais do que 12 dígitos';
    end if;
    --Formata o valor do parâmetro com zeros à esquerda e o converte em um array
    v_digitos := string_to_array(lpad(p_codbarras,12,'0'), null);
    --É somado cada elemento do array, caso ele esteja num índice par o valor será
    --multiplicado por 3 antes de ser somado.
    for i in 1..12 loop
        if mod(i,2) = 0 then
            v_soma := coalesce(v_soma, 0) + (v_digitos[i] * 3);
        else
            v_soma := coalesce(v_soma, 0) + v_digitos[i];
        end if;
    end loop;
    --O resultado da subtração de 10 pela sobra da divisão da soma dos dígitos
    --por 10 é o dígito verificador
    v_DV = 10 - mod(v_soma, 10);
    if v_DV = 10 then
        v_DV := 0;
    end if;
    --É retornado o código de barras concatenado ao dígito verificador
    return array_to_string(v_digitos, '') || v_DV;
end
$$ language plpgsql volatile strict;
SELECT public.fn_get_codbarras_ean13('789100031550');

 

Link para o comentário
Compartilhar em outros sites

  • 0

Se eu entendi bem, essa função valida quando recebe um EAN para validar. Gostaria de ajuda para um select e delete EANs que não sejam válidos em um BD já existente.

Teria alguma sugestão?

Em 30/01/2019 em 09:18, douglascso disse:

Bom dia,

segue exemplo:


create or replace function fn_get_codbarras_ean13(p_codbarras varchar(12))
returns varchar(13) as $$
declare
    v_soma integer;
    v_digitos smallint[12];
    v_DV smallint;
begin
    --Verifica a quantidade de dígitos informados no parâmetro da função
    if length(p_codbarras) > 12 then
        raise exception 'O valor informado no parâmetro possui mais do que 12 dígitos';
    end if;
    --Formata o valor do parâmetro com zeros à esquerda e o converte em um array
    v_digitos := string_to_array(lpad(p_codbarras,12,'0'), null);
    --É somado cada elemento do array, caso ele esteja num índice par o valor será
    --multiplicado por 3 antes de ser somado.
    for i in 1..12 loop
        if mod(i,2) = 0 then
            v_soma := coalesce(v_soma, 0) + (v_digitos[i] * 3);
        else
            v_soma := coalesce(v_soma, 0) + v_digitos[i];
        end if;
    end loop;
    --O resultado da subtração de 10 pela sobra da divisão da soma dos dígitos
    --por 10 é o dígito verificador
    v_DV = 10 - mod(v_soma, 10);
    if v_DV = 10 then
        v_DV := 0;
    end if;
    --É retornado o código de barras concatenado ao dígito verificador
    return array_to_string(v_digitos, '') || v_DV;
end
$$ language plpgsql volatile strict;

SELECT public.fn_get_codbarras_ean13('789100031550');

 

 

Editado por Rodrigo A. M.
Link para o comentário
Compartilhar em outros sites

  • 0

Use o seguinte comando:

update produtos set codigo_barra = '' produtos where codigo_barra != (SELECT * from public.fn_get_codbarras_ean13(
(SELECT substring(codigo_barra from 1 for 12) FROM produtos WHERE id = 1)
)) and id = 1;

 

Douglas Carlos da Silva Oliveira
Analista de TI, QA, DBA
@douglas_carlos_

Editado por douglascso
Link para o comentário
Compartilhar em outros sites

  • 0

Não estou conseguindo amigo. Essa função e esse delete excluem mesmo registros válidos. Não sei onde estou errando.

Tenho uma base com as seguintes colunas "COD_EAN" "DESC_PRODUTO" e "CLASS_FISCAL_NCM", com 500.000 registros mais ou menos e precisava rodar algo para validar essa base já existente e excluir o que não passar na validação. Mas sou iniciante em PostgreSQL e está me tirando a tranquilidade, tens alguma dica?

Se não tiver, mesmo assim, agradeço seu tempo.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Rodrigo,

agora que observei que ele está apagando os produtos e você queria um update.

na minha base de dados de teste funcionou corretamente, você poderia informar alguns códigos incorretos e outros corretos da sua base de dados e a estrutura completa(sql) dessa tabela? Se possível me envie uma copia do seu banco para eu analisar. douglascsoliveira@hotmail.com

 

Douglas Carlos da Silva Oliveira
Analista de TI, QA, DBA
@douglas_carlos_

Editado por douglascso
Link para o comentário
Compartilhar em outros sites

  • 0

Pode tentar o seguinte comando.

-- Function: public.fn_get_codbarras_ean13(character varying)
-- DROP FUNCTION public.fn_get_codbarras_ean13(character varying);
CREATE OR REPLACE FUNCTION public.fn_get_codbarras_ean13(p_codbarras character varying)
  RETURNS character varying AS
$BODY$
declare
    v_soma integer;
    v_digitos smallint[12];
    v_DV smallint;
begin
    --Verifica a quantidade de dígitos informados no parâmetro da função
    if length(p_codbarras) > 12 then
        raise exception 'O valor informado no parâmetro possui mais do que 12 dígitos';
    end if;
    --Formata o valor do parâmetro com zeros à esquerda e o converte em um array
    v_digitos := string_to_array(lpad(p_codbarras,12,'0'), null);
    --É somado cada elemento do array, caso ele esteja num índice par o valor será
    --multiplicado por 3 antes de ser somado.
    for i in 1..12 loop
        if mod(i,2) = 0 then
            v_soma := coalesce(v_soma, 0) + (v_digitos[i] * 3);
        else
            v_soma := coalesce(v_soma, 0) + v_digitos[i];
        end if;
    end loop;
    --O resultado da subtração de 10 pela sobra da divisão da soma dos dígitos
    --por 10 é o dígito verificador
    v_DV = 10 - mod(v_soma, 10);
    if v_DV = 10 then
        v_DV := 0;
    end if;
    --É retornado o código de barras concatenado ao dígito verificador
    return array_to_string(v_digitos, '') || v_DV;
end
$BODY$
  LANGUAGE plpgsql VOLATILE STRICT
  COST 100;
ALTER FUNCTION public.fn_get_codbarras_ean13(character varying)
  OWNER TO postgres;
update ean_ecm set cod_ean = '' where cod_ean != public.fn_get_codbarras_ean13(substring(cod_ean from 1 for 12));

 

sql.png

 

Obs. Caso dê erro, digite o comando.

Editado por douglascso
Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia, dei uma alterada no na função e funcionou perfeitamente como eu precisava. Obrigado por toda disponibilidade em ajudar.

Qualquer consideração fique a vontade.

 

create or replace function fn_get_codbarras_gtin(p_codbarras varchar(13))
returns varchar(14) as $$
declare
    v_soma integer;
    v_digitos smallint[13];
    v_DV smallint;
    v_dt integer;
   begin
    --Verifica a quantidade de dígitos informados no parâmetro da função
    if length(p_codbarras) > 13 then
        raise exception 'O valor informado no parâmetro possui mais do que 12 dígitos';
    end if;
    --Converte em um array
    v_digitos := string_to_array(p_codbarras, null);
    --É somado cada elemento do array, caso ele esteja num índice par o valor será
    --multiplicado por 3 antes de ser somado.
    v_dt := (Length("p_codbarras"));
    for i in 1..v_dt loop
        if mod(v_dt,2) = 0 then
            if mod(i,2) = 0 then
                v_soma := coalesce(v_soma, 0) + (v_digitos * 3);
            else
                v_soma := coalesce(v_soma, 0) + v_digitos;
            end if;
        else
            if mod(i,2) = 0 then
                v_soma := coalesce(v_soma, 0) + v_digitos;
            else
                v_soma := coalesce(v_soma, 0) + (v_digitos * 3);
            end if;
         end if;
    end loop;
    --O resultado da subtração de 10 pela sobra da divisão da soma dos dígitos
    --por 10 é o dígito verificador
    v_DV = 10 - mod(v_soma, 10);
    if v_DV = 10 then
        v_DV := 0;
    end if;
    --É retornado o código de barras concatenado ao dígito verificador
    return array_to_string(v_digitos, '') || v_DV;
end
$$ language plpgsql volatile strict;

update public."GTIN13" set "STATUS" = 'INVALIDO' where "GTIN" != public.fn_get_codbarras_gtin(substring("GTIN" from 1 for (Length("GTIN")-1)));

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...