Datagridview показывает только последнюю запись, хотя у меня больше строк при сравнении текущего чтения Excel и таблицы счетов - PullRequest
0 голосов
/ 25 апреля 2018

Задача

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
...