In final am gasit o solutie si mai buna. Modific selectul initial a.i. sa scap de selectul interior. In loc de selectul interior, coloana sold va avea valoarea 0 pe toate inregistrarile. Adaug o coloana noua la DT care se numeste "CalculatedSum". Setul de date astfel obtinut il incarc intr-un DataTable. Parcurg DT cu ajutorul urmatoarei functii (C#) si calculez sold:
if (dtCopy != null)
{
bool bFirstRow = true;
decimal dPrevSold = 0;
string sPrevCont = "";
foreach (DataRow dr in dtCopy.Rows)
{
if (!dr["CONT"].ToString().Equals(sPrevCont))
{
dPrevSold = 0;
sPrevCont = dr["CONT"].ToString();
}
if (bFirstRow)
{
dr["CalculatedSum"] = Convert.ToDecimal(dr["debit"]) - Convert.ToDecimal(dr["credit"]);
bFirstRow = false;
}
else
{
dr["CalculatedSum"] = dPrevSold + Convert.ToDecimal(dr["debit"]) - Convert.ToDecimal(dr["credit"]);
}
dPrevSold = Convert.ToDecimal(dr["CalculatedSum"]);
}
}
Dupa modificarea de mai sus toata treaba tine 10 secunde in loc de 4-5 minute cat tinea initial. (Cred ca se poate scapa de coloana noua, numai ca eu aveam DT asociat unui grid - caz special si facea figuri - evident, ca solutia se mai poate finisa)
Consider problema rezolvata si multumesc tuturor celor care s-au implicat si au incercat sa ma ajute :)