예제 #1
0
        public static DataTable GetData(string tableName, string fileName, string keyPath, string accountEmailAddress, string applicationName, string ids, string startDate, string endDate, string metrics, string dimensions, string filters, string segment, string sort, int?maxResults, bool desample)
        {
            var data = GaAccess
                       .GetGaData(keyPath, accountEmailAddress, applicationName, ids, startDate, endDate, metrics, dimensions, filters, segment, sort, maxResults, desample)
                       .ToDataTable(tableName, dimensions.Split(',').Count());

            bool saved = String.IsNullOrEmpty(fileName);

            while (!saved)
            {
                try {
                    var ds = new DataSet();
                    ds.Tables.Add(data);
                    ds.SaveAs(fileName);
                    saved = true;
                } catch (Exception ex) {
                    if (System.Windows.MessageBox.Show(ex.Message, Resources.SaveErrorMessage, System.Windows.MessageBoxButton.YesNo, System.Windows.MessageBoxImage.Error, System.Windows.MessageBoxResult.No) == System.Windows.MessageBoxResult.No)
                    {
                        throw;
                    }
                }
            }

            return(data);
        }
예제 #2
0
        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);
            }
        }