PDA

Visualizza versione completa : Cancellazione discriminata dati da dbf


Fat George
03-07-2004, 16.16.02
:crying: Sono passati talmente tanti anni che non mi ricordo piu' bene, e allora chiedo aiuto.

Database pippo.dbf

Al suo interno una parte di records vanno cancellati perche obsoleti.

La struttura prevede un campo data cioe' field D grandezza 8

programmo (clipper) cosi':

set date italian
use pippo
delete all for data < ctod("01/05/04")
pack
close databases

puo' essere? c'e' qualcuno tanto "vecchio" :D da aiutarmi?

Grassie

P8257 WebMaster
03-07-2004, 16.20.53
Ora sono sotto Xp Pro ed ho difficoltà a tirare su il TSR delle vecchie Norton Guides di Ca-Clipper.. ma non mi sembra che il tuo programma possa essere scorretto.. al limite, se non ti fidi della sintassi della "query" puoi farti una function che prelevi tutti i record dal database e poi li cancelli uno per uno controllandoli come fai tu con la "CTOD"...

Ti suggerirei di provare il programma, al limite se hai problemi posso darti una mano in settimana.

Bye :cool:

P8257 WebMaster
03-07-2004, 16.23.52
Ah se non ricordo male, la sintassi di "USE", prevedeva il NEW....

USE database NEW

Sempre se non ricordo male, in questo modo sei sicuro di lavorare su una nuova area di memoria.

Bye :cool:

Fat George
03-07-2004, 16.31.53
:D ma allora sei vecchissimo anche tu P8257. In effetti non ci avevo pensato alla funzione... mumble mumble saranno 50.000 record, speriamo non vada in overflow. Vabbe' casomai ci si rivede per aggiornamenti. stasera a casa guardo se mi e' rimasto qualche manuale
Eppure ci si faceva le notti su cose cosi' . Bei tempi...

Ciao

P8257 WebMaster
03-07-2004, 16.42.19
Sono un nostalgico pure io .. ;)
pensa che avevo fatto un programma meglio del DBU .. :p....

Comunque tranquillo, non dovrebbe andare in overflow, non è un linguaggio lentissimo, in più la DELETE come ricordi, non cancella effettivamente i record, li segna solo come eliminati, quindi non dovrebbe metterci molto, nel ciclo di scansione del db. fai attenzione al record "fantasma"... alla fine fai un bel PACK (come hai fatto) ed è tutto ok...

Bye :cool:

Fat George
05-07-2004, 15.43.50
mah, non ci sto capendo niente il comando delete all for sembra non funzionare (ma sbaglio io sicuramente) con le date.

Faccio un breve riassunto:

Database pippo.dbf i campi sono:

DATA formato D caratteri 8
TIPO formato C caratteri 3 al suo interno o NOT o JIN
altri campi

ora io da quello che mi ricordo il comando delete all for dice prorpio di cancellate tutti i record di un database se corrispondono a un dato di confronto.

Imposto quanto segue

clear
store ctod(" - - ") to rifgiorno
@10,10 say"Fino a che giorno vuoi cancellare " get rifgiorno
read
use pippo
delete all for DATA <= rifgiorno
pack
close databases
quit

Ebbene NON FUNZIONA

se metto invece

delete all for TIPO = "NOT"

Funziona e cancella tutti i records che contengono la scritta NOT

Quindi qualcosa non va sulle date ... ma cosa? :wall: :wall:

P8257 WebMaster
05-07-2004, 16.09.27
Guarda, a me funziona .. l'ho risolto in questo modo .. vedi se può andarti bene ..

NOTA: per prova ho usato un database chiamato Prova con due campi, uno carattere e uno data, il campo data l'ho chiamato DATA1, se vuoi utilizzare il codice devi naturalmente cambiare i nomi dei campi e del db (lo dico solo per chiarezza).


FUNCTION main()
LOCAL GetList := {}
LOCAL dDate := SPACE(10)
SET DATE ITALIAN
@10,10 SAY "Inserire la data (dd-mm-aaaa): " GET dDate
READ
DeleteByDate(CTOD(dDate))
RETURN nil


// DeleteByDate - Cancella selettivamente i record secondo la data indicata
FUNCTION DeleteByDate(ByDate)
USE prova NEW

DO WHILE RECNO() != (LASTREC()+1)
IF prova -> DATA1 == ByDate
DELETE
ENDIF
DBSKIP()
ENDDO
PACK
CLOSE DATABASES
RETURN nil



L'ho testato e mi sembra funzionare, fammi sapere...

Bye :cool:

P8257 WebMaster
05-07-2004, 16.28.32
Aggiungo:
se vuoi seguire il mio metodo e vuoi cancellare i record prima di una certa data, basta che controlli "manualmente" se la data è minore di quella indicata.. puoi farlo in due modi:

- Spezzandola in 3 tronconi e controllando con "if" innestati la validità del fatto che sia <= alla data limite
- Utilizzandola come data e ricorrendo agli appositi operatori.

Poi passi tutto alla DeleteByDate oppure implementi direttamente in essa i controlli di cui sopra.

Bye :cool: