diff --git a/ca/ca3700.cpp b/ca/ca3700.cpp
index 6078a3123..dbff84f42 100755
--- a/ca/ca3700.cpp
+++ b/ca/ca3700.cpp
@@ -247,6 +247,7 @@ protected:
 	void crea_righe_rdoc(const TPrint_rendiconto_ca_mask& msk);
 	void crea_trr(const TFilename& trr) const;
 	void salva_rmovana(const TRectype& rmovana, const TRectype& movana);
+	real somma_budget(const TString& codconto, const char* tipomovana);
 
 
 public:
@@ -259,6 +260,8 @@ public:
 
 static const TPrint_rendiconto_ca_recordset* myself = NULL;
 
+TPrint_rendiconto_ca_recordset* rendiconto_recordset() { return (TPrint_rendiconto_ca_recordset* ) myself;}
+
 //metodo per riconoscere se il record corrente soddisfa i filtri della maschera...strafighissimo!
 bool TPrint_rendiconto_ca_recordset::valid_record(const TRelation& rel) const
 {
@@ -309,7 +312,7 @@ bool TPrint_rendiconto_ca_recordset::mov_filter(const TRelation* rel)
 void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const
 {
 	//filtro sui conti selezionati sulla maschera
-	TRectype darec(cur.curr()), arec(cur.curr());	//record corrente (rmovana (solo movimentati))
+	TRectype darec(cur.curr()), arec(cur.curr());
 	darec.put(RMOVANA_CODCONTO, _daconto);
 	darec.put(RMOVANA_DATACOMP, _dadata);
 	arec.put(RMOVANA_CODCONTO, _aconto);
@@ -320,28 +323,80 @@ void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const
   cur.set_filterfunction(mov_filter, true);
 }
 
+//metodo per il calcolo del budget PREVENTIVO o VARIAZIONE (sezione di raggruppamento sul report)
+real TPrint_rendiconto_ca_recordset::somma_budget(const TString& codconto, const char* tipomovana)
+{
+	real budget = ZERO;
+
+	TRelation rel_rmovana(LF_RMOVANA);
+	rel_rmovana.add(LF_MOVANA, "NUMREG==NUMREG");
+
+	//..crea un cursore su movana per avere solo i conti di tipo tipomovana, con il codice conto
+	//selezionato e la datacomp compresa nell'intervallo date
+	TRectype da_rmovana(LF_RMOVANA);
+	da_rmovana.put(RMOVANA_CODCONTO, codconto);
+	da_rmovana.put(RMOVANA_DATACOMP, _dadata);
+	TRectype a_rmovana(LF_RMOVANA);
+	a_rmovana.put(RMOVANA_CODCONTO, codconto);
+	a_rmovana.put(RMOVANA_DATACOMP, _adata);
+
+	TString filtro;
+	filtro << "(MOVANA_TIPODOC==" << tipomovana << ")";
+
+	TCursor cur_rmovana(&rel_rmovana, filtro, 2, &da_rmovana, &a_rmovana);
+	const long rmovana_items = cur_rmovana.items();
+	cur_rmovana.freeze();
+
+	if (rmovana_items > 0)
+	{
+		const TRectype& movana = rel_rmovana.curr(LF_MOVANA);
+		for (cur_rmovana = 0; cur_rmovana.pos() < rmovana_items; ++cur_rmovana)
+		{
+			if (movana.get_char(MOVANA_SEZIONE) == 'D')
+				budget -= movana.get_real(MOVANA_TOTDOC);
+			if (movana.get_char(MOVANA_SEZIONE) == 'A')
+				budget += movana.get_real(MOVANA_TOTDOC);
+		}
+	}
+	return budget;
+}
 
 const TVariant& TPrint_rendiconto_ca_recordset::get(const char* column_name) const
 {
 
-  if (strcmp(column_name, "#COSTO") == 0)
-  {
-    TVariant& var = get_tmp_var();
-    var = _codcosto;
-    return var;
-  }
-  if (strcmp(column_name, "#COMMESSA") == 0)
-  {
-    TVariant& var = get_tmp_var();
-    var = _codcms;
-    return var;
-  }
-  if (strcmp(column_name, "#FASE") == 0)
-  {
-    TVariant& var = get_tmp_var();
-    var = _codfas;
-    return var;
-  }
+	if (*column_name == '#')
+	{
+		if (strcmp(column_name, "#COSTO") == 0)
+		{
+			TVariant& var = get_tmp_var();
+			var = _codcosto;
+			return var;
+		}
+		if (strcmp(column_name, "#COMMESSA") == 0)
+		{
+			TVariant& var = get_tmp_var();
+			var = _codcms;
+			return var;
+		}
+		if (strcmp(column_name, "#FASE") == 0)
+		{
+			TVariant& var = get_tmp_var();
+			var = _codfas;
+			return var;
+		}
+		if (strcmp(column_name, "#PREVENTIVO") == 0)
+		{
+			TVariant& var = get_tmp_var();
+			var = rendiconto_recordset()->somma_budget(get(RMOVANA_CODCONTO).as_string(), "P");
+			return var;
+		}
+		if (strcmp(column_name, "#VARIAZIONE") == 0)
+		{
+			TVariant& var = get_tmp_var();
+			var = rendiconto_recordset()->somma_budget(get(RMOVANA_CODCONTO).as_string(), "V");
+			return var;
+		}
+	}
   return TISAM_recordset::get(column_name);
 }
 
@@ -353,8 +408,8 @@ void TPrint_rendiconto_ca_recordset::salva_rmovana(const TRectype& rmovana, cons
 	{
 		//scegli i campi da mettere
 		_tmp->curr().put("CONTO", rmovana.get(RMOVANA_CODCONTO));	//conto
-		_tmp->curr().put("DCODNUM", movana.get(MOVANA_DCODNUM));	//codnum del documento che origina il movana
-		_tmp->curr().put("DATAREG", movana.get(MOVANA_DATAREG));	//data del movana
+		_tmp->curr().put("CODNUM", movana.get(MOVANA_DCODNUM));	//codnum del documento che origina il movana
+		_tmp->curr().put("DATA", movana.get(MOVANA_DATAREG));	//data del movana
 		_tmp->curr().put("NUMREG", movana.get(MOVANA_NUMREG)); 
 		_tmp->curr().put("NUMDOCRIF", movana.get(MOVANA_DNDOC));
 		_tmp->curr().put("DATADOCRIF", movana.get(MOVANA_DATADOC));
@@ -497,7 +552,7 @@ void TPrint_rendiconto_ca_recordset::crea_righe_rdoc(const TPrint_rendiconto_ca_
 void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const
 {
 	ofstream of(trr);
-	of << 1005 << endl;
+	of << 1000 << endl;
 	of << 13 << endl;
 	of << "CONTO|1|20|0|Conto analitico" << endl;
 	of << "CODNUM|1|4|0|Numerazione documento" << endl;
@@ -519,8 +574,12 @@ void TPrint_rendiconto_ca_recordset::crea_trr(const TFilename& trr) const
 void TPrint_rendiconto_ca_recordset::set_filter(const TPrint_rendiconto_ca_mask& msk, int cms_row)
 {
 	//se esiste il file temporano con tracciato persomalizzato lo cancella e lo ricrea vuoto
-  TFilename trr; trr.temp(); trr.add("rendiconto.trr");  
-  TFilename dbf(trr); dbf.ext("dbf");
+  TFilename trr; 
+	trr.temp("rendy");
+	TFilename dbf(trr);
+
+  trr.ext("trr");   
+	dbf.ext("dbf");
 	
 	//crea il file .trr in base ai parametri del metodo
 	crea_trr(trr);