Clipper On Line • Ver Tópico - Valor do SET DELETED

Valor do SET DELETED

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Valor do SET DELETED

Mensagempor ClickOk » 23 Fev 2017 17:55

Oi amigos

Preciso criar uma função, que efetua buscas mesmo em registros deletados. Até aí eu sei que tenho que usar

SET DELETED OFF


Mas eu gostaria de criar uma função sem efeitos colaterais, isto é, não sei o sistema que vai usá-la estará com SET DELETED OFF ou ON, então eu gostaria de algo assim:

function FazAlgumaCoisa()
  bEstadoAntigo := dbsetdeleted() // guarda o status
  SET DELETED OFF
// (codigo da função aqui)
//
//
dbsetdeleted(bEstadoAntigo ) // retorna o status antigo
return


Bem, não achei a versão funcional do SET DELETED (que aqui sugeri como dbsetdeleted)... então pergunto aos amigos se existe, se é possível, etc...

Abraços!
Fábio Alves
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
ClickOk
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 12 Jan 2017 20:29
Cidade/Estado: Brasilia/DF
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Valor do SET DELETED

Mensagempor alxsts » 24 Fev 2017 11:46

Olá!

Veja se este exemplo de código atende tua necessidade:

#include "set.ch"

FUNCTION Main()
   
   FazAlgmaCoisa()

RETURN NIL
//-----------------------------------------

FUNCTION FazAlgmaCoisa()

   LOCAL lSetDeleted := Set( _SET_DELETED, .F. )   // guarda o status
   LOCAL lRet

   //
   //   Procedimentos
   //

   Set( _SET_DELETED, lSetDeleted )   // retorna o status antigo

RETURN lRet
//-----------------------------------------
[]´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

Valor do SET DELETED

Mensagempor Kapiaba » 24 Fev 2017 11:57

https://vivaclipper.wordpress.com/tag/set-deleted/

https://harbour.github.io/ng/c53g01c/nge3d1f.html

http://www.fabriciobreve.com/trabalhos/clipper.pdf

REQUEST DBFCDX 

FUNCTION MAIN()

LOCAL nWRK1,nWRK2,cDBF1,cDBF2,cDBFDIR,cFILE1,cFILE2
LOCAL nRECCOUNT

RddSetDefault("DBFCDX")
CLS

?
? "Testing the APPEND FROM ... Command"
? " with SET DELETED ON and OFF. "
?

nWRK1 := 1
nWRK2 := 2

cDBFDIR := "\WHO\DBF\"      // WHEREEVER YOU WISH THE DBF'S TO BE PLACED
cDBF1 := "CRAP1"
cDBF2 := "CRAP2"

cFILE1 := cDBFDIR + cDBF1 + ".DBF"
cFILE2 := cDBFDIR + cDBF2 + ".DBF"

FERASE(cFILE1) // ERASE TEMPORARY DATABASE
FERASE(cFILE2) // ditto

IF FILE(cFILE1) .OR. FILE(cFILE2)
   ALERT("Error in Deleting Temporary DBFs. Quit Now.")
   RETURN NIL
ENDIF

// DEFINE DBF STRUCTURE IN AN ARRAY

aDBFARY := ;
   { ;
      {"SURNAME","C",16,0}, ;
      {"FNAME","C",12,0} ;
   }

DBCreate(cFILE1,aDBFARY,"DBFCDX",.F.)

DBCREATE(cFILE2,aDBFARY,"DBFCDX",.F.)

IF .NOT. (FILE(cFILE1) .AND. FILE(cFILE2))
   ALERT("Error in Creating empty Temporary DBFs. Quit Now.")
   CLOSE DATABASES
   CLEANUP(cFILE1,cFILE2)
   RETURN NIL
ENDIF

SELECT (nWRK1)
USE (cFILE1) ALIAS FILE1 EXCLUSIVE
IF NETERR()
   ALERT("Filed to Open File1 Exclusively. Quit Now.")
   CLOSE DATABASES
   CLEANUP(cFILE1,cFILE2)
ENDIF

SELECT (nWRK2)
USE (cFILE2) ALIAS FILE2 EXCLUSIVE
IF NETERR()
   ALERT("Filed to Open File2 Exclusively. Quit Now.")
   CLOSE DATABASES
   CLEANUP(cFILE1,cFILE2)
   RETURN NIL
ENDIF

SELECT FILE1
APPEND BLANK
REPLACE SURNAME WITH "Giordano", FNAME WITH "ENRICO"
APPEND BLANK
REPLACE SURNAME WITH "SMITH", FNAME WITH "MEL"

IF RECCOUNT() <> 2
   ALERT("Error. faulty Record Count = "+STR(RECCOUNT(),2,0))
   CLOSE DATABASES
   CLEANUP(cFILE1,cFILE2)
   RETURN NIL
ENDIF

SET DELETED ON
// NOW MOVE TO AND DELETE THE 'Giordano' Record
GOTO 1
DELETE   // (ITS O.K., ITS OPENED EXCLUSIVELY)
// NOW CONFIRM ONLY ONE ACTIVE UNDELETED RECORD IN THIS FILE
COUNT TO nRECCOUNT
IF nRECCOUNT == 2 // FAILURE: BOTH RECORDS WERE COUNTED
   ALERT("After Deletion, Primary File: "+cFILE1+" still shows TWO
Records.")
   CLOSE DATABASES
   CLEANUP(Cfile1, Cfile2)
   RETURN NIL
ENDIF

SELECT FILE1
USE   // CLOSE IT UP FOR USE BELOW -- WITH 1 DELETED RECORD

SET DELETED OFF

SELECT (nWRK2)
USE (cFILE2) ALIAS FILE2 EXCLUSIVE
APPEND FROM (cFILE1) // which was closed above
GOTO TOP
COUNT TO nRECCOUNT FOR DELETED()

?
? "Number of Deleted Records with SET DELETED OFF =" + STR(nRECCOUNT,2,0)
?
? "     Answer should be 1"
?
?

// NOW SET DELETED ON AND TRY IT.
GOTO TOP
ZAP

SET DELETED ON
APPEND FROM (cFILE1) // which was closed above
GOTO TOP
COUNT TO nRECCOUNT FOR DELETED()

?
? "Number of Deleted Records with SET DELETED ON =" + STR(nRECCOUNT,2,0)
?
? "     Answer should be 0"
?
?
?
? "Press any key : "
??
INKEY(0)
?
CLOSE DATABASES
// AND LEAVE THEM FOR EXAMINATION

RETURN NIL

FUNCTION CLEANUP(cF1,cF2)
FERASE(cF1)
FERASE(cF2)
RETURN NIL



abs
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Valor do SET DELETED

Mensagempor JoséQuintas » 24 Fev 2017 12:24

Apenas acrescentar uma dica:

Uma fonte de referência, relacionada ao que já existia no Clipper e algo mais, dá pra achar na STD.CH

#command SET DELETED <x:ON,OFF,&>      => Set( _SET_DELETED, <(x)> )


O comando SET DELETED ON/OFF é traduzido pra Set( _SET_DELETED, .T. / .F. )

Vendo esse nome de função, só usar.

#include "set.ch"

FUNCTION SuaRotina()

   LOCAL lSetDeleted

   lSetDeleted := Set( _SET_DELETED, .F. )
   SEEK ...
   Set( _SET_DELETED, lSetDeleted )

   RETURN NIL
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: 18007
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Valor do SET DELETED

Mensagempor ClickOk » 24 Fev 2017 18:17

Obrigado a todos. E obrigado por ensinar a ler a STD.CH. Muito útil!
Fábio Alves
"O homem lança os dados, mas do SENHOR procede o resultado" Provérbios 16:33 (paráfrase)
ClickOk
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 13
Data de registro: 12 Jan 2017 20:29
Cidade/Estado: Brasilia/DF
Curtiu: 4 vezes
Mens.Curtidas: 0 vez

Valor do SET DELETED

Mensagempor Eolo » 25 Fev 2017 10:05

Eu uso a cláusula FOR na indexação, com SET DELE sempre em OFF.
Mais prático.
set dele off
use nomes
index on nome to tudo
index on nome to morto for deleted()
index on nome to vivo  for (!deleted())
set index to tudo, morto, vivo

Assumindo que "FULANO" é um nome deletado:

set orde to 1 // tudo
* ficam visíveis todos os registros, deletados ou não
* seek "FULANO" -> found()=.T.

set orde to 2 // morto
* ficam visíveis só os registros deletados
* seek "FULANO" -> found()=.T.

set orde to 3 // vivo
* ficam visíveis só os registros não deletados
* seek "FULANO" -> found()=.F.

Funciona em NTX e CDX.
E, dando um browse no arquivo, aparecem só os nomes abrangidos pelo índice setado.
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 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