public override void Execute(object parameter) { var doc = (DocumentView)((DataSourceProvider)System.Windows.Application.Current.MainWindow.DataContext).Data; var folder = (FolderView)parameter; try { var keyPath = Tools.JsonIO.DefaultIfEmptyDir(doc.KeyPath); var accountEmailAddress = doc.AccountEmailAddress; var ids = doc.IDs; var requests = folder.Requests; var fileName = folder.FileName; var applicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; //загрузить весь DataSet var ext = System.IO.Path.GetExtension(fileName);// DataSet ds; if (System.IO.File.Exists(fileName)) { switch (ext) { case ".json": ds = JsonIO.Open <DataSet>(fileName); break; case ".xlsx": ds = new DataSet(); ds.Tables.AddRange( requests .Select(e => GetData.FromExcel(JsonIO.DefaultIfEmptyDir(fileName), e.Title, null)) .ToArray()); break; case ".xml": throw new NotImplementedException("Актуализация XML еще не поддерживается"); //TODO сделать поддержку XML //break; default: ds = new DataSet(); break; } } else { ds = new DataSet(); } foreach (var request in requests) { var title = request.Title; var startDate = String.IsNullOrEmpty(request.StartDate) ? folder.StartDate : request.StartDate; var endDate = String.IsNullOrEmpty(request.EndDate) ? folder.EndDate : request.EndDate; var metrics = String.IsNullOrEmpty(request.Metrics) ? folder.Metrics : request.Metrics; var dimensions = String.IsNullOrEmpty(request.Dimensions) ? folder.Dimensions : request.Dimensions; var filters = String.IsNullOrEmpty(request.Filters) ? folder.Filters : request.Filters; var segment = String.IsNullOrEmpty(request.Segment) ? folder.Segment : request.Segment; var sort = String.IsNullOrEmpty(request.Sort) ? folder.Sort : request.Sort; var maxResults = request.MaxResults; bool desample = folder.Desample || request.Desample; //выбрать таблицу, если пустая - потом просто добавим, если непустая, то обработаем var str_isoYearIsoWeek = "isoYearIsoWeek"; if (ds.Tables.Contains(title) && ds.Tables[title].Columns.Contains(str_isoYearIsoWeek)) {//только если в измерениях есть неделя, остальные случаи необходимо доработать //Обрабатываем var dt = ds.Tables[title]; //определить актуальность таблицы по последней неделе //определяем год и номер последней недели var lastIsoYearIsoWeek = dt.AsEnumerable().LastOrDefault().Field <string>(str_isoYearIsoWeek); //определяем понедельник предыдущей недели var lastDate = GetDateByWeek(lastIsoYearIsoWeek); var prevDate = lastDate.AddDays(-7); var prevIsoYearIsoWeek = string.Format("{0}{1}", prevDate.Year, WeekNumber(prevDate)); //удаляем лишние строки, где год-неделя соответствуют неактуальным датам var rowsToRemove = dt.AsEnumerable() .Where(e => e.Field <string>(str_isoYearIsoWeek) == prevIsoYearIsoWeek || e.Field <string>(str_isoYearIsoWeek) == lastIsoYearIsoWeek) .ToArray(); foreach (var element in rowsToRemove) { dt.Rows.Remove(element); } //выполняем запрос начиная с актуальной даты var dt2 = GaAccess .GetGaData(keyPath, accountEmailAddress, applicationName, ids, prevDate.ToString(datePattern), endDate, metrics, dimensions, filters, segment, sort, maxResults, desample) .ToDataTable(title, dimensions.Split(',').Count()); foreach (var element in dt2.AsEnumerable()) { var row = dt.NewRow(); for (int i = 0; i < dt.Columns.Count; i++) { row[i] = element[i]; } dt.Rows.Add(row); } dt.AcceptChanges(); } else { //просто выполняем и добавляем ds.Tables.Add(GaAccess .GetGaData(keyPath, accountEmailAddress, applicationName, ids, startDate, endDate, metrics, dimensions, filters, segment, sort, maxResults, desample) .ToDataTable(title, dimensions.Split(',').Count())); } } //после выполнения всего раздела, если название файла не пустое, то объединить все файлы в один if (!String.IsNullOrEmpty(fileName)) { ds.SaveAs(fileName); } MessageBox.Show(string.Format("{0} {1} {2}", Properties.Resources.RefreshSuccessMessage0, folder.Title, Properties.Resources.RefreshSuccessMessage1), string.Format("{0} {1}", Application.Current.MainWindow.Title, folder.Title), MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { MessageBox.Show(string.Format("{0} {1}.\n\n{2}", Properties.Resources.RefreshErrorMessage, folder.Title, ex.Message), string.Format("{0} {1}", Application.Current.MainWindow.Title, folder.Title), MessageBoxButton.OK, MessageBoxImage.Error); } }