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