Autor do artigo: Pedro.fortes.pro

(Não remova esse quadro) Descreva o passo a passo para o cliente seguindo os padrões de escrita de artigos, como: 1. Escreva em voz ativa. 2. Numere o passo a passo. 3. Atenção com imagens: utilize uma resolução apropriada ao local de inserção. 4. Escreva em tempo presente, na primeira pessoal e no imperativo (em passo a passo). Essas informações não se tonam parte do conteúdo em sua nova página, elas ficam ocultas e só aprecem para usuário logado e se o artigo/dica estiver em modo de edição!


Como Ocorre ?:


Situação ocorre ao efetuar o comando no pervasive de uma empresa : 

  • Alter table lfs_nota_item_compl add column DUMMIE integer default 999#
  • Alter table prg_empresa_btr drop column DUMMIE     

e ele informa the record has a key field containing a duplicate value (btrieve error 5) 

Inserir imagem neste quadro (Remova essa instrução)

Como identificar o registro duplicado ?:

 

1 - Para realizar a consulta dos registros será necessário realizar o script para identificar os duplicados usando mais de uma coluna como parâmetro para o agrupamento de dados 

SELECT * FROM (

select

                  ntic_id

                , ntic_ano_movimento

                , ntic_fk_nota_item

                , count(1) as qtde

from lfs_nota_item_compl

group by ntic_id, ntic_ano_movimento,ntic_fk_nota_item

) AS duplicados

WHERE qtde > 1

ORDER BY qtde DESC;



2 - Após identificação dos registros é necessário verificar  que a duplicidade se apresenta ao realizar a pesquisa dos registros pelo ntic_fk_nota_item


Abaixo uma consulta mais completa já mostrando as linhas duplicadas ordenadas pelo ntic_fk_nota_item.


SELECT * FROM lfs_nota_item_compl 
WHERE ntic_fk_nota_item IN (
SELECT ntic_fk_nota_item FROM (
select 
    ntic_id 
    , ntic_ano_movimento
    , ntic_fk_nota_item 
    , count(1) as qtde
from lfs_nota_item_compl 
group by ntic_id, ntic_ano_movimento,ntic_fk_nota_item 
) AS duplicados 
WHERE qtde > 1
) ORDER BY ntic_fk_nota_item;



Como um exemplo esta sendo utilizado um registro ,  pode-se ver que de duas em duas elas se duplicam e são iguais em todos os registros.



Como Solucionar ?:

Como solução é necessário executar a busca das linhas duplicadas apenas pelo valor do campo ntic_fk_nota_item uma a uma 

Exemplo:

SELECT * FROM lfs_nota_item_compl

WHERE ntic_fk_nota_item = 91331;


Resultado apresentado:

ntic_id

ntic_ano_movimento

ntic_fk_nota_item

ntic_fk_unid_medida

ntic_exc_icms_piscof

ntic_DescrProd

118951

2023

91331

0

0


118951

2023

91331

0

0




Para remoção foi escolhido o segundo registro apresentado e usado o processo de remoção por dentro da interface do PCC.

Obs.: A remoção do primeiro registro por esse processo ocasiona em erro e não remove o registro, por esse motivo o segundo registro duplicado é usado.

Com isso efetuado a Tabela não possuirá mais duplicidade .



(Não remova esse quadro)
Essas informações não se tonam parte do conteúdo em sua nova página, elas ficam ocultas e só aprecem para usuário logado e se o artigo/dica estiver em modo de edição!
<div id="text-end"></div>




<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-193974933-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag2(){dataLayer.push(arguments);}
  gtag2('js', new Date());

  gtag2('config', 'UA-193974933-1');


  function gtagevents (action,category) {
     console.log(category + ':' + action);
     gtag2('event',action,{event_category:category,event_label: document.title});
  };

</script>

<script src="https://player.vimeo.com/api/player.js"></script>
<script>
    (function(){
        // RASTREIO DE USO DO VÍDEO
        function gtagvideo(action){
           gtagevents(action,'Video')
        }

        var iframe = document.querySelector('iframe');
        var player = new Vimeo.Player(iframe);

        var seeking = false;
        var priorTime = 0;
        var currentTime = 0;
        var reportouFinalDoConteudo = false;

        // se pausar o play é acionado também.
        player.on('play', function(data) {
            if(data.seconds == 0){ 
              gtagvideo('video-iniciado');
            }
            priorTime = data.seconds;             
        });

        player.on('ended', function() {
            gtagvideo('video-finalizado');
        });

        //seeking e timeupdate são disparados juntos, logo o tempo dos 2 é atualizado também. Preciso garantir que a variavel starttime seja atualizada ordenadamente (sempre antes ou após o seeking).
        // pra isso preciso setar uma variavel no timeupdate e ler no seeking para garantir a ordem. Se ela estiver false será alterada na próxima iteração.
        player.on('seeking', function(data) {               
            seeking = true;
        });


        player.on('pause',function(data){
            gtagvideo('video-pausado');    
        });

        player.on('timeupdate', function(data) {
            if(seeking){
                if(currentTime < priorTime){
                    gtagvideo('video-voltando');    
                }
                if(currentTime > priorTime){
                    gtagvideo('video-avancando')
                }
                seeking = false;
            }
            priorTime = currentTime;
            currentTime = data.seconds;


           var finalDoConteudo = (data.duration - data.seconds) < 5;
           if(finalDoConteudo && !reportouFinalDoConteudo){
            gtagvideo('conteudo-finalizado')
            reportouFinalDoConteudo = true;
           }
        });

        player.on('fullscreenchange', function() {
            gtagvideo('video-fullscreen');
        });
    })();
</script>

<script>
 // RASTREIO DO USO DE AUDIO
 (function(){
    function gtagaudio(action){
           gtagevents(action,'Audio')
    }            

    var audio = document.querySelector("audio");

    var seeking = false;
    var priorTime = 0;
    var currentTime = 0;

    audio.addEventListener('play',function(){
        if(audio.currentTime == 0){
          gtagaudio('audio-iniciado');
        }
        priorTime = audio.currentTime;        
    });

    audio.addEventListener('ended',function(){
        gtagaudio('audio-finalizado');
    });

    audio.addEventListener('pause',function(){
        gtagaudio('audio-pausado');
    });

    audio.addEventListener('seeking', function(data) {               
        seeking = true;
    });

    audio.addEventListener('timeupdate', function(data) {               
        if(seeking){
                if(currentTime < priorTime){
                    gtagaudio('audio-voltando');    
                }
                if(currentTime > priorTime){
                    gtagaudio('audio-avancando')
                }
                seeking = false;
            }
            priorTime = currentTime;
            currentTime = audio.currentTime;
    });    
 })();
 </script>

<script>
    (function(){
        var terminou = false;
        //RASTREIO DE LEITURA ATÉ O FINAL DA PÁGINA
        document.addEventListener('scroll',() => {
            if(document.getElementById('text-end').getBoundingClientRect().top < window.innerHeight){
                if(!terminou){
                    terminou = true;
                    gtagevents('artigo-lido','Pagina')
                }
            }else{
                terminou = false;
            }
                
        });
    })();
 </script>