voidTArchive_doc::create_tmp_files(boolcreate)//crea i files temporanei (nella directory temp)
{
TFilenametf(_tmp_dir);
tf.add("f1");
_tdoc=newTIsamtempfile(LF_DOC,tf,create);
tf.rtrim(1);tf<<"2";
_trdoc=newTIsamtempfile(LF_RIGHEDOC,tf,create);
tf.rtrim(1);tf<<"3";
_trcf=newTIsamtempfile(LF_CLIFO,tf,create);
tf.rtrim(1);tf<<"4";
_trcfv=newTIsamtempfile(LF_CFVEN,tf,create);
}
voidTArchive_doc::delete_tmp_files(boolremove)//cancella i files temporanei al termine dell'archiviazione
{
if(remove)// Cosi' posso forzare la cancellazione in chiusura
{
_tdoc->set_autodel();
_trdoc->set_autodel();
_trcf->set_autodel();
_trcfv->set_autodel();
}
delete_tdoc;
delete_trdoc;
delete_trcf;
delete_trcfv;
_tdoc=NULL;
_trdoc=NULL;
_trcf=NULL;
_trcfv=NULL;
}
voidTArchive_doc::archivia(constTMask&m)
{
constboolwith_clifor=m.get_bool(F_WITHCLI);
TRelationrel(LF_DOC);//crea una relazione sul file identificato dal numero LF_DOC
m.autosave(rel);//scrive, in base alla rel, i valori del campo con specifica LF_DOC
TRectyperecini(rel.curr());//crea recini di TRectype che costruisce il record corrente del file
TRectyperecfin(rel.curr());//crea recfin di TRectype che costruisce il record corrente del file
recini.put(DOC_NDOC,m.get(F_NUMFR));//setta il contenuto del campo DOC_NDOC con il numero che arriva da m.get (<28> il numero del primo record da leggere)
recfin.put(DOC_NDOC,m.get(F_NUMTO));//come sopra ma per l'ultimo record (questi due numeri gli servono nel cursore)
_unit=m.get(F_DRIVE)[0];//legge solo i drive dei floppy e quelli locali
_path=m.get(F_PATH);//path di destinazione del file da creare (se non floppy)
_desc=m.get(F_DESCRFILE);//descrizione nel file .ini
TStringfilter;//crea l'ogetto filter da TString
TCursorcur(&rel,filter,1,&recini,&recfin);//crea un cursore (cur) basato sulla relazione rel, il filtro filter, da recini a recfin
constlongtotal=cur.items();//mette in total il numero totale di record
if(total>0)//se c'<27> almeno un record...
{
TStringmsg="Confermare l'invio di ";//istanza della TString (compare una box con la richiesta di conferma)
msg.add_plural(total,"documento");//cerca il plurale della stringa "documento" se total <20>>1
if(yesno_box(msg))//se si conferma l'archiviazione (OK nella box)...
{
//chiamo la funzione che crea i file temporanei in modo da creare un
create_tmp_files(TRUE);//file di intestazione ed un file di righe temporanei (N.B. non devo
//creare alcun oggetto perch<63> la funzione <20> un metodo della TArchive_doc
//e quindi l'oggetto <20> gi<67> creato
TProgindpi(total,"Elaborazione in corso...",TRUE,TRUE);//istanza pi di TProgind che fa comparire la finestra di elaborazione in corso
TDocumento*doc=newTDocumento;//doc <20> un puntatore ad una istanza di TDocumento
rel.lfile().set_curr(doc);//applica set_curr al localisamfile che viene ritornato da rel.lfile()
//set_curr sostituisce il record corrente del file doc
interr=NOERR;
for(cur=0;cur.pos()<total&&!pi.iscancelled()&&err==NOERR;++cur)//for cur che va da 0 alla posizione corrente (che deve essere < del numero totale
//dei record (total) and non essere interrotto e non esserci errore
{
err=_tdoc->write(doc->head());//scrive l'intestazione sul file temp delle testate
if(with_clifor)
{
TStringkey(doc->get(DOC_TIPOCF));
key<<"|"<<doc->get(DOC_CODCF);
TRectypeclifor(cache().get(LF_CLIFO,key));
TRectypecfven(cache().get(LF_CFVEN,key));
if(!clifor.empty())
clifor.write(*_trcf);
if(!cfven.empty())
cfven.write(*_trcfv);
}
if(err!=NOERR)//se invece c'<27> un errore..
{
error_box("Errore %d durante la copia dell'intestazione",err);
break;
}
for(intr=1;r<=doc->physical_rows()&&err==NOERR;r++)//scrive le righe sul file temp delle
{//righe;
err=_trdoc->write((*doc)[r]);//scrive le righe sul file
if(err!=NOERR)
{
error_box("Errore %d durante la copia delle righe",err);
break;
}
}
pi.addstatus(1L);//mette la barra di work in progress
}
delete_tmp_files(false);//chiude i files temp in modo da risparmiare memoria
constchar*dir=_tmp_dir;//fa puntare dir alla directory temp
if(!yesnocancel_box(FR("Il file %s da ripristinare non <20> compatibile con lo stesso file\n nell'installazione andrebbe rigenerato"),src.description()))