Calcolo valori magazzino
git-svn-id: svn://10.65.10.50/trunk@3434 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
b763d99520
commit
d40e546bf6
@ -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);
|
||||
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user