Rodrigo A. M. Postado Janeiro 28, 2019 Denunciar Share Postado Janeiro 28, 2019 Boa tarde amigo, Alguém já precisou validar códigos EAN ou os conhecidos código de barras de produtos? Se sim, tem o script dessa função? Desde já agradeço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 douglascso Postado Janeiro 30, 2019 Denunciar Share Postado Janeiro 30, 2019 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'); Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rodrigo A. M. Postado Fevereiro 4, 2019 Autor Denunciar Share Postado Fevereiro 4, 2019 (editado) 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 Fevereiro 4, 2019 por Rodrigo A. M. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 douglascso Postado Fevereiro 4, 2019 Denunciar Share Postado Fevereiro 4, 2019 (editado) 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 Fevereiro 5, 2019 por douglascso Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 douglascso Postado Fevereiro 4, 2019 Denunciar Share Postado Fevereiro 4, 2019 (editado) ou update produtos set codigo_barra = '' where codigo_barra != public.fn_get_codbarras_ean13(substring(codigo_barra from 1 for 12)); Douglas Carlos da Silva Oliveira Analista de TI, QA, DBA@douglas_carlos_ Editado Fevereiro 5, 2019 por douglascso Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rodrigo A. M. Postado Fevereiro 5, 2019 Autor Denunciar Share Postado Fevereiro 5, 2019 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 douglascso Postado Fevereiro 5, 2019 Denunciar Share Postado Fevereiro 5, 2019 (editado) 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 Fevereiro 5, 2019 por douglascso Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 douglascso Postado Fevereiro 5, 2019 Denunciar Share Postado Fevereiro 5, 2019 Update corrigido. update produtos set codigo_barra = '' where codigo_barra != public.fn_get_codbarras_ean13(substring(codigo_barra from 1 for 12)); Douglas Carlos da Silva Oliveira Analista de TI, QA, DBA@douglas_carlos_ Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 douglascso Postado Fevereiro 5, 2019 Denunciar Share Postado Fevereiro 5, 2019 (editado) 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)); Obs. Caso dê erro, digite o comando. Editado Fevereiro 5, 2019 por douglascso Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Rodrigo A. M. Postado Fevereiro 22, 2019 Autor Denunciar Share Postado Fevereiro 22, 2019 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))); Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Rodrigo A. M.
Boa tarde amigo,
Alguém já precisou validar códigos EAN ou os conhecidos código de barras de produtos?
Se sim, tem o script dessa função?
Desde já agradeço.
Link para o comentário
Compartilhar em outros sites
9 respostass a esta questão
Posts Recomendados
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.