/// <summary> /// Agrregate a data table to hourly,daily data... /// </summary> /// <param name="priceTbl">source data to be aggregated </param> /// <param name="cultureCode"></param> /// <param name="isDailyPrice"> /// Volume can be accumulated real-time or at the end of the day. /// - If data is collected in realtime, /// updateVolume table is used to culmulated the volume for each day and that will need some more resources. /// - If data is collected at the end of the day, the voulume alredy is the total volume and updateVolume table /// should not be used to save resources. /// </param> /// <param name="onAggregateDataFunc">function that was triggered after each agrregation</param> public static void AggregatePriceData(databases.baseDS.priceDataDataTable priceTbl, CultureInfo cultureInfo, OnAggregateData onAggregateDataFunc) { databases.baseDS.priceDataSumDataTable priceSumDataTbl = new databases.baseDS.priceDataSumDataTable(); AgrregateInfo myAgrregateStat = new AgrregateInfo(); myAgrregateStat.maxCount = priceTbl.Count; decimal changeVolume; int lastYear = int.MinValue; for (int idx = 0; idx < priceTbl.Count; idx++) { myAgrregateStat.count = idx; if (onAggregateDataFunc != null) { onAggregateDataFunc(myAgrregateStat); } if (myAgrregateStat.cancel) { priceSumDataTbl.Clear(); break; } Application.DoEvents(); changeVolume = priceTbl[idx].volume; foreach (AppTypes.TimeScale timeScale in AppTypes.myTimeScales) { if (timeScale.Type == AppTypes.TimeScaleTypes.RealTime) { continue; } AggregatePriceData(priceTbl[idx], changeVolume, timeScale, cultureInfo, priceSumDataTbl); } //Update and clear cache to speed up the performance if (lastYear != priceTbl[idx].onDate.Year) { databases.DbAccess.UpdateData(priceSumDataTbl); priceSumDataTbl.Clear(); lastYear = priceTbl[idx].onDate.Year; } //databases.DbAccess.UpdateData(priceDataRow); } databases.DbAccess.UpdateData(priceSumDataTbl); priceSumDataTbl.Dispose(); }
/// <summary> /// Agrregate a data table to hourly,daily data... /// </summary> /// <param name="priceTbl">source data to be aggregated </param> /// <param name="cultureCode"></param> /// <param name="isDailyPrice"> /// Volume can be accumulated real-time or at the end of the day. /// - If data is collected in realtime, /// updateVolume table is used to culmulated the volume for each day and that will need some more resources. /// - If data is collected at the end of the day, the voulume alredy is the total volume and updateVolume table /// should not be used to save resources. /// </param> /// <param name="onAggregateDataFunc">function that was triggered after each agrregation</param> public static void AggregatePriceData(databases.baseDS.priceDataDataTable priceTbl, CultureInfo cultureInfo, OnAggregateData onAggregateDataFunc) { databases.baseDS.priceDataSumDataTable priceSumDataTbl = new databases.baseDS.priceDataSumDataTable(); AgrregateInfo myAgrregateStat = new AgrregateInfo(); myAgrregateStat.maxCount = priceTbl.Count; decimal changeVolume; int lastYear = int.MinValue; for (int idx = 0; idx < priceTbl.Count; idx++) { myAgrregateStat.count = idx; if (onAggregateDataFunc != null) onAggregateDataFunc(myAgrregateStat); if (myAgrregateStat.cancel) { priceSumDataTbl.Clear(); break; } Application.DoEvents(); changeVolume = priceTbl[idx].volume; foreach (AppTypes.TimeScale timeScale in AppTypes.myTimeScales) { if (timeScale.Type == AppTypes.TimeScaleTypes.RealTime) continue; AggregatePriceData(priceTbl[idx], changeVolume, timeScale, cultureInfo, priceSumDataTbl); } //Update and clear cache to speed up the performance if (lastYear != priceTbl[idx].onDate.Year) { databases.DbAccess.UpdateData(priceSumDataTbl); priceSumDataTbl.Clear(); lastYear = priceTbl[idx].onDate.Year; } //databases.DbAccess.UpdateData(priceDataRow); } databases.DbAccess.UpdateData(priceSumDataTbl); priceSumDataTbl.Dispose(); }