Correzione gestione albero distinta base

git-svn-id: svn://10.65.10.50/branches/R_10_00@22847 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-05-06 08:48:45 +00:00
parent 453890fd36
commit e4e44ab7f4
2 changed files with 46 additions and 41 deletions

View File

@ -471,9 +471,7 @@ TDistinta_expr::TDistinta_expr()
#define TREE_SEPARATOR '~' #define TREE_SEPARATOR '~'
const TRectype* TDistinta_tree::_curr = NULL; //const TRectype* TDistinta_tree::_curr = NULL;
bool TDistinta_tree::isola_codice(TString& code) const bool TDistinta_tree::isola_codice(TString& code) const
{ {
@ -852,7 +850,7 @@ bool TDistinta_tree::restart()
bool TDistinta_tree::set_root(const TQuantita& qta, const char* livgiac) bool TDistinta_tree::set_root(const TQuantita& qta, const char* livgiac)
{ {
bool ok = find_child(qta.articolo(), 1) != NULL; bool ok = has_child_num(qta.articolo(), 1);
if (ok) if (ok)
{ {
_tmp = qta.articolo(); // codice _tmp = qta.articolo(); // codice
@ -873,7 +871,7 @@ bool TDistinta_tree::set_root(const TCodice_articolo& art,
const char* um, real qta, const char* um, real qta,
const char* livgiac) const char* livgiac)
{ {
bool ok = find_child(art, 1) != NULL; bool ok = has_child_num(art, 1);
if (ok) if (ok)
{ {
const TCodice_um umart = um; const TCodice_um umart = um;
@ -991,8 +989,13 @@ const TRectype* TDistinta_tree::find_child(const TCodice_articolo& father, int c
TString80 key = father; TString80 key = father;
key << '|' << child; key << '|' << child;
const TRectype& rec = cache().get(LF_RDIST,key); const TRectype& rec = cache().get(LF_RDIST,key);
return &rec;
}
return rec.empty() ? NULL : &rec; bool TDistinta_tree::has_child_num(const TCodice_articolo& father, int child) const
{
const TRectype* rec = find_child(father, child);
return rec != NULL && !rec->empty();
} }
int TDistinta_tree::build_children_list(const TCodice_articolo& father, TArray& children) const int TDistinta_tree::build_children_list(const TCodice_articolo& father, TArray& children) const
@ -1001,7 +1004,7 @@ int TDistinta_tree::build_children_list(const TCodice_articolo& father, TArray&
for (int nrig = 1; ; nrig++) for (int nrig = 1; ; nrig++)
{ {
const TRectype* rec = find_child(father, nrig); const TRectype* rec = find_child(father, nrig);
if (rec == NULL) if (rec == NULL || rec->empty())
break; break;
key.add(rec->get("CODCOMP"),0); key.add(rec->get("CODCOMP"),0);
key.add(rec->get("LIVELLO"),1); key.add(rec->get("LIVELLO"),1);
@ -1027,31 +1030,31 @@ bool TDistinta_tree::has_son() const
{ {
const int depth = curr_depth(); const int depth = curr_depth();
if (depth >= _max_depth) if (depth >= _max_depth)
return FALSE; return false;
} }
if (is_cyclic()) if (is_cyclic())
return FALSE; return false;
TCodice_articolo key; curr_code(key); TCodice_articolo key; curr_code(key);
// TString16 livgiac; curr_giaclev(livgiac); // TString16 livgiac; curr_giaclev(livgiac);
_curr = find_child(key, 1); (TRectype&)_curr = *find_child(key, 1);
// Se ci sono almeno due figli ed e' necessario ordinare // Se ci sono almeno due figli ed e' necessario ordinare
if (_sort != 0 && find_child(key, 2) != NULL) if (_sort != 0 && has_child_num(key, 2))
{ {
TArray children; TArray children;
build_children_list(key, children); build_children_list(key, children);
const int first = ((TToken_string*)children.objptr(0))->get_int(2); const int first = ((TToken_string*)children.objptr(0))->get_int(2);
_curr = find_child(key, first); (TRectype&)_curr = *find_child(key, first);
} }
return _curr != NULL; return !_curr.empty();
} }
bool TDistinta_tree::add_child() bool TDistinta_tree::add_child()
{ {
TCodice_articolo comp = _curr->get("CODCOMP"); TCodice_articolo comp = _curr.get("CODCOMP");
TString tmp,tmp2; TString tmp,tmp2;
if (_curr->get_char("TIPO") == 'V') // Espando la variabile if (_curr.get_char("TIPO") == 'V') // Espando la variabile
{ {
tmp = get_string(comp); tmp = get_string(comp);
if (tmp.blank() || tmp.len() > comp.size()) if (tmp.blank() || tmp.len() > comp.size())
@ -1061,7 +1064,7 @@ bool TDistinta_tree::add_child()
_path.add(comp); // 0 - Codice articolo _path.add(comp); // 0 - Codice articolo
_path << TREE_SEPARATOR; _path << TREE_SEPARATOR;
tmp = _curr->get("LIVELLO"); tmp = _curr.get(RDIST_LIVELLO);
if (livgiac().enabled()) if (livgiac().enabled())
{ {
TString fgiaclev; father_giaclev(fgiaclev); TString fgiaclev; father_giaclev(fgiaclev);
@ -1069,7 +1072,7 @@ bool TDistinta_tree::add_child()
for (int l= 0 ; l < 4; l++) if (livgiac().enabled(l+1)) for (int l= 0 ; l < 4; l++) if (livgiac().enabled(l+1))
{ {
tmp2 = livgiac().unpack_grpcode(tmp, l+1); tmp2 = livgiac().unpack_grpcode(tmp, l+1);
if (_curr->get("TIPO_LIV")[l]=='E') if (_curr.get(RDIST_TIPO_LIV)[l]=='E')
{ {
tmp2 = livgiac().unpack_grpcode(fgiaclev, l+1); tmp2 = livgiac().unpack_grpcode(fgiaclev, l+1);
livgiac().pack_grpcode(tmp, tmp2 , l+1); livgiac().pack_grpcode(tmp, tmp2 , l+1);
@ -1078,18 +1081,18 @@ bool TDistinta_tree::add_child()
} }
_path << tmp; // 1 Livello giacenza _path << tmp; // 1 Livello giacenza
long num = _curr->get_long("NRIG"); long num = _curr.get_long(RDIST_NRIG);
_path << TREE_SEPARATOR << num; // 2 Numero componente _path << TREE_SEPARATOR << num; // 2 Numero componente
if (_sort > 0) if (_sort > 0)
{ {
TString16 field; field << "SORT" << _sort; TString16 field; field << "SORT" << _sort;
num = _curr->get_long(field); num = _curr.get_long(field);
} }
_path << TREE_SEPARATOR << num; // 3 Numero ordinamento _path << TREE_SEPARATOR << num; // 3 Numero ordinamento
_path << TREE_SEPARATOR << _curr->get("UM"); // 4 Unita' di misura _path << TREE_SEPARATOR << _curr.get(RDIST_UM); // 4 Unita' di misura
const TString& expr = _curr->get("EXPR"); const TString& expr = _curr.get(RDIST_EXPR);
const real qta = evaluate_numexpr(expr); const real qta = evaluate_numexpr(expr);
_path << TREE_SEPARATOR << qta; // 5 Quantita' _path << TREE_SEPARATOR << qta; // 5 Quantita'
_path << TREE_SEPARATOR << get_type(comp); // 6 - Articolo, Lavorazione, Virtuale, Ghost _path << TREE_SEPARATOR << get_type(comp); // 6 - Articolo, Lavorazione, Virtuale, Ghost
@ -1144,20 +1147,20 @@ bool TDistinta_tree::has_rbrother() const
if (c >= 0 && c < last) if (c >= 0 && c < last)
{ {
const int brother = ((TToken_string*)children.objptr(c+1))->get_int(2); const int brother = ((TToken_string*)children.objptr(c+1))->get_int(2);
_curr = find_child(father, brother); (TRectype&)_curr = *find_child(father, brother);
} }
else else
_curr = NULL; ((TRectype&)_curr).zero();
} }
else else
_curr = NULL; ((TRectype&)_curr).zero();
} }
else else
{ {
_curr = find_child(father, curr_nrig+1); (TRectype&)_curr = *find_child(father, curr_nrig+1);
} }
return _curr != NULL; return !_curr.empty();
} }
bool TDistinta_tree::goto_rbrother() bool TDistinta_tree::goto_rbrother()
@ -1199,24 +1202,24 @@ bool TDistinta_tree::has_lbrother() const
if (c > 0) if (c > 0)
{ {
const int brother = ((TToken_string*)children.objptr(c-1))->get_int(2); const int brother = ((TToken_string*)children.objptr(c-1))->get_int(2);
_curr = find_child(father, brother); (TRectype&)_curr = *find_child(father, brother);
} }
else else
_curr = NULL; ((TRectype&)_curr).zero();
} }
else else
_curr = NULL; ((TRectype&)_curr).zero();
} }
else else
{ {
const int brother = curr_nrig - 1; const int brother = curr_nrig - 1;
if (brother > 0) if (brother > 0)
_curr = find_child(father, brother); (TRectype&)_curr = *find_child(father, brother);
else else
_curr = NULL; ((TRectype&)_curr).zero();
} }
return _curr != NULL; return !_curr.empty();
} }
bool TDistinta_tree::goto_lbrother() bool TDistinta_tree::goto_lbrother()
@ -1253,8 +1256,7 @@ bool TDistinta_tree::is_root() const
bool TDistinta_tree::is_leaf() const bool TDistinta_tree::is_leaf() const
{ {
TCodice_articolo key; curr_code(key); TCodice_articolo key; curr_code(key);
const TRectype* first_son = find_child(key, 1); return !has_child_num(key, 1);
return first_son == NULL;
} }
bool TDistinta_tree::is_mag(const char* c) const bool TDistinta_tree::is_mag(const char* c) const
@ -1290,7 +1292,7 @@ char TDistinta_tree::get_type(const char* c) const
type = 'L'; // Lavorazione type = 'L'; // Lavorazione
else else
{ {
if (find_child(c, 1)) // E' una distinta if (has_child_num(c, 1)) // E' una distinta
{ {
const TString& artprod = find_head(c).get("ARTPROD"); const TString& artprod = find_head(c).get("ARTPROD");
if (artprod.blank()) if (artprod.blank())
@ -1678,17 +1680,17 @@ static bool explode_callback(TTree& node, void* jolly, word when)
{ {
const long sk = tree.curr_sort(); const long sk = tree.curr_sort();
if (sk <= 0) if (sk <= 0)
return FALSE; // Non fa parte dell'ordinamento return false; // Non fa parte dell'ordinamento
} }
if (ep._filter.find(type) < 0) if (ep._filter.find(type) < 0)
return FALSE; return false;
TRiga_esplosione* er = new TRiga_esplosione(tree, ep._filter.find('G') >= 0, tree.curr()); TRiga_esplosione* er = new TRiga_esplosione(tree, ep._filter.find('G') >= 0, tree.curr());
er->set_mat_base(is_leaf); er->set_mat_base(is_leaf);
ep._array->add(er); ep._array->add(er);
} }
return FALSE; return false;
} }
int TDistinta_tree::raggruppa(TArray& boom, TExplosion_grouping mode) const int TDistinta_tree::raggruppa(TArray& boom, TExplosion_grouping mode) const
@ -1773,7 +1775,7 @@ TCodgiac_livelli &TDistinta_tree::livgiac() const
TDistinta_tree::TDistinta_tree() TDistinta_tree::TDistinta_tree()
: _sort(0), _max_depth(0), _ignore_ghost(FALSE), : _sort(0), _max_depth(0), _ignore_ghost(FALSE),
_livgiac(NULL),_qta_on_descr(FALSE),_descr_sep('-'), _livgiac(NULL),_qta_on_descr(FALSE),_descr_sep('-'),
_tmp(80, TREE_SEPARATOR) _tmp(80, TREE_SEPARATOR), _curr(LF_RDIST)
{ {
memset(_livgiac_on_descr, 0, sizeof(_livgiac_on_descr)); memset(_livgiac_on_descr, 0, sizeof(_livgiac_on_descr));
} }

View File

@ -254,7 +254,9 @@ class TDistinta_tree : public TBidirectional_tree
bool _qta_on_descr; bool _qta_on_descr;
char _descr_sep; char _descr_sep;
static const TRectype* _curr; //static const TRectype* _curr;
TRectype _curr;
TToken_string _tmp; TToken_string _tmp;
TStack _stack; TStack _stack;
@ -271,6 +273,7 @@ protected:
virtual const TRectype& find_head(const TCodice_articolo& art) const; virtual const TRectype& find_head(const TCodice_articolo& art) const;
virtual const TRectype* find_child(const TCodice_articolo& father, int child) const; virtual const TRectype* find_child(const TCodice_articolo& father, int child) const;
bool has_child_num(const TCodice_articolo& father, int child) const;
// int build_children_pointers(const TCodice_articolo& father, TPointer_array& children) const; // int build_children_pointers(const TCodice_articolo& father, TPointer_array& children) const;
int build_children_list(const TCodice_articolo& father, TArray& children) const; int build_children_list(const TCodice_articolo& father, TArray& children) const;
@ -311,7 +314,7 @@ public:
virtual bool get_description(TString& desc) const; virtual bool get_description(TString& desc) const;
virtual TImage* image(bool selected) const; virtual TImage* image(bool selected) const;
virtual TObject* curr_node() const; virtual TObject* curr_node() const;
const TRectype * curr() const { return TDistinta_tree::_curr;} const TRectype* curr() const { return &_curr;}
const TString& describe(const TCodice_articolo& codart) const; const TString& describe(const TCodice_articolo& codart) const;
bool describe(const TCodice_articolo& codart, TString& descr) const; bool describe(const TCodice_articolo& codart, TString& descr) const;