Зацикливание заголовка и сведений в одном файле - PullRequest
0 голосов
/ 12 января 2019

Я повторно отредактировал этот вопрос ниже. У меня есть файл примера, который представляет собой несколько заказов на покупку в файле, который идентифицирован во втором столбце.

Номер заказа, Номер покупки, ДАТА, Код товара, Кол-во, Описание 1245456,98978,12 / 01/2019, 1545-878, 1, «Тест»

1245456,98978,12 / 01 / 2019,1545-342,2, "Тест"

1245456,98978,12 / 01 / 2019,1545-878,2, "Тест"

1245456,98979,12 / 02 / 2019,1545-878,3, "Испытание 3"

1245456,98979,12 / 02 / 2019,1545-342,4, "Испытание 4"

1245456,98979,12 / 02 / 2019,1545-878,5, «Тест 4»

То, что я хочу, чтобы конечный результат состоял в том, чтобы иметь возможность поместить вышеупомянутое в один класс как следующий

Как минимум, я использую filelpers для разбора файла csv, это будет работать нормально, если у меня есть файл заголовка sep и файл строки, но они объединены, как вы видите

var engine = new FileHelperEngine<CSVLines>();
var lines = engine.ReadFile(csvFileName);

Так что класс должен быть как ниже

  [DelimitedRecord(",")]
  public class SalesOrderHeader
  {
     private Guid? _guid;


    public  Guid RowID
    {
        get
        {
            return _guid ?? (_guid = Guid.NewGuid()).GetValueOrDefault();
        }
    }
    public string DocReference { get; set; }
    public string CardCode { get; set; }
    public string DocDate { get; set; }
    public string ItemCode { get; set; }

    public string Description { get; set; }
    public string Qty { get; set; }

    public string Price { get; set; }


    [FieldHidden]
    public List<SalesOrderHeader> OrdersLines { get; set; }
  }

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

 public void CreateSalesOrder(List<SalesOrderHeader> _salesOrders)
    {
        foreach (var record in _salesOrders.GroupBy(g => g.DocReference))
        {

            // Init the Order object
            oOrder = (SAPbobsCOM.Documents)company.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oOrders);
            SAPbobsCOM.SBObob oBob;
            // set properties of the Order object
           // oOrder.NumAtCard = record.Where(w=>w.RowID = record.Where()
            oOrder.CardCode = record.First().CardCode;
            oOrder.DocDueDate = DateTime.Now;

            oOrder.DocDate =Convert.ToDateTime(record.First().DocDate);
            foreach (var recordItems in _salesOrders.SelectMany(e=>e.OrdersLines).Where(w=>w.DocReference ==record.First().DocReference))
            {
                oOrder.Lines.ItemCode = recordItems.ItemCode;
                oOrder.Lines.ItemDescription = recordItems.Description;
                oOrder.Lines.Quantity = Convert.ToDouble(recordItems.Qty);
                oOrder.Lines.Price = Convert.ToDouble(recordItems.Price);

                oOrder.Lines.Add();
                log.Debug(string.Format("Order Line added to sap Item Code={0}, Description={1},Qty={2}", recordItems.ItemCode, recordItems.Description, recordItems.Qty));

            }
            int lRetCode = oOrder.Add(); // Try to add the orer to the database
        }

        if(lRetCode == 0)
        {
            string body = "Purchase Order Imported into SAP";               

        }
        if (lRetCode != 0)
        {
            int temp_int = lErrCode;
            string temp_string = sErrMsg;
            company.GetLastError(out temp_int, out temp_string);
            if (lErrCode != -4006) // Incase adding an order failed
            {
                log.Error(string.Format("Error adding an order into sap ErrorCode {0},{1}", temp_int, temp_string));
            }

        }
    }

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

1 Ответ

0 голосов
/ 17 января 2019

В FileHelpers важно избегать использования класса отображения для чего-либо, кроме описания базовой файловой структуры. Здесь я подозреваю, что вы пытаетесь сопоставить класс слишком сложным.

Класс FileHelpers - это просто способ определения спецификации плоского файла с использованием синтаксиса C #.

Таким образом, классы FileHelpers являются необычным типом класса C #, и вы не должны пытаться использовать принятые принципы ООП. FileHelpers не должен иметь свойств или методов, отличных от тех, которые используются библиотекой FileHelpers.

Думайте о классе FileHelpers как о «спецификации» только вашего формата CSV. Это должно быть его единственной ролью. (В любом случае, это хорошая практика с точки зрения обслуживания - если бы изменилась базовая структура CSV, ваш код легче адаптировать).

Тогда, если вам нужны записи в более «нормальном» объекте, сопоставьте результаты с чем-то лучшим, то есть с классом, который инкапсулирует все функциональные возможности объекта Order, а не CSVOrder.

Итак, один из способов обработки файлов этого типа - это анализ файла дважды. На первом проходе вы извлекаете заголовок записи. Примерно так:

var engine1 = new FileHelperEngine<CSVHeaders>();
var headers = engine1.ReadFile(csvFileName);

Во втором проходе вы извлекаете детали;

var engine2 = new FileHelperEngine<CSVDetails>();
var details = engine2.ReadFile(csvFileName);

Затем вы объединяете эту информацию в новый выделенный класс, возможно, с некоторым LINQ, похожим на этот

var niceOrders = 
    headers
        .DistinctBy(h => h.OrderNumber)
            .SelectMany(d => details.Where(d => d.OrderNumber = y))
                 .Select(x => 
                      new NiceOrder() { 
                          OrderNumber = x.OrderNumber,  
                          Customer = x.Customer,
                          ItemCode = x.ItemCode                                     
                          // etc.
                      });
...