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 class TTable_expression : public TExpression
{ {
static TAssoc_array _expr; static TAssoc_array _expr;
void load_expr(); static const TRelation* _rel;
protected: 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: public:
void set_relation(const TRelation& rel) { _rel = &rel; }
TTable_expression(TTypeexp t) : TExpression(t) { } TTable_expression(TTypeexp t) : TExpression(t) { }
TTable_expression(const char* expr, TTypeexp t) : TExpression(expr, t) { } TTable_expression(const char* expr, TTypeexp t) : TExpression(expr, t) { }
virtual ~TTable_expression() { } virtual ~TTable_expression() { }
}; };
TAssoc_array TTable_expression::_expr; TAssoc_array TTable_expression::_expr;
const TRelation* TTable_expression::_rel = NULL;
void TTable_expression::load_expr() 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); TTable_expression* expr = (TTable_expression*)_expr.objptr(name);
if (expr == NULL) if (expr == NULL)
{ {
TExpression::evaluate_user_func(name, nparms, stack); TExpression::evaluate_user_func(name, nparms, stack, curtype);
return; return;
} }
// Assegna i valori a tutte le variabili dell'espressione
TString var; TString var;
for (int v = expr->numvar()-1; v >= 0; v--) 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 if (var[0] == '_') // Parametro della funzione
{ {
const int n = atoi(var.mid(2,0)); const int n = atoi(var.mid(2,0));
CHECKS(var[1] == 'P' && n > 0 && n <= nparms, "Parametro errato ", (const char*)var); CHECKS(n > 0 && n <= nparms, "Parametro errato ", (const char*)var);
expr->setvar(var, (TString&)stack.peek(nparms-n)); 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 // Toglie i parametri dallo stack
for (v = nparms; v > 0; v--) for (int p = nparms; p > 0; p--)
stack.pop(); 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()); const int cur_key = atoi(f.get());
TToken_string& key_expr = m.get_key_expr(cur_key); TToken_string& key_expr = m.get_key_expr(cur_key);
const bool empty = key_expr.empty_items(); 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); TSheet_field& sheet = (TSheet_field&)m.field(F_FIELDS);
TString_array& sa = sheet.rows_array(); 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); sa.row(r).add(des.get_field_description(field), F_DESCR-F_FIELD);
} }
if (des.file_num() == LF_CONDV || des.file_num() == LF_RCONDV) 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(); sheet.force_update();
} }
return TRUE; return TRUE;