Página 1 de 2
Auto numerar campo na DBF
Enviado: 05 Out 2004 10:02
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
Enviado: 05 Out 2004 11:51
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
Numeração seqüêncial...
Enviado: 05 Out 2004 12:24
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
Enviado: 05 Out 2004 12:46
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
Numerar Campo em uma DBF
Enviado: 05 Out 2004 13:39
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.
Renumear ...
Enviado: 05 Out 2004 13:54
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
Enviado: 05 Out 2004 16:33
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
Re: Numerar Campo em uma DBF
Enviado: 05 Out 2004 17:17
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...
E aí Kristo, que dia vai ser?
Atenciosamente,
Janis Peters Grants.
http://www.gransoft.com.br
gransoft@zipmail.com.br
Enviado: 05 Out 2004 18:32
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...
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
Cabra Arretado!!!
Enviado: 05 Out 2004 20:20
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
Re: Numerar Campo em uma DBF
Enviado: 06 Out 2004 10:27
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.
Enviado: 06 Out 2004 11:05
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
Enviado: 06 Out 2004 12:25
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
Enviado: 06 Out 2004 15:21
por kristo
Valeu rapaziada.......problema resolvido...............abraço a todos
Enviado: 06 Out 2004 15:48
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