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.