A função que apresento é muito boa para se controlar os vários contadores que usamos em nossos sistemas e vale a pena investir em seu uso, já que a velha técnica de pegar o RECNO() sempre falha após um exclusão fisica via PACK.
Exemplo:
Eu tinha um cadastro de clientes com 20 registros e eliminei 5 aleatóriamente ficando com 15. Ao usar um PACK o meu RECNO()+1 devolveria 16 e se usasse este numero eu poderia ter registros duplicados.
A função possui um cálculo que retorna um valor baseado na regra:
nControle := ... recco()+(recco()/2) ...
Ou seja numero de registros é igual ao seu total mais sua metade, ou seja, meu proximo contador poderia ser 22 ou 23.
Ela não é a prova de falhas, pois depende de um cálculo FIXO baseado em valores FLUTUANTES.
Seu código é:
FUNCTION PsqControle( database )
// Inicializa controle com um numero diferente do total de registros
nControle := iif( recco()=0, 1, recco()+(recco()/2) )
// Guarda a área atual do .DBf a ser controlado
OldArea := Select()
If !File("CONTROLE.DBF")
// Cria a estrutura do controlador caso ainda não exista
ESTRU_DBF := { ;
{ "DATABASE" , "C",12, 0 } , ; // Guarda o nome do DBF/ALIAS
{ "CONTADOR" , "N", 7, 0 } } // Armazena o contador
DBCREATE( "CONTROLE", ESTRU_DBF )
EndIf
If Select("CONTROLE") == 0 // Se ainda não estiver aberto, abre...
USE controle NEW
Else
DbSelectar("CONTROLE") // Se ja estiver aberto SELEciona
EndIf
// Verifica a existencia da chave( que pode ser também uma palavra )
LOCATE FOR UPPER(controle->database) = UPPER(database)
if found()
// Encontrando incrementa o contador
nControle := controle->contador + 1
RLOCK() // Usado no caso de rede
controle->contador := nControle
COMMIT
else
// Caso a chave ainda não exista será criada
APPEND BLANK
controle->database := database
controle->contador := nControle
COMMIT
endif
// Volta a área antiga
SELE (OldArea)
// Retorna o numero de controle
RETURN nControle
O seu uso é muito simples:
...
CLIENTES->IDCLIENTE := PsqControle( DBF() )
APPEND BLANK
...
COMMIT
...
O registro de cliente será salvo com um numero atualizado e o controle também será atualizado.
A manutenção do arquivo de controle poderá ser feita também via dBase, DBU ,Fox ou um browse interno chamado pelos menos de sua aplicação .
@braços :xau