Acho que o Rochinha complicou à toa.
Como já foi falado, falta saber o Ãndice disponÃvel, e principalmente qual o relacionamento entre elas.
SELECT principal
GOTO TOP
DO WHILE ! Eof()
IF principal->Situacao == "quitada"
SELECT filha
SEEK principal->Chave
DO WHILE filha->Chave == principal->Chave .AND. ! Eof()
DELETE
SKIP
ENDDO
SELECT principal
ENDIF
SKIP
ENDDO
Se preferir:
SELECT principal
GOTO TOP
DO WHILE ! Eof()
IF principal->Situacao == "quitada"
ApagaFilha( principal->Chave )
ENDIF
SKIP
ENDDO
RETURN
FUNCTION ApagaFilha( cChave )
LOCAL nSelect := Select()
SELECT filha
SEEK cChave
DO WHILE filha->Chave == cChave .AND. ! Eof()
DELETE
SKIP
ENDDO
SELECT (nSelect)
RETURN Nil
Neste segundo é até interessante, é a velha história de dividir o problemão em problemas menores.
1. processar e identificar o que está quitado
2. apagar os registros referentes ao que está quitado
De adicional, se processar o arquivo principal sem Ãndice, pode criar um gráfico de processamento até com estimativa de tempo.
GrafTempo( RecNo(), LastRec() )