# 用Power BI分析你的BCL销售

> 从BCL导出已付款的交易，或从BCL API读取，在Power BI制作按表单、付款渠道和日期分析销售的报告。
>
> Source: https://docs.bcl.my/zh/power-bi/

BCL没有内置的Power BI连接器，但你的销售数据很容易转过去。从BCL导出已付款的交易，在Excel整理文件，然后在Power BI Desktop（免费）制作报告，按表单、付款渠道和日期显示营业额。如果你熟悉API，Power BI也可以直接从BCL API读取你的交易。

## 导出已付款的交易

先准备一个包含成功付款的Excel文件：

1. 在侧边栏点击**Transactions**。
2. 点击**Successful**标签页，然后点击**Export All**。

   *(Screenshot: Transactions页面，侧边栏的Transactions、Successful标签页和Export All按钮已标示)*

3. 保留默认的列，点击**Submit**。Excel文件就会下载。

   *(Screenshot: Export All面板，Submit按钮已标示)*

所有导出选项，请看[导出你的交易](/zh/export-transactions/)。

## 每笔订单只保留一行

导出的文件里，订单的每个产品各占一行，而且每一行都会重复该订单的**Total Amount (RM)**。先删除多出来的行，否则Power BI会把这些订单计算不止一次：

1. 用Excel打开文件，或上传到OneDrive后用Excel for the web打开。
2. 点击**Data** → **Remove Duplicates**。
3. 取消勾选**Select all columns**，只勾选**Order Number**，保持勾选**My data has headers**，然后点击**OK**。

   *(Screenshot: Remove Duplicates对话框，只勾选了Order Number，OK按钮已标示)*

4. 保存文件。

Excel会告诉你删除了多少个重复的行。剩下的行，每笔已付款订单一行。

## 在Power BI Desktop制作报告

Power BI Desktop是Microsoft推出的免费Windows App。先在那里制作报告，然后发布到Power BI service：

1. 打开Power BI Desktop，点击**Excel workbook**。

   *(Screenshot: Power BI Desktop开始页面，Excel workbook图块已标示)*

2. 选择你保存好的导出文件。在**Navigator**勾选**Worksheet**，然后点击**Load**。
3. 从**Visualizations**窗格添加这三个视觉对象，并在**Data**窗格勾选栏位：

   | 视觉对象 | 栏位 | 显示什么 |
   | --- | --- | --- |
   | Clustered bar chart | **Form Name**、**Total Amount (RM)** | 按表单的营业额 |
   | Donut chart | **Payment Channel**、**Total Amount (RM)** | 按付款渠道的营业额，例如FPX或DuitNow QR |
   | Clustered column chart | **Transaction Date**（按日）、**Total Amount (RM)** | 按日的营业额 |

4. 保存报告，然后点击**Publish**，选择**My workspace**。在[app.powerbi.com](https://app.powerbi.com)打开报告，就可以在浏览器查看，或在你的机构内分享。

要更新报告，就重新导出，替换文件，然后在Power BI Desktop点击**Refresh**刷新数据，再重新发布。

## 进阶：从BCL API读取你的销售

Power BI Desktop可以调用BCL API，不必读取导出的文件。你需要一个拥有**API Read**权限的BCL API token，在**Platform Setup** → **Integrations** → **API Token**获取。请看[API tokens](/zh/api-tokens/)。

> **Caution**
> API只列出真实交易。测试模式的付款不会出现在`/transactions`。

1. 在Power BI Desktop开始页面点击**Get data from other sources**（或在**Home**标签页点击**Get data**），搜索**Web**，选择它，然后点击**Connect**。

   *(Screenshot: Get Data对话框，Web连接器和Connect按钮已标示)*

2. 选择**Advanced**。在**URL parts**输入`https://api.bcl.my/v1/transactions`和`?per_page=100`。在**HTTP request header parameters**下，添加**Authorization**，值是`Bearer `加上你的token，点击**Add header**，再添加**User-Agent**，值是你的App名称，例如`KopiKampung-PowerBI/1.0`。没有正确User-Agent的请求会被BCL拒绝。点击**OK**。

   *(Screenshot: Advanced模式下的From Web对话框，URL parts以及Authorization和User-Agent header已标示)*

3. 如果Power BI问你要怎样连接，选择**Anonymous**，然后点击**Connect**。你的token已经在header里发送。Power Query会打开，并把JSON转换成表格。

第一个查询只读取一页，最多100笔交易。要读取所有页面，并只保留你需要的列，就在Power Query点击**Advanced Editor**，把查询换成下面这个。把`YOUR_API_TOKEN`换成你的token：

```text
let
    Token = "YOUR_API_TOKEN",
    GetPage = (page as number) =>
        Json.Document(Web.Contents("https://api.bcl.my/v1", [
            RelativePath = "transactions",
            Query = [per_page = "100", page = Number.ToText(page)],
            Headers = [
                Authorization = "Bearer " & Token,
                #"User-Agent" = "KopiKampung-PowerBI/1.0",
                Accept = "application/json"
            ]
        ])),
    FirstPage = GetPage(1),
    AllRows = List.Combine(
        List.Transform({1..FirstPage[meta][last_page]}, each GetPage(_)[data])
    ),
    Orders = Table.FromRecords(AllRows,
        {"order_number", "created_at", "payer_name", "amount", "status",
         "payment_channel", "form_type", "remarks"}, MissingField.UseNull),
    Typed = Table.TransformColumnTypes(Orders,
        {{"created_at", type datetime}, {"amount", type number}})
in
    Typed
```

*(Screenshot: Power Query的Advanced Editor，里面是分页查询)*

点击**Done**，在**Query Settings**下为查询命名（例如**BCL Orders**），然后点击**Close & Apply**。API每笔交易返回一行，所以没有产品行需要删除。它包含所有状态，所以加总营业额之前，先把**status**列筛选为成功的付款。

*(Screenshot: Power Query里的BCL Orders查询，每笔交易一行，Name栏位已标示)*

## 小贴士

几个好习惯，让你的报告准确又安全：

- **只导出Successful标签页**。导出文件里的待处理、失败和已取消付款会让营业额虚高。
- **每次使用相同的文件名**。用同一个名称把旧的导出文件换成新的，在Power BI Desktop点击**Refresh**，就能刷新到新数据，不用重新制作视觉对象。
- **不要把API token放在共享的文件里**。Token就在报告的查询里。不要把.pbix文件发给不应该看到你BCL数据的人，而且只给token**API Read**权限。
- **想让新订单一进来就出现在Excel**？请看[用Power Automate把订单发送到Excel](/zh/excel-power-automate/)。

## 常见问题

### 为什么Power BI里的营业额比BCL高？

BCL导出的文件每个产品一行，每一行都会重复该订单的Total Amount (RM)。加总之前，先按Order Number删除重复的行。

### Power BI可以直接读取我的BCL数据吗？

可以，使用Power BI Desktop和BCL API。使用Get data → Web，在Authorization header发送你的API token，并设置你自己的User-Agent。API只列出真实交易。

### 我把Excel文件导入Power BI service，却只看到电子表格。为什么？

Power BI service会把导入的Excel文件当作工作簿打开查看，而不是报告用的数据。请在Power BI Desktop制作报告，然后发布到你的工作区。
