Subscription & Schedule handling on Reporting Services API (Part 3)

本文介绍了一种用于定义和解析订阅计划的方法,包括一次性、按小时、按天、按周和按月等不同频率的订阅模式。通过XML序列化和反序列化实现计划的保存与读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The CORE: Schedule XML and the Schedule UI

#region Schedule Settings
  #region GET
  private string GetMatchData()
  {
   #region time
   System.DateTime _startTime,_endTime;
   bool _hasEndTime=false;
   try
   {
    _startTime=Convert.ToDateTime(this.txt_StartDate.Text);
   }
   catch
   {
    _startTime=System.DateTime.Now;
   }
   try
   {
    _endTime=Convert.ToDateTime(this.txt_EndDate.Text);
    _hasEndTime=true;
   }
   catch
   {
    _endTime=System.DateTime.Now;
   }
   #endregion

   ScheduleDefinition schedule = new ScheduleDefinition();
   schedule.StartDateTime = _startTime;
   if(_hasEndTime)
   {
    schedule.EndDateSpecified = true; 
    schedule.EndDate=_endTime;
   }
   schedule.Item = GetPattern();
   
   XmlDocument xmlDoc = GetScheduleAsXml(schedule);       
   return xmlDoc.OuterXml;
  }

  private XmlDocument GetScheduleAsXml(ScheduleDefinition schedule)
  {
   MemoryStream buffer = new MemoryStream();
   XmlSerializer xmlSerializer = new XmlSerializer(typeof(ScheduleDefinition));
   xmlSerializer.Serialize(buffer, schedule);
   buffer.Seek(0, SeekOrigin.Begin);
                   
   XmlDocument doc = new XmlDocument();       
   doc.Load(buffer); 
   // patch up WhichWeek
   XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
   nsmgr.AddNamespace("rp","http://schemas.microsoft.com/sqlserver/2003/12/reporting/reportingservices");
   XmlNode node = doc.SelectSingleNode("/ScheduleDefinition/rp:MonthlyDOWRecurrence/rp:WhichWeek", nsmgr);
   if(node != null)
   {
    switch (node.InnerXml)
    {
     case "FirstWeek":
      node.InnerXml = "FIRST_WEEK"; break;
     case "SecondWeek":
      node.InnerXml = "SECOND_WEEK"; break;
     case "ThirdWeek":
      node.InnerXml = "THIRD_WEEK"; break;
     case "FourthWeek":
      node.InnerXml = "FOURTH_WEEK"; break;
     case "LastWeek":
      node.InnerXml = "LAST_WEEK"; break;
    }
   }

   return doc;
  }
  //订阅设置参数
  #region GetPattern
  private RecurrencePattern GetPattern()
  {
   if(this.rad_ScheduleOnce.Checked)//Once
   {
    ///////////OnceRecurrence
    return null;
   }

   #region monthSelector
   MonthsOfYearSelector monthSelector = new MonthsOfYearSelector();
   if(this.rad_ScheduleDay.Checked)
   {
    monthSelector.January =true;
    monthSelector.February =true;
    monthSelector.March  =true;
    monthSelector.April  =true;
    monthSelector.May  =true;
    monthSelector.June  =true;
    monthSelector.July  =true;
    monthSelector.August =true;
    monthSelector.September =true;
    monthSelector.October =true;
    monthSelector.November =true;
    monthSelector.December =true;

   }
   else
   {
    bool _jan=this.chk_MonthOfJan.Checked,_feb=this.chk_MonthOfFeb.Checked,_mar=this.chk_MonthOfMar.Checked,
     _apr=this.chk_MonthOfApr.Checked,_may=this.chk_MonthOfMay.Checked,_jun=this.chk_MonthOfJun.Checked,
     _jul=this.chk_MonthOfJul.Checked,_aug=this.chk_MonthOfAug.Checked,_sep=this.chk_MonthOfSep.Checked,
     _oct=this.chk_MonthOfOct.Checked,_nov=this.chk_MonthOfNov.Checked,_dec=this.chk_MonthOfDec.Checked;
   
    monthSelector.January =_jan;
    monthSelector.February =_feb;
    monthSelector.March  =_mar;
    monthSelector.April  =_apr;
    monthSelector.May  =_may;
    monthSelector.June  =_jun;
    monthSelector.July  =_jul;
    monthSelector.August =_aug;
    monthSelector.September =_sep;
    monthSelector.October =_oct;
    monthSelector.November =_nov;
    monthSelector.December =_dec;
   }
   #endregion

   #region daySelector
   DaysOfWeekSelector daySelector=new DaysOfWeekSelector();
   if(this.rad_ScheduleDay.Checked && this.rad_EveryWeekDay.Checked)
   {
    daySelector.Monday  =true;
    daySelector.Tuesday  =true;
    daySelector.Wednesday =true;
    daySelector.Thursday =true;
    daySelector.Friday  =true;
    daySelector.Saturday =false;
    daySelector.Sunday  =false;
   }
   else
   {
    bool _mon=this.chk_daysOfWeekMon.Checked,_tue=this.chk_daysOfWeekTue.Checked,_wed=this.chk_daysOfWeekWed.Checked,
     _thu=this.chk_daysOfWeekThu.Checked,_fri=this.chk_daysOfWeekFri.Checked,_sat=this.chk_daysOfWeekSat.Checked,_sun=this.chk_daysOfWeekSun.Checked;
  
    daySelector.Monday  =_mon;
    daySelector.Tuesday  =_tue;
    daySelector.Wednesday =_wed;
    daySelector.Thursday =_thu;
    daySelector.Friday  =_fri;
    daySelector.Saturday =_sat;
    daySelector.Sunday  =_sun;
   }
   #endregion

   if(this.rad_ScheduleHour.Checked)//hourly
   {
    ///////////MinuteRecurrence
    int _hour,_min;
    #region _hour _min
    try
    {
     _hour=Convert.ToUInt16(this.txt_IntervalHour.Text);
    }
    catch
    {
     _hour=0;
    }
    try
    {
     _min=Convert.ToUInt16(this.txt_IntervalMinute.Text);
    }
    catch
    {
     _min=0;
    }
    #endregion
    MinuteRecurrence patternMin=new MinuteRecurrence();
    patternMin.MinutesInterval=_hour*60+_min;
    return patternMin;
   }
   
   if(this.rad_ScheduleDay.Checked && this.rad_IntervalDay.Checked)//daily
   {
    ///////////DailyRecurrence
    int _day;
    #region _day
    try
    {
     _day=Convert.ToUInt16(this.txt_IntervalDay.Text);
    }
    catch
    {
     _day=0;
    }
    #endregion
    DailyRecurrence patternDay = new DailyRecurrence();
    patternDay.DaysInterval=_day;
    return patternDay;
   }

   if(this.rad_ScheduleWeek.Checked ||
    (this.rad_ScheduleDay.Checked && (this.rad_WeekDay.Checked || this.rad_EveryWeekDay.Checked)) )//weekly
   {
    ///////////WeeklyRecurrence
    WeeklyRecurrence patternWeek=new WeeklyRecurrence();
    patternWeek.DaysOfWeek=daySelector;

    int _weekInterval=1;
    if(this.rad_ScheduleWeek.Checked)
    {
     #region _weekInterval
     try
     {
      _weekInterval = Convert.ToUInt16(this.txt_IntervalWeek.Text);
     }
     catch
     {
      _weekInterval=-1;
     }
     #endregion
    }
    if(_weekInterval>-1)
    {
     patternWeek.WeeksIntervalSpecified=true;
     patternWeek.WeeksInterval=_weekInterval;
    }

    return patternWeek;
   }

   if(this.rad_ScheduleMonth.Checked && this.rad_MCalendarDate.Checked)//monthly
   {
    ///////////MonthlyRecurrence
    string _days=this.txt_CalendarDate.Text;
    MonthlyRecurrence patternMon=new MonthlyRecurrence();
    patternMon.MonthsOfYear=monthSelector;
    patternMon.Days=_days;
    return patternMon;
   }

   ///////////MonthlyDOWRecurrence
   MonthlyDOWRecurrence patternDOW = new MonthlyDOWRecurrence();
   patternDOW.MonthsOfYear=monthSelector;
   patternDOW.DaysOfWeek=daySelector;

   bool _weekSpecified=(this.rad_ScheduleMonth.Checked && this.rad_MWeekOfMonth.Checked);
   if(_weekSpecified)
   {
    int _week=Convert.ToUInt16(this.drp_MWeekOfMonth.SelectedValue);
    #region _week
    try
    {
     _week=Convert.ToUInt16(this.drp_MWeekOfMonth.SelectedValue);
    }
    catch
    {
     _week=0;
    }
    #endregion
    patternDOW.WhichWeekSpecified=true;
    patternDOW.WhichWeek  =(WeekNumberEnum)_week; //0-3 week of month, 4 last week
   }
   return patternDOW;
  }
  #endregion

  
  #endregion

  #region SET
  private ScheduleDefinition GetScheduleFromXml (string sMatchData)
  {
   MemoryStream vStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(sMatchData));
   XmlAttributes attrs = new XmlAttributes();

   attrs.XmlElements.Add(new XmlElementAttribute("MinuteRecurrence",typeof(MinuteRecurrence)));
   attrs.XmlElements.Add(new XmlElementAttribute("DailyRecurrence",typeof(DailyRecurrence)));
   attrs.XmlElements.Add(new XmlElementAttribute("WeeklyRecurrence",typeof(WeeklyRecurrence)));
   attrs.XmlElements.Add(new XmlElementAttribute("MonthlyRecurrence",typeof(MonthlyRecurrence)));
   attrs.XmlElements.Add(new XmlElementAttribute("MonthlyDOWRecurrence",typeof(MonthlyDOWRecurrence)));
   XmlAttributeOverrides attrOver=new XmlAttributeOverrides();

   attrOver.Add(typeof(ScheduleDefinition),"ScheduleDefinition",attrs);
   XmlSerializer newSr=new XmlSerializer(typeof(ScheduleDefinition),attrOver);

   return (ScheduleDefinition)newSr.Deserialize(vStream);
  }

  private void SetPatten(ScheduleDefinition _ScheduleDefinition)
  {
   this.txt_StartDate.Text=_ScheduleDefinition.StartDateTime.ToString("yyyy-MM-dd HH:mm");
   if(_ScheduleDefinition.EndDateSpecified)
    this.txt_EndDate.Text=_ScheduleDefinition.EndDate.ToString("yyyy-MM-dd");

   if(_ScheduleDefinition.Item==null)
    this.rad_ScheduleOnce.Checked=true;
   else
   {
    switch(_ScheduleDefinition.Item.GetType().Name)
    {
     case "MinuteRecurrence":
      this.rad_ScheduleHour.Checked=true;//Hourly Schedule
      this.txt_IntervalHour.Text =string.Format("{0:00}",((MinuteRecurrence)_ScheduleDefinition.Item).MinutesInterval/60);
      this.txt_IntervalMinute.Text=string.Format("{0:00}",((MinuteRecurrence)_ScheduleDefinition.Item).MinutesInterval%60);
      break;
     case "DailyRecurrence":
      this.rad_ScheduleDay.Checked=true; this.rad_IntervalDay.Checked=true;//Daily Schedule
      this.txt_IntervalDay.Text =string.Format("{0}",((DailyRecurrence)_ScheduleDefinition.Item).DaysInterval);
      break;
     case "WeeklyRecurrence":
      
      SetDaysOfWeekSelector(((WeeklyRecurrence)_ScheduleDefinition.Item).DaysOfWeek);
      if(((WeeklyRecurrence)_ScheduleDefinition.Item).WeeksInterval>1)//Weekly Schedule
      {
       this.txt_IntervalWeek.Text =string.Format("{0}",((WeeklyRecurrence)_ScheduleDefinition.Item).WeeksInterval);
       this.rad_ScheduleWeek.Checked=true;
      }
      else//Weekly Schedule in Day
      {
       DaysOfWeekSelector daySel = ((WeeklyRecurrence)_ScheduleDefinition.Item).DaysOfWeek;
       if(
        daySel.Monday  ==true&&
        daySel.Tuesday  ==true&&
        daySel.Wednesday ==true&&
        daySel.Thursday  ==true&&
        daySel.Friday  ==true&&
        daySel.Saturday  ==false&&
        daySel.Sunday  ==false)
       {
        this.rad_ScheduleDay.Checked=true; this.rad_EveryWeekDay.Checked=true;//Daily Schedule-EveryWeekDay
       }
       else
        this.rad_ScheduleDay.Checked=true; this.rad_WeekDay.Checked=true;//Daily Schedule-Day Of Week
      }
      break;
     case "MonthlyRecurrence":
      this.rad_ScheduleMonth.Checked=true; this.rad_MCalendarDate.Checked=true;//Month Calendar
      this.txt_CalendarDate.Text = ((MonthlyRecurrence)_ScheduleDefinition.Item).Days;
      SetMonthsOfYearSelector(((MonthlyRecurrence)_ScheduleDefinition.Item).MonthsOfYear);
      break;
     case "MonthlyDOWRecurrence":
      this.rad_ScheduleMonth.Checked=true; this.rad_MWeekOfMonth.Checked=true;//Month DOW
      SetDaysOfWeekSelector(((MonthlyDOWRecurrence)_ScheduleDefinition.Item).DaysOfWeek);
      SetMonthsOfYearSelector(((MonthlyDOWRecurrence)_ScheduleDefinition.Item).MonthsOfYear);
      if(((MonthlyDOWRecurrence)_ScheduleDefinition.Item).WhichWeekSpecified)
      {
       this.drp_MWeekOfMonth.SelectedValue=string.Format("{0}",(uint)((MonthlyDOWRecurrence)_ScheduleDefinition.Item).WhichWeek);
      }
      break;
    }
   }
  }
  #region Selector
  private void SetDaysOfWeekSelector(DaysOfWeekSelector daySelector)
  {
   this.chk_daysOfWeekMon.Checked = daySelector.Monday;
   this.chk_daysOfWeekTue.Checked = daySelector.Tuesday;
   this.chk_daysOfWeekWed.Checked = daySelector.Wednesday;

   this.chk_daysOfWeekThu.Checked = daySelector.Thursday;
   this.chk_daysOfWeekFri.Checked = daySelector.Friday;
   this.chk_daysOfWeekSat.Checked = daySelector.Saturday;
   this.chk_daysOfWeekSun.Checked = daySelector.Sunday;
  }
  private void SetMonthsOfYearSelector(MonthsOfYearSelector monthSelector)
  {
   this.chk_MonthOfJan.Checked = monthSelector.January;
   this.chk_MonthOfFeb.Checked =monthSelector.February;
   this.chk_MonthOfMar.Checked =monthSelector.March;

   this.chk_MonthOfApr.Checked =monthSelector.April;
   this.chk_MonthOfMay.Checked =monthSelector.May;
   this.chk_MonthOfJun.Checked =monthSelector.June;

   this.chk_MonthOfJul.Checked =monthSelector.July;
   this.chk_MonthOfAug.Checked =monthSelector.August;
   this.chk_MonthOfSep.Checked =monthSelector.September;

   this.chk_MonthOfOct.Checked =monthSelector.October;
   this.chk_MonthOfNov.Checked =monthSelector.November;
   this.chk_MonthOfDec.Checked =monthSelector.December;
  }
  #endregion
  #endregion
  #endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值