Página 1 de 1
Valor do SET DELETED
Enviado: 23 Fev 2017 17:55
por ClickOk
Oi amigos
Preciso criar uma função, que efetua buscas mesmo em registros deletados. Até aí eu sei que tenho que usar
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!
Valor do SET DELETED
Enviado: 24 Fev 2017 11:46
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
//-----------------------------------------
Valor do SET DELETED
Enviado: 24 Fev 2017 11:57
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
Valor do SET DELETED
Enviado: 24 Fev 2017 12:24
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
Valor do SET DELETED
Enviado: 24 Fev 2017 18:17
por ClickOk
Obrigado a todos. E obrigado por ensinar a ler a STD.CH. Muito útil!
Valor do SET DELETED
Enviado: 25 Fev 2017 10:05
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.