Calcolo valori magazzino

git-svn-id: svn://10.65.10.50/trunk@3434 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-08-23 15:56:24 +00:00
parent b763d99520
commit d40e546bf6

View File

@ -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;