系统集成SQL Server

SQL SERVER Power BI 设计和优化 问题?

项目中遇到的一些 PBI 设计和优化的问题,请大家帮忙看看:

1.  如何自定义视觉对象

2.  如何有效的使用书签

3.  PBI中分页,书签,页面视觉对象的控制

4.  模型的数据源,提前对数据进行排序存放对刷数据后查询模型是否有提高?

5.  PBI读模型数据排序需要模型预处理,能否PBI实现

6.  PBI读模型和数据库的两种方式,会带来哪些开发方式和设计PBI方法的不同

7.  PBI 交接SSAS是否可以使用import模式

8.  对于视觉对象过多,从而导致performance较差的报表,有什么提升性能的建议

参与5

1同行回答

zhuqibszhuqibs软件开发工程师Adidas
3. 使用 Power BI 报表书签可捕获报表页的配置视图、选择状态、视觉对象的筛选状态。 但它需要来自 Power BI 视觉对象的其他操作来支持书签并对更改做出正确反应。有关书签的详细信息,请参阅使用书签在 Power BI 中共享见解和创建故事。视觉对象中的报表书签支持如果视...显示全部

3.
使用 Power BI 报表书签可捕获报表页的配置视图、选择状态、视觉对象的筛选状态。 但它需要来自 Power BI 视觉对象的其他操作来支持书签并对更改做出正确反应。

有关书签的详细信息,请参阅使用书签在 Power BI 中共享见解和创建故事

视觉对象中的报表书签支持

如果视觉对象与其他视觉对象交互、选择数据点或筛选其他视觉对象,则需要从属性中还原状态。

添加报表书签支持

  1. 安装(或更新)所需的实用程序 - powerbi-visuals-utils-interactivityutils版本 3.0.0 或更高版本。 它包含使用状态选择或筛选器进行操作的其他类。 筛选器视觉对象和使用 InteractivityService的任何视觉对象都需要它。
  2. 将视觉对象 API 更新到版本 1.11.0,以便在 SelectionManager 的实例中使用 registerOnSelectCallback。 使用普通 SelectionManager 而非 InteractivityService的非筛选器视觉对象都需要它。

    Power BI 视觉对象如何在报表书签中与 Power BI 进行交互

请考虑以下情景:你希望在报表页上创建多个书签,每个书签中都有不同的选择状态。

首先,在视觉对象中选择一个数据点。 视觉对象通过将选择传递给主机来与 Power BI 和其他视觉对象进行交互。 然后在“书签”窗格中选择“添加”,Power BI 将保存新书签的当前选择 。

更改选择并添加新书签时,会重复发生此情况。 创建书签后,可以在它们之间进行切换。

选择书签时,Power BI 会还原已保存的筛选器或选择状态并传递给视觉对象。 根据书签中存储的状态突出显示或筛选其他视觉对象。 Power BI 主机负责执行操作。 视觉对象负责正确反映新的选择状态(例如,更改所呈现的数据点的颜色)。

新的选择状态通过 update方法传达给视觉对象。 options 参数包含一个特殊属性 options.jsonFilters。 它的 JSONFilter 属性可以包含 Advanced Filter 和 Tuple Filter。

视觉对象应还原筛选器值,以显示所选书签的视觉对象的对应状态。 或者,如果视觉对象只使用选择,则你可以使用注册为 ISelectionManager 的 registerOnSelectCallback方法的特殊回叫函数。

带选择的视觉对象

如果视觉对象使用选择与其他视觉对象交互,则可通过以下两种方式之一添加书签:

  • 如果视觉对象尚未使用 InteractivityService,则你可以使用 FilterManager.restoreSelectionIds方法。
  • 如果视觉对象已使用 InteractivityService 来管理选择,则应使用 InteractivityService 实例中的 applySelectionFromFilter方法。

    使用 ISelectionManager.registerOnSelectCallback

选择书签时,Power BI 会使用相应的选择调用视觉对象的 callback方法。

TypeScript

this.selectionManager.registerOnSelectCallback(
    (ids: ISelectionId[]) => {
        //called when a selection was set by Power BI
    });
);

假设视觉对象中有一个数据点是在 visualTransform方法中创建的。

datapoints如下所示:

TypeScript

visualDataPoints.push({
    category: categorical.categories[0].values[i],
    color: getCategoricalObjectValue(categorical.categories[0], i, 'colorSelector', 'fill', defaultColor).solid.color,
    selectionId: host.createSelectionIdBuilder()
        .withCategory(categorical.categories[0], i)
        .createSelectionId(),
    selected: false
});

现将 visualDataPoints 作为数据点,且将 ids 数组传递给 callback函数。

此时,视觉对象应将 ISelectionId[] 的数组与 visualDataPoints数组中的选择进行比较,并将相应的数据点标记为已选中。

TypeScript

this.selectionManager.registerOnSelectCallback(
    (ids: ISelectionId[]) => {
        visualDataPoints.forEach(dataPoint => {
            ids.forEach(bookmarkSelection => {
                if (bookmarkSelection.equals(dataPoint.selectionId)) {
                    dataPoint.selected = true;
                }
            });
        });
    });
);

更新数据点后,它们将反映存储在 filter对象中的当前选择状态。 然后,当呈现数据点时,自定义视觉对象的选择状态将与书签的状态匹配。

使用 InteractivityService 控制视觉对象中的选择

如果视觉对象使用 InteractivityService,则无需执行任何其他操作来支持视觉对象中的书签。

选择书签时,该实用程序将处理视觉对象的选择状态。

带筛选器的视觉对象

假设视觉对象创建了一个按日期范围筛选数据的筛选器。 将 startDate 和 endDate作为范围的开始日期和结束日期。

视觉对象创建高级筛选器并调用主机方法 applyJsonFilter按相关条件筛选数据。

目标是用于筛选的表。

TypeScript

import { AdvancedFilter } from "powerbi-models";

const filter: IAdvancedFilter = new AdvancedFilter(
    target,
    "And",
    {
        operator: "GreaterThanOrEqual",
        value: startDate
            ? startDate.toJSON()
            : null
    },
    {
        operator: "LessThanOrEqual",
        value: endDate
            ? endDate.toJSON()
            : null
    });

this.host.applyJsonFilter(
    filter,
    "general",
    "filter",
    (startDate && endDate)
        ? FilterAction.merge
        : FilterAction.remove
);

每次选择书签时,自定义视觉对象都会获取 update调用。

自定义视觉对象应检查对象中的筛选器:

TypeScript

const filter: IAdvancedFilter = FilterManager.restoreFilter(
    && options.jsonFilters
    && options.jsonFilters[0] as any
) as IAdvancedFilter;

如果 filter对象不为 NULL,则视觉对象应从对象还原筛选条件:

TypeScript

const jsonFilters: AdvancedFilter = this.options.jsonFilters as AdvancedFilter[];

if (jsonFilters
    && jsonFilters[0]
    && jsonFilters[0].conditions
    && jsonFilters[0].conditions[0]
    && jsonFilters[0].conditions[1]
) {
    const startDate: Date = new Date(`${jsonFilters[0].conditions[0].value}`);
    const endDate: Date = new Date(`${jsonFilters[0].conditions[1].value}`);

    // apply restored conditions
} else {
    // apply default settings
}

在此之后,视觉对象应更改其内部状态来反映当前条件。 内部状态包括数据点和可视化对象(线条、矩形等)。

重要

在报表书签情景中,视觉对象不应调用 applyJsonFilter来筛选其他视觉对象。 它们已由 Power BI 筛选。

时间线切片器视觉对象会将范围选择器更改为相应的数据范围。

有关详细信息,请参阅时间线切片器存储库

筛选状态以在书签中保存视觉对象属性

filterState属性构成筛选某部分的一个属性。 视觉对象可在书签中存储不同的值。

若要将属性值保存为筛选器状态,请在 capabilities.json 文件中将对象属性标记为 "filterState": true。

例如,时间线切片器将 Granularity属性值存储在筛选器中。 通过该切片器可在更改书签时更改当前粒度。

收起
互联网服务 · 2020-04-30
浏览1146

提问者

leo_wyn
商业智能工程师Security

相关问题

相关资料

问题状态

  • 发布时间:2020-04-30
  • 关注会员:2 人
  • 问题浏览:1661
  • 最近回答:2020-04-30
  • X社区推广