diff --git a/ve/ve4100.cpp b/ve/ve4100.cpp index b897e4880..7455f694d 100755 --- a/ve/ve4100.cpp +++ b/ve/ve4100.cpp @@ -18,18 +18,27 @@ class TTable_expression : public TExpression { static TAssoc_array _expr; - void load_expr(); + static const TRelation* _rel; protected: - virtual void evaluate_user_func(const char* name, int nparms, TStack& stack) const; - + virtual void evaluate_user_func(const char* name, int nparms, + TStack& stack, TTypeexp curtype) const; + + int str2file(const TString& s) const; + void load_expr(); + const TRelation& get_relation() const { CHECK(_rel, "NULL relation"); return *_rel; } + const char* get_var(const char* v) const; + public: + void set_relation(const TRelation& rel) { _rel = &rel; } + TTable_expression(TTypeexp t) : TExpression(t) { } TTable_expression(const char* expr, TTypeexp t) : TExpression(expr, t) { } virtual ~TTable_expression() { } }; TAssoc_array TTable_expression::_expr; +const TRelation* TTable_expression::_rel = NULL; void TTable_expression::load_expr() { @@ -48,15 +57,48 @@ void TTable_expression::load_expr() } } -void TTable_expression::evaluate_user_func(const char* name, int nparms, TStack& stack) const +int TTable_expression::str2file(const TString& str) const +{ + HIDDEN const char* const s = "AUDCR"; + HIDDEN const int logicnum[] = { LF_ANAMAG, LF_UMART, LF_DESLIN, LF_CONDV, LF_RCONDV }; + const char* p = strchr(s, str[0]); + CHECKS(p, "Identificatore di file errato: ", (const char*)str); + const int ln = logicnum[p-s]; + return ln; +} + +const char* TTable_expression::get_var(const char* v) const +{ + TString var(v); + int logicnum = 0; + const int arrow = var.find("->"); + if (arrow > 0) + { + logicnum = str2file(var); + var = var.mid(arrow+2); + } + const char* val = ""; + if (get_relation().exist(logicnum)) + { + const TFieldref fr(var, logicnum); + val = fr.read(get_relation()); + } + else + NFCHECK("Il campo %s non appartiene alla relazione.", v); + return val; +} + +void TTable_expression::evaluate_user_func(const char* name, int nparms, + TStack& stack, TTypeexp curtype) const { TTable_expression* expr = (TTable_expression*)_expr.objptr(name); if (expr == NULL) { - TExpression::evaluate_user_func(name, nparms, stack); + TExpression::evaluate_user_func(name, nparms, stack, curtype); return; } + // Assegna i valori a tutte le variabili dell'espressione TString var; for (int v = expr->numvar()-1; v >= 0; v--) { @@ -64,14 +106,31 @@ void TTable_expression::evaluate_user_func(const char* name, int nparms, TStack& if (var[0] == '_') // Parametro della funzione { const int n = atoi(var.mid(2,0)); - CHECKS(var[1] == 'P' && n > 0 && n <= nparms, "Parametro errato ", (const char*)var); - expr->setvar(var, (TString&)stack.peek(nparms-n)); + CHECKS(n > 0 && n <= nparms, "Parametro errato ", (const char*)var); + if (curtype == _numexpr) + expr->setvar(var, (real&)stack.peek(nparms-n)); + else + expr->setvar(var, (TString&)stack.peek(nparms-n)); + } + else + { + const char* val = get_var(var); + if (curtype == _numexpr) + expr->setvar(var, real(val)); + else + expr->setvar(var, TString(val)); } } - // Vuota lo stack - for (v = nparms; v > 0; v--) + // Toglie i parametri dallo stack + for (int p = nparms; p > 0; p--) stack.pop(); + + // Mette il risultato sullo stack + if (curtype == _numexpr) + stack.push((const real&)expr); + else + stack.push((const TString&)expr); } /////////////////////////////////////////////////////////// @@ -410,7 +469,7 @@ bool TRicalcolo_mask::key_handler(TMask_field& f, KEY k) const int cur_key = atoi(f.get()); TToken_string& key_expr = m.get_key_expr(cur_key); const bool empty = key_expr.empty_items(); - bool enable_first_row = TRUE; + int first_enabled = 0; TSheet_field& sheet = (TSheet_field&)m.field(F_FIELDS); TString_array& sa = sheet.rows_array(); @@ -429,9 +488,12 @@ bool TRicalcolo_mask::key_handler(TMask_field& f, KEY k) sa.row(r).add(des.get_field_description(field), F_DESCR-F_FIELD); } if (des.file_num() == LF_CONDV || des.file_num() == LF_RCONDV) - enable_first_row = FALSE; + first_enabled = 4; } - sheet.enable_cell(0, -1, enable_first_row); + + for (int r = sa.items()-1; r >= 0; r--) + sheet.enable_cell(0, -1, r >= first_enabled); + sheet.force_update(); } return TRUE;