2016-06-13 3 views
0

Работа над приложением C# для расчета заработной платы. Как предупреждение, я очень новичок во всем этом, просто был впущен в него и наслаждался этим, но он много поглощает за короткий промежуток времени. В настоящее время я изучаю LINQ и классы. Я захватываю строки счетов из нашей учетной записи SQL-сервера и оплачивая персонал на основе продаж и некоторых ситуаций, которые могут быть определены из данных. Смотрите пример ниже:Как лучше всего обрабатывать данные в моем приложении

Ord_Inv_No  Delivery_Date  Trmnl_Key TrmnlGrp_Key 
INV-00059754 2016-05-02 07:00:00 23   3 
INV-00059839 2016-05-02 16:01:00 56   3 

Это очень небольшая часть данных, но она дает суть того, что я хочу, чтобы проанализировать. У меня есть класс, как показано ниже:

class SalesItem 
{ 

    public string DriverName { get; set; } 
    public DriverData DriverData { get; set; } 
    public int TerminalKey { get; set; } 
    public int TerminalGroupKey { get; set; } 
    public string DeliveryDate { get; set; } 
    public string CustomerLocation { get; set; } 
    public int? CustomerLocationKey { get; set; } 
    public bool? IsCredited { get; set; } 
    public string InvoiceNumber { get; set; } 
    public string TermianlGroupDesc { get; set; } 

    public SalesItem(string driverName, int terminalKey, int terminalGroupKey, string deliveryDate, 
     string customerLocation, int? customerLocationKey, bool? isCredited, string invoiceNumber, string terminalGroupDesc) 
    { 
     this.DriverName = driverName; 
     this.TerminalKey = terminalKey; 
     this.TerminalGroupKey = terminalGroupKey; 
     this.DeliveryDate = deliveryDate; 
     this.CustomerLocation = customerLocation; 
     this.CustomerLocationKey = customerLocationKey; 
     this.IsCredited = isCredited; 
     this.InvoiceNumber = invoiceNumber; 
     this.TermianlGroupDesc = terminalGroupDesc; 
    } 

Я пытаюсь реализовать способ, которым я могу 1. хранить каждый SalesItem (каждая строка) в виде коллекции из-за отсутствия лучшего слова. Я хочу выполнить итерацию по коллекции SalesItem и узнать несколько вещей, например, когда строка счет-фактуры отображается дважды с разными Trmnl_Key и двумя разными Ord_Inv_No, которые имеют ту же самую дату, что и друг друга, и возвращают максимальную ставку оплаты за два. Я написал для этого какую-то логику, которая манипулировала DataTable, который я захватывал через SQLConnection/Command/Reader/Etc, но все это было очень медленным и громоздким при работе с неделей данных, и я не мог заставить сравнение работать надежно. Далее по строкам эти строки будут помечены в DataGrid в WPF для проверки людей их заработной платы в случае чего-то фанки, входящего в бухгалтерское программное обеспечение.

Прямо сейчас, я пытаюсь сохранить коллекцию, как показано ниже (который только текущей итерации, у меня есть несколько дней стоит пытаться, что это не удалось.)

private void GetInformation(object sender, SelectionChangedEventArgs e) 
    { 
     ComboBox currentItem = sender as ComboBox; 
     int driverKey = Convert.ToInt32(currentItem.SelectedValue); 
     DriverData driver = new DriverData(); 
     driver.SetDriverData(driverKey); 
     int years = driver.ServiceYears; 
     List<SalesItem> items = (from o in transportationDb._Payroll_Orders 
           where o.Ord_Driver_Key == driverKey && 
           o.Delivery_Date >= new DateTime(2016, 5, 2) && o.Delivery_Date <= new DateTime(2016, 5, 8) 
           select new SalesItem(
            o.Driver_Name, 
            o.Trmnl_Key, 
            o.TrmnlGrp_Key, 
            o.Delivery_Date.ToString(), 
            o.CustLoc_Description, 
            o.Ord_CustLoc_Key, 
            o.Credits, o.Ord_Inv_No, o.TrmnlGrp_Description)).ToList(); 


     dataGrid.ItemsSource = items; 

    } 

Любая мудрость или направление будет ценится

+0

Вы используете Entity Framework? –

+0

вам нужно будет объявить 'List элементов' вне метода GetInformation на уровне класса, также вы видите элементы в DataGrid после того, как вы назначили ItemsSource, возможно, вам следует Google, как связать список с DataGridView. . Посмотрите, как это свойство DataSource – MethodMan

+0

EF не работает. Используйте TSQL и DataReader. – Paparazzi

ответ

0

Конечно, это не сильно отличается от того, что у вас было, но попробовать это и посмотреть, если он работает для вас:

private void GetInformation(object sender, SelectionChangedEventArgs e) 
{ 
    ComboBox currentItem = sender as ComboBox; 
    int driverKey = Convert.ToInt32(currentItem.SelectedValue); 
    DriverData driver = new DriverData(); //What's this for? 
    driver.SetDriverData(driverKey); //What's this for? 
    int years = driver.ServiceYears; //What's this for? 
    var startDate=new DateTime(2016, 5, 2); 
    var endDate=new DateTime(2016, 5, 8); 
    var items = transportationDb._Payroll_Orders 
     .Where(o=>o.Ord_Driver_Key == driverKey) 
     .Where(o=>o.Delivery_Date >= startDate && o.Delivery_Date <= endDate) 
     .Select(o=>new SalesItem { 
     DriverName=o.Driver_Name, 
     ... 
     }); 
    dataGrid.ItemsSource = items; 
} 

Если таблица ваших заказов имеет индекс O n Ord_Driver_key и Delivery_Date, тогда этот запрос должен быть довольно быстрым.

0

Я надеюсь, что это поможет в некотором роде. Я не слишком уверен в том, чего вы пытаетесь достичь. Функция сохранения может выглядеть примерно так: но я точно не знаю, какое соединение вы используете. Обратите внимание, что я проверяю, чтобы запись не существовала уже.

private void Save(SalesItem item) 
    { 
     if(!transportationDb._Payroll_Orders.Any(p => p.Ord_Inv_No == item.InvoiceNumber)) 
     { 
      transportationDb._Payroll_Orders.Add(item.PayrollOrder); 
      transportationDb.SaveChanges(); 
     } 
     else 
     { 
      // Already exists 
     } 
    } 

Update ваш класс, однако вы хотели бы, но я хотел бы сделать это таким образом из-за ограниченного знания о том, что ваш объект, предполагают, чтобы выглядеть.

class SalesItem 
{ 

    public SalesItem(_Payroll_Orders po == null, DriverData dd == null) 
    { 
     this._Payroll_Order = po != null ? po : new _Payroll_Orders(); 
     this.DriverData = dd != null ? dd : new DriverData(); 
    } 

    private _Payroll_Orders _Payroll_Order { get; set; } 

    public _Payroll_Orders PayrollOrder 
    { 
     get { return _Payroll_Order; } 
     set { _Payroll_Order = value; } 
    } 

    public string DriverName 
    { 
     get { return _Payroll_Order.Driver_Name; } 
     set { _Payroll_Order.Driver_Name= value; } 
    } 
    public DriverData DriverData { get; set; } 
    public int TerminalKey 
    { 
     get { return _Payroll_Order.Trmnl_Key; } 
     set { _Payroll_Order.Trmnl_Key= value; } 
    } 
    public int TerminalGroupKey 
    { 
     get { return _Payroll_Order.TrmnlGrp_Key; } 
     set { _Payroll_Order.TrmnlGrp_Key= value; } 
    } 
    public DateTime DeliveryDate 
    { 
     get { return _Payroll_Order.Delivery_Date; } 
     set { _Payroll_Order.Delivery_Date= value; } 
    } 
    public string CustomerLocation 
    { 
     get { return _Payroll_Order.CustLoc_Description; } 
     set { _Payroll_Order.CustLoc_Description = value; } 
    } 
    public int? CustomerLocationKey 
    { 
     get { return _Payroll_Order.Ord_CustLoc_Key; } 
     set { _Payroll_Order.Ord_CustLoc_Key = value; } 
    } 
    public bool? IsCredited 
    { 
     get { return _Payroll_Order.Credits; } 
     set { _Payroll_Order.Credits = value; } 
    } 
    public string InvoiceNumber 
    { 
     get { return _Payroll_Order.Ord_Inv_No; } 
     set { _Payroll_Order.Ord_Inv_No = value; } 
    } 
    public string TermianlGroupDesc 
    { 
     get { return _Payroll_Order.TrmnlGrp_Description; } 
     set { _Payroll_Order.TrmnlGrp_Description = value; } 
    } 
} 

, то вы можете изменить свою функцию здесь, так что вы должны выбрать только 'новый SalesItem (о, водитель)':

private void GetInformation(object sender, SelectionChangedEventArgs e) 
    { 
     ComboBox currentItem = sender as ComboBox; 
     int driverKey = Convert.ToInt32(currentItem.SelectedValue); 
     DriverData driver = new DriverData(); 
     driver.SetDriverData(driverKey); 
     int years = driver.ServiceYears; 
     List<SalesItem> items = (from o in transportationDb._Payroll_Orders 
           where o.Ord_Driver_Key == driverKey && 
           o.Delivery_Date >= new DateTime(2016, 5, 2) && 
           o.Delivery_Date <= new DateTime(2016, 5, 8) 
           select new SalesItem(o, driver)).ToList(); 

     dataGrid.ItemsSource = items; 

    } 
+0

спасибо, у меня нет времени, чтобы посмотреть его на данный момент, но через несколько часов. –

Смежные вопросы