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: 3107
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: 3107
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: 4666
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 1 vez
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 4666
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Curtiu: 1 vez
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