请求和下载报表
报告是一个异步过程。 下面是请求报表的一般流程。
- 使用报表参数创建请求
- 向报告服务发送请求
- 服务将请求排队,直到它能够处理它
- 定期轮询服务以获取报表作业的状态
- 当状态为 “成功”时,请使用服务提供的 URL 下载报表。
如果使用 .NET 语言、Java 或 Python,则应使用 必应广告 API 客户端库。 .NET、Java 和 Python SDK 提取下面所述的低级别详细信息。 例如,可以将一种方法用于 Reporting Service Manager,而不是调用 SubmitGenerateReportRequest 和 PollGenerateReportRequest 来下载报表。
有关演示如何下载报表的代码示例,请参阅 报表请求代码示例。
请求报告
确定要请求的报告。 有关可请求的报表列表,请参阅 报表类型。
创建报表请求对象的实例。 报表请求的一些元素是必需的,有些元素是可选的。 根据应用程序设置适当的元素。 报表请求的元素决定要包含在报表中的数据范围、要包含在报表中的数据列,以及是否仅在所有数据都可用时生成报表。
注意
必须创建派生自 ReportRequest 数据对象的对象之一的实例;如果尝试将 ReportRequest 对象传递给 SubmitGenerateReport 操作,调用将失败。
创建 SubmitGenerateReportRequest 对象的实例,并将 ReportRequest 元素设置为在上一步中选择的报表请求。
调用 SubmitGenerateReport 操作以提交请求。 操作是在创建报表之前返回的异步操作。 该操作返回一个 ReportRequestId ,在以下步骤中使用该 Id 来确定报表何时完成。 报表请求标识符的有效期为两天。 如果在两天内未下载报表,则必须再次请求报告。
创建 PollGenerateReportRequest 对象的实例,并将报表请求标识符设置为上一步返回的标识符。
注意
必须为 SubmitGenerateReport 和 PollGenerateReport 操作使用相同的用户凭据。
当状态为“挂起”时,在循环中调用 PollGenerateReport 操作。 当请求成功完成时,操作会将状态设置为 “成功 ”;“ 挂起” 或 “成功” 以外的状态指示报告失败。
完成报表请求所需的时间长度取决于许多变量,例如所请求的报表类型;指定的聚合、范围和时间段值;预期行数;和队列中已有的请求数。 由于这些变量,很难为所有情况确定适当的轮询间隔。 由于大多数报告应在几分钟内完成,因此在大多数情况下,以 2 到 15 分钟的间隔轮询应该适用。 如果总轮询周期超过 60 分钟,请考虑保存报告标识符,退出循环,然后重试。
如果请求成功完成,请使用 ReportDownloadUrl 元素中的 URL 下载包含报表的文件。 获取下载 URL 后,有 5 分钟的时间下载报表。 如果在获取 URL 后五分钟内未下载报表,则必须轮询用于下载报表的新 URL。
报表文件已压缩;因此,必须解压缩它才能读取报表。
创建自定义日期范围
以下过程演示如何为报表请求指定自定义日期范围。 对于上述报表请求工作流,这是可选的。 如果指定自定义日期范围,则不得设置 ReportTime.PredefinedTime 元素。 另请注意,报表请求对象的 Aggregation 元素确定如何聚合指定时间段的数据。
创建 ReportTime 对象的实例。 将 ReportTime 对象分配给 ReportRequest 数据对象的 Time 元素。
创建一个 Date 对象,该对象指定自定义日期范围的开始日期。 将 Date 对象分配给 ReportTime.CustomDateRangeStart 元素。
创建另一个 Date 对象,指定自定义日期范围的结束日期。 将 Date 对象分配给 ReportTime.CustomDateRangeEnd 元素。
以下代码片段演示如何初始化报表请求对象以请求自定义日期范围。
// Create an instance of the ReportTime class to hold the report date
// information.
request.Time = new ReportTime();
// Set the start date for the report to one month before today.
DateTime startDate = DateTime.Today.AddMonths(-1);
request.Time.CustomDateRangeStart = new Date();
request.Time.CustomDateRangeStart.Day = startDate.Day;
request.Time.CustomDateRangeStart.Month = startDate.Month;
request.Time.CustomDateRangeStart.Year = startDate.Year;
// Set the end date to today.
DateTime endDate = DateTime.Today;
request.Time.CustomDateRangeEnd = new Date();
request.Time.CustomDateRangeEnd.Day = endDate.Day;
request.Time.CustomDateRangeEnd.Month = endDate.Month;
request.Time.CustomDateRangeEnd.Year = endDate.Year;
report.setTime(new ReportTime());
Calendar calendar = Calendar.getInstance();
report.getTime().setCustomDateRangeStart(new Date());
report.getTime().getCustomDateRangeStart().setMonth(1);
report.getTime().getCustomDateRangeStart().setDay(1);
report.getTime().getCustomDateRangeStart().setYear(calendar.get(Calendar.YEAR)-1);
report.getTime().setCustomDateRangeEnd(new Date());
report.getTime().getCustomDateRangeEnd().setMonth(12);
report.getTime().getCustomDateRangeEnd().setDay(31);
report.getTime().getCustomDateRangeEnd().setYear(calendar.get(Calendar.YEAR)-1);
$report->Time = new ReportTime();
$report->Time->PredefinedTime = null;
date_default_timezone_set('UTC');
$LastYear = date("Y") - 1;
$report->Time->CustomDateRangeStart = new Date();
$report->Time->CustomDateRangeStart->Month = 1;
$report->Time->CustomDateRangeStart->Day = 1;
$report->Time->CustomDateRangeStart->Year = $LastYear;
$report->Time->CustomDateRangeEnd = new Date();
$report->Time->CustomDateRangeEnd->Month = 12;
$report->Time->CustomDateRangeEnd->Day = 31;
$report->Time->CustomDateRangeEnd->Year = $LastYear;
report_time=reporting_service.factory.create('ReportTime')
custom_date_range_start=reporting_service.factory.create('Date')
custom_date_range_start.Day=1
custom_date_range_start.Month=1
custom_date_range_start.Year=int(strftime("%Y", gmtime()))-1
report_time.CustomDateRangeStart=custom_date_range_start
custom_date_range_end=reporting_service.factory.create('Date')
custom_date_range_end.Day=31
custom_date_range_end.Month=12
custom_date_range_end.Year=int(strftime("%Y", gmtime()))-1
report_time.CustomDateRangeEnd=custom_date_range_end
report_time.PredefinedTime=None
report_request.Time=report_time