Apagar registros pai e filho banco de dados dbf

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Fabricio Fagundes
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 19 Jan 2022 11:25
Localização: JUIZ DE FORA

Apagar registros pai e filho banco de dados dbf

Mensagem 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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Apagar registros pai e filho banco de dados dbf

Mensagem 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?
[]´s
Alexandre Santos (AlxSts)
Fabricio Fagundes
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 19 Jan 2022 11:25
Localização: JUIZ DE FORA

Apagar registros pai e filho banco de dados dbf

Mensagem por Fabricio Fagundes »

Boa noite!

Alexandre, NTX.

Grato pela atenção.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Apagar registros pai e filho banco de dados dbf

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Apagar registros pai e filho banco de dados dbf

Mensagem 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
...
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar registros pai e filho banco de dados dbf

Mensagem 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() )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Apagar registros pai e filho banco de dados dbf

Mensagem por rochinha »

Amiguinhos,
Acho que o Rochinha complicou à toa.
. kkkkkkkkk e eu achei que tinha simplificado.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder