Página 1 de 1
Apagar registros pai e filho banco de dados dbf
Enviado: 20 Jan 2022 13:12
por Fabricio Fagundes
Boa tarde! Gostaria de uma ajuda de como apagar os registros de duas tabelas sendo pai e filho. A tabelas tem a seguintes estrutura;
Tabela Venda
NUMFICHA, COD_CLI, OPERACAO, DATAOP, NFISCAL, VALORTOTAL, VENCIMENTO, SITUACAO.
Tabela ItemVenda
NUMFICHA, PROCOD, DATAOPE, COD_CLI, PRECOMP, QUANT, DESC, PREVENDA
Gostaria de apagar os registros nas duas tabelas que tenham a situacao "quitada".
Desde já, agradeço atenção.
Apagar registros pai e filho banco de dados dbf
Enviado: 20 Jan 2022 17:41
por alxsts
Olá!
Seja bem-vindo ao Fórum, Fabrício!
Faltou uma informação que muda completamente a forma de fazer o que quer:
Estas tabelas tem índices? Se sim, quais?
Apagar registros pai e filho banco de dados dbf
Enviado: 20 Jan 2022 21:01
por Fabricio Fagundes
Boa noite!
Alexandre, NTX.
Grato pela atenção.
Apagar registros pai e filho banco de dados dbf
Enviado: 20 Jan 2022 21:35
por alxsts
Olá!
alxsts escreveu:Se sim, quais?
Me refiro às chaves. Quais campos formam as chaves de índice?
O importante é ter índices. Se NTX ou CDX pouco importa neste caso.
Apagar registros pai e filho banco de dados dbf
Enviado: 05 Mar 2022 13:16
por rochinha
Amiguinhos,
Algo assim:
Código: Selecionar todos
function EliminaPaisEFilhos( sCodigoPai )
use pai new shared index codigopai
use filhos new shared index codigopai // campo unificador dos filhos do pai
select pai
seek sCodigoPai // Se tiver indices pelo sCodigoPai senão usa-se LOCATE sCodigoPai
if found()
sRegistroPai := recno()
select filho
do while .not. eof()
if filho->codigopai = sCodigoPai
rlock()
dbDelete()
unlock()
endif
dbskip
enddo
select pai
go sRegistroPai
if pai->codigopai = sCodigoPai
rlock()
dbDelete()
unlock()
endif
endif
...
Apagar registros pai e filho banco de dados dbf
Enviado: 05 Mar 2022 23:19
por JoséQuintas
Acho que o Rochinha complicou à toa.
Como já foi falado, falta saber o índice disponível, e principalmente qual o relacionamento entre elas.
Código: Selecionar todos
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:
Código: Selecionar todos
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() )
Apagar registros pai e filho banco de dados dbf
Enviado: 08 Mar 2022 11:51
por rochinha
Amiguinhos,
Acho que o Rochinha complicou à toa.
. kkkkkkkkk e eu achei que tinha simplificado.