diff --git a/ca/calib01.cpp b/ca/calib01.cpp
index b6b027712..ddb3afc38 100755
--- a/ca/calib01.cpp
+++ b/ca/calib01.cpp
@@ -1310,6 +1310,93 @@ bool TAnal_app::user_destroy()
 // TAnal_mov
 ///////////////////////////////////////////////////////////
 
+const char * TAnal_mov::row_anal_code(int logicnum, int row) const
+{
+	const TMultilevel_code_info & c = ca_multilevel_code_info(logicnum);
+	const int levels = c.levels();
+	TString & code = get_tmp_string();
+
+	for (int i = 0; i < levels; i++)
+	{
+		TFieldref fr = c.fieldref(i);
+
+		if (fr.name() == "CODCOSTO")
+			fr.set_name(RMOVANA_CODCCOSTO);
+		if (logicnum == LF_FASI && fr.name() == "CODCMSFAS")
+			continue;
+
+		const TString & s = fr.read(body()[row]);
+
+		if (s.full())
+		{
+			if (code.full())
+				code << " ";
+			code << s;
+		}
+	}
+	return code;
+}
+
+const char * TAnal_mov::row_code(int row) const
+{
+	const TMultilevel_code_info & fasi = ca_multilevel_code_info(LF_FASI);
+  TConfig& cfg = ca_config();
+	bool fase_added = false;
+	const TString16 codfase(row_anal_code(LF_FASI, row));
+	bool fase_to_add = codfase.full();
+	TString code;
+  
+	for (int i = 0; i < 2; i++)
+  {
+    const TString& level = cfg.get("Level", NULL, i+1);  // Legge il livello 1 o 2
+
+    if (level == "CDC")                                  // Crea centro di costo 
+    {
+			const TString & codcdc = row_anal_code(LF_CDC, row);
+
+			if (codcdc.full())
+			{
+				if (code.full())
+					code << " ";
+				code << codcdc;
+			}
+      if (fase_to_add && fasi.parent() == LF_CDC)
+			{
+				if (code.full())
+					code << " ";
+				code << codfase;
+				fase_to_add = false;
+			}
+		}
+		else
+			if (level == "CMS")                                  // Crea centro di costo 
+			{
+				const TString & codcms = row_anal_code(LF_COMMESSE, row);
+
+				if (codcms.full())
+				{
+					if (code.full())
+						code << " ";
+					code << codcms;
+				}
+
+				if (fase_to_add && fasi.parent() == LF_COMMESSE)
+				{
+					if (code.full())
+						code << " ";
+					code << codfase;
+					fase_to_add = false;
+				}
+			}
+	}
+	if (fase_to_add)
+	{
+		if (code.full())
+			code << " ";
+		code << codfase;
+	}
+	return get_tmp_string() = code;
+}
 void TAnal_mov::saldo_set_reset(const TRectype& row, bool reset)
 {
   const int dec = TCurrency::get_firm_dec();
diff --git a/ca/calib01.h b/ca/calib01.h
index bf4f6939a..9086ebe71 100755
--- a/ca/calib01.h
+++ b/ca/calib01.h
@@ -158,7 +158,10 @@ public:
 public:
   int read(long numreg, word lockop = _nolock); // Funzione read di comodo
   void update_totdoc();
-  TAnal_mov(long numreg = 0);
+	const char * row_anal_code(int logicnum, int i) const;
+	const char * row_code(int i) const;
+
+	TAnal_mov(long numreg = 0);
 	TAnal_mov(const TRectype& rec);	//accetta LF_MOVANA,LF_RMOVANA,LF_MOV
 };