Newsgroup: it.comp.lang.vo-clipper
Titolo: [CL] Riutilizzo records cancellati in Clipper

Ciao,
So che esistono diverse tecniche che consentono
di riutilizzare i records marcati per la cancellazione
(e quindi di evitare il Pack delle tabelle) e mi
interesserebbe sapere se qualcuno le ha adottate
e sperimentate.
Quelle che conosco sono le seguenti :
1 ) Aggiungere una condizione agli indici  dopo il FOR  
     Index on fileindice to stringa FOR .not. deleted()
    in questo modo Clipper dovrebbe aggiungere solo
    solo le chiavi di records non cancellati.
    Quando viene fatto un delete la chiave dovrebbe 
    essere rimossa dall'indice e viene aggiunta quando 
    si fa un Recall.
2) Usare un indice apposito tipo :
     Index on fileindice to stringa FOR deleted()
     Questo consente avere una lista dei soli records 
     cancellati e riutilizzarli quando serve.
3 ) Aggiungere all'inizio della stringa di definizione dell'indice
 
     iif(deleted(),chr(255),chr(32))+stringaindice
 
    Questo consente di tenere i records cancellati
    in fondo all'archivio ma costringe ad aggiungere
    un black all'inizio della chiave.
4 ) Sfruttare un indice esistente
     ad esempio con una chiave che inizia con numero bolla
     si potrebbe ad momento della cancellazione azzerare
     il campo e poi eseguire il delete
     Quando si aggiungono nuovi records si potrebbe fare 
     una cosa cosi':
     Set deleted off
     Seek str(0,lencampo)
     if found()
        recall
     else
        append
     end
     Set deleted on
C'e' qualche altro sistema ? 
e soprattutto qualcuno le ha sperimentate ?
Ciao,
Eugenio.
-


Io ho sempre usato questo metodo e mi sono trovato benissimo.
Vantaggio - Il recordo viene eliminato e non è più possibile recuperare il
contenuto dello stesso (ogni campo viene azzerato). Ottimo per motivi di
segretezza.
Svantaggio - Un deleted per errore si paga caro.

>      Set deleted on
Il rischio per quanto limitato forse rimane, 
si ottiene pero' il vantaggio di evitare il pack di tabelle 
a volte molto grosse ed un sicuro miglioramento 
delle performance nella aggiunta di records
(quando ne esistono di riutilizzabili) .
Ciao,
Eugenio.

      Set deleted on
Anche io ho sempre utilizzato questo metodo. La cosa simpatica e che quando
cancello il record ne blanko tutti i campi, cosicché per trovare un record
da reciclare basta fare in tutti i casi la go top
function recupera()
Local retval:=.f.,olddel:=Set(_SET_DELETED)
set(_SET_DELETED,.f.)
go top
if deleted()
   if RecLock()
      recall
      retval:=.t.
   endif
else
   if AddRec()
      retval:=.t.
   endif
endif
set(_SET_DELETED,olddel)
return retval
Function DelRec
if reclock()
   recclear() * riempie ogni campo del record di blank (spazi, 0, .f., ...)
   delete
   return .t.
else
   return .f.
endif

   recclear() 
forse rallenta un po'  l'operazione di cancellazione...
Io preferisco un intervento mirato ad azzerare il primo campo 
chiave anche se poi devo scrivere un po' di piu' e stare piu'
attento...
Ciao,
Eugenio
-

Scusate ma le problematiche relative all'utilizzo in rete di un programma?
Dove sono le istruzioni dbrlock(), DBRUNLOCK(), DBCOMMIT() , etc.
E la semaforazzazione?
Io sono del parere che č meglio non sovrascrivere i record cancellati.
Piuttosto se l'installazione lo permette creare delle procedure notturne in
cui
rifare il PACK, e Gli indicii, ma solo se le performance dovessero proprio
degenerare per la presenza appunto di troppi records cancellati.

     Index on fileindice to stringa FOR .not. deleted()
va cosi' :
      Index on stringa to fileindice FOR .not. deleted()
Eugenio.
-