Apagar Registro do DBF

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

JuniorVaz
Usuário Nível 3
Usuário Nível 3
Mensagens: 100
Registrado em: 16 Jul 2004 15:49

Apagar Registro do DBF

Mensagem por JuniorVaz »

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
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem por janio »

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:

Código: Selecionar todos

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
JuniorVaz
Usuário Nível 3
Usuário Nível 3
Mensagens: 100
Registrado em: 16 Jul 2004 15:49

Deu certo

Mensagem por JuniorVaz »

Brigadaum ae Janio, era isto mesmo que voce citou, funcionou perfeito....
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

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:

Código: Selecionar todos

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
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

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.
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

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?...
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

- 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.
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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 :?)
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

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 do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

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 do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Apagar Registro do DBF

Mensagem por clodoaldomonteiro »

Boas,

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

Uso a seguinte rotina:

Código: Selecionar todos

      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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apagar Registro do DBF

Mensagem por JoséQuintas »

Também aproveitando a deixa.... rs

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

Código: Selecionar todos

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.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/
Responder