请求和下载报表

报告是一个异步过程。 下面是请求报表的一般流程。

  • 使用报表参数创建请求
  • 向报告服务发送请求
  • 服务将请求排队,直到它能够处理它
  • 定期轮询服务以获取报表作业的状态
  • 当状态为 “成功”时,请使用服务提供的 URL 下载报表。

如果使用 .NET 语言、Java 或 Python,则应使用 必应广告 API 客户端库。 .NET、Java 和 Python SDK 提取下面所述的低级别详细信息。 例如,可以将一种方法用于 Reporting Service Manager,而不是调用 SubmitGenerateReportRequestPollGenerateReportRequest 来下载报表。

有关演示如何下载报表的代码示例,请参阅 报表请求代码示例

请求报告

  1. 确定要请求的报告。 有关可请求的报表列表,请参阅 报表类型

  2. 创建报表请求对象的实例。 报表请求的一些元素是必需的,有些元素是可选的。 根据应用程序设置适当的元素。 报表请求的元素决定要包含在报表中的数据范围、要包含在报表中的数据列,以及是否仅在所有数据都可用时生成报表。

    注意

    必须创建派生自 ReportRequest 数据对象的对象之一的实例;如果尝试将 ReportRequest 对象传递给 SubmitGenerateReport 操作,调用将失败。

  3. 创建 SubmitGenerateReportRequest 对象的实例,并将 ReportRequest 元素设置为在上一步中选择的报表请求。

  4. 调用 SubmitGenerateReport 操作以提交请求。 操作是在创建报表之前返回的异步操作。 该操作返回一个 ReportRequestId ,在以下步骤中使用该 Id 来确定报表何时完成。 报表请求标识符的有效期为两天。 如果在两天内未下载报表,则必须再次请求报告。

  5. 创建 PollGenerateReportRequest 对象的实例,并将报表请求标识符设置为上一步返回的标识符。

    注意

    必须为 SubmitGenerateReportPollGenerateReport 操作使用相同的用户凭据。

  6. 当状态为“挂起”时,在循环中调用 PollGenerateReport 操作。 当请求成功完成时,操作会将状态设置为 “成功 ”;“ 挂起”“成功” 以外的状态指示报告失败。

    完成报表请求所需的时间长度取决于许多变量,例如所请求的报表类型;指定的聚合、范围和时间段值;预期行数;和队列中已有的请求数。 由于这些变量,很难为所有情况确定适当的轮询间隔。 由于大多数报告应在几分钟内完成,因此在大多数情况下,以 2 到 15 分钟的间隔轮询应该适用。 如果总轮询周期超过 60 分钟,请考虑保存报告标识符,退出循环,然后重试。

  7. 如果请求成功完成,请使用 ReportDownloadUrl 元素中的 URL 下载包含报表的文件。 获取下载 URL 后,有 5 分钟的时间下载报表。 如果在获取 URL 后五分钟内未下载报表,则必须轮询用于下载报表的新 URL。

  8. 报表文件已压缩;因此,必须解压缩它才能读取报表。

创建自定义日期范围

以下过程演示如何为报表请求指定自定义日期范围。 对于上述报表请求工作流,这是可选的。 如果指定自定义日期范围,则不得设置 ReportTime.PredefinedTime 元素。 另请注意,报表请求对象的 Aggregation 元素确定如何聚合指定时间段的数据。

  1. 创建 ReportTime 对象的实例。 将 ReportTime 对象分配给 ReportRequest 数据对象的 Time 元素。

  2. 创建一个 Date 对象,该对象指定自定义日期范围的开始日期。 将 Date 对象分配给 ReportTime.CustomDateRangeStart 元素。

  3. 创建另一个 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

另请参阅

Reporting Service 参考