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:
parent
453890fd36
commit
e4e44ab7f4
80
db/dblib.cpp
80
db/dblib.cpp
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user