Clipper On Line • Ver Tópico - Apagar Registro do DBF

Apagar Registro do DBF

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Apagar Registro do DBF

Mensagempor JuniorVaz » 07 Fev 2005 20:19

Ola, gostaria de uma dica para apagar um certo dado do meu DBF aki, fiz o seguinte codigo:

sele nf
seek xnumnf
rlock()
deleTE
PACK
commit
unlock


mas da erro dizendo: Exclusive Required, queria saber como processodo pra conseguir apagar o registro... VLW
JuniorVaz
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 99
Data de registro: 16 Jul 2004 15:49
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor janio » 07 Fev 2005 21:45

Olá JuniorVaz,

Em um ambiente de rede local, o comando PACK é inutilizável... a não ser... que o DBF seja aberto em modo EXCLUSIVE. Para isso, seu código deveria ficar assim:

SELECT 1
USE SEUDBF EXCLUSIVE
IF NETERR()
   ALERT("ARQUIVO EM USO")
ELSE
   SEEK xnumnf
   DELETE
   PACK
   commit
ENDIF


Um abraço,

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar de usuário

janio
Colaborador

Colaborador
 
Mensagens: 1687
Data de registro: 06 Jul 2004 07:43
Cidade/Estado: UBAJARA - CE
Curtiu: 7 vezes
Mens.Curtidas: 38 vezes

Deu certo

Mensagempor JuniorVaz » 08 Fev 2005 18:55

Brigadaum ae Janio, era isto mesmo que voce citou, funcionou perfeito....
JuniorVaz
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 99
Data de registro: 16 Jul 2004 15:49
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Glauco Cruz Costa » 28 Dez 2005 20:30

janio escreveu:Olá JuniorVaz,

Em um ambiente de rede local, o comando PACK é inutilizável... a não ser... que o DBF seja aberto em modo EXCLUSIVE. Para isso, seu código deveria ficar assim:

SELECT 1
USE SEUDBF EXCLUSIVE
IF NETERR()
   ALERT("ARQUIVO EM USO")
ELSE
   SEEK xnumnf
   DELETE
   PACK
   commit
ENDIF


Um abraço,

Janio


OLÁ. ESTOU ME INTROMETENDO. MAS, FAZ PARTE DO MESMO TÓPICO.
ESTOU COM UM PROBLEMA.
COMO EU PODERIA USAR AO MESMO TEMPO UM DBF, ABRINDO-O SHARED PARA INCLUIR, PESQUISAR, IMPRIMIR...; E EXCLUSIVE PARA EXCLUIR.
EU JÁ TENTEI ASSIM:
SELECT 1
USE RETORNO SHARED NEW
SELECT 2
USE RETORNO EXCLUSIVE NEW
MAS, NÃO ADIANTOU.
HÁ OUTRO JEITO? OBRIGADO
Avatar de usuário

Glauco Cruz Costa
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 103
Data de registro: 15 Dez 2005 21:02
Cidade/Estado: Brasília/DF
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Stanis Luksys » 28 Dez 2005 20:36

Olá,

Use o mesmo arquivo no modo shared e da só um dbDelete() para marcar como deletado e use o SET DELETED ON para não processar os deletados... Depois crie uma rotina (que pode ser executada diariamente ou semanalmente, dependendo da necessidade) apenas para dar um PACK geral e compactar os arquivos. Essa rotina sim deve ser no EXCLUSIVE.

Eu pelo menos faço assim...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar de usuário

Stanis Luksys
Colaborador

Colaborador
 
Mensagens: 1331
Data de registro: 18 Jun 2005 03:04
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Mensagempor Glauco Cruz Costa » 28 Dez 2005 20:50

Stanis Luksys escreveu:Olá,

Use o mesmo arquivo no modo shared e da só um dbDelete() para marcar como deletado e use o SET DELETED ON para não processar os deletados... Depois crie uma rotina (que pode ser executada diariamente ou semanalmente, dependendo da necessidade) apenas para dar um PACK geral e compactar os arquivos. Essa rotina sim deve ser no EXCLUSIVE.

Eu pelo menos faço assim...


Obrigado, mas...
Agumas perguntas.
Precisa ser o dbdelete()?
Pode ser o delete normal?
E o que eu marquei com delete fica considerado dias como marcado pelo programa. Como é isso?...
Avatar de usuário

Glauco Cruz Costa
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 103
Data de registro: 15 Dez 2005 21:02
Cidade/Estado: Brasília/DF
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor Stanis Luksys » 28 Dez 2005 21:09

- Precisa ser o dbdelete()? Pode ser o delete normal?

Mesma coisa, mas aconselho usar o dbDelete() por que pode ser util dentro de um code block e tal... É bom se acostumar acho...


- E o que eu marquei com delete fica considerado dias como marcado pelo programa. Como é isso?...

Pode ficar meses e anos até, se você usar o SET DELETED ON no inicio do programa principal, o sistema não processará estes registros. É útil porque você pode até criar algo como uma "lixeira" no seu sistema, onde o usuário pode recuperar registros excluídos... Este registors são processados apenas em comando especiais como o de indexação por exemplo e é justamente por isso que é bom dar um pack de vez em qdo.

Deu pra enteder?
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar de usuário

Stanis Luksys
Colaborador

Colaborador
 
Mensagens: 1331
Data de registro: 18 Jun 2005 03:04
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Mensagempor Glauco Cruz Costa » 28 Dez 2005 21:12

Stanis Luksys escreveu:- Precisa ser o dbdelete()? Pode ser o delete normal?

Mesma coisa, mas aconselho usar o dbDelete() por que pode ser util dentro de um code block e tal... É bom se acostumar acho...

- E o que eu marquei com delete fica considerado dias como marcado pelo programa. Como é isso?...

Pode ficar meses e anos até, se você usar o SET DELETED ON no inicio do programa principal, o sistema não processará estes registros. É útil porque você pode até criar algo como uma "lixeira" no seu sistema, onde o usuário pode recuperar registros excluídos... Este registors são processados apenas em comando especiais como o de indexação por exemplo e é justamente por isso que é bom dar um pack de vez em qdo.

Deu pra enteder?


OBRIGADÃO.
Avatar de usuário

Glauco Cruz Costa
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 103
Data de registro: 15 Dez 2005 21:02
Cidade/Estado: Brasília/DF
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Mensagempor rochinha » 28 Dez 2005 23:00

Amiguinho

Aproveitando a deixa.

Voce pode abrir o mesmo .DBF varias vezes, bastando para isto utilizar o parametro ALIAS, exemplo:

USE clientes NEW SHARED
USE clientes NEW SHARED ALIAS teste
USE clientes NEW SHARED ALIAS outro
...
SELECT clientes
browse()
SELECT teste
browse()
SELECT outro
browse()

Outro exemplo:

USE clientes NEW SHARED
USE clientes NEW SHARED ALIAS DeSP
SET FILTER TO clientes->estado="SP"
GO TOP
USE clientes NEW SHARED ALIAS DeRJ
SET FILTER TO clientes->estado="RJ"
GO TOP
...
SELECT clientes
browse()
SELECT DeSP
browse()
SELECT DeRJ
browse()

Veja que usei o parametro NEW pois o Clipper assume a proxima área vazia para abrir o .DBF e não é necessário especificar numeros e voce pode selecionar pelo proprio nome ou alias do arquivo.

USE clientes NEW SHARED
USE fornec NEW SHARED
...
SELECT clientes
SELECT fornec

Fica mais visivel até para voce saber que área esta aberta ou sendo selecionada.

@braços :?)
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4100
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 436 vezes
Mens.Curtidas: 171 vezes

Mensagempor Stanis Luksys » 28 Dez 2005 23:42

Prezado Rochinha,

Pode ser que eu tenha então falado bobagem, mas você saberia me dizer se é possível abrir o mesmo arquivo no modo SHARED e em outra área como EXCLUSIVE...

Eu nunca tentei , mas foi isso que eu falei que acho que não dá...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar de usuário

Stanis Luksys
Colaborador

Colaborador
 
Mensagens: 1331
Data de registro: 18 Jun 2005 03:04
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Mensagempor rochinha » 30 Dez 2005 06:03

Amiguinho

Quando idealizei o tópico anterior eu iria complementar dizendo que a abertura de um mesmo .DBF em áreas diferentes e modos diferentes é impossivel pelo mesmo aplicativo.

Ou seja numa mesma rotina, voce não consegue abrir o mesmo .DBF em modos exclusivos e compartilhados ao mesmo tempo nem mesmo usando alias.

@braços :?)
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4100
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 436 vezes
Mens.Curtidas: 171 vezes

Apagar Registro do DBF

Mensagempor clodoaldomonteiro » 06 Jul 2018 09:44

Boas,

Só uma dica para este tópico, depois de muito tempo.

Uso a seguinte rotina:
      Try
         PACK
      Catch
      End

Pois acho que assim, uma hora pode acontecer de que a tabela esteja livre para ser aberta em modo Shared e seja executado o comando Pack.
Avatar de usuário

clodoaldomonteiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 578
Data de registro: 30 Dez 2006 12:17
Cidade/Estado: Teresina-PI
Curtiu: 19 vezes
Mens.Curtidas: 8 vezes

Apagar Registro do DBF

Mensagempor JoséQuintas » 07 Jul 2018 09:00

Também aproveitando a deixa.... rs

Sugestão: Crie suas próprias funções de rede/bloqueio, exemplo:

RecLock()
DELETE
RecUnlock()
...

FUNCTION RecLock()

DO WHILE ! RLock()
   Inkey(0.5)
ENDDO
RETURN NIL

FUNCTION RecUnlock()

SKIP 0
UNLOCK
RETURN NIL


É que vai acabar querendo colocar tentativas de bloqueio, e comandos adicionais no desbloqueio, e assim já ajusta num lugar só.
Quanto ao PACK, deve ser eventual e não a cada exclusão. Imagine um pack demorado... vai ser problema.
Nada de usar COMMIT nisso, não tem nada a ver.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 9670
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 593 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Bing [Bot] e 4 visitantes


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro