Clipper On Line • Ver Tópico - Eliminar Duplicidade em uma DBF

Eliminar Duplicidade em uma DBF

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Eliminar Duplicidade em uma DBF

Mensagempor alxsts » 01 Jun 2020 18:45

Olá!

Seja bem-vindo ao Fórum João!

Precisamos de mais detalhes sobre o teu problema para podermos oferecer ajuda.

JoãoBC escreveu:Tentei usar o programa direto no dbase IV, mas não funcionou, deu erro logo na primeira linha, onde aparece

Qual programa? Foi escrito em Clipper e tentou usar no dBase IV? Ou pegou um programa dBase IV e tentou compilar com Clipper? Foi você quem escreveu o fonte? Como está fazendo para compilar?
JoãoBC escreveu:Deu comando não reconhecido para a palavras "new excl". Não vi no texto qual a versão do clipper.

Parece que está tentando compilar o fonte dBase IV com Clipper e a primeira linha do programa é a indicada acima. Se for isto, coloque como primeira linha do arquivo fonte (.Prg) a linha abaixo:
Function Main()

Poste o teu código fonte, arquivos .Bat que esteja usando para compilar e outas informações que possam ajudar, tais como versão do compilador, linkeditor.

Para facilitar a análise de código fonte, o Fórum tem a "tag code" presente na barra de ferramentas da página que se abre para postar mensagens. Basta clicar no botão mostrado abaixo e colar o código entre as tags.
Capturar.PNG


Para outras informações sobre formatação de mensagens, veja: Guia do BBCode
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Eliminar Duplicidade em uma DBF

Mensagempor JoãoBC » 02 Jun 2020 00:11

Olá, Alexandre, obrigado pela ajuda.
Eu copiei o código fonte do EOLO, é a terceira mensagem deste tópico, como texto puro, com o nome dupli.prg, salvei na pasta do dBase IV e digitei DO dupli.
Eu programava em clipper até 93, depois nunca mais escrevi uma única linha, já não me lembro mais.
O que acontece: tenho um arquivo chamado levant.dbf criado em dbase V 2.0 para DOS (não windows) em que há vários registros duplicados (um triplicado).
São registros exatamente iguais, em todos os campos e todos os valores dos campos. Verdadeira fotocópia ou clone. Preciso que seja eliminado (apagado) o segundo
(eventualmente terceiro, quarto) igual.
Detectei a repetição pois mandei listar em ordem alfabética e nome, (campo nome) e vi que o registro 34 é exatamente igual ao 68, o registro 18 é exatamente igual ao
registro 93, e assim vai. De 240 registros, há pelo menos 50 repetições.
Não usei nenhum compilador, como falei, peguei o código fonte e copiei, alterando o nome do banco, de "cadasso" para "levant", e os campos, de "nome" para "computador"
e de "endereco" para "responsav"
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Eliminar Duplicidade em uma DBF

Mensagempor Vlademiro » 02 Jun 2020 03:38

Esse código vai funcionar no Clipper 5 e Harbour. Não tenho certeza, mas creio que funciona até no antigo Clipper Summer 87, mas evite a cláusula New do comando use.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Eliminar Duplicidade em uma DBF

Mensagempor JoãoBC » 02 Jun 2020 09:38

Olá, Pessoal, bom dia !
Fiquei das 21h de ontem (01/junho/2020) até as 3h da madrugada de hoje (02/junho/2020) mas consegui fazer funcionar no dBase IV para D.O.S. (usando a versão 2.0 do dBase e o virtualbox). Foi na "programação por atrito" ou ensaio e erro, mas saiu.

A questão - e fica a dica para quem precisar - é que o dBase NÃO tem o comando SELECT embutido. Cada vez que se usa o comando USE, o banco anterior é automaticamente fechado. O segredo então foi acrescentar manualmente cada um dos SELECT necessários.

Para vocês acompanharem melhor o fonte adaptado, preciso lembrar que, no pedido original do Kristo, atendido pelo Eolo, o banco de dados se chamava cadasso, no meu, levant. No pedido dele, os campos para comparação eram NOME e ENDERECO, no meu, COMPUTADOR e RESPONSAV.

       Select 1
   use levant excl
   
   copy stru to dupli
   copy stru to unico
   
   select 2
   use dupli excl
   
   select 3
   use unico excl
   
   select 3
   inde on computador+responsav to unico
   set inde to unico
   
   sele 1
   go top
   do whil .not. eof()
      Select 3
      seek levant->computador+levant->responsav
   
     if found()
       sele 2
     endif
     appe blan
     repl RECONUM with levant->RECONUM
     repl DEPTO with levant->DEPTO
     repl SETOR with levant->SETOR
     repl COMPUTADOR with levant->COMPUTADOR
     repl PAT_COMP with levant->PAT_COMP
     repl MONITOR with levant->MONITOR
     repl PAT_MON with levant->PAT_MON
     repl TAM_MON with levant->TAM_MON
     repl PROCESS with levant->PROCESS
     repl SISTEMA_OP with levant->SISTEMA_OP
     repl MEMORIA with levant->MEMORIA
     repl RESPONSAV with levant->RESPONSAV
    
    
   
     sele 1
     skip
   enddo


Reparem que, além de tirar a palavra NEW, também tirei o comando QUIT.

Diferente do Kristo, precisava que todos os campos fossem repassados para o arquivo novo. Não sei, no dBase IV 2.0 DOS, como se faz um append para TODOS os campos de uma só vez, quando o segundo arquivo está em outra área de trabalho (SELECT).

Uma vez que o INDEX é sempre em ordem ascendente, você mantém o primeiro registro e detona os subsequentes. Para fazer o oposto, ou seja, manter o último e detonar os anteriores, seria necessário uma programação muito mais complexa.
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Eliminar Duplicidade em uma DBF

Mensagempor JoséQuintas » 02 Jun 2020 13:37

Na rotina anterior, pra deixar o primeiro ou o último, seria o caso de indexar.

INDEX ON campo1 + campo2 + StrZero( RecNo(), 10 )

INDEX ON campo1 + campo2 + StrZero( RecNo(), 10 ) DESCEND

INDEX ON campo1 + campo2 + StrZero( 9999999999 - RecNo(), 10 )

Também tem a opção de índice único, mas sem opção de escolha


SET UNIQUE ON

USE ARQUIVO
// acrescenta um campo OK, C, 1
INDEX ON campo1 + campo2 TO UNICO
REPLACE ALL OK WITH "S"
SET INDEX TO

COPY TO UNICO FOR OK = "S"
COPY TO REPETIDO FOR OK <> "S"
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Eliminar Duplicidade em uma DBF

Mensagempor JoãoBC » 02 Jun 2020 14:41

Olá, Jose !

Não entendi o que você quis dizer.
Aquelas 3 linhas de index fora do CODE entrariam aonde? Qualquer uma das três ?
As linhas de dentro do quadro CODE sriam usadas onde ? Antes ou depois das outras ?
Haveria possibilidade de você postar a rotina final para ficar mais explícito ?
Desculpe-me, como disse antes, desde 1993 que não programo e não uso clipper, estou
muito "enferrujado".
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Eliminar Duplicidade em uma DBF

Mensagempor JoséQuintas » 02 Jun 2020 14:57

A rotina conserva o primeiro que encontrar, certo?

Então é só indexar pela ordem que quer manter, antes de iniciar o processo.
Se fizer crescente o mais antigo vém primeiro, se fizer decrescente o último vém primeiro.
Apenas coloquei opções, caso DESCEND não funcione tem a opção de 999999999 - RecNo().
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Eliminar Duplicidade em uma DBF

Mensagempor JoãoBC » 02 Jun 2020 18:08

Olá, José, eu (João) novamente.

Agora entendi mas somente uma parte. Desculpe minha burrice.

Entendi as 3 linhas antes do code: (usando INDEX)
- A primeira é para indexar em ordem crescente;
- A segunda em ordem decrescente,
- A terceira, para que o index numere como decrescente mesmo
"pensando" que está crescente (já que o número diminui).

Já dentro do code, não entendi.
Vi que é acrescentado ao banco um campo chamado "OK" onde o valor "S"
equivale ao "True" ou "Yes" e outro valor, ao "false" ou "not"

Mas o comando REPLACE ALL não colocaria "S" em todos os registros ?
No dBase , SET INDEX TO sem argumento retorna erro.

Obrigado pelo seu tempo despendido aqui.
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Eliminar Duplicidade em uma DBF

Mensagempor JoséQuintas » 02 Jun 2020 19:00

JoãoBC escreveu:Mas o comando REPLACE ALL não colocaria "S" em todos os registros ?


No índice único não entra chave repetida.
Com isso, o REPLACE ALL só trocaria o primeiro, porque estaria obedecendo ao índice..
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Eliminar Duplicidade em uma DBF

Mensagempor JoãoBC » 02 Jun 2020 21:15

Ah, entendi.
Obrigado pela paciência a ajuda !

Não pude testar (ainda) no clipper nem no harbour.
Direto no dBase V não funcionou, pois mostra
"NDX index may not be DESCENDING"

também o comando copy copia o arquivo completo.

Fiz então da seguinte forma:
1) Acrescentei um campo, chamado RECONUM no arquivo original.
Campo Character, 3 posições (pois são 240 registros)
2) Preenchi com o número da posição, precedido de zeros
replace all RECONUM with right("000" + str(recno()),3)
3) Criei um arquivo auxiliar, ordenado de trás para frente por este campo
Sort on RECONUM to levanto DESCEND
4) Usei este novo arquivo no lugar do anterior (levant)

Por quê faço desta forma ?
Para ficar independente de ser direto no dBase, no Fox, no Visual (fox/dbase/etc),
no Clipper, no harbour...
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Eliminar Duplicidade em uma DBF

Mensagempor JoãoBC » 20 Jun 2020 16:24

oi, pessoal. Tive uma ideia aqui. Nas rotinas acima, para alimentar os bancos "dupli" e "unico" com os campos do "cadasso", é feito assim:

append blan
repl nome with cadasso->nome [Replace <campo1> with <arquivo>-><campo1>
repl endereco with cadasso->endereco [replace <campo2> with <arquivo>-><campo2>

Existe algum comando ou rotina que faça o replace com TODOS os campos de uma só vez (sendo UM único registro) ?

Serial algo como REPLACE FIELDS with cadasso
ou
Append from cadasso [one only]

Assim, no lugar da palavra cadasso, usaria-se uma variável com o nome de arquivo, e o programa seria universal,
ou seja, qualquer que fosse o nome do arquivo.dbf e qualquer que fosse a estrutura, usaria-se este programa sem
modificacão. INPUT "NOME DO ARQUIVO" : GET cARQUIVO
JoãoBC
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 14
Data de registro: 01 Jun 2020 16:47
Cidade/Estado: Rio de Janeiro, RJ
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Anterior



Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro