Clipper On Line • Ver Tópico - Apagar Registro do DBF
Mudar para estilo Clássico
Discussão sobre a linguagem CA-Clipper.
Postar uma resposta

Apagar Registro do DBF

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

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:

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


Um abraço,

Janio

Deu certo

08 Fev 2005 18:55

Brigadaum ae Janio, era isto mesmo que voce citou, funcionou perfeito....

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:

Código:
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

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

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?...

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?

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.

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 :?)

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á...

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 :?)

Apagar Registro do DBF

06 Jul 2018 09:44

Boas,

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

Uso a seguinte rotina:
Código:
      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.

Apagar Registro do DBF

07 Jul 2018 09:00

Também aproveitando a deixa.... rs

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

Código:
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.
Postar uma resposta