public static bool TPSPC_add(int baseyear, int year, int nature)
{
sb_inster_sql.Remove (0, sb_inster_sql.Length ); bool rv =false ;
string itemno, productid, log_tag;
double tp_lc,tp_eu,tp_us,spc_lc,spc_eu,spc_us;
double maxtp_lc,maxtp_eu,maxtp_us,maxspc_lc,maxspc_eu,maxspc_us;
int forecastbudget; // 0: forecast, 1: budget
int returnresult=0;
int j;
DateTime dt_trandate;
DataView dv;
DataView tmpdv;
DBOperator db;
int result; maxtp_lc = maxtp_eu = maxtp_us = maxspc_lc = maxspc_eu = maxspc_us=0.0;

string sql="" ;
int ti=0 ;
StringCollection msgs= new StringCollection();

// start import data
// nature: 0 forecast, 1-budget1, 2-budget2, 3-budget3
forecastbudget = 1;
log_tag = "";

if (nature == 0)
{
log_tag = "Forecast: ";
dv=csv.getDataView(Const.importFileForecast) ;
year = baseyear;
forecastbudget = 0;
}
else if (nature == 1)
{
log_tag = "Budget1: ";
dv=csv.getDataView(Const.importFileBudget1) ;
}
else if (nature == 2)
{
log_tag = "Budget2: ";
dv=csv.getDataView(Const.importFileBudget2) ;
}
else if (nature == 3)
{
log_tag = "Budget3: ";
dv=csv.getDataView(Const.importFileBudget3) ;
}
else
{
Error.LogToFile(msgs,Const.logTPSPC,true);
return false;
}

db = DBOperator.Instance();
db.Open ();
SqlParameter[] prams={ db.MakeInParam("@nature",SqlDbType.Int,40,forecastbudget),
db.MakeInParam("@baseyyyy",SqlDbType.Int,40,baseyear),
db.MakeInParam("@yyyy",SqlDbType.Int,40,year),
db.MakeOutParam("@result", SqlDbType.Int, 40)};
db.RunProc("DeleteTpSpc", prams) ;
result = Convert.ToInt32(prams[3].Value.ToString()) ;
db.Close(); init_TPSPC_import_data(baseyear, year, nature) ;

msgs.Add ( "Import TPSPC:"+log_tag); j = 0;
foreach(DataRowView tr in dv)
{
j++;

tp_lc=tp_eu=tp_us=0;
spc_lc=spc_eu=spc_us=0; itemno =tr["itemno"].ToString().Trim();
if (tr["tp_lc"].ToString().Trim() != "")
{
tp_lc =Convert.ToDouble(StrApi.getToDecimal(tr["tp_lc"].ToString().Trim()));
}
if (tr["spc_lc"].ToString().Trim() != "")
{
spc_lc =Convert.ToDouble(StrApi.getToDecimal(tr["spc_lc"].ToString().Trim()));
}
if (tr["tp_eu"].ToString().Trim() != "")
{
tp_eu =Convert.ToDouble(StrApi.getToDecimal(tr["tp_eu"].ToString().Trim()));
}
if (tr["spc_eu"].ToString().Trim() != "")
{
spc_eu =Convert.ToDouble(StrApi.getToDecimal(tr["spc_eu"].ToString().Trim()));
}
if (tr["tp_us"].ToString().Trim() != "")
{
tp_us =Convert.ToDouble(StrApi.getToDecimal(tr["tp_us"].ToString().Trim()));
}
if (tr["spc_us"].ToString().Trim() != "")

spc_us =Convert.ToDouble(StrApi.getToDecimal(tr["spc_us"].ToString().Trim()));
} //msgs.Add("Import TPSPC:"+log_tag+j+" Start:Itemno:"+itemno);

productid = (string)hs_product[itemno] ;
if (productid != null)
{
// check productid be already existed in the tp/spc 
// get max tp and spc and then update the max one string[] count_list = (string [])hs_TPSPC_imp1[productid] ;
if (count_list != null)
{
msgs.Add("Update TPSPC:Itemno:"+itemno); if (count_list[0] != "")
maxtp_lc = Convert.ToDouble(count_list[0]);
if (count_list[1] != "")
maxtp_us = Convert.ToDouble(count_list[1]);
if (count_list[2] != "")
maxtp_eu = Convert.ToDouble(count_list[2]);

if (count_list[3] != "")
maxspc_lc = Convert.ToDouble(count_list[3]);
if (count_list[4] != "")
maxspc_us = Convert.ToDouble(count_list[4]);
if (count_list[5] != "")
maxspc_eu = Convert.ToDouble(count_list[5]); if (tp_lc < maxtp_lc)
tp_lc = maxtp_lc;
if (tp_us < maxtp_us)
tp_us = maxtp_us;
if (tp_eu < maxtp_eu)
tp_eu = maxtp_eu;
if (spc_lc < maxspc_lc)
spc_lc = maxspc_lc;
if (spc_us < maxspc_us)
spc_us = maxspc_us;
if (spc_eu < maxspc_eu)
spc_eu = maxspc_eu;

returnresult = 1 ;
}

if (returnresult > 0)
{
sql= "update BATpSpc set "+
" tp_lc="+tp_lc +","+" spc_lc="+spc_lc+","+
" tp_eu="+tp_eu +","+" spc_eu="+spc_eu+","+
" tp_usd="+tp_us +","+" spc_usd="+spc_us+
" where nature = "+forecastbudget +" AND productid='"+productid+"' AND yyyy="+
baseyear + " AND budget_yyyy="+year;  hs_TPSPC_imp1.Remove(productid);
}
else
{
msgs.Add("insert TPSPC:Itemno:"+itemno); sql= "insert into BATpSpc (productid,yyyy,budget_yyyy, nature,tp_lc,spc_lc,tp_eu,spc_eu,tp_usd,spc_usd" + 
") values ("+"'"+productid+"'"+","+baseyear+","+
year+","+forecastbudget+","+tp_lc+","+spc_lc+","+
tp_eu+","+spc_eu+","+tp_us+","+spc_us+
")";
}
string dKey = productid ;
if (hs_TPSPC_imp1[dKey] == null)
{
string [] dValue = {tp_lc.ToString().Trim(), tp_us.ToString().Trim(),tp_eu.ToString().Trim(),spc_lc.ToString().Trim(), spc_us.ToString().Trim(), spc_eu.ToString().Trim()} ;
hs_TPSPC_imp1.Add (dKey, dValue);
}

sb_inster_sql.Append (sql + ";") ;
}
else
{
msgs.Add(" TPSPC:Non-exist Itemno:"+itemno);
} ti++ ;
if (ti%100 == 0)
{
import_to_database(sb_inster_sql.ToString ());
sb_inster_sql.Remove (0, sb_inster_sql.Length );
}

} sb_inster_sql.Remove (0, sb_inster_sql.Length );

rv=true ;
dv.Dispose();

Error.LogToFile(msgs,Const.logTPSPC,true);

return rv ;
} public static void init_TPSPC_import_data(int baseyear, int year, int nature)
{
init_product_data() ; int forecastbudget = 1;
if (nature == 0)
{
forecastbudget = 0 ;
} hs_TPSPC_imp1.Clear ();
SQLDetail db = new SQLDetail();
string dKey ;
string sql_str = "Select productid, max(tp_lc) as tp_lc,max(tp_usd) as tp_usd,max(tp_eu) as tp_eu, max(spc_lc) as spc_lc,max(spc_usd) as spc_usd,max(spc_eu) as spc_eu from BATPSPC where nature=" + forecastbudget + " AND yyyy=" + baseyear + " AND budget_yyyy=" + year + " group by productid ";
SqlDataReader rs = db.getDataReader(sql_str);
while (rs.Read())
{
dKey = rs["productid"].ToString();
if (hs_TPSPC_imp1[dKey] == null)
{
string [] dValue = {rs["tp_lc"].ToString().Trim(), rs["tp_usd"].ToString().Trim(), rs["tp_eu"].ToString().Trim(), rs["spc_lc"].ToString().Trim(), rs["spc_usd"].ToString().Trim(), rs["spc_eu"].ToString().Trim()} ;
hs_TPSPC_imp1.Add (dKey, dValue);
}
}
rs.Close();

}