Valor do SET DELETED

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

ClickOk
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 12 Jan 2017 21:29
Localização: Brasilia/DF

Valor do SET DELETED

Mensagem por ClickOk »

Oi amigos

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

Código: Selecionar todos

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:

Código: Selecionar todos

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)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Valor do SET DELETED

Mensagem por alxsts »

Olá!

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

Código: Selecionar todos

#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)
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Valor do SET DELETED

Mensagem por Kapiaba »

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

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

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

Código: Selecionar todos

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

Valor do SET DELETED

Mensagem por JoséQuintas »

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

Código: Selecionar todos

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

Código: Selecionar todos

#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 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/
ClickOk
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 12 Jan 2017 21:29
Localização: Brasilia/DF

Valor do SET DELETED

Mensagem por ClickOk »

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)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Valor do SET DELETED

Mensagem por Eolo »

Eu uso a cláusula FOR na indexação, com SET DELE sempre em OFF.
Mais prático.

Código: Selecionar todos

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