Clipper On Line • Ver Tópico - Exclusão sequenciada de arquivo indexado

Exclusão sequenciada de arquivo indexado

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Exclusão sequenciada de arquivo indexado

Mensagempor lugab » 01 Nov 2018 21:38

Boa noite, pessoal.

Uma dúvida que sempre tive: Usando o SET DELETED "ON", ao excluir um registro de arquivo indexado, o próximo skip setará o próximo registro
da sequência indexada ou o SET DELETED ON levará o ponteiro para um registro diferente ??
Exemplo
No arquivo Teste.dbf abaixo, indexado pelo campo código, qdo deletar o código A003 o próximo skip avançará para o código B001 ?
codigo
A001
A002
A003
B001
B002
C001
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor JoséQuintas » 02 Nov 2018 20:56

Excluir não é problema. O que causa mudança de ordem é alterar a chave de acesso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor alxsts » 03 Nov 2018 01:20

Olá!

lugab escreveu:qdo deletar o código A003 o próximo skip avançará para o código B001 ?


Sim.

DELETE
Mark records for deletion
------------------------------------------------------------------------------
Syntax

DELETE [<scope>] [WHILE <lCondition>]
[FOR <lCondition>]

Arguments

<scope> is the portion of the current database file to DELETE. If a
scope is not specified, DELETE acts only on the current record. If a
conditional clause is specified, the default becomes ALL records.

WHILE <lCondition> specifies the set of records meeting the
condition from the current record until the condition fails.

FOR <lCondition> specifies the conditional set of records to DELETE
within the given scope.

Description

DELETE is a database command that tags records so they can be filtered
with SET DELETED ON, queried with DELETED(), or physically removed from
the database file with PACK. In addition, display commands such as LIST
and DISPLAY identify deleted records with an asterisk (*) character.
Once records are deleted, you can reinstate them by using RECALL. If
you want to remove all records from a database file, use ZAP instead of
DELETE ALL and PACK.

Any deleted record can be recalled as long as the PACK or ZAP command
has not been issued. Once the PACK or ZAP command has been issued, the
deleted data cannot be retrieved.

In a network environment, DELETE requires the current record be locked
with RLOCK() if you are deleting a single record. If you are deleting
several records, the current database file must be locked with FLOCK()
or USEed EXCLUSIVEly. Refer to the "Network Programming" chapter in the
Programming and Utilities Guide for more information.

Notes

. DELETE with SET DELETED ON: If the current record is deleted
with SET DELETED ON, it will be visible until the record pointer is
moved.


Examples

. This example demonstrates use of the FOR clause to mark a set
of records for deletion:

        USE Sales INDEX Salesman NEW
        DELETE ALL FOR Inactive


Files Library is CLIPPER.LIB.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor lugab » 03 Nov 2018 03:09

Ok, mestres...

Mesmo se a cláusula SET DELETED estiver "ON " ?
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor Jairo Maia » 03 Nov 2018 10:58

lugab escreveu:Mesmo se a cláusula SET DELETED estiver "ON " ?
Somente se SET DELETED estiver ON, ocorrerá o que você disse, Se estiver OFF, usando seu exemplo então ao deletar o registro o registro corrente passa a ser o B001 e o próximo SKIP levará o pointer ao registro B002.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor alxsts » 03 Nov 2018 15:06

Olá!

Jairo Maia escreveu:Somente se SET DELETED estiver ON, ocorrerá o que você disse, Se estiver OFF, usando seu exemplo então ao deletar o registro o registro corrente passa a ser o B001 e o próximo SKIP levará o pointer ao registro B002.

Não é o que informa o manual.
alxsts escreveu:Notes

. DELETE with SET DELETED ON: If the current record is deleted
with SET DELETED ON, it will be visible until the record pointer is
moved.

Na realidade, independentemente do estado de SET DELETED, existindo ou não um índice em uso para o DBF aberto na área em questão, o registro é marcado como DELETED() e o ponteiro do registro (RECNO()) permanece no mesmo lugar até que o ponteiro seja movido (DbSkip(), DbGoTop(), DbGoBottom(), DbSeek() )
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor lugab » 03 Nov 2018 15:42

Ahannn... Agora sim eu entendi

Na realidade, independentemente do estado de SET DELETED, existindo ou não um índice em uso para o DBF aberto na área em questão, o registro é marcado como DELETED() e o ponteiro do registro (RECNO()) permanece no mesmo lugar até que o ponteiro seja movido (DbSkip(), DbGoTop(), DbGoBottom(), DbSeek() )


Elementar meu caro, Alxsts
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor Jairo Maia » 03 Nov 2018 15:59

alxsts escreveu:Notes

. DELETE with SET DELETED ON: If the current record is deleted
with SET DELETED ON, it will be visible until the record pointer is
moved.
Ops, calma ai... Vamos ver o que diz a mensagem:
DELETE com SET DELETED ON: Se o registro corrente é deletado com SET DELETED ON, ele permanecerá visível até que o pointer seja movido.

O que eu disse diferente? Se deletar com SET DELETED OFF, isso não ocorrerá, e o pointer passará ao registro seguinte.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor alxsts » 03 Nov 2018 16:13

Olá!

Faça o teste.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor Jairo Maia » 03 Nov 2018 16:25

Olá Alexandre,

alxsts escreveu:Faça o teste.
Acabei de fazer com as 4 situações. Arquivo indexado com ON e OFF. Arquivo sem indexação com ON e OFF. Hoje não, mas amanhã posto um exemplo aqui. Fiz os testes ligando e desligando SET DELETED em meu sistema, não dá para postar agora.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor lugab » 03 Nov 2018 21:37

Beleza...

Esqueça amanhã não, Mestre Jairo, a gente vai ver a conclusão final, derradeira e conclusiva do assunto
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor Jairo Maia » 04 Nov 2018 09:56

Olá Pessoal,

Alexandre, fiz os testes ontem mas foi em meu TBrowse(), claro, ao pressionar algo remonto a tela e portanto move o pointer.

E como prometi, aqui está a prova: Você tem Razão!!! rs...

Reli as notas no manual tanto em SET DELETED como em DbDelete(), e é uma advertência exatamente como você entendeu: Alerta que mesmo usando SET DELETED ON, que é para não visualizar registros deletados, o pointer não se moverá automaticamente, mas que o registro deixará de ser visível apenas quando mover o pointer, independente se o arquivo está ou não indexado.

Abaixo um exemplo que prova que você está certo, e eu claro, confundi tudo (também coloquei uma opção para simular no Browse()):
#include "inkey.ch"

REQUEST DBFCDX
REQUEST HB_CODEPAGE_PT850

Function Main()
Local x, aEstr, cDbf := "DBFTESTE.DBF"

Hb_CdpSelect( "PT850" )
RDDSetDefault( "DBFCDX" )

If !File( cDbf )

  aEstr := {;
           {"codigo"   , "C",  5, 0},;
           {"descricao", "C", 30, 0};
           }

  DBCreate( cDbf, aEstr )

  DbUseArea( .T., "DBFCDX", "DBFTESTE.DBF", "DBFTESTE", .F. )  // abre em modo EXCLUSIVO

  For x := 1 To 20
   Append Blank
   Replace codigo With StrZero( RecN(), 5 )
   Replace descricao With "DESCRIÇÃO DO CAMPO => " + codigo
  Next
 
  DbCreateIndex( "DBFTESTE", codigo )
  DbSetIndex( "DBFTESTE" )
 
Else

  DbUseArea( .T., "DBFCDX", "DBFTESTE.DBF", "DBFTESTE", .F. )
  DbSetIndex( "DBFTESTE" )

Endi

Clear Screen

//SET DELETED OFF
SET DELETED ON

While LastKey() != K_ESC .And. !EOF()

  @ 2,2 Say "Pressione DEL para deletar um registro"
  @ 3,2 Say "Presione Seta Acima ou Seta Abaixo para Navegar"
  @ 5,2 Say "Result de RecN() => " + Hb_NToS( RecN() ) + " "
  @ 6,2 Say "Registro Corrente => " + codigo + "-" + descricao
 
  Inkey(0)
 
  If LastKey() = K_UP
   Skip -1
  ElseIf LastKey() = K_DOWN
   Skip
  ElseIf LastKey() = K_DEL .And. !Deleted()
   DbDelete()
  ElseIf LastKey() = K_DEL
   DbRecall()
  EndIf
 
  If Deleted()
   @ 8,2 Say "=> Registro Deletado"
  Else
   @ 8,2 Say "=> Registro Válido  "
  EndIf
 
  @ 10,2 Say "Ordem do índice   => " + Hb_NToS( IndexOrd() )
  @ 11,2 Say "Registro Corrente => " + codigo + "-" + descricao
 
  //DbCommit()
  //Browse()
 
EndDo

Return Nil

Alexandre, bom Domingo, e se espirrar: Saúde!
:-Y
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor lugab » 08 Nov 2018 09:21

Obrigado, Mestres
:D
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Exclusão sequenciada de arquivo indexado

Mensagempor alxsts » 04 Dez 2018 18:57

Olá!
Jairo Maia escreveu:Alexandre, bom Domingo, e se espirrar: Saúde!

Obrigado Jairo (kkk)!

Estive fora por 31 dias, devido a problemas com acesso a internet.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro