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