reporting-dashboards

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Reporting & Dashboards for ServiceNow

ServiceNow 报表与仪表盘开发

ServiceNow provides comprehensive reporting capabilities for data visualization and business intelligence.
ServiceNow 为数据可视化与商业智能提供了全面的报表功能。

Report Types

报表类型

TypeUse CaseExample
ListTabular dataIncident list
BarCategory comparisonIncidents by priority
Pie/DonutDistributionTickets by category
Line/AreaTrends over timeWeekly ticket volume
Pivot TableMulti-dimensionalPriority x Category
Single ScoreKPI valueOpen P1 count
GaugeProgress/thresholdSLA compliance
类型使用场景示例
列表表格型数据事件列表
柱状图类别对比按优先级统计事件
饼图/环形图占比分布按类别统计工单
折线图/面积图时间趋势每周工单数量
透视表多维分析优先级 × 类别
单一指标KPI数值未解决P1事件数量
仪表盘进度/阈值SLA合规率

Creating Reports

创建报表

List Report (ES5)

列表报表(ES5)

javascript
// Create list report
var report = new GlideRecord('sys_report');
report.initialize();

report.setValue('title', 'Open High Priority Incidents');
report.setValue('table', 'incident');
report.setValue('type', 'list');

// Filter condition
report.setValue('filter', 'active=true^priority<=2');

// Columns
report.setValue('field', 'number,short_description,priority,state,assigned_to,opened_at');

// Sorting
report.setValue('orderby', 'priority');
report.setValue('order', 'ASC');

// Grouping (optional)
report.setValue('group', 'assignment_group');

// Access control
report.setValue('user', gs.getUserID());
report.setValue('roles', 'itil');

report.insert();
javascript
// Create list report
var report = new GlideRecord('sys_report');
report.initialize();

report.setValue('title', 'Open High Priority Incidents');
report.setValue('table', 'incident');
report.setValue('type', 'list');

// Filter condition
report.setValue('filter', 'active=true^priority<=2');

// Columns
report.setValue('field', 'number,short_description,priority,state,assigned_to,opened_at');

// Sorting
report.setValue('orderby', 'priority');
report.setValue('order', 'ASC');

// Grouping (optional)
report.setValue('group', 'assignment_group');

// Access control
report.setValue('user', gs.getUserID());
report.setValue('roles', 'itil');

report.insert();

Bar Chart Report (ES5)

柱状图报表(ES5)

javascript
// Create bar chart
var barReport = new GlideRecord('sys_report');
barReport.initialize();

barReport.setValue('title', 'Incidents by Priority');
barReport.setValue('table', 'incident');
barReport.setValue('type', 'bar');

// Aggregation
barReport.setValue('aggregate', 'COUNT');
barReport.setValue('group', 'priority');

// Filter
barReport.setValue('filter', 'active=true');

// Chart options
barReport.setValue('show_data_label', true);
barReport.setValue('show_legend', true);
barReport.setValue('chart_color', 'blue');

barReport.insert();
javascript
// Create bar chart
var barReport = new GlideRecord('sys_report');
barReport.initialize();

barReport.setValue('title', 'Incidents by Priority');
barReport.setValue('table', 'incident');
barReport.setValue('type', 'bar');

// Aggregation
barReport.setValue('aggregate', 'COUNT');
barReport.setValue('group', 'priority');

// Filter
barReport.setValue('filter', 'active=true');

// Chart options
barReport.setValue('show_data_label', true);
barReport.setValue('show_legend', true);
barReport.setValue('chart_color', 'blue');

barReport.insert();

Trend Report (ES5)

趋势报表(ES5)

javascript
// Create trend line chart
var trendReport = new GlideRecord('sys_report');
trendReport.initialize();

trendReport.setValue('title', 'Incident Volume - Last 30 Days');
trendReport.setValue('table', 'incident');
trendReport.setValue('type', 'line');

// Time-based grouping
trendReport.setValue('trend', 'opened_at');
trendReport.setValue('trend_interval', 'day');

// Aggregation
trendReport.setValue('aggregate', 'COUNT');

// Time filter
var thirtyDaysAgo = new GlideDateTime();
thirtyDaysAgo.addDaysLocalTime(-30);
trendReport.setValue('filter', 'opened_at>=' + thirtyDaysAgo.getValue());

// Stacked by category
trendReport.setValue('stack', 'priority');

trendReport.insert();
javascript
// Create trend line chart
var trendReport = new GlideRecord('sys_report');
trendReport.initialize();

trendReport.setValue('title', 'Incident Volume - Last 30 Days');
trendReport.setValue('table', 'incident');
trendReport.setValue('type', 'line');

// Time-based grouping
trendReport.setValue('trend', 'opened_at');
trendReport.setValue('trend_interval', 'day');

// Aggregation
trendReport.setValue('aggregate', 'COUNT');

// Time filter
var thirtyDaysAgo = new GlideDateTime();
thirtyDaysAgo.addDaysLocalTime(-30);
trendReport.setValue('filter', 'opened_at>=' + thirtyDaysAgo.getValue());

// Stacked by category
trendReport.setValue('stack', 'priority');

trendReport.insert();

Pivot Table (ES5)

透视表(ES5)

javascript
// Create pivot table
var pivotReport = new GlideRecord('sys_report');
pivotReport.initialize();

pivotReport.setValue('title', 'Incidents: Priority vs Category');
pivotReport.setValue('table', 'incident');
pivotReport.setValue('type', 'pivot');

// Dimensions
pivotReport.setValue('group', 'priority');       // Rows
pivotReport.setValue('stack', 'category');       // Columns

// Aggregation
pivotReport.setValue('aggregate', 'COUNT');

// Filter
pivotReport.setValue('filter', 'active=true');

// Show totals
pivotReport.setValue('show_row_total', true);
pivotReport.setValue('show_column_total', true);

pivotReport.insert();
javascript
// Create pivot table
var pivotReport = new GlideRecord('sys_report');
pivotReport.initialize();

pivotReport.setValue('title', 'Incidents: Priority vs Category');
pivotReport.setValue('table', 'incident');
pivotReport.setValue('type', 'pivot');

// Dimensions
pivotReport.setValue('group', 'priority');       // Rows
pivotReport.setValue('stack', 'category');       // Columns

// Aggregation
pivotReport.setValue('aggregate', 'COUNT');

// Filter
pivotReport.setValue('filter', 'active=true');

// Show totals
pivotReport.setValue('show_row_total', true);
pivotReport.setValue('show_column_total', true);

pivotReport.insert();

Dashboards

仪表盘

Creating Dashboard (ES5)

创建仪表盘(ES5)

javascript
// Create dashboard
var dashboard = new GlideRecord('sys_dashboard');
dashboard.initialize();

dashboard.setValue('name', 'IT Service Desk Dashboard');
dashboard.setValue('description', 'Key metrics for service desk operations');

// Layout
dashboard.setValue('layout', '3');  // 1, 2, 3, or 4 columns

// Access
dashboard.setValue('view_as', 'desktop');
dashboard.setValue('roles', 'itil');

var dashboardSysId = dashboard.insert();
javascript
// Create dashboard
var dashboard = new GlideRecord('sys_dashboard');
dashboard.initialize();

dashboard.setValue('name', 'IT Service Desk Dashboard');
dashboard.setValue('description', 'Key metrics for service desk operations');

// Layout
dashboard.setValue('layout', '3');  // 1, 2, 3, or 4 columns

// Access
dashboard.setValue('view_as', 'desktop');
dashboard.setValue('roles', 'itil');

var dashboardSysId = dashboard.insert();

Adding Widgets to Dashboard (ES5)

向仪表盘添加组件(ES5)

javascript
// Add report widget
function addReportToDashboard(dashboardId, reportId, row, column, width, height) {
    var widget = new GlideRecord('sys_dashboard_widget');
    widget.initialize();
    widget.setValue('dashboard', dashboardId);
    widget.setValue('report', reportId);
    widget.setValue('row', row);
    widget.setValue('column', column);
    widget.setValue('width', width || 1);   // columns wide
    widget.setValue('height', height || 1); // rows tall
    return widget.insert();
}

// Layout example (3-column dashboard)
// Row 0: Three single-score cards
addReportToDashboard(dashboardSysId, openIncidentsReport, 0, 0, 1, 1);
addReportToDashboard(dashboardSysId, avgResolutionReport, 0, 1, 1, 1);
addReportToDashboard(dashboardSysId, slaComplianceReport, 0, 2, 1, 1);

// Row 1: Full-width trend chart
addReportToDashboard(dashboardSysId, trendReport, 1, 0, 3, 2);

// Row 2: Two charts side by side
addReportToDashboard(dashboardSysId, priorityPieChart, 3, 0, 1, 2);
addReportToDashboard(dashboardSysId, categoryBarChart, 3, 1, 2, 2);
javascript
// Add report widget
function addReportToDashboard(dashboardId, reportId, row, column, width, height) {
    var widget = new GlideRecord('sys_dashboard_widget');
    widget.initialize();
    widget.setValue('dashboard', dashboardId);
    widget.setValue('report', reportId);
    widget.setValue('row', row);
    widget.setValue('column', column);
    widget.setValue('width', width || 1);   // columns wide
    widget.setValue('height', height || 1); // rows tall
    return widget.insert();
}

// Layout example (3-column dashboard)
// Row 0: Three single-score cards
addReportToDashboard(dashboardSysId, openIncidentsReport, 0, 0, 1, 1);
addReportToDashboard(dashboardSysId, avgResolutionReport, 0, 1, 1, 1);
addReportToDashboard(dashboardSysId, slaComplianceReport, 0, 2, 1, 1);

// Row 1: Full-width trend chart
addReportToDashboard(dashboardSysId, trendReport, 1, 0, 3, 2);

// Row 2: Two charts side by side
addReportToDashboard(dashboardSysId, priorityPieChart, 3, 0, 1, 2);
addReportToDashboard(dashboardSysId, categoryBarChart, 3, 1, 2, 2);

Scheduled Reports

定时报表

Create Scheduled Report (ES5)

创建定时报表(ES5)

javascript
// Schedule report for email delivery
var schedule = new GlideRecord('sys_report_schedule');
schedule.initialize();

schedule.setValue('report', reportSysId);
schedule.setValue('name', 'Weekly Incident Summary');

// Recipients
schedule.setValue('recipients', 'it-managers@company.com');
schedule.setValue('recipient_users', managersSysIds);  // comma-separated
schedule.setValue('recipient_groups', itManagersGroup);

// Schedule (cron)
schedule.setValue('run', 'weekly');
schedule.setValue('day', 'monday');
schedule.setValue('time', '08:00:00');

// Format
schedule.setValue('format', 'pdf');  // pdf, xlsx, csv

// Email settings
schedule.setValue('subject', 'Weekly IT Incident Summary');
schedule.setValue('message', 'Please find attached the weekly incident summary report.');

schedule.setValue('active', true);

schedule.insert();
javascript
// Schedule report for email delivery
var schedule = new GlideRecord('sys_report_schedule');
schedule.initialize();

schedule.setValue('report', reportSysId);
schedule.setValue('name', 'Weekly Incident Summary');

// Recipients
schedule.setValue('recipients', 'it-managers@company.com');
schedule.setValue('recipient_users', managersSysIds);  // comma-separated
schedule.setValue('recipient_groups', itManagersGroup);

// Schedule (cron)
schedule.setValue('run', 'weekly');
schedule.setValue('day', 'monday');
schedule.setValue('time', '08:00:00');

// Format
schedule.setValue('format', 'pdf');  // pdf, xlsx, csv

// Email settings
schedule.setValue('subject', 'Weekly IT Incident Summary');
schedule.setValue('message', 'Please find attached the weekly incident summary report.');

schedule.setValue('active', true);

schedule.insert();

Advanced Reporting

高级报表

Report with Formula Field (ES5)

带公式字段的报表(ES5)

javascript
// Report with calculated field
var report = new GlideRecord('sys_report');
report.initialize();

report.setValue('title', 'SLA Breach Analysis');
report.setValue('table', 'task_sla');
report.setValue('type', 'bar');

// Custom formula aggregation
report.setValue('aggregate', 'SUM');
report.setValue('field', 'has_breached');  // Boolean to count

// Percentage calculation
report.setValue('formula',
    'CASE WHEN {has_breached} = 1 THEN 1 ELSE 0 END'
);

report.setValue('group', 'sla.name');

report.insert();
javascript
// Report with calculated field
var report = new GlideRecord('sys_report');
report.initialize();

report.setValue('title', 'SLA Breach Analysis');
report.setValue('table', 'task_sla');
report.setValue('type', 'bar');

// Custom formula aggregation
report.setValue('aggregate', 'SUM');
report.setValue('field', 'has_breached');  // Boolean to count

// Percentage calculation
report.setValue('formula',
    'CASE WHEN {has_breached} = 1 THEN 1 ELSE 0 END'
);

report.setValue('group', 'sla.name');

report.insert();

Drill-Down Report (ES5)

钻取报表(ES5)

javascript
// Create report with drill-down capability
var summaryReport = new GlideRecord('sys_report');
summaryReport.initialize();

summaryReport.setValue('title', 'Incidents by Assignment Group');
summaryReport.setValue('table', 'incident');
summaryReport.setValue('type', 'bar');
summaryReport.setValue('aggregate', 'COUNT');
summaryReport.setValue('group', 'assignment_group');

// Enable drill-down
summaryReport.setValue('is_drillable', true);
summaryReport.setValue('drill_down_report', detailReportSysId);

summaryReport.insert();
javascript
// Create report with drill-down capability
var summaryReport = new GlideRecord('sys_report');
summaryReport.initialize();

summaryReport.setValue('title', 'Incidents by Assignment Group');
summaryReport.setValue('table', 'incident');
summaryReport.setValue('type', 'bar');
summaryReport.setValue('aggregate', 'COUNT');
summaryReport.setValue('group', 'assignment_group');

// Enable drill-down
summaryReport.setValue('is_drillable', true);
summaryReport.setValue('drill_down_report', detailReportSysId);

summaryReport.insert();

Export & Integration

导出与集成

Export Report Data (ES5)

导出报表数据(ES5)

javascript
// Export report to CSV
function exportReportToCSV(reportSysId) {
    var report = new GlideRecord('sys_report');
    if (!report.get(reportSysId)) return null;

    var ga = new GlideAggregate(report.getValue('table'));

    // Apply filter
    var filter = report.getValue('filter');
    if (filter) {
        ga.addEncodedQuery(filter);
    }

    // Apply grouping
    var groupField = report.getValue('group');
    if (groupField) {
        ga.addAggregate('COUNT');
        ga.groupBy(groupField);
    }

    ga.query();

    var results = [];
    while (ga.next()) {
        results.push({
            group: ga.getValue(groupField),
            count: ga.getAggregate('COUNT')
        });
    }

    return results;
}
javascript
// Export report to CSV
function exportReportToCSV(reportSysId) {
    var report = new GlideRecord('sys_report');
    if (!report.get(reportSysId)) return null;

    var ga = new GlideAggregate(report.getValue('table'));

    // Apply filter
    var filter = report.getValue('filter');
    if (filter) {
        ga.addEncodedQuery(filter);
    }

    // Apply grouping
    var groupField = report.getValue('group');
    if (groupField) {
        ga.addAggregate('COUNT');
        ga.groupBy(groupField);
    }

    ga.query();

    var results = [];
    while (ga.next()) {
        results.push({
            group: ga.getValue(groupField),
            count: ga.getAggregate('COUNT')
        });
    }

    return results;
}

REST API for Reports

报表REST API

javascript
// Get report data via REST
// GET /api/now/stats/{table}?sysparm_query={filter}&sysparm_count=true&sysparm_group_by={field}

// Example: Incidents by priority
// GET /api/now/stats/incident?sysparm_query=active=true&sysparm_count=true&sysparm_group_by=priority
javascript
// Get report data via REST
// GET /api/now/stats/{table}?sysparm_query={filter}&sysparm_count=true&sysparm_group_by={field}

// Example: Incidents by priority
// GET /api/now/stats/incident?sysparm_query=active=true&sysparm_count=true&sysparm_group_by=priority

MCP Tool Integration

MCP工具集成

Available Reporting Tools

可用的报表工具

ToolPurpose
snow_create_report
Create report
snow_create_dashboard
Create dashboard
snow_create_scheduled_report
Schedule delivery
snow_discover_reporting_tables
Find available tables
snow_discover_report_fields
Get field options
snow_export_report_data
Export data
snow_create_data_visualization
Create chart
工具用途
snow_create_report
创建报表
snow_create_dashboard
创建仪表盘
snow_create_scheduled_report
定时发送
snow_discover_reporting_tables
查找可用表
snow_discover_report_fields
获取字段选项
snow_export_report_data
导出数据
snow_create_data_visualization
创建图表

Example Workflow

示例工作流

javascript
// 1. Discover available tables
var tables = await snow_discover_reporting_tables({
    category: 'itsm'
});

// 2. Get fields for table
var fields = await snow_discover_report_fields({
    table: 'incident'
});

// 3. Create report
var reportId = await snow_create_report({
    title: 'Incident Overview',
    table: 'incident',
    type: 'bar',
    group: 'priority',
    aggregate: 'COUNT',
    filter: 'active=true'
});

// 4. Create dashboard
var dashboardId = await snow_create_dashboard({
    name: 'Service Desk Overview',
    layout: '3-column'
});

// 5. Add report to dashboard
await snow_add_dashboard_widget({
    dashboard: dashboardId,
    report: reportId,
    row: 0,
    column: 0
});

// 6. Schedule report
await snow_create_scheduled_report({
    report: reportId,
    frequency: 'weekly',
    recipients: 'managers@company.com',
    format: 'pdf'
});
javascript
// 1. Discover available tables
var tables = await snow_discover_reporting_tables({
    category: 'itsm'
});

// 2. Get fields for table
var fields = await snow_discover_report_fields({
    table: 'incident'
});

// 3. Create report
var reportId = await snow_create_report({
    title: 'Incident Overview',
    table: 'incident',
    type: 'bar',
    group: 'priority',
    aggregate: 'COUNT',
    filter: 'active=true'
});

// 4. Create dashboard
var dashboardId = await snow_create_dashboard({
    name: 'Service Desk Overview',
    layout: '3-column'
});

// 5. Add report to dashboard
await snow_add_dashboard_widget({
    dashboard: dashboardId,
    report: reportId,
    row: 0,
    column: 0
});

// 6. Schedule report
await snow_create_scheduled_report({
    report: reportId,
    frequency: 'weekly',
    recipients: 'managers@company.com',
    format: 'pdf'
});

Best Practices

最佳实践

  1. Clear Titles - Descriptive, action-oriented names
  2. Appropriate Type - Match chart type to data
  3. Filter Wisely - Default to relevant subset
  4. Color Meaning - Consistent color conventions
  5. Mobile Friendly - Test on smaller screens
  6. Performance - Limit rows, use aggregations
  7. Access Control - Role-based visibility
  8. Regular Refresh - Keep data current
  1. 清晰命名 - 使用描述性、面向行动的名称
  2. 合适类型 - 图表类型与数据匹配
  3. 合理过滤 - 默认显示相关子集
  4. 颜色规范 - 保持颜色约定一致
  5. 移动端适配 - 在小屏幕上测试
  6. 性能优化 - 限制行数,使用聚合
  7. 权限控制 - 基于角色的可见性
  8. 定期更新 - 保持数据时效性