Auto numerar campo na DBF

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

kristo
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Set 2004 16:19

Auto numerar campo na DBF

Mensagem por kristo »

Bom dia amigos....

Tenho um campo em uma DBF campo " numero " eu gostaria de saber como faço para auto numerar ele, ou seja acrescentar números de 1 por diante.........tem como ?
Fico no aguardo.........obrigado a todos
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Olá Kristo,

O seu problema é relativamente fácil de ser resolvido. Veja:

Código: Selecionar todos

        vCodigo = 0   // inicializa a variável com ZERO
        SELECT CLIENTE // selectiona arquivo de dados
        SET ORDER TO 1
        go bottom  // vai para o final do arquivo
        vCODIGO = CODIGO + 1   // pega o último número + 1
        append blank
        replace CODIGO with vCODIGO,; // grava novo registro
                TIPPES with vTIPPES,;
        ...
        ...
Valeu?

Janio
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Numeração seqüêncial...

Mensagem por gransoft »

ARAGUARI-MG, 5 de outubro de 2004.

Prezados Amigos,

Conforme o Jânio citou, se o usuário excluir um registro lá no meio do arquivo, a seqüência ficará interrompida, com números vagos...

Sugestão:

Podemo criar um *.DBF auxiliar, onde será guardado o último número incluído e qualquer outro que venha a ser excluído, aproveitando-o numa próxima inclusão.

Código: Selecionar todos

* PARA INCLUIR:
* cCodigo, cCodCli, cCodDoc, cPedido ...
cCodigo := GeraNum("I",SPACE(06))

* PARA EXCLUIR:
GeraNum("E",cCodigo)

Código: Selecionar todos

*** FUNCTION PARA GERAR NUMERO SEQUENCIAL ***
FUNCTION GeraNum(cVar,cNL)
*
LOCAL nArq, nNl, cNumLan := SPACE(06)
*
IF (VALTYPE(cVar) <> "C") .OR. (cVar == NIL)
   RETURN(cNumLan)
END
*
cVar := ALLTRIM(cVar)
*
IF (cVar <> "I") .AND. (cVar <> "E")
   RETURN(cNumLan)
END
IF (cVar == "E") .AND. ((VALTYPE(cNL) <> "C") .OR. (cNL == NIL))
   RETURN(cNumLan)
END
*
nArq := Arquivo("LANCAMENTO")
*
IF Abre_Dbf(aDbfNtx[nArq,01],aAlias[nArq],lMono,5)
   && Abre_Ntx(nArq)
ELSE
   SETCOLOR(cCor5)
   Mensagem("*** O "+aMsgArq[nArq,01]+" NAO ESTA DISPONIVEL ***")
   Retorno()
   RETURN(cNumLan)
END
*
IF     cVar = "I"  && Inclusao ...
   IF     LASTREC() = 0
      GOTO BOTTOM
      nNl     := 1
      cNumLan := STRZERO(nNl,6)
      APPEND BLANK
      REPLACE NUMLAN WITH CD(cNumLan)
   ELSEIF LASTREC() = 1
      GOTO 1
      nNl     := VAL(DC(NUMLAN))+1
      cNumLan := STRZERO(nNl,6)
      REPLACE NUMLAN WITH CD(cNumLan)
   ELSEIF LASTREC() >= 2
      GOTO 2
      nNl     := VAL(DC(NUMLAN))
      cNumLan := STRZERO(nNl,6)
      DELETE
      PACK
   END
ELSEIF cVar = "E"  && Exclusao ...
   GOTO BOTTOM
   APPEND BLANK
   REPLACE NUMLAN WITH CD(cNL)
END
COMMIT
CLOSE LANCAMENTO
RETURN(cNumLan)
***
Atenciosamente,
Janis Peters Grants.

http://www.gransoft.com.br
gransoft@zipmail.com.br
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezado Colega

Você poderia nos explicar o que você quer mais explicitamente, pois dependendo do que seja existem várias opções.

Uma outra opção de incluir um número sequencial em todo o banco de dados inicialmente seria :

PACK
REPLACE ALL NUMERO WITH RECNO()

Até logo.

Marcelo
kristo
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Set 2004 16:19

Numerar Campo em uma DBF

Mensagem por kristo »

Bom vou ser mais explicito então..
Tenho uma DBF gigantesca, ela tem 8.000.000 de nomes, mais ela tem um campo chamado " numero " que está em branco......eu gostaria de numerar esse campo..........já tentei algumas PRG mais não tive sucesso.

Eu poderia auto numerar no access, mais infelizmente ele não comporta abrir tantos nomes........

os campos que contém nessa DBF são:

NUMERO = 8
DOC = 11
NASC = 6
NOME = 31
END = 23
NUM = 6
COMPL = 15
BAIRRO = 15
CEP = 8
CIDADE = 29
UF = 2
DDD = 4
FONE = 8
ATIV = 3
RD = 7
SEXO = 1
ESTCIV = 1
CMI = 1
FX = 1
TEMFONE = 1


SE ALGUÉM PUDER MONTAR UMA PRG EU AGRADEÇO.
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Renumear ...

Mensagem por gransoft »

ARAGUARI-MG, 5 de outubro de 2004.

Prezado Kristo,

Ahhh... Bão...

Código: Selecionar todos

USE ARQUIVO.DBF
GOTO TOP
*
nN := 0
*
WHILE (.NOT. EOF())
   nN := nN + 1
   REPLACE NUMERO WITH nN
/*
   SE FOR ALFANUMERICO/CARACTERE (00000001),
   REPLACE NUMERO WITH STRZERO(nN,8) 
*/
   SKIP
END
*
QUIT
*
Atenciosamente,
Janis Peters Grants.

http://www.gransoft.com.br
gransoft@zipmail.com.br
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Ou então...

Código: Selecionar todos

REPLACE ALL NUMERO WITH RECNO()

Se o campo NUMERO for caractere então...

REPLACE ALL NUMERO WITH STRZERO(RECNO(),8) // Com zeros a esquerda
ou
REPLACE ALL NUMERO WITH STR(RECNO(),8) // Sem zeros a esquerda
Até logo.

Marcelo
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Re: Numerar Campo em uma DBF

Mensagem por gransoft »

kristo escreveu:Tenho uma DBF gigantesca, ela tem 8.000.000 de nomes
ARAGUARI-MG, 5 de outubro de 2004.

Prezados Amigos,

PACK e REPLACE ALL, dependendo do micro, dá tempo para uma caixa de cerveja e churrasco... :evil:

E aí Kristo, que dia vai ser?

Atenciosamente,
Janis Peters Grants.

http://www.gransoft.com.br
gransoft@zipmail.com.br
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Não vejo problema algum em utilizar o REPLACE ALL já que ele irá utilizar esse recurso uma única vez, diga-se de passagem que um DO WHIL .NOT. EOF() gasta o mesmo tempo, fiz um teste aqui e o tempo foi rigorosamente o mesmo, demoradíssimos 22 segundos num PENTIUM 233 MMX, quanto ao PACK...talvez alguém conheça um outro meio de excluir um registro fisicamente do arquixo talvez no xRabo seja possível, mas no Clipper que eu saiba é o único jeito... :twisted:

Acho melhor deixar o churrasco para depois, melhor comprar umas cervejinhas para esfriar a cabeça com os futuros problemas com o xRabo...

Ps. O arquivo do teste tem 89.000 registros

Fui...

Marcelo
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Cabra Arretado!!!

Mensagem por gransoft »

ARAGUARI-MG, 5 de outubro de 2004.

Prezado Marcelo,

VixiMaria!!! Eu te fiz alguma crítica ???

Atenciosamente,
Janis Peters Grants.

http://www.gransoft.com.br
gransoft@zipmail.com.br
Gerald
Usuário Nível 1
Usuário Nível 1
Mensagens: 39
Registrado em: 06 Jul 2004 17:50
Localização: Caldas Novas
Contato:

Re: Numerar Campo em uma DBF

Mensagem por Gerald »

kristo escreveu:Bom vou ser mais explicito então..
Tenho uma DBF gigantesca, ela tem 8.000.000 de nomes, mais ela tem um campo chamado " numero " que está em branco......eu gostaria de numerar esse campo..........já tentei algumas PRG mais não tive sucesso.

Eu poderia auto numerar no access, mais infelizmente ele não comporta abrir tantos nomes........

os campos que contém nessa DBF são:

NUMERO = 8
DOC = 11
NASC = 6
NOME = 31
END = 23
NUM = 6
COMPL = 15
BAIRRO = 15
CEP = 8
CIDADE = 29
UF = 2
DDD = 4
FONE = 8
ATIV = 3
RD = 7
SEXO = 1
ESTCIV = 1
CMI = 1
FX = 1
TEMFONE = 1


SE ALGUÉM PUDER MONTAR UMA PRG EU AGRADEÇO.
Eu fiz o seguinte amigo: tenho uma tabela que chama "Param" mas pode chamar de "Codigo" ou outra coisa qualquer. Criei os campos e esses contem apenas um registro. Quando quero gerar o número pego o campo que quero e acrescento mais um (Campo:= Campo+1). Foi a maneira que achamos mais fácil. Ou se for um sistema multi-empresas cria na tabela de empresas. Procura pelo código da empresa e pega o devido campo que quer auto-numerar. Certo?

Qualquer dúvida pode me contatar.
Quando disserem que seu trabalho não é o de um profissional, lembre-se: Amadores construíram a arca de Noé, profissionais, o Titanic...

www.1grau.com\comunidadeclipper
skype = "gpfranca"
novo email: geraldo@usinfo.com.br
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Uma vez que uma receita a mais vem a somar no leque de opções, passo a minha também.
Já usei o velho esquema de incrementar o valor do campo X do último registro. Não dá muito certo, já que há o problema de rede. Coincidências acontecem, principalmente quando há mais usuários fazendo a mesma coisa. Descartei.
Já usei também o esquema de gravar um contador específico para cada empresa (multi-empresa) em arquivo à parte. Até dá certo. Funciona bem, mas achei um esquema muito mais prático e simples.
Eu uso agora, plenamente satisfeito, simples números aleatórios. O campo do código, ao ser preenchido, recebe um número gerado ao acaso (Random()). Isso por si só já dá muita tranqüilidade, pois é realmente difícil que dois números se repitam. E nenhum arquivo extra precisa ser manipulado. Portanto, é mais rápido. E também mais fácil - usa menos código. Só que a Lei de Murphy nunca descansa. Então, por precaução, após obter esse número, pesquiso no arquivo e me certifico de que ele realmente não existe. Se existir (raríssimo - nos meus testes nunca peguei um único caso), é só gerar outro número e pesquisá-lo novamente.
Evidentemente, a unicidade do número também depende de sua largura. Se for um número pequeno é óbvio que as chances de repetição são maiores. Uso um número largo o suficiente. Mas aí entra outro problema: não gosto de gastar muito espaço em registro. Assim, inventei um esquema bem simples: números alfadecimais. Parecidos com os hexadecimais, essa base nova usa todas as letras do alfabeto (maiúsculas/minúsculas). Um exemplo: o decimal 56.800.235.583 equivale ao número alfadecimal "zzzzzz". Assim, ao invés de usar 11 caracteres para armazenar um código decimal, uso apenas 6 para essa nova base.

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

Calma, pessoal!

Acredito que a esta altura do campeonato o problema do amigo Kristo já tenha sido resolvido e é isso que importa, não é mesmo?

Um abraço a todos,


Jânio
kristo
Usuário Nível 2
Usuário Nível 2
Mensagens: 78
Registrado em: 21 Set 2004 16:19

Mensagem por kristo »

Valeu rapaziada.......problema resolvido...............abraço a todos
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Um tópico, num fórum de acesso público, nunca se destina apenas e tão somente a quem o abriu. Serve também para todos os demais que lerem as mensagens. Assim, se o postulante original não aproveitar tudo o que disserem, há quem possa tirar algu proveito do que ele descartou. Eu mesmo nunca desperdiço nada do que dizem, por mais óbvio que me pareça. De repente, posso aproveitar alguma idéia. Assim, acabo aprendendo mais um pouco.
É por isso que existe o ditado: "é melhor sobrar do que faltar".

[]'s
Maligno
http://www.buzinello.com/prg
Responder