Para que o OrdKeyCount() me mostre sempre a quantidade real de registros apresentado nos browses, em meu sistema uso a cláusula "FOR !DELETED()" em todos meus índices.
O problema é que percebi que o "DELETE ALL FOR condições..." NAO FUNCIONA com a condição "FOR !DELETED()"
Código: Selecionar todos
// hbmk2.exe z_prog -b
Function Main()
SET DELETED ON
SETMODE(25,80)
SET COLOR TO ("W+/B")
CLS
Alert("Vai iniciar!")
// Criando um banco de dados
If !File("fat_discri.dbf")
aStructure := {}
aAdd( aStructure, { "PEDIDO" , "N", 7, 1 })
aAdd( aStructure, { "DESCRICAO" , "C", 40, 0 })
aAdd( aStructure, { "QUANT" , "N", 10, 2 })
aAdd( aStructure, { "UNIT" , "N", 12, 2 })
aAdd( aStructure, { "TOTAL" , "N", 14, 2 })
aAdd( aStructure, { "LINHA" , "N", 2, 0 })
dbCreate("fat_discri.dbf", aStructure)
EndIf
USE FAT_DISCRI
COPY TO TESTE
USE TESTE NEW EXCLU
// Incluindo 14 registros no banco de dados
FOR F=1 TO 14
APPEND BLANK
REPLACE DESCRICAO WITH "Linha -> "+str(f)
REPLACE LINHA WITH F
NEXT
INDEX ON LINHA TAG LINHA TO TESTE FOR !DELETED()
alert("Apos indexar, o arquivo "+alias()+" possui "+alltrim(str(ordkeycount()))+" registros validos.")
dbedit()
cls
DELETE ALL FOR RECNO()>4 // -> DELETA APENAS 1 REGISTRO
alert("Depois de TENTAR deletar 10 registros, o arquivo "+alias()+" possui "+alltrim(str(ordkeycount()))+" registros validos.")
dbedit()
cls
GO TOP
DELETE ALL FOR LINHA>4 // CONTINUA DELETANDO APENAS MAIS 1 REGISTRO
REINDEX
COUNT TO nTotalNaoDeletados FOR !DELETED() // Nem precisaria o "FOR !DELETED()" ...
alert("Depois de MAIS UMA TENTATIVA de deletar, o arquivo "+alias()+" possui "+alltrim(str(nTotalNaoDeletados))+" registros validos.")
dbedit()
cls
QUIT
Vejo que a solução é sempre abrir o arquivo sem índice antes de um DELE ALL, mas no caso de arquivo com 500 mil registros fica meio na contramão...
Analisando o resultado do código acima, acredito que o comando DELETE ALL deleta e atualiza o índice UM a UM ao invés de deletar UM a UM a DEPOIS atualizar o índice pelo lote deletado, ou seja, na primeira deleção já quebra o índice pois sendo um DELETADO se perde no loop.
É assim mesmo ou tem algum macete ?
Grato!


