Problem Creating a Data Driven Subscription through Reporting Services using C#
Hi, I am trying to create a Data Driven Subscription through Reporting Services using C# but have encountered an error that i can't find the solution to. rs.Url = "http://dev010/ReportServer/ReportService2010.asmx" ; rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string report = "/AppointmentsAtClinics" ; string desc = "Send Email" ; string eventType = "TimedSubscription" ; string scheduleXml = @"<ScheduleDefinition> <StartDateTime>2010-11-30T11:52:05-00:00</StartDateTime> <WeeklyRecurrence> <WeeksInterval>1</WeeksInterval> <DaysOfWeek> <Monday>True</Monday> <Tuesday>True</Tuesday> <Wednesday>True</Wednesday> <Thursday>True</Thursday> <Friday>True</Friday> </DaysOfWeek> </WeeklyRecurrence> </ScheduleDefinition>" ; ParameterValue[] extensionParams = new ParameterValue[8]; extensionParams[0] = new ParameterValue(); extensionParams[0].Name = "TO" ; extensionParams[0].Value = "steven.barker@warwickicsystems.com" ; extensionParams[1] = new ParameterValue(); extensionParams[1].Name = "ReplyTo" ; extensionParams[1].Value = "reporting@adventure-works.com" ; extensionParams[2] = new ParameterValue(); extensionParams[2].Name = "IncludeReport" ; extensionParams[2].Value = "True" ; extensionParams[3] = new ParameterValue(); extensionParams[3].Name = "RenderFormat" ; extensionParams[3].Value = "MHTML" ; extensionParams[4] = new ParameterValue(); extensionParams[4].Name = "Subject" ; extensionParams[4].Value = "@ReportName was executed at @ExecutionTime" ; extensionParams[5] = new ParameterValue(); extensionParams[5].Name = "Comment" ; extensionParams[5].Value = "Here is your report." ; extensionParams[6] = new ParameterValue(); extensionParams[6].Name = "IncludeLink" ; extensionParams[6].Value = "True" ; extensionParams[7] = new ParameterValue(); extensionParams[7].Name = "Priority" ; extensionParams[7].Value = "NORMAL" ; //ParameterValue parameter = new ParameterValue(); //parameter.Name = "PersonnelID"; //parameter.Value = "0001"; //ParameterValue[] parameters = new ParameterValue[1]; //parameters[0] = parameter; string matchData = scheduleXml; ExtensionSettings extSettings = new ExtensionSettings(); extSettings.ParameterValues = extensionParams; extSettings.Extension = "Report Server Email" ; try { //rs.CreateFolder("GenohsisTest", "/", new Property[0]); rs.CreateSubscription(report, extSettings, desc, eventType, matchData, new ParameterValue[0]); } catch (SoapException ex) { Console.WriteLine(ex.Detail.InnerXml.ToString()); } } public void createDataDrivenSub() { rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string report = "/AppointmentsAtClinics" ; string description = "My new data driven subscription" ; // Set the extension setting as report server email. ExtensionSettings settings = new ExtensionSettings(); settings.Extension = "Report Server Email" ; // Set the extension parameter values. ParameterValueOrFieldReference[] extensionParams = new ParameterValueOrFieldReference[8]; ParameterFieldReference to = new ParameterFieldReference(); // Data-driven. to.ParameterName = "TO" ; to.FieldAlias = "EmailAddress" ; //to.FieldAlias = "Steven@domain.com"; extensionParams[0] = to; ParameterValue replyTo = new ParameterValue(); replyTo.Name = "ReplyTo" ; replyTo.Value = "DataReports@domain.com" ; extensionParams[1] = replyTo; ParameterValue includeReport = new ParameterValue(); includeReport.Name = "IncludeReport" ; includeReport.Value = "False" ; extensionParams[2] = includeReport; ParameterValue renderFormat = new ParameterValue(); renderFormat.Name = "RenderFormat" ; renderFormat.Value = "HTML4.0" ; extensionParams[3] = renderFormat; ParameterValue priority = new ParameterValue(); priority.Name = "Priority" ; priority.Value = "NORMAL" ; extensionParams[4] = priority; ParameterValue subject = new ParameterValue(); subject.Name = "Subject" ; subject.Value = "Your Report" ; extensionParams[5] = subject; ParameterValue comment = new ParameterValue(); comment.Name = "Comment" ; comment.Value = "Here is the link to your report." ; extensionParams[6] = comment; ParameterValue includeLink = new ParameterValue(); includeLink.Name = "IncludeLink" ; includeLink.Value = "True" ; extensionParams[7] = includeLink; settings.ParameterValues = extensionParams; // Create the data source for the delivery query. DataSource delivery = new DataSource(); delivery.Name = "" ; DataSourceDefinition dataSourceDefinition = new DataSourceDefinition(); dataSourceDefinition.ConnectString = "data source=wicswhdev010;initial catalog=Database1" ; dataSourceDefinition.CredentialRetrieval = CredentialRetrievalEnum.Store; dataSourceDefinition.Enabled = true ; dataSourceDefinition.EnabledSpecified = true ; dataSourceDefinition.Extension = "SQL" ; dataSourceDefinition.ImpersonateUserSpecified = false ; dataSourceDefinition.UserName = "sa" ; dataSourceDefinition.Password = "password1234" ; delivery.Item = dataSourceDefinition; // Create the fields list. Field[] fieldsList = new Field[1]; fieldsList[0] = new Field(); fieldsList[0].Name = "AppointmentID" ; fieldsList[0].Alias = "AppointmentID" ; //fieldsList[1] = new Field(); //fieldsList[1].Name = "AppointmentType"; //fieldsList[1].Alias = "AppointmentType"; // Create the data set for the delivery query. DataSetDefinition dataSetDefinition = new DataSetDefinition(); dataSetDefinition.AccentSensitivitySpecified = false ; dataSetDefinition.CaseSensitivitySpecified = false ; dataSetDefinition.KanatypeSensitivitySpecified = false ; dataSetDefinition.WidthSensitivitySpecified = false ; dataSetDefinition.Fields = fieldsList; QueryDefinition queryDefinition = new QueryDefinition(); queryDefinition.CommandText = "Select AppointmentID from Appointments Where AppointmentType = 'A'" ; queryDefinition.CommandType = "Text" ; queryDefinition.Timeout = 45; queryDefinition.TimeoutSpecified = true ; dataSetDefinition.Query = queryDefinition; DataSetDefinition results = new DataSetDefinition(); bool changed; string [] paramNames; try { results = rs.PrepareQuery(delivery, dataSetDefinition, out changed, out paramNames); } catch (SoapException e) { Console.WriteLine(e.Detail.InnerText.ToString()); } DataRetrievalPlan dataRetrieval = new DataRetrievalPlan(); dataRetrieval.DataSet = results; dataRetrieval.Item = dataSourceDefinition; // Set the event type and match data for the delivery. string eventType = "TimedSubscription" ; string matchData = "<ScheduleDefinition><StartDateTime>2010-11-30T14:35:00-00:00</StartDateTime><WeeklyRecurrence><WeeksInterval>1</WeeksInterval><DaysOfWeek><Monday>True</Monday><Tuesday>True</Tuesday><Wednesday>True</Wednesday><Thursday>True</Thursday><Friday>True</Friday></DaysOfWeek></WeeklyRecurrence></ScheduleDefinition>" ; //ParameterValue parameter = new ParameterValue(); //parameter.Name = "PersonnelID"; //parameter.Value = "0001"; //ParameterValue[] parameters = new ParameterValue[1]; //parameters[0] = parameter; // Set the report parameter values. ParameterValueOrFieldReference[] parameters = new ParameterValueOrFieldReference[0]; try { string subscriptionID = rs.CreateDataDrivenSubscription(report, settings, dataRetrieval, description, eventType, matchData, parameters); } catch (SoapException e) { Console.WriteLine(e.Detail.InnerText.ToString()); } rs.PrepareQuery works fine and returns the correct data. However the code throws an error in the try block at the end when trying to create the subscription. The Error Message reads "The required field Field is missing from the input structure" Any help solving this would be much appreciated. :)
November 30th, 2010 12:22pm

Hi Steven, From the code you posted, I suppose the report has a parameter named AppointmentID. However, ParameterValueOrFieldReference is empty in the code. This means you didn't pass any value to the parameter AppointmentID. In case the parameter AppointmentID don't have a default value, we will get the error message "The required field Field is missing from the input structure". So, to solve the issue, please provider default values for the parameter AppointmentID. Or, please modify the code to be: ParameterValueOrFieldReference[] parameters = new ParameterValueOrFieldReference[3]; ParameterFieldReference appointmentID= new ParameterFieldReference(); // Data-driven. appointmentID.ParameterName = "AppointmentID"; appointmentID.FieldAlias = "AppointmentID"; parameters[0] = appointmentID; If you have any more questions, please feel free to ask. Thanks, Jin ChenJin Chen - MSFT
Free Windows Admin Tool Kit Click here and download it now
December 30th, 2010 3:49am

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics