// Загрузка списка клиентов и контрактов из xml документа сформированного MS Access public void AccessXmlToClients(ListClients clients) { /* Закоментировано для варианта с добавлением новых записей * // Очищаем все списки * Clients.clients.Clear(); * * Clients.AllContracts.Clear(); * Clients.AllServices.Clear(); * Clients.AllNameWorks.Clear(); * Clients.AllNameDevices.Clear(); * Clients.AllAddInfo.Clear(); */ #region CultureInfo setting CultureInfo ci = Thread.CurrentThread.CurrentCulture; ci = (CultureInfo)ci.Clone(); ci.NumberFormat.CurrencyGroupSeparator = " "; ci.NumberFormat.NumberDecimalSeparator = "."; Thread.CurrentThread.CurrentCulture = ci; #endregion foreach (XElement xe in xClients.Element("dataroot").Elements("Клиенты")) {// int id = int.Parse(xe.Element("КодКлиента").Value); string name = xe.Element("НазваниеКомпании").Value; string settlementAccount = xe.Element("АдресВыставленияСчета")?.Value; string city = xe.Element("Город")?.Value; string address = xe.Element("ОбластьКрайРеспублика")?.Value; Client client; // Проверяем, есть ли клиент. Если нет - создаём if (clients.Contains(id)) { client = clients[id]; } else { client = new Client(name, id, settlementAccount, city, address); clients.Add(client); } string svalue; IEnumerable <XElement> xelement = xe.Elements("Договоры"); if (xelement != null) { foreach (XElement element in xelement) { id = int.Parse(element.Element("КодЗаказа").Value); if (Clients.AllContracts.ContainsKey(id)) { continue; } svalue = element.Element("ДатаРазмещения")?.Value; if (!DateTime.TryParse(svalue, out DateTime dt)) { dt = DateTime.MinValue; } svalue = element.Element("НомерЗаказа")?.Value; int number = (int)double.Parse(svalue ?? "0"); svalue = element.Element("Сумма")?.Value; decimal summ = decimal.Parse(svalue ?? "0"); bool signed = (int.Parse(element.Element("Наличие_x0020_договора").Value) == 1); string sfn = GetFileName(element.Element("ФайлДоговора")?.Value); var regex = new Regex(@"(\.\.\\)|(/)|(\.\./)|%20"); string filename = regex.Replace(sfn, (m) => { if (m.Value == @"..\") { return(@"\"); } if (m.Value == "../") { return(@"\"); } if (m.Value == "%20") { return(" "); } return(@"\"); }); TypeContract tc; if (filename == null) { tc = TypeContract.Contract; } else { tc = (filename.Contains("Договор")) ? TypeContract.Contract // Договор : TypeContract.CWC; // Акт приёмки сдачи работ } var contract = new Contract(client, id, dt, number, summ, signed, filename, tc); // Получаем правильный путь к файлу договора string path = Clients.GetPathFile(contract.FileName, Clients.DefaultPathFile); if (path != null) { contract.LoadServicesFrom_xls(path); // загружаем список услуг договора } client.contracts.Add(contract); } } } }
// Fill List clients and List contracts (foreach(Element)) public void XmlToClientsAndContracts(ListClients clients) { // Очищаем все списки Clients.clients.Clear(); Clients.AllContracts.Clear(); Clients.AllServices.Clear(); #region CultureInfo setting CultureInfo ci = Thread.CurrentThread.CurrentCulture; ci = (CultureInfo)ci.Clone(); ci.NumberFormat.CurrencyGroupSeparator = " "; ci.NumberFormat.NumberDecimalSeparator = "."; Thread.CurrentThread.CurrentCulture = ci; #endregion XElement xelm = xClients.Element("Clients").Element("CommonData"); // загружаем общие данные, если они есть if (xelm != null) { // Загружаем списки наименований услуг, названий устройств, названий подразделений ReadListFromXml(Clients.AllNameWorks, xelm.Element("ListNameWorks")?.Elements()); ReadListFromXml(Clients.AllNameDevices, xelm.Element("ListNameDevices")?.Elements()); ReadListFromXml(Clients.AllAddInfo, xelm.Element("ListAddInfo")?.Elements(), "InfoString"); // Загружаем список всех услуг IEnumerable <XElement> xelements = xelm.Element("ListServices")?.Elements(); if (xelements != null) { foreach (XElement xe in xelements) { int id = int.Parse(xe.Attribute("Id").Value); var sv = new Service(Clients.AllNameWorks[int.Parse(xe.Element("NameWork").Attribute("Id").Value)].Name, Clients.AllNameDevices[int.Parse(xe.Element("NameDevice").Attribute("Id").Value)].Name, int.Parse(xe.Element("Subdivision").Attribute("Id").Value), int.Parse(xe.Element("Number").Value), decimal.Parse(xe.Element("Value").Value), id, Clients.AllAddInfo[int.Parse(xe.Element("AddInfo").Attribute("Id").Value)].Name); sv.Add(); } } } // Загружаем список клиентов foreach (XElement xe in xClients.Element("Clients").Elements("Client")) { int id = int.Parse(xe.Attribute("ClientId").Value); string name = xe.Element("ClientName").Value; string settlementAccount = xe.Element("SettlementAccount")?.Value; string city = xe.Element("City")?.Value; string address = xe.Element("Address")?.Value; if (clients.Contains(id)) { // Ошибка! Повтор идентификатора в xml файле } var client = new Client(name, id, settlementAccount, city, address); clients.Add(client); client.Subdivisions.Clear(); // загружаем список подразделений данного клиента IEnumerable <XElement> xelement = xe.Element("Subdivisions")?.Elements(); if (xelement != null) { foreach (XElement element in xelement) { if (client.Subdivisions.ContainsValue(element.Value)) {// Ошибка! Повтор имени подразделения в xml файле } client.AddSubdivision(element.Value, int.Parse(element.Attribute("Id").Value)); } } // загружаем список договоров данного клиента xelement = xe.Element("Contracts")?.Elements(); if (xelement != null) { foreach (XElement element in xelement) { id = int.Parse(element.Attribute("ContractId").Value); string svalue = element.Element("DateContract")?.Value; if (!DateTime.TryParse(svalue, out DateTime dt)) { dt = DateTime.MinValue; } svalue = element.Element("Number")?.Value; int number = (int)double.Parse(svalue ?? "0"); svalue = element.Element("Summ")?.Value; decimal summ = decimal.Parse(svalue ?? "0"); bool signed = bool.Parse(element.Element("Signed").Value); var regex = new Regex(@"(\.\.\\)|(/)|(\.\./)|%20"); svalue = regex.Replace(element.Element("FileName")?.Value, (m) => { if (m.Value == @"..\") { return(@"\"); } if (m.Value == "../") { return(@"\"); } if (m.Value == "%20") { return(" "); } return(@"\"); }); TypeContract tc; if (svalue == null) { tc = TypeContract.Contract; } else { tc = (svalue.Contains("Акт")) ? TypeContract.CWC // Акт приёмки сдачи работ : TypeContract.Contract; // Договор } var ctr = new Contract(client, id, dt, number, summ, signed, svalue, tc); client.contracts.Add(ctr); // // Здесь загружаем Services // IEnumerable <XElement> ServicesElements = element.Element("Services")?.Elements(); if (ServicesElements != null) { ctr.services.Clear(); foreach (XElement servelem in ServicesElements) { int idService = int.Parse(servelem.Attribute("Id").Value); ctr.services.Add(idService); var sv = Service.Svlist[idService]; // Увеличиваем счётчики использования компонентов услуги client.NWCounts.IncrementValue(sv.Nw.Id); client.NDCounts.IncrementValue(sv.Nd.Id); client.AICounts.IncrementValue(sv.Ai.Id); } } } } } }