Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Chave Primaria
Message
De
06/03/2002 19:43:12
 
 
À
05/03/2002 07:13:56
Information générale
Forum:
Visual FoxPro
Catégorie:
Base de données, Tables, Vues, Index et syntaxe SQL
Titre:
Divers
Thread ID:
00628307
Message ID:
00629321
Vues:
11
>Olá Pessoal,
>Como vc's fazem com registros deletados em chave primaria?? Pesquisa com set delete off e depois recall ??
>
>Breno Lucas

Olá Breno, olá All's
Eu tenho uma técnica meio diferente da usual.

1 - Não utilizo "Primary Key", uso sempre "Regular".
Porque: Se usar Primary Key vc tem que utilizar o filtro !deleted(). E, isto não é otimizado pela Rushmore.

2 - Só utilizo campos ID do tipo "Integer" e não "Caracter". Eu sempre utilizava Caracter mas analizando respostas de news eu percebi que varios gurus utilizam o tipo Integer. Motivo:
-Tamanho, é de apenas 4 byte.
-Qtde de numeros, –2147483647 a +2147483647, é uma quantia razoavel.
-Velocidade, é rápido, otimizado pela Rushmore.
-Problema, indice composto, neste caso vc deve criar um indice do ID e outro indice composto. O composto é simples PADL(ID,10,'0')+NOME.

3 - Junto com os indices crio tb + 2 tags.
Deleted Deleted() Otimiza e muito se vc usa Set Delete on.
Record_no "A" Esta tag otimiza a busca quando não existe
nenhum indice ativo e vc da um go bottom.
Em tabelas muito grandes é muito eficiente.

4 - Não mostro o número ao usuário. Isto evita problemas. Tem sempre um usário querendo digitar um número antigo.
Utilizo combos com pesquisas. Disponibilizo tb um botao de pesquiza junto com os de navegação que mostra uma grid com busca incremental.

Mas e a duplicacao da chave primaria como fica?
Bom, eu tenho uma função que faz isto é NewID() abaixo apresentada ela não esta 100% porque estou dando uns retoques, esta é a ideia geral mas pode ser alterada e testada com facilidade.

******************************************************************
* OWL Informática Ltda
* SJRio Preto, São Paulo
* Brasil
*
* Copyright © 2000 OWL Informatica Ltda
*
******************************************************************

***************
* NewID - Gera Identificador Unico.
***************
* Parameters:
* lcTable : Nome da tabela.
* lcIndexTag : Index Tag. Verifica duplicidade.
***************

LPARAM lcTable,lcIndexTag
LOCAL lnRetVal, lnSele0, lcUniqueFile, lnOldRepro

lnSele0 = SELECT()

*--- Previne Inicializacao Var.
IF TYPE("lcTable") = "L"
lcTable = UPPER(ALIAS())
ELSE
lcTable = UPPER(m.lcTable)
ENDIF

*--- Verifica a condicao do arquivo.
* lcUniqueFile = '(path)\NewID.dbf'
lcUniqueFile = 'NewID.dbf'
IF !FILE(lcUniqueFile)
* Aqui pode-se criar a tabela em tempo de execucao, em vez da mensagem.
* Seus campos sao: cAlias C (10)
* iLastKey I (04)
* Indice: cAlias.
=Messagebox("Não posso Abrir a Tabela."+CHR(10)+CHR(13)+;
"Tabela Não existe no Projeto.")
RETURN 0
ENDIF

*--- Salva Repro e abre NewId.
lnOldRepro = SET('REPROCESS')
IF ! USED("NewID")
USE (lcUniqueFile) IN 0 SHARED
*--- Ativa tabela NAO bufferizada
=CURSORSETPROP( 'Buffering', 1, 'NewID' )
ENDIF

SELE (lcUniqueFile)
BEGIN TRANSACTION
LOCATE FOR ALLT(UPPER(NewID.cAlias)) == ALLT(UPPER(m.lcTable))
IF ! FOUND()
INSERT INTO NewID (cAlias,ilastkey) values (UPPER(m.lcTable),0)
ENDIF
SET REPROCESS TO AUTOMATIC
IF TYPE( "lcIndexTag" ) = "L"
*--- Se IndexTag nao foi especificado, assume o proximo numero e boa
m.lnRetVal = NewID.ilastkey
IF RLOCK( 'NewID' )
REPLACE ilastkey WITH ilastkey + 1
ENDIF
ELSE
*--- Previne duplicidade.
* Confirma se o numero gerado nao existe na tabela
* Isto tem uma vantagem se atingir o total de 2147483647,
* ele retorna ao inicio reaproveitando os codigos deletados.
DO WHILE .T.
m.lnRetVal = NewID.ilastkey
IF m.lnRetVal = 2147483647
m.lnRetVal = 1
ENDIF
REPLACE ilastkey WITH ilastkey + 1
IF ! INDEXSEEK(m.lnRetVal,.F.,m.lcTable,m.lcIndexTag)
EXIT
ENDIF
ENDDO
ENDIF
UNLOCK RECORD RECNO()
END TRANSACTION

SET REPROCESS TO (lnOldRepro)
USE
SELE (lnSele0)

RETURN m.lnRetVal

Bom pessoal é só, esta função estou refazendo-a por isso não sei se esta livre de erros. qualquer correção será bem vinda.

Abraços

Fernando Borges
Fernando Borges.
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform