Example #1
0
        /// <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();
        }
Example #2
0
        /// <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();
            }