Files correlati : Ricompilazione Demo : [ ] Commento : eliminati riferimenti ai files accoppati colldich e caradd; si continuano a compilare AB0 (che sta nel cd) e AB1 (che non sta da nessuna parte), mentre non si compilano AB2 e AB3 (che però non si compilavano neanche prima) git-svn-id: svn://10.65.10.50/trunk@20660 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			435 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			435 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <relation.h>
 | |
| #include <relapp.h>
 | |
| #include <tree.h>
 | |
| #include <mask.h>
 | |
| 
 | |
| #include "ablib09.h"
 | |
| #include "analisi.h"
 | |
| #include "relvoci.h"
 | |
| #include "relana.h"
 | |
| #include "saldi.h"
 | |
| #include "movdett.h"
 | |
| #include "voci.h"
 | |
| 
 | |
| #define MAX_ID_REL 999999999
 | |
| #define MAX_ID_MOVDETT 999999
 | |
| #define NODO_AGGIUNTO "A"
 | |
| #define NODO_MODIFICATO "M"
 | |
| #define NODO_RIMOSSO "R"
 | |
| #define IMMESSO 'I'
 | |
| #define TRASFERITO 'T'
 | |
| 
 | |
| #define TIPO_ANALISI "A"
 | |
| #define TIPO_VOCE    "V"
 | |
| #define ID_NULLO 0
 | |
| #define ID_NULLO_STR "0"
 | |
| 
 | |
| typedef real TNumeric_id;
 | |
| 
 | |
| 
 | |
| class TAlbero_movdett : public TBidirectional_tree
 | |
| {
 | |
|   TToken_string _codtab;
 | |
|   TLocalisamfile *_movdett;
 | |
| protected:
 | |
|   virtual void node2id(const TObject * node,TString & id) const;
 | |
| public:
 | |
|   virtual bool has_son() const;
 | |
|   virtual bool has_rbrother() const;
 | |
|   virtual bool has_father() const;
 | |
|   virtual bool has_lbrother() const;
 | |
|   virtual bool goto_root();
 | |
|   virtual bool goto_firstson();
 | |
|   virtual bool goto_father();
 | |
|   virtual bool goto_rbrother();
 | |
|   virtual bool goto_lbrother();
 | |
|   virtual bool goto_node(TString & id)
 | |
|     {return(_movdett->readat(atol(id))==NOERR); }
 | |
|   virtual TObject * curr_node() const;
 | |
|   bool goto_id(const TNumeric_id &id);
 | |
|   TRectype & curr() {return (TRectype &)*curr_node();}
 | |
|   
 | |
|   TAlbero_movdett( const char * tabcode);
 | |
|   virtual ~TAlbero_movdett();
 | |
| };
 | |
|   
 | |
|   
 | |
| //Classe per gestire l'albero di relana
 | |
| class TAlbero_relana : public TBidirectional_tree
 | |
| {
 | |
|   TString _codtab;
 | |
|   TLocalisamfile *_relana;
 | |
|   TNumeric_id _last_id;
 | |
| protected:
 | |
|   virtual void node2id(const TObject * node,TString & id) const;
 | |
| public:
 | |
|   void zero_id() {_last_id = 0;}
 | |
|   virtual bool has_son() const;
 | |
|   virtual bool has_rbrother() const;
 | |
|   virtual bool has_father() const;
 | |
|   virtual bool has_lbrother() const;
 | |
|   virtual bool goto_root();
 | |
|   virtual bool goto_firstson();
 | |
|   virtual bool goto_father();
 | |
|   virtual bool goto_rbrother();
 | |
|   virtual bool goto_lbrother();
 | |
|   virtual bool goto_node(TString & id)
 | |
|     {return(_relana->readat(atol(id))==NOERR); }
 | |
|   virtual TObject * curr_node() const;
 | |
|   bool goto_id(const TNumeric_id &id);
 | |
|   TRectype & curr() {return (TRectype &)*curr_node();}
 | |
|   bool lock();
 | |
|   void unlock();
 | |
|   TNumeric_id &new_id(real id);
 | |
|   
 | |
|   TAlbero_relana( const char * tabcode);
 | |
|   virtual ~TAlbero_relana();
 | |
| };
 | |
| 
 | |
| //Classe per gestire la struttura di una tabella di analisi
 | |
| // basandosi sull'albero di relvoci
 | |
| class TAlbero_relvoci : public TTree
 | |
| {
 | |
|   TString _codtab;
 | |
|   TLocalisamfile *_relvoci;
 | |
| protected:
 | |
|   virtual void node2id(const TObject* node, TString& id) const;
 | |
| public:
 | |
|   virtual bool goto_root();
 | |
|   virtual bool has_son() const;
 | |
|   virtual bool goto_firstson();
 | |
|   virtual bool has_rbrother() const;
 | |
|   virtual bool goto_rbrother();
 | |
|   virtual TObject * curr_node() const;
 | |
|   virtual bool goto_node(const TString &id)
 | |
|     {return (_relvoci->readat(atol(id))==NOERR);}
 | |
|   bool has_lbrother() const;
 | |
|   bool goto_lbrother();
 | |
|   TRectype & curr() {return (TRectype &)*curr_node();}
 | |
|   bool lock();
 | |
|   void unlock();
 | |
|   const TString & codtab()
 | |
|     {return _codtab;}
 | |
|   
 | |
|   TAlbero_relvoci(const char * tabcode);
 | |
|   virtual ~TAlbero_relvoci() ;
 | |
| };
 | |
| 
 | |
| // Struttura da albero basata su un file temporaneo cached
 | |
| class TAlbero_locale : public TBidirectional_tree
 | |
| { 
 | |
|   TLocalisamfile *_f;   // da rimuovere !!
 | |
|   protected:
 | |
|     TAssoc_array _status_node;
 | |
|     TRWrecord_cache * _local_cache;
 | |
|     TNumeric_id _last_insert_id;
 | |
|     TRectype *_currnode;
 | |
| 
 | |
|     virtual const char * get_headkey() const {return NULL;}
 | |
|     virtual const char * id_fieldname() const {return NULL;}
 | |
|   public:
 | |
|     // debug
 | |
|     void write_cache() { _local_cache->flush(); }
 | |
|     void clear_cache()
 | |
|     {
 | |
|       _local_cache->clear();
 | |
|       _last_insert_id = 0;
 | |
|     }
 | |
|     
 | |
|     virtual bool insert_node(TRectype &node, const TNumeric_id id_prec, const TNumeric_id id_padre, TNumeric_id id, const char trasf_immes = TRASFERITO) {return FALSE;}
 | |
|     virtual bool delete_node(const TNumeric_id &id) {return FALSE;}
 | |
|     virtual bool delete_tree() { return FALSE;}
 | |
|     virtual void zero() {;}
 | |
|     virtual bool make_root(TBaseisamfile & saldi) {return FALSE;}
 | |
|     virtual void link_succ_zero(const TNumeric_id currid) {;}
 | |
|     virtual void link_son_zero(const TNumeric_id currid) {;}
 | |
|     virtual TObject * curr_node() const {return _currnode;}
 | |
|     TRectype & current() const {return (TRectype &)*curr_node();}
 | |
|     TRWrecord_cache & current_cache() const {return *_local_cache;}
 | |
| 
 | |
|     
 | |
|     // ***** gestione interfaccia Database/copia locale
 | |
|     virtual TRectype extract_dirtynode(TString &id, TString& status) { TRectype rec(*_currnode); return rec;}
 | |
|     int dirty_nodes() { return _status_node.items();}
 | |
|     void set_status_node(const TString &id, const char *status);
 | |
|     TString* get_status_node(const TString &id) 
 | |
|       {return (TString*)_status_node.objptr(id);}
 | |
|       
 | |
| 
 | |
|     virtual void goto_node(const TNumeric_id id) {;}
 | |
|     virtual void goto_node(TRectype &node) {*_currnode = node;}
 | |
|     virtual bool goto_node(const TString & id) {TNumeric_id nid(id); goto_node(nid); return TRUE;}
 | |
| 
 | |
|     virtual void node2id(const TObject* node, TString& id) const  {;}
 | |
|     virtual bool goto_firstson() {return FALSE;}
 | |
|     virtual bool goto_rbrother() {return FALSE;}
 | |
|     virtual bool goto_root() {return FALSE;}
 | |
| 
 | |
| /*    virtual const char * idfather_fieldname() const {return NULL;}
 | |
|     virtual const char * idson_fieldname() const {return NULL;}
 | |
|     virtual const char * idsucc_fieldname() const {return NULL;}
 | |
|     virtual const char * idprec_fieldname() const {return NULL;}
 | |
|     virtual void put_headkey(TRectype &) {;}
 | |
|     
 | |
|     virtual bool remove_subtree(const TNumeric_id lastnode_id) { return TRUE;}
 | |
|     virtual TNumeric_id &new_id(TNumeric_id) { real i; return i;}
 | |
|     virtual bool has_father() const {return TRUE;}
 | |
|     virtual bool goto_father() {return TRUE;}
 | |
|     virtual bool has_rbrother() const {return TRUE;}
 | |
|     virtual bool has_lbrother() const {return TRUE;}    
 | |
|     virtual bool goto_lbrother() {return TRUE;}
 | |
|     virtual bool goto_son_first_level() {return TRUE;}
 | |
|         virtual void curr_id(TString& id) const 
 | |
|     { 
 | |
|       node2id(curr_node(), id);
 | |
|     }
 | |
| 
 | |
| */
 | |
| 
 | |
|     TAlbero_locale(int filenum);
 | |
|     virtual ~TAlbero_locale();
 | |
| };
 | |
| 
 | |
| class TAlbero_locale_link : public TAlbero_locale
 | |
| {
 | |
|   
 | |
| //  TLocalisamfile *_c;
 | |
| //    TRWrecord_cache * _local_cache_carad;
 | |
|   protected:
 | |
| 
 | |
|     virtual const char * idfather_fieldname() const pure ;
 | |
|     virtual const char * idson_fieldname() const pure;
 | |
|     virtual const char * idsucc_fieldname() const pure;
 | |
|     virtual const char * idprec_fieldname() const pure;
 | |
|     virtual const char * id_fieldname() const pure;
 | |
|     virtual const char * get_headkey() const pure;
 | |
|     virtual void put_headkey(TRectype &) pure;
 | |
|     virtual void node2id(const TObject* node, TString& id) const 
 | |
|     {
 | |
|       const TRectype *rec = (const TRectype *)node;
 | |
|       id = rec->get_real(id_fieldname()).string();
 | |
|     }
 | |
|     
 | |
|     virtual bool remove_subtree(const TNumeric_id lastnode_id);
 | |
|     virtual TNumeric_id &new_id(TNumeric_id);
 | |
| 
 | |
|   public:
 | |
|     virtual bool insert_node(TRectype &node, const TNumeric_id id_prec, const TNumeric_id id_padre, TNumeric_id id, const char trasf_immes = TRASFERITO);
 | |
|     virtual bool delete_node(const TNumeric_id &id);
 | |
|     virtual bool delete_tree();
 | |
|     virtual void zero();
 | |
|     
 | |
|     virtual void goto_node(const TNumeric_id id);
 | |
|     virtual void goto_node(TRectype &node) {*_currnode = node;}
 | |
|     virtual bool goto_node(const TString & id) {TNumeric_id nid(id); goto_node(nid); return TRUE;}
 | |
| 
 | |
|     virtual bool make_root(TBaseisamfile & saldi) pure;
 | |
|     virtual bool get_description(TString& desc) const pure; 
 | |
|     
 | |
|     virtual bool has_son() const;
 | |
|     virtual bool goto_firstson();
 | |
|     virtual bool has_father() const;
 | |
|     virtual bool goto_father();
 | |
|     virtual bool has_rbrother() const;
 | |
|     virtual bool goto_rbrother();
 | |
|     virtual bool has_lbrother() const;
 | |
|     virtual bool goto_lbrother();
 | |
| 
 | |
|     virtual bool goto_son_first_level();
 | |
| //    virtual bool has_root() const {return FALSE;}
 | |
|     virtual bool goto_root();
 | |
|     virtual void link_succ_zero(const TNumeric_id currid);
 | |
|     virtual void link_son_zero(const TNumeric_id currid);
 | |
|     virtual TRectype extract_dirtynode(TString &id, TString& status);
 | |
|     
 | |
|     TAlbero_locale_link(int filenum);
 | |
|     virtual ~TAlbero_locale_link() {;}
 | |
| };
 | |
| 
 | |
| class TAlbero_locale_relvoci: public TAlbero_locale
 | |
| {   
 | |
|   protected:
 | |
| //        virtual bool remove_subtree(const TNumeric_id lastnode_id);
 | |
|   
 | |
|   public:
 | |
|     virtual bool insert_node(TRectype &node, const TNumeric_id id_prec, const TNumeric_id id_padre, TNumeric_id id, const char trasf_immes = TRASFERITO);
 | |
|     virtual bool delete_node(const TNumeric_id &id);
 | |
| 
 | |
|     virtual bool goto_node(const TString &key);
 | |
| 
 | |
| /**********************/
 | |
|     virtual bool delete_tree() { return FALSE;}
 | |
|     virtual void zero() {;}
 | |
|     virtual bool make_root(TBaseisamfile & saldi) {return FALSE;}
 | |
|     virtual bool has_rbrother() const;
 | |
|     virtual bool goto_rbrother();
 | |
|     virtual bool has_lbrother() const;
 | |
|     virtual bool goto_lbrother();
 | |
|     virtual TRectype extract_dirtynode(TString &id, TString& status);
 | |
|     TNumeric_id new_id();
 | |
| 
 | |
| 
 | |
| //    virtual bool delete_tree();
 | |
| 
 | |
| //    virtual bool has_son() const;
 | |
| //    virtual bool goto_firstson();
 | |
| //    virtual bool has_father() const;
 | |
| //    virtual bool goto_father();
 | |
| 
 | |
| //    virtual bool goto_son_first_level();
 | |
| 
 | |
|     TAlbero_locale_relvoci();
 | |
|     virtual ~TAlbero_locale_relvoci() {;}
 | |
| };
 | |
| 
 | |
| // Copia locale dell'albero di una tabella analisi
 | |
| class TLocal_relana3 : public TAlbero_locale_link
 | |
| { 
 | |
|   protected:
 | |
|     virtual const char * idfather_fieldname() const {return ABRA_IDPADRE;}
 | |
|     virtual const char * idson_fieldname() const {return ABRA_IDFIGLIO;}
 | |
|     virtual const char * idsucc_fieldname() const {return ABRA_IDSUCC;}
 | |
|     virtual const char * idprec_fieldname() const {return ABRA_IDPREC;}
 | |
|     virtual const char * id_fieldname() const {return ABRA_ID;}
 | |
|     virtual const char * get_headkey() const {return " ";}
 | |
|     virtual void put_headkey(TRectype & node) {node.put(ABRA_CODAN,get_headkey());}
 | |
|   public:
 | |
|     virtual bool make_root(TBaseisamfile & saldi);
 | |
|     virtual bool get_description(TString& desc) const; 
 | |
|   
 | |
|     TLocal_relana3();
 | |
|     virtual ~TLocal_relana3();
 | |
| };
 | |
| 
 | |
| // Copia locale dell'albero dei dettagli di un saldo
 | |
| class TLocal_balance3 : public TAlbero_locale_link
 | |
| { 
 | |
|   protected:
 | |
|     virtual const char * idfather_fieldname() const {return ABMD_IDPADRE;}
 | |
|     virtual const char * idson_fieldname() const {return ABMD_IDFIGLIO;}
 | |
|     virtual const char * idsucc_fieldname() const {return ABMD_IDSUCC;}
 | |
|     virtual const char * idprec_fieldname() const {return ABMD_IDPREC;}
 | |
|     virtual const char * id_fieldname() const {return ABMD_ID;}
 | |
|     virtual const char * get_headkey() const {return " | | | | ";}
 | |
|     virtual void put_headkey(TRectype & node) ;
 | |
|   public:
 | |
|     virtual bool make_root(TBaseisamfile & saldi); 
 | |
|     virtual bool get_description(TString& desc) const;  
 | |
| 
 | |
|     TLocal_balance3();
 | |
|     virtual ~TLocal_balance3();
 | |
| };
 | |
| 
 | |
| class TAlbero_AB: public TRectype
 | |
| {
 | |
|   protected:
 | |
|     TAlbero_locale *_inter_tree;
 | |
|     virtual int commit_body() const;
 | |
|     virtual int read_body(bool lockstruct) {return 0;}  //DA FARE
 | |
|     virtual void put_headkey(TRectype &rec) const {;} //DA FARE
 | |
|     
 | |
|     TRectype * _newrec; //buffer per l'inserimento dodo per nodo
 | |
|  
 | |
|   public:
 | |
|     TAlbero_AB(int filenum);
 | |
|     virtual ~TAlbero_AB();
 | |
|     
 | |
|     virtual int read(TBaseisamfile& analisi, word isop=_isequal, word lockop=_nolock);
 | |
|     virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock);
 | |
|     virtual int write(TBaseisamfile& analisi) const;
 | |
|     virtual int rewrite(TBaseisamfile& analisi) const;
 | |
|     virtual int remove(TBaseisamfile& f) const;
 | |
|     virtual bool remove_node(const TNumeric_id &id) {return FALSE;}
 | |
|     virtual bool insert_new_node() {return FALSE;}
 | |
|     virtual void zero();
 | |
|     TAlbero_locale * user_tree()
 | |
|       {return _inter_tree;}
 | |
| };
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| class TRecord : public TObject
 | |
| {    
 | |
|   TLocalisamfile *_r;   // da rimuovere !!
 | |
|   protected:                         
 | |
|     TAssoc_array _status_node_record;
 | |
|     TRWrecord_cache * _local_cache_record;
 | |
|     TRectype *_currrec;
 | |
|     
 | |
|   public:
 | |
|     // debug
 | |
|     void write_cache() { _local_cache_record->flush(); }
 | |
|     TRectype & current_rec() const {return *_currrec;}
 | |
|     TRWrecord_cache & current_cache_record() const {return *_local_cache_record;}
 | |
|     virtual TRectype extract_dirtynode(TString &id, TString& status);
 | |
|     
 | |
|     int dirty_nodes() { return _status_node_record.items();}
 | |
|     void set_status_node(const TString &id, const char *status);
 | |
|     TString* get_status_node(const TString &id) 
 | |
|       {return (TString*)_status_node_record.objptr(id);}
 | |
|     TRecord(int filenum);
 | |
|     virtual ~TRecord();
 | |
| };
 | |
| 
 | |
| class TAnalisi_bil: public TAlbero_AB
 | |
| {
 | |
|     class TArray_fratelli: public TAssoc_array
 | |
|     {
 | |
|       public:
 | |
|         void setkey(const char *tipocod, const char *codvc, TToken_string &key) const;
 | |
|         bool find1stkey(const char *tipocod, const char *codvc, TToken_string &key);
 | |
|         void mark_used(const char *key);
 | |
|         bool used(TObject *o);
 | |
|     };
 | |
|     TArray_fratelli _nodifratelli;
 | |
|     TLocalisamfile *_analisi;
 | |
|     TLocalisamfile *_voci;
 | |
|     TAlbero_relvoci *_relaz;
 | |
|     TAlbero_relana *_ana;
 | |
|     TAlbero_locale *_inter_tree_relvoci;
 | |
|     
 | |
|   protected:
 | |
|     void naviga_relazioni(const TNumeric_id & id_relana,const TNumeric_id & prec,const TNumeric_id & padre );
 | |
|     TRectype * sincronizza_relana(const TNumeric_id &begin_relana,TNumeric_id &id_relana);
 | |
|     bool lock_struttura();
 | |
|     bool unlock_struttura();
 | |
|     bool lock_tabella();
 | |
|     bool unlock_tabella();
 | |
|     virtual int read_body(bool lockstruct);
 | |
|     virtual int commit_body() const;
 | |
|     virtual void put_headkey(TRectype &rec) const;
 | |
|     void prova_inserimento();
 | |
| 
 | |
|   public:
 | |
|     virtual bool remove_node(const TNumeric_id &id);
 | |
|     virtual bool insert_new_node(TToken_string &codice);
 | |
|     virtual void modify_node(TToken_string &codice);
 | |
|     TAnalisi_bil();
 | |
|     virtual ~TAnalisi_bil() ;
 | |
|     TAlbero_locale * user_tree_voc()
 | |
|       {return _inter_tree_relvoci;}
 | |
| 
 | |
|     const TString &type() {return get(ABAN_TIPOAN);}
 | |
|     void set_type(const char * tipo) {put(ABAN_TIPOAN,tipo);}
 | |
|     
 | |
| };
 | |
|     
 | |
| class TABsaldo: public TAlbero_AB
 | |
| {
 | |
|     TLocalisamfile *_saldi;
 | |
|     TAlbero_movdett *_mov;
 | |
|     TLocalisamfile *_movdett;
 | |
| 
 | |
|   protected:
 | |
|     virtual int read_body(bool lockstruct);
 | |
|     virtual void put_headkey(TRectype &rec) const;
 | |
|     void naviga_movdett();
 | |
|     void prova_inserimento();
 | |
| 
 | |
|   public:
 | |
|     virtual bool remove_node(const TNumeric_id &id) {return FALSE;} //da fare
 | |
|     TABsaldo();
 | |
|     virtual ~ TABsaldo();
 | |
| };
 |