Задача
Datagridview показывает только последнюю запись, хотя у меня больше строк, когда текущее чтение Excel меньше, чем текущее чтение таблицы счета.
Неверный результат в операторе else для щелчка внутри btn_import для подсчета цикла
Подробнее
У меня есть лист выдачи:
unitcode CurrentReading
12 2000
14 4500
и у меня есть таблица счетов в базе данных в SQL Server 2012 имеет следующие поля
serial unitcode CurrentReading year month
1 12 1000 2018 3
3 14 5000 2018 3
так, как отобразить код блока 14 в представлении данных.
На самом деле то, что мне нужно, это когда текущая чтение кода модуля в таблице Excel меньше текущей чтения
в таблице накладной отобразить значения в datagridview.
формула следующая
Btn импорт, который импортирует из Excel
private void btn_import_Click(object sender, EventArgs e)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
System.Data.DataTable dt = new System.Data.DataTable();
dt = Showdataprint();
decimal LastMeterReading = ConvertToDecimal(GetLastReading(dt.Rows[i]["UnitCode"].ToString()));
if (!string.IsNullOrEmpty(dt.Rows[i]["CurrentMeterReading"].ToString()) && ConvertToDecimal(dt.Rows[i]["CurrentMeterReading"]) > 0 && ConvertToDecimal(dt.Rows[i]["CurrentMeterReading"]) > ConvertToDecimal(LastMeterReading))
{
//insert to table invoice
}
else
{
System.Data.DataTable dtErrorRows = new DataTable();
DataView dv2 = new DataView(dt);
dv2.RowFilter = "(CurrentMeterReading < " + LastMeterReading + ")" + "and" + "(UnitCode = " + Utilities.ObjectConverter.ConvertToInteger(dt.Rows[i]["UnitCode"]) + ")";
dv2.RowStateFilter = DataViewRowState.CurrentRows;
int a = dv2.Count;
if (dv2.Count > 0)
{
dtErrorRows = dv2.ToTable();
}
}
}
Grid.DataSource = dtErrorRows;
}
функция получения данных из Excel
public System.Data.DataTable Showdataprint()
{
string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", txtpath.Text);
OleDbConnection con = new OleDbConnection(connectionString);
con.Open();
string str = @"SELECT [UnitCode],[CurrentMeterReading] FROM [Sheet5$] ";
OleDbCommand com = new OleDbCommand();
com = new OleDbCommand(str, con);
OleDbDataAdapter oledbda = new OleDbDataAdapter();
oledbda = new OleDbDataAdapter(com);
DataSet ds = new DataSet();
ds = new DataSet();
oledbda.Fill(ds, "[Sheet5$]");
con.Close();
System.Data.DataTable dt = new System.Data.DataTable();
dt = ds.Tables["[Sheet5$]"];
return dt;
}
Для выбора текущего чтения из таблицы счетов:
private decimal GetLastReading(string UnitCode)
{
string sqlquery = "";
sqlquery = @"select isnull((select top 1 CurrentMeterReading from WAHInvoice where UnitCode=" + UnitCode + " order by year , Serial desc),0)";
object nullableValue = DataAccess.ExecuteScalar(sqlquery);
decimal myValue;
if (nullableValue == null || nullableValue == DBNull.Value)
{
myValue = 0;
}
else
{
decimal.TryParse(nullableValue.ToString(), out myValue);
}
return Utilities.ObjectConverter.ConvertToDecimal(DataAccess.ExecuteScalar(sqlquery));
}
Ожидаемый результат в datagridview
unitcode CurrentReading
14 4500