CLOSE TABLES
FOR i = 1 to ADBOBJECTS(laTables, "Table")
IF !EMPTY(laTables[i])
IF !USED(laTables[i])
USE (laTables[i]) IN 0 EXCL
SELECT (laTables[i])
WAIT WINDOW NOWAIT REINDEXING_LOC + ;
UPPER(ALLTRIM(laTables[i])) + ".DBF"
REINDEX
ENDIF
ENDIF
ENDFOR
CLOSE TABLES
WAIT WINDOW NOWAIT DONE_LOC
#DEFINE OUTFILE "valdbc.txt"
CLOSE TABLES
Очень часто бывает так, что при "улетевших" индексах фокс не может открыть таблицу! Как тогда ее
переиндексировать?
Решение может быть такое:
CLOSE TABLES ALL
CLOSE DATABASES
SET SAFETY OFF
set exclusive on
SET MESSAGE TO [Открытие БАЗЫ ДАННЫХ]
PathDB = ["]+ path_dbf+ [VITRINA"]
on error do curerr
OPEN DATABASE &PathDB EXCLUSIVE
ON ERROR
SET MESSAGE TO [Удаление первичных иддексов]
SET MESSAGE TO [Удаление индексов в таблице ZAG]
ALTER TABLE zag DROP FOREIGN KEY TAG naim
SET MESSAGE TO [Удаление индексов в таблице LST]
ALTER TABLE lst DROP FOREIGN KEY TAG tel
ALTER TABLE lst DROP FOREIGN KEY TAG sod_ind
ALTER TABLE lst DROP FOREIGN KEY TAG par_sod
* и так далее...
close tables all
SET MESSAGE TO [Переиндексация файла ZAG]
******************************************************* FileName = path_dbf + [zag.dbf]
=UnCdx(FileName)
FileName = ["]+ fileName+ ["]
use &FileName alias zag
***** Create each index for ZAG *****
SET COLLATE TO 'MACHINE'
INDEX ON NAIM TAG NAIM
*и так далее...
********************************************
* Program-ID ...: UnCDX.PRG
* Purpose ......: Удаляет метку наличия индекса "CDX"
* : (значение х01 в 29 байте файла .DBF)
* : Используется для исключения ошибки 1707
********************************************
function UnCDX
parameters FileName
private TalkSet
TalkSet = set('talk')
set talk off
CdxName = left(FileName, len(FileName) - 4)
CdxName = CdxName + ".cdx"
FileName = fullpath(FileName)
CdxName = fullpath(CdxName)
fh = fopen(FileName, 2)
if fh < 0
??chr(7)
wait "Hе могу открыть файл : " + FileName nowait window
return .F.
endif
test = fseek(fh, 28, 0)
= fwrite(fh, chr(0))
= fclose(fh)
if file(CdxName)
delete file &CdxName
endif
set talk &TalkSet
return .T.