Ristrutturazione classi

git-svn-id: svn://10.65.10.50/trunk@6058 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
augusto 1998-01-28 16:46:36 +00:00
parent 3d21d05e6d
commit 7cb0311413
5 changed files with 334 additions and 292 deletions

View File

@ -15,7 +15,7 @@ int main(int argc,char **argv)
case 0:
ab2100(argc,argv); break; //Trasferimento e Ricezione
// case 1:
// ab2200(argc,argv); break;
// ab2200(argc,argv); break; //Scarico archivi
default:
error_box(usage, argv[0]) ;
}

View File

@ -8,48 +8,30 @@
#include "caradd.h"
#include "colldich.h"
bool TRiceTras::create()
{
_files.add(new TLocalisamfile(LF_CARADD),1);
_files.add(new TLocalisamfile(LF_COLLDICH),2);
dispatch_e_menu(BAR_ITEM(1)); //Simula la scelta di una voce di menu
return TRUE;
}
TFile_text* TRiceTras::set_config_name(TString &config, const TMask &msk, const TFilename &percorso)
/* ********************************************************************************************************* */
/* TTrasfer */
/*********************************************************************************************************** */
TObject_reception *TRicezione::set_transfer(int tipo_ricezione ,const TFilename & percorso, const TString & config_name)
{
if (_trasfile != NULL)
delete _trasfile;
_trasfile=NULL;
int tipo_ricezione = msk.get_int(F_TIPO_RICE);
if (_rice != NULL)
delete _rice;
switch (tipo_ricezione)
{
case 1: // RICEZIONE INTERNA: WINDOWS
config="ab2100a.ini"; /*DA CAMBIARE*/
case RICEZIONE_INTERNA:
_rice = new TObject_reception(percorso);
break;
case 2: //RICEZIONE ESTERNA: AS400
config="ab2100a.ini";
case RICEZIONE_AS400:
_rice = new TRicezione_AS400(percorso);
break;
case 3://RICEZIONE ESTERNA: USER DEFINED
config=msk.get(F_PERCORSO_UTENTE);
case RICEZIONE_USER_DEFINED:
_rice = new TRicezione_userdef(config_name,percorso);
break;
default:
config.cut(0);
break;
}
if (config.not_empty())
_trasfile = new TABfile_text(percorso, config); //Leggo il file di configurazione
return _trasfile;
return _rice;
}
bool TRiceTras::destroy() //Distruttore
{
return TRUE;
}
int ab2100(int argc, char **argv)
{
char *rt = argv[2]+1; //Leggo se è richiesta la ricezine (r/R) o il trasferimento (t/T)

View File

@ -78,7 +78,7 @@
//Costanti tipi di ricesione
#define RICEZIONE_INTERNA 1
#define RICEZIONE_AS400 2
#define RICESIONE_USER_DEFINED 3
#define RICEZIONE_USER_DEFINED 3
//Definizione dei flag
#define FLAG_COGE '1'
@ -109,9 +109,6 @@
#define AB_MOV 10
class TAlbero_record : public TAssoc_array
{
static TToken_string wrk_string;
@ -124,69 +121,129 @@ public:
virtual ~TAlbero_record(){}
};
class TFile_text_AS400: public TFile_text
{
TString16 _tipo_bilancio;
TAssoc_array _last_id;
// static long _idcaradd;
long _idncomp;
//long _idcoldich;
TString _codvc_prec;
//classe derivata nella quale viene gestita la funzione di trasferimento
class TRiceTras: public TApplication
{
private:
TArray _files;
protected:
TFile_text* _trasfile; //File di testo
protected:
virtual bool menu(MENU_TAG) pure; //Gli dico che non è implementata in questa classe, ma obbligatoriamente in un'altra
//Seleziona da quale file prelevare le informazioni del tracciato record
// void set_config_name(TString&,TMask&);
TFile_text* set_config_name(TString&,const TMask&, const TFilename&);
//Controlla che il percorso e il file specificati esistono
static bool inseriscipercorso(TMask_field& f, KEY k);
inline const TString & get_tipo_bil() const {return _tipo_bilancio;}
protected:
// virtual void preformat_field(TRelation& rel,const TFieldref&field,const TRecord_text& rec,TString &str);
virtual void preformat_field(const TFieldref&field,TString &str,TRelation& rel,const TString &tipo_tr);
void cambia_anno(TString& str);
void cambia_data(TString& str);
virtual bool pre_writerel(TRelation& rel,const TRecord_text& rec);
void scrivi_temp_link(TRelation& rel,const TRecord_text& rec);
void aggiorna_rel_link(TLocalisamfile &relvoc);
public:
void set_tipo_bilancio(const TString & tipo_bil) {_tipo_bilancio = tipo_bil;}
TRiceTras() {}
virtual ~TRiceTras() {}
};
class TRicezione:public TRiceTras
{
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG);
virtual void set_tipo_bil(const TString&) {;}
virtual void ricevi(TMask &) ;
public:
TRicezione() {}
virtual ~TRicezione() {}
TFile_text_AS400(const char* file_name, const char* set_config_name);
virtual ~TFile_text_AS400() {}
};
//Classe derivata per la ricezione
class TRicezione_AS400:public TRicezione
{
TString _tipo_bilancio;
class TObject_reception:public TObject
{
protected:
virtual void leggi_temp_link(TRectype& cur_rec,TToken_string& k);
TFile_text* _trasfile; //File di testo da cui ricevere
public:
TFile_text * trans_file() {return _trasfile;}
virtual void ricevi(TMask &);
TObject_reception() {_trasfile = NULL;}
TObject_reception(const TFilename &percorso) ;
virtual ~TObject_reception() {}
};
//Classe derivata per la ricezione
class TRicezione_AS400 : public TObject_reception
{
private:
virtual void build_balancetree(int);
virtual void build_ana_tree(long&, TRectype&, TRectype*, TRectype*, TAssoc_array&);
virtual void build_relana(TString&, const TMask&, const TFilename&);
void build_balancetree(int);
void build_ana_tree(long&, TRectype&, TRectype*, TRectype*, TAssoc_array&);
void build_relana(TString&, const TMask&, const TFilename&);
void naviga_array(TAlbero_record &a);
void scrivi_array(TAssoc_array &s_rec, int);
protected:
virtual void set_tipo_bil(const TString&);
const TString & get_tipo_bil() const {return _tipo_bilancio;}
virtual void ricevi(TMask &);
//Questa funzione Š da usare solo in fase di debug
TFile_text_AS400 *trasfile() {return (TFile_text_AS400 *)_trasfile;}
virtual void leggi_temp_link(TRectype& cur_rec,TToken_string& k);
//Questa funzione è da usare solo in fase di debug
//void print_ana_tree(int & level, TRectype&,FILE * stream);
public:
TRicezione_AS400() {}
virtual void ricevi(TMask &);
TRicezione_AS400(const TFilename &percorso);
virtual ~TRicezione_AS400() {}
};
//Classe derivata per il trasferimento
class TTrasferimento_AS400:public TRiceTras
//Classe derivata per la ricezione
class TRicezione_userdef : public TObject_reception
{
public:
//virtual void ricevi(TMask &);
TRicezione_userdef(const TString & config, const TFilename &percorso) ;
virtual ~TRicezione_userdef() {}
};
//classe derivata nella quale viene gestita la funzione di trasferimento
class TTrasfer: public TApplication
{
// private:
// TArray _files;
protected:
// TFile_text* _trasfile; //File di testo
virtual bool menu(MENU_TAG) pure; //Gli dico che non è implementata in questa classe, ma obbligatoriamente in un'altra
//Controlla che il percorso e il file specificati esistono
static bool inseriscipercorso(TMask_field& f, KEY k);
public:
TTrasfer() {}
virtual ~TTrasfer() {}
};
class TRicezione:public TTrasfer
{
private:
TArray _files;
TObject_reception *_rice;
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG);
public:
//Seleziona da quale file prelevare le informazioni del tracciato record
// void set_config_name(TString&,TMask&);
TObject_reception *set_transfer(int tipo_ricezione ,const TFilename & percorso_temp, const TString & config_file_temp);
TObject_reception *transfer() {return _rice;}
TFile_text * trans_file() {return _rice->trans_file();}
TRicezione() {}
virtual ~TRicezione() {}
};
//Classe derivata per il trasferimento
class TInvio_AS400:public TTrasfer
{
TFile_text* _trasfile; //File di testo da cui ricevere
protected:
virtual bool menu(MENU_TAG);
static bool inseriscipercorso(TMask_field& f, KEY k);
@ -198,28 +255,8 @@ class TTrasferimento_AS400:public TRiceTras
bool mov_da_scrivere(TRectype &);
void formatta(TRecord_text&,TRectype&,int&);
public:
TTrasferimento_AS400() {}
virtual ~TTrasferimento_AS400() {}
};
class TFile_text_AS400: public TFile_text
{
TAssoc_array _last_id;
// static long _idcaradd;
long _idncomp;
//long _idcoldich;
TString _codvc_prec;
protected:
// virtual void preformat_field(TRelation& rel,const TFieldref&field,const TRecord_text& rec,TString &str);
virtual void preformat_field(const TFieldref&field,TString &str,TRelation& rel,const TString &tipo_tr);
void cambia_anno(TString& str);
void cambia_data(TString& str);
virtual bool pre_writerel(TRelation& rel,const TRecord_text& rec);
void scrivi_temp_link(TRelation& rel,const TRecord_text& rec);
void aggiorna_rel_link(TLocalisamfile &relvoc);
public:
TFile_text_AS400(const char* file_name, const char* set_config_name);
virtual ~TFile_text_AS400() {}
TInvio_AS400() {}
virtual ~TInvio_AS400() {}
};
// **********************

View File

@ -1,5 +1,4 @@
//AB2101.CPP: Ricezione tabelle
#include <utility.h> //Definizione di fexit
#include "movdett.h" //Contiene le definizioni di costanti relative ai nomi dei campi di LF_MOVDETT
#include "saldi.h" //Contiene le definizioni di costanti relative ai nomi dei campi di LF_SALDI
@ -13,89 +12,40 @@
#include <progind.h>
#include <assoc.h>
#define FLAG_COGE '1'
#define FLAG_DETT '2'
#define FLAG_MOVIMENTO '3' // così i movs sono alla fine
#define FLAG_INDICE "I"
#define FLAG_SOTTOD "S"
#define FLAG_COMPOSTA "C"
#define FLAG_ANALISI "A"
#define FLAG_VOCI "V"
//Definizioni di constanti per il record di testata
#define RECORD_TESTA "1"
#define ABILITATO "X"
#define AB_PIANO_CONTI 2
#define AB_PERIODI_BIL 3
#define AB_ANALISI 4
#define AB_SALDI 8
#define AB_DETT 9
#define AB_MOV 10
TToken_string TAlbero_record ::wrk_string;
/* ********************************************************************************************************* */
/* TFile_text_AS400 */
/*********************************************************************************************************** */
//Costruttore di TABfile_text: lo inizializzo a 0
TABfile_text::TABfile_text(const char* file_name, const char* set_config_name)
: TFile_text(file_name, set_config_name),_idncomp(1)
//Costruttore di TFile_text_AS400: lo inizializzo a 0
TFile_text_AS400::TFile_text_AS400(const char* file_name, const char* config_name)
: TFile_text(file_name, config_name),_idncomp(1),_tipo_bilancio("")
{
}
class TAlbero_record : public TAssoc_array
{
static TToken_string wrk_string;
public:
void dept_first(TToken_string key, TRectype * padre, TRectype * prec, int &curr_id, TString_array & allkeys, TToken_string ** prog_key);
TToken_string& cerca_fratello (TToken_string &key, TString_array& allkeys, TToken_string ** next_key);
TToken_string& cerca_figlio (TToken_string &key, TString_array& allkeys, TToken_string ** next_key);
TAlbero_record() {}
virtual ~TAlbero_record(){}
};
TToken_string TAlbero_record ::wrk_string;
//Classe derivata per la ricezione
class TRicezione:public TRiceTras
{
TString _tipo_bilancio;
protected:
virtual void leggi_temp_link(TRectype& cur_rec,TToken_string& k);
public:
void set_tipo_bil(const TString&);
const TString & get_tipo_bil() const {return _tipo_bilancio;}
virtual bool menu(MENU_TAG);
//Controlla che il percorso e il file specificati esistono
static bool inseriscipercorso(TMask_field& f, KEY k);
//Esegue il ciclo di ricezione
void ricevi(TMask &);
void build_balancetree(int);
void naviga_array(TAlbero_record &a);
void scrivi_array(TAssoc_array &s_rec, int);
void build_relana(TString&, const TMask&, const TFilename&);
void build_ana_tree(long&, TRectype&, TRectype*, TRectype*, TAssoc_array&);
//Questa funzione è da usare solo in fase di debug
//void print_ana_tree(int & level, TRectype&,FILE * stream);
TRicezione() {}
virtual ~TRicezione() {}
};
inline TRicezione& app()
{
return (TRicezione&) main_app();
}
void TABfile_text::cambia_anno(TString& str)
{
if (atoi(str)>0)
void TFile_text_AS400::cambia_anno(TString& str)
{
//Trasformo dal formato aa al formato aaaa solo se la data è nel formato aa:
//se str > 99 allora significa che la data è già in formato aaaa e quindi non deve eseguire nessun cambio
if ((atoi(str)>0) && (atoi(str) < 99))
{
if (str > "50") //Trasformo dal formato aa al formato aaaa
if (str > "50")
str.insert("19");
else
str.insert("20");
}
}
void TABfile_text::cambia_data(TString &str)
void TFile_text_AS400::cambia_data(TString &str)
{
if (atoi(str)>0)
{
@ -114,8 +64,8 @@ void TABfile_text::cambia_data(TString &str)
}
//Questa funzione esegue la conversione dell'anno dal formato aa al formato aaaa
//void TABfile_text::preformat_field(TRelation& rel,const TFieldref&field,const TRecord_text& rec,TString &str)
void TABfile_text::preformat_field(const TFieldref& field, TString &str,TRelation& rel,const TString &tipo_tr)
//void TFile_text_AS400::preformat_field(TRelation& rel,const TFieldref&field,const TRecord_text& rec,TString &str)
void TFile_text_AS400::preformat_field(const TFieldref& field, TString &str,TRelation& rel,const TString &tipo_tr)
{
if (field.file()==LF_MOVDETT)
{//Parte riservata ai MOVIMENTI/DETTAGLI
@ -147,7 +97,7 @@ void TABfile_text::preformat_field(const TFieldref& field, TString &str,TRelatio
}
//Assegno valori temporanei a IDPADRE, IDFIGLIO, IDSUCC, IDPREC
void TABfile_text::scrivi_temp_link(TRelation& rel,const TRecord_text& rec)
void TFile_text_AS400::scrivi_temp_link(TRelation& rel,const TRecord_text& rec)
{
if ((rec.type() == MOVIMENTO3) || (rec.type() == MOVIMENTO4) || (rec.type() == MOVIMENTO5))
{
@ -209,7 +159,7 @@ void TABfile_text::scrivi_temp_link(TRelation& rel,const TRecord_text& rec)
}
void TABfile_text::aggiorna_rel_link(TLocalisamfile &relvoc)
void TFile_text_AS400::aggiorna_rel_link(TLocalisamfile &relvoc)
{
if (relvoc.get_long(ABRL_IDCOMP) > 1)
{ //Ci deve essere un precedente
@ -233,13 +183,16 @@ void TABfile_text::aggiorna_rel_link(TLocalisamfile &relvoc)
}
}
bool TABfile_text::pre_writerel(TRelation& rel,const TRecord_text& rec)
bool TFile_text_AS400::pre_writerel(TRelation& rel,const TRecord_text& rec)
{
int logic_num=rel.lfile().num(); //Carico il numero logico del file che sto utilizzando
if (logic_num==LF_ABSALDI)
{//Parte riservata ai SALDI
rel.lfile().put(ABMD_TIPOBIL,app().get_tipo_bil());
{//Parte riservata ai SALDI: modifico (immetto) il tipo di bilancio con il valore passato da maschera
//solo se questo campo è vuoto, nel caso contratio lascio il valore letto
TString prova = rel.lfile().get(ABMD_TIPOBIL);
if ( rel.lfile().get(ABMD_TIPOBIL) == "" )
rel.lfile().put(ABMD_TIPOBIL,get_tipo_bil());
return TRUE;
}//Fine parte riservata ai SALDI
@ -283,20 +236,20 @@ bool TABfile_text::pre_writerel(TRelation& rel,const TRecord_text& rec)
{//E' un COGE e quindi inserisco anche il Coddett
rel.lfile().put(ABMD_TIPODETT,"CG");
rel.lfile().put(ABMD_CODDETT,rec.get(CONTO_COGE_MOVDETT));
rel.lfile().put(ABMD_TIPOBIL,app().get_tipo_bil());
rel.lfile().put(ABMD_TIPOBIL,get_tipo_bil());
}
else
{//In questo caso inserisco Coddett = 0 per azzerare eventuali altri valori
//già scritti precedentemente
rel.lfile().put(ABMD_TIPODETT,"DT");
rel.lfile().put(ABMD_CODDETT,0);
rel.lfile().put(ABMD_TIPOBIL,app().get_tipo_bil());
rel.lfile().put(ABMD_TIPOBIL,get_tipo_bil());
}
}
else
{//Può essere solo un "movimento" perchè il tipo record è MOVI1 o MOVI2
rel.lfile().put(ABMD_TIPODETT,"MO");
rel.lfile().put(ABMD_TIPOBIL,app().get_tipo_bil());
rel.lfile().put(ABMD_TIPOBIL,get_tipo_bil());
rel.lfile().put(ABMD_CODDETT,0); //Azzero il contenuto del campo da valori precedenti
real r(rec.get(CONTO_COGE_MOVDETT)); //Eseguo una conversione per un controllo numerico
if (r > 0)
@ -461,10 +414,13 @@ bool TABfile_text::pre_writerel(TRelation& rel,const TRecord_text& rec)
return TRUE;
}
/* ********************************************************************************************************* */
/* TTrasfer */
/*********************************************************************************************************** */
//Questo Handler viene "richiamato" da tre campi:
// F_PERCORSO, F_PERCORSO_UTENTE, F_TIPO_RICE
bool TRicezione::inseriscipercorso(TMask_field& f, KEY k)
bool TTrasfer::inseriscipercorso(TMask_field& f, KEY k)
{
bool modificato = FALSE; //Questa mi dice quando c'è stata una modifica sulla maschera
if ((k==K_TAB) &&
@ -491,7 +447,6 @@ bool TRicezione::inseriscipercorso(TMask_field& f, KEY k)
modificato=TRUE;
}
if (((f.dlg() == F_PERCORSO) || (f.dlg() == F_TIPO_RICE ))&& modificato)
{//Entro in questo if tutte le volte che è stato modificato il campo F_PERCORSO
//o F_TIPO_RICE
@ -501,11 +456,14 @@ bool TRicezione::inseriscipercorso(TMask_field& f, KEY k)
//non è garantito che ci sia un record di testa
TWait_cursor hourglass;
TRecord_text rec_temp; //Istanzio un tipo record_text
TString config_file_temp; //Nome del file di configurazione
TFilename percorso_temp; //Contiene il percorso completo del file sorgente
TString config_file_temp(f.mask().get(F_PERCORSO_UTENTE));//Nome del file di configurazione
TFilename percorso_temp(f.mask().get(F_PERCORSO)); //Contiene il percorso completo del file sorgente
int tipo_ricezione = f.mask().get_int(F_TIPO_RICE);
app().set_transfer(tipo_ricezione,percorso_temp,config_file_temp);
TFile_text *file_temp=NULL;
percorso_temp=f.mask().get(F_PERCORSO); //Leggo il contenuto di F_PERCORSO
file_temp=app().set_config_name(config_file_temp,f.mask(),percorso_temp);
file_temp=app().trans_file();
file_temp->open('r'); //Apro il file di testo in rettura
int err = file_temp->read(rec_temp); //Leggo la prima riga del file di testo (dovrebbe contenere il record di testata)
if((err == NOERR) && (rec_temp.type() == RECORD_TESTA)) //Controllo la lettura e che ci sia il record di testa
@ -548,7 +506,75 @@ bool TRicezione::inseriscipercorso(TMask_field& f, KEY k)
}
void TRicezione::ricevi(TMask & msk)
/* ********************************************************************************************************* */
/* TRicezione */
/*********************************************************************************************************** */
bool TRicezione::create()
{
_files.add(new TLocalisamfile(LF_CARADD),1);
_files.add(new TLocalisamfile(LF_COLLDICH),2);
dispatch_e_menu(BAR_ITEM(1)); //Simula la scelta di una voce di menu
return TRUE;
}
bool TRicezione::destroy() //Distruttore
{
return TRUE;
}
//Funzione membro che effettua la conversione
bool TRicezione::menu(MENU_TAG)
{
TString config_file; //Nome del file di configurazione
TMask msk("AB2100A"); //Maschera dove si chiede di immettere il percorso del file sorgente
TFilename percorso; //Contiene il percorso completo del file sorgente
msk.set_handler(F_PERCORSO, inseriscipercorso); //Assegno un handler al campo F_PERCORSO
//inseriscipercorso controlla che il percorso (e il file) esista e sia corretto
msk.set_handler(F_PERCORSO_UTENTE, inseriscipercorso);
msk.set_handler(F_TIPO_RICE, inseriscipercorso);
//A questo punto il percorso e' corretto
if (msk.run()== K_ENTER) //Eseguo la maschera
{
//Visualizza una finestra di attesa
TIndwin idle(0,"Attendere: aggiornamento della tabella in corso. L'operazione potrebbe richiedere qualche minuto ... ",FALSE,FALSE,60);
percorso=msk.get(F_PERCORSO); //Leggo il contenuto di F_PERCORSO
if (msk.get_int(F_TIPO_RICE) == RICEZIONE_AS400)
{
_rice = new TRicezione_AS400(percorso);
}
if (msk.get_int(F_TIPO_RICE) == RICEZIONE_INTERNA)
{
_rice = new TObject_reception(percorso);
}
if (msk.get_int(F_TIPO_RICE) == RICEZIONE_USER_DEFINED)
{
_rice = new TObject_reception(percorso);
}
_rice->ricevi(msk);
/* if ((msk.get_int(F_TIPO_RICE) == RICEZIONE_AS400) &&
(msk.get_bool(F_MOVIMENTI)))
{
build_balancetree(LF_MOVDETT);
} */
//La chiusura del _trasfile non può essere eseguita prima poichè questo
//serve nella costruzione dell'albero dei movimenti
/* if (msk.get_bool(F_SRELAZ))
build_relana(config_file,msk,percorso); */
//messaggio finale
message_box(" ... aggiornamento delle tabelle selezionate effettuato");
} //end if (msk.run())
return FALSE;
}
void TObject_reception::ricevi(TMask & msk)
{
TRecord_text rec; //Istanzio un tipo record_text
@ -599,19 +625,12 @@ void TRicezione::ricevi(TMask & msk)
//Finita prima fase di aggionamento, si passa eventualmente alla seconda
}
// prepara l'albero di record per la navigazione e lo naviga
void TRicezione::naviga_array(TAlbero_record &a)
{
int curr_id=1;
TString_array allkeys;
a.get_keys(allkeys);
allkeys.sort();
TToken_string radice,*next_key;
radice=(TToken_string &)*allkeys.first_item();// radice
next_key=(TToken_string *)allkeys.succ_item();// chiave seguente (figlio? fratello?)
a.dept_first(radice, NULL,NULL, curr_id,allkeys,&next_key);
}
/* ********************************************************************************************************* */
/* TAlbero_record */
/*********************************************************************************************************** */
// visita in dept first e aggiunge man mano i link corretti ai nodi
void TAlbero_record::dept_first(TToken_string key, TRectype * padre, TRectype * prec, int &curr_id,
@ -674,7 +693,6 @@ void TAlbero_record::dept_first(TToken_string key, TRectype * padre, TRectype *
}
}
//key is: FLAG|CODDETT|NREG|NRIG
TToken_string& TAlbero_record ::cerca_figlio (TToken_string &key,
TString_array& allkeys, // parametri ricerca COGE
@ -815,7 +833,26 @@ TToken_string& TAlbero_record ::cerca_fratello (TToken_string &key,
return wrk_string;
}
void TRicezione::scrivi_array(TAssoc_array &s_rec, int logic_num)
/* ********************************************************************************************************* */
/* TRicezione_AS400 */
/*********************************************************************************************************** */
// prepara l'albero di record per la navigazione e lo naviga
void TRicezione_AS400::naviga_array(TAlbero_record &a)
{
int curr_id=1;
TString_array allkeys;
a.get_keys(allkeys);
allkeys.sort();
TToken_string radice,*next_key;
radice=(TToken_string &)*allkeys.first_item();// radice
next_key=(TToken_string *)allkeys.succ_item();// chiave seguente (figlio? fratello?)
a.dept_first(radice, NULL,NULL, curr_id,allkeys,&next_key);
}
void TRicezione_AS400::scrivi_array(TAssoc_array &s_rec, int logic_num)
{
TRectype *rec; //Creo un tipo di record dove inserire il record
@ -837,7 +874,7 @@ void TRicezione::scrivi_array(TAssoc_array &s_rec, int logic_num)
}
}
void TRicezione::leggi_temp_link(TRectype& cur_rec,TToken_string& k)
void TRicezione_AS400::leggi_temp_link(TRectype& cur_rec,TToken_string& k)
{
TString campo1 = cur_rec.get(ABMD_IDPADRE);
TString campo2 = cur_rec.get(ABMD_IDFIGLIO);
@ -852,7 +889,7 @@ void TRicezione::leggi_temp_link(TRectype& cur_rec,TToken_string& k)
}
void TRicezione::build_balancetree(int logic_num)
void TRicezione_AS400::build_balancetree(int logic_num)
{
TAlbero_record seleziona_record; //Dichiarazione di un assoc_array
TRelation rel(logic_num); //Creo un nuova relazione
@ -897,7 +934,7 @@ void TRicezione::build_balancetree(int logic_num)
}
}
void TRicezione::build_relana(TString& config_file, const TMask &msk, const TFilename& percorso)
void TRicezione_AS400::build_relana(TString& config_file, const TMask &msk, const TFilename& percorso)
{
TString16 curr_ana;
TToken_string key;
@ -909,7 +946,9 @@ void TRicezione::build_relana(TString& config_file, const TMask &msk, const TFil
rel.add(LF_COLLDICH,"ID=IDCOLDICH");
rel.add(LF_CARADD,"ID=IDCARADD");
ft = set_config_name(config_file,msk,percorso);
//ft = set_config_name(config_file,msk,percorso);
ft = trans_file();
ft->close(); //Chiudo il file
ft->open('r'); //Apro il file di testo in lettura
//Inizia il ciclo sulle Analisi in radici
@ -1001,7 +1040,7 @@ void TRicezione::build_relana(TString& config_file, const TMask &msk, const TFil
// naviga per ricostruire il numero di sottorelazione
void TRicezione::build_ana_tree(long &currid, TRectype & nodo, TRectype * father, TRectype * brother, TAssoc_array & tabtree)
void TRicezione_AS400::build_ana_tree(long &currid, TRectype & nodo, TRectype * father, TRectype * brother, TAssoc_array & tabtree)
{
TRectype *ana_node;
TToken_string key;
@ -1072,12 +1111,10 @@ void TRicezione::build_ana_tree(long &currid, TRectype & nodo, TRectype * father
ana_node->put(ABRA_IDSUCC, ID_NULLO);
}
/*
// Questa funzione serve solo in fase di debug:
// naviga per ricostruire il numero di sottorelazione
void TRicezione::print_ana_tree(int &level,TRectype & nodo,FILE * stream)
void TRicezione_AS400::print_ana_tree(int &level,TRectype & nodo,FILE * stream)
{
TToken_string key;
@ -1111,51 +1148,60 @@ void TRicezione::print_ana_tree(int &level,TRectype & nodo,FILE * stream)
}
*/
void TRicezione::set_tipo_bil(const TString &tipo_bil)
void TRicezione_AS400::ricevi(TMask & msk)
{
_tipo_bilancio = tipo_bil;
}
//Funzione membro che effettua la conversione
bool TRicezione::menu(MENU_TAG)
{
TString config_file; //Nome del file di configurazione
TMask msk("AB2100A"); //Maschera dove si chiede di immettere il percorso del file sorgente
TFilename percorso; //Contiene il percorso completo del file sorgente
msk.set_handler(F_PERCORSO, inseriscipercorso); //Assegno un handler al campo F_PERCORSO
//inseriscipercorso controlla che il percorso (e il file) esista e sia corretto
msk.set_handler(F_PERCORSO_UTENTE, inseriscipercorso);
msk.set_handler(F_TIPO_RICE, inseriscipercorso);
_trasfile=NULL;
//A questo punto il percorso e' corretto
if (msk.run()== K_ENTER) //Eseguo la maschera
{
//Visualizza una finestra di attesa
TIndwin idle(0,"Attendere: aggiornamento della tabella in corso.\n\nL'operazione potrebbe richiedere qualche minuto ... ",FALSE,FALSE,60);
percorso=msk.get(F_PERCORSO); //Leggo il contenuto di F_PERCORSO
_trasfile=set_config_name(config_file,msk,percorso);
_trasfile->open('r'); //Apro il file di testo in rettura
set_tipo_bil(msk.get(F_TIPO_BILANCIO));
ricevi(msk);
if (msk.get_bool(F_MOVIMENTI))
build_balancetree(LF_MOVDETT);
//La chiusura del _trasfile non può essere eseguita prima poichè questo
//serve nella costruzione dell'albero dei movimenti
// Eseguo la ricezione normale
TObject_reception::ricevi(msk);
trasfile()->set_tipo_bilancio(msk.get(F_TIPO_BILANCIO));
// E aggiungo il resto ...
if (msk.get_bool(F_MOVIMENTI))
{
build_balancetree(LF_MOVDETT);
}
//La chiusura del _trasfile non può essere eseguita prima poichè questo
//serve nella costruzione dell'albero dei movimenti
if (_trasfile != NULL)
{
_trasfile->close();
delete _trasfile;
_trasfile =NULL;
if (msk.get_bool(F_SRELAZ))
build_relana(config_file,msk,percorso);
//messaggio finale
message_box(" ... aggiornamento delle tabelle selezionate effettuato");
} //end if (msk.run())
return FALSE;
}
if (msk.get_bool(F_SRELAZ))
{
TString config_file;
TFilename percorso;
percorso=msk.get(F_PERCORSO); //Leggo il contenuto di F_PERCORSO: è stato controllato prima
build_relana(config_file,msk,percorso);
}
}
TObject_reception::TObject_reception(const TFilename &percorso)
{
if (_trasfile != NULL)
delete _trasfile;
_trasfile = new TFile_text(percorso, "C:/SAURO/TEMP/AB2100B.INI"); /*DA CAMBIARE*/
//_trasfile = new TFile_text(percorso, config); //Leggo il file di configurazione
}
TRicezione_AS400::TRicezione_AS400(const TFilename &percorso)
{
if (_trasfile != NULL)
delete _trasfile;
TString config("ab2100a.ini");
_trasfile = new TFile_text_AS400(percorso, config); //Leggo il file di configurazione
}
TRicezione_userdef ::TRicezione_userdef(const TString & config, const TFilename &percorso)
{
if (_trasfile != NULL)
delete _trasfile;
_trasfile = new TFile_text(percorso, config); //Leggo il file di configurazione
}
int ab2101(int argc, char **argv)
{
TRicezione a;

View File

@ -9,48 +9,27 @@
#include <progind.h>
#include <assoc.h>
#include <varrec.h>
#define FLAG_COGE "CG"
#define FLAG_DETT "DT"
#define FLAG_CLIENTE "CL"
#define FLAG_FORNITORE "FO"
#define FLAG_MOVIMENTO "MO" // così i movs sono alla fine
//Classe derivata per il trasferimento
class TTrasferimento:public TRiceTras
{
public:
virtual bool menu(MENU_TAG);
static bool inseriscipercorso(TMask_field& f, KEY k);
//Esegue il ciclo di ricezione
void converti(int);
void trasferisci_albero(TRectype &,TRecord_text&, TAssoc_array&);
bool cerca_padre(TLocalisamfile &, TRectype &);
long my_num(TLocalisamfile&, TAssoc_array&);
bool mov_da_scrivere(TRectype &);
void formatta(TRecord_text&,TRectype&,int&);
TTrasferimento() {}
virtual ~TTrasferimento() {}
};
const char* get_ordinamento(TVariable_rectype & rec)
{
if (rec.get(ABMD_TIPODETT) == FLAG_DETT || rec.get(ABMD_TIPODETT) == FLAG_COGE )
if (rec.get(ABMD_TIPODETT) == FLAG_DETT_DT || rec.get(ABMD_TIPODETT) == FLAG_COGE_CG )
{ //E' un record di MOVI3
return (MOVIMENTO3);
}
if (rec.get(ABMD_TIPODETT) == FLAG_CLIENTE)
if (rec.get(ABMD_TIPODETT) == FLAG_CLIENTE_CL)
{//E' un record di MOVI4
return (MOVIMENTO4);
}
if (rec.get(ABMD_TIPODETT) == FLAG_FORNITORE)
if (rec.get(ABMD_TIPODETT) == FLAG_FORNITORE_FO)
{//E' un record di MOVI5
return (MOVIMENTO5);
}
if (rec.get(ABMD_TIPODETT) == FLAG_MOVIMENTO)
if (rec.get(ABMD_TIPODETT) == FLAG_MOVIMENTO_MO)
{//Può essere MOVI 1 2
real r(rec.get(ABMD_IMPORTO));
if (r > 0)
@ -64,7 +43,7 @@ const char* get_ordinamento(TVariable_rectype & rec)
return NULL;
}
bool TTrasferimento::cerca_padre(TLocalisamfile & padre, TRectype &node)
bool TInvio_AS400::cerca_padre(TLocalisamfile & padre, TRectype &node)
{
padre.put(ABMD_CODDITTA,node.get(ABMD_CODDITTA));
padre.put(ABMD_ANNO,node.get(ABMD_ANNO));
@ -77,7 +56,7 @@ bool TTrasferimento::cerca_padre(TLocalisamfile & padre, TRectype &node)
return FALSE;
}
long TTrasferimento::my_num(TLocalisamfile& mov, TAssoc_array& progressivi)
long TInvio_AS400::my_num(TLocalisamfile& mov, TAssoc_array& progressivi)
{
long ret = 1;
@ -113,20 +92,20 @@ long TTrasferimento::my_num(TLocalisamfile& mov, TAssoc_array& progressivi)
return ret;
}
void TTrasferimento::trasferisci_albero(TRectype &node, TRecord_text &rec, TAssoc_array &progressivi)
void TInvio_AS400::trasferisci_albero(TRectype &node, TRecord_text &rec, TAssoc_array &progressivi)
{
TLocalisamfile mov(LF_MOVDETT);
//Se è un COGE scrivo il CODICE_COGE nel relativo campo
if (node.get(ABMD_TIPODETT) == FLAG_COGE)
if (node.get(ABMD_TIPODETT) == FLAG_COGE_CG)
rec.add(node.get(ABMD_CODDETT),CONTO_COGE_MOVDETT);
//Se è un movimento ...
if (node.get(ABMD_TIPODETT)== FLAG_MOVIMENTO)
if (node.get(ABMD_TIPODETT)== FLAG_MOVIMENTO_MO)
{ //... sono all'ultimo livello: trovo il padre
if (cerca_padre(mov,node))
{//Questo è il padre del movimento
if (mov.get(ABMD_TIPODETT) == FLAG_COGE) //Se il padre è un COGE scrivo il CONTO COGE nel relativo campo
if (mov.get(ABMD_TIPODETT) == FLAG_COGE_CG) //Se il padre è un COGE scrivo il CONTO COGE nel relativo campo
rec.add(node.get(ABMD_CODDETT),CONTO_COGE_MOVDETT);
//altrimenti, se il padre è un dettaglio, non scrivo nessuna informazione aggiuntiva
}
@ -162,7 +141,7 @@ void TTrasferimento::trasferisci_albero(TRectype &node, TRecord_text &rec, TAsso
}//Fine parte "ricostruzione" albero dei movimenti
//Questa parte "ricostruisce" l'albero dei dettaglio
if (node.get(ABMD_TIPODETT)== FLAG_DETT)
if (node.get(ABMD_TIPODETT)== FLAG_DETT_DT)
{
mov.curr()=node;
TString16 num;
@ -171,7 +150,7 @@ void TTrasferimento::trasferisci_albero(TRectype &node, TRecord_text &rec, TAsso
}
}
bool TTrasferimento::mov_da_scrivere(TRectype &node)
bool TInvio_AS400::mov_da_scrivere(TRectype &node)
{
TLocalisamfile dett(LF_MOVDETT);
if (node.get_long(ABMD_IDPADRE) == ID_NULLO) //Sono al primo livello
@ -183,14 +162,14 @@ bool TTrasferimento::mov_da_scrivere(TRectype &node)
return TRUE;
else
{
if (dett.get(ABMD_TIPODETT) == FLAG_COGE) //Sono al terzo livello, ma ammetto solo i COGE
if (dett.get(ABMD_TIPODETT) == FLAG_COGE_CG) //Sono al terzo livello, ma ammetto solo i COGE
return TRUE;
}
}
return FALSE; //Tutti i livelli superiori a 2 e tutti i casi che non riesco a gestire
}
void TTrasferimento::formatta(TRecord_text &rec, TRectype &node, int &logic_num)
void TInvio_AS400::formatta(TRecord_text &rec, TRectype &node, int &logic_num)
{
if (logic_num == LF_MOVDETT)
{
@ -272,7 +251,7 @@ void TTrasferimento::formatta(TRecord_text &rec, TRectype &node, int &logic_num)
}
}
void TTrasferimento::converti(int logic_num)
void TInvio_AS400::converti(int logic_num)
{
TRelation *tr_relation=_trasfile->t_rec(logic_num)->relation();
@ -330,7 +309,7 @@ void TTrasferimento::converti(int logic_num)
}
//Handler per l'inserimento del percorso completo
bool TTrasferimento::inseriscipercorso(TMask_field& f, KEY k)
bool TInvio_AS400::inseriscipercorso(TMask_field& f, KEY k)
{
TString percorso;
percorso=f.get(); //Leggo il contenuto del campo
@ -339,9 +318,9 @@ bool TTrasferimento::inseriscipercorso(TMask_field& f, KEY k)
//Funzione membro che esegue la conversione di trasferimento
bool TTrasferimento::menu(MENU_TAG)
bool TInvio_AS400::menu(MENU_TAG)
{
TString config_file; //Nome del file di configurazione
TString config_file("ab2100b"); //Nome del file di configurazione
TMask msk("AB2100A"); //Maschera dove si chiede di immettere il percorso del file sorgente
TFilename percorso; //Contiene il percorso completo del file sorgente
@ -356,14 +335,12 @@ bool TTrasferimento::menu(MENU_TAG)
msk.hide(F_VOCI); //nascondo questo campo poichè non mi serve
msk.hide(F_RELAZ); //nascondo questo campo poichè non mi serve
msk.hide(F_SRELAZ); //nascondo questo campo poichè non mi serve
//A questo punto il percorso e' corretto
if (msk.run()== K_ENTER) //Eseguo la maschera
{
//A questo punto il percorso e' corretto
percorso=msk.get(F_PERCORSO); //Leggo il contenuto di F_PERCORSO
set_config_name(config_file,msk, percorso);
_trasfile = new TABfile_text(percorso, config_file); //Leggo il file di configurazione
_trasfile = new TFile_text_AS400(percorso, config_file); //Leggo il file di configurazione
_trasfile->open(percorso,'w'); //Apro il file di testo in rettura
if (msk.get_bool(F_PIANO_CONTI)==TRUE) //Controllo se si è scelto di convertire il piano dei conti
{
@ -397,7 +374,7 @@ bool TTrasferimento::menu(MENU_TAG)
int ab2102(int argc, char **argv)
{
TTrasferimento a;
TInvio_AS400 a;
a.run(argc,argv,"Trasferimento su file di testo");
return 0;
}