Ir para conteúdo
Fórum Script Brasil

Rodrigo A. M.

Membros
  • Total de itens

    7
  • Registro em

  • Última visita

Posts postados por Rodrigo A. M.

  1. Alguém poderia me ajudar com a seguinte consulta?
     
    Tab_base
    gtin(PK) | cod_entr | aliq_entr | cod_saida | aliq_saida
     
     
    Tab_consulta
    cod_barra | cod_entr | aliq_entr | cod_saida | aliq_saida | status_saida | corr_saida | status_entr | corr_entr 
     
    A Tab_consulta é importada e deve consultar se existe o cod_barra igual ao gtin da Tab_base. Em caso positivo, preciso consultar os campos que tem informação na Tab_consulta de códigos e alíquotas, quando tiver informação cruzar com a Tab_base para validar se está correto, se estiver correto (status_* = 'OK'), se estiver diferente (status_* = 'inválido' and corr_* = "alíquota certa vindo da Tab_base").
     
    Desde já agradeço a ajuda.
  2. Em 03/09/2018 em 15:04, Markleber disse:

    Boa tarde à todos... Sou totalmente leigo em SQL e estou precisando de uma ajuda de vocês, aliás, um excelente ajuda. Tenho duas tabelas abaixo:

    Tabela linaus07

    d01 d02 d03 d04 d05 d06 d07
    10 11 12 13 14 15 16
    10 11 12 13 14 16 17
    10 11 12 13 14 16 22

     

    Tabela linrep07

    d01 d02 d03 d04 d05 d06 d07 d08 d09 d10 d11 d12 d13 d14 d15
    1 2 3 4 5 6 7 10 11 12 13 14 16 17 22
    1 2 3 4 5 6 7 8 10 11 12 13 14 16 17
    1 2 3 4 5 6 7 9 10 11 12 13 14 16 22

     

    Então, o que preciso...???

    Pego o 1 registro da tabela linaus07 contendo 7 campos e confronto com todos os registros da tabela linrep07 contendo 15 campos, reparem que o primeiro registro da tabela linaus07, confrontando com a tabela linrep07, em nenhum momento continha 7 iguais nos registros, então, não preciso fazer nada, porém, repare agora, que o segundo registro da tabela linaus07, confrontando com a tabela linrep07, encontramos 7 campos exatamente nos 15 campos da outra tabela, então, pego o registro da tabela linrep07 e gravo em outro banco de dados (um novo), o registro que contem esses 15 campos que tinham os 7 campos da tabela linaus07.

    o que tem que ser respeitado...

    Cada registro da tabela linaus07 contendo 7 campos, irá passar em todos os registros da tabela linrep07 contendo 15 campos e irá colocar num novo banco de dados, todos os registros que da tabela linrep07 tiverem exatamente os 7 campos da tabela linaus07 e ao final, esse novo banco, terá com certeza muito registros, mas preciso salvá-los em um arquivo .txt com o separador "-" entre os campos...

    Espero ter sido claro... Obrigado 

    MARCELO SAMPAIO

    Oi Marcelo, sou novo no fórum, você conseguiu solucionar esse desafio?

  3. 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)));

  4. 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.

  5. 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');

     

     

×
×
  • Criar Novo...