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
|
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);
|
||||||
|
if (curtype == _numexpr)
|
||||||
|
expr->setvar(var, (real&)stack.peek(nparms-n));
|
||||||
|
else
|
||||||
expr->setvar(var, (TString&)stack.peek(nparms-n));
|
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user