# 报表取数与计算常用函数、取数插件

本文件覆盖金蝶云星空报表开发中的常用函数与取数插件（C#）开发要点。

## 一、报表取数函数（账表/报表表达式）

金蝶报表系统提供各类取数与计算函数，用于公式单元格、汇总、条件取数。

### 常用取数函数

| 函数 | 用途 | 示例 |
|---|---|---|
| `ACCT(...)` | 总账科目取数（账簿、科目、期间、取数类型） | `ACCT("1001","Y","",0,0,0,"")` 取现金科目本期发生额 |
| `ACCTGROUP(...)` | 科目组取数 | 按科目组汇总 |
| `PTOTAL(...)` / `TOTAL(...)` | 单元格合计 | 纵向/横向汇总 |
| `SUM(...)` | 求和 | `SUM(B5:B10)` |
| `AVG(...)` | 平均 | |
| `MAX(...)` / `MIN(...)` | 最大/最小 | |
| `COUNT(...)` | 计数 | |
| `ABS(...)` | 绝对值 | |
| `ROUND(...)` | 四舍五入 | |
| `IF(...)` | 条件 | `IF(条件, 真值, 假值)` |
| `YEAR(...)` / `MONTH(...)` / `DAY(...)` | 日期取年/月/日 | |
| `TODAY()` | 当前日期 | |
| `NOW()` | 当前日期时间 | |
| `DATE(...)` | 构造日期 | |
| `TEXT(...)` / `VALUE(...)` | 类型转换 | |
| `CONCAT(...)` | 字符串连接 | |
| `LEFT(...)` / `RIGHT(...)` / `MID(...)` | 字符串截取 | |
| `LEN(...)` | 字符串长度 | |
| `ISNULL(...)` / `NVL(...)` | 空值处理 | `NVL(字段, 0)` |

> 具体函数名与签名以当前版本报表设计器内置函数列表为准（插入 → 函数 / F8 快捷键调出函数列表）。不同版本（星空/星瀚）函数集有差异。

### 财务取数 ACCT 函数说明

```
ACCT(科目, 取数类型, 年度, 期间, 期间数, 币别, 账簿, 是否包含未过账, 取数参数...)
```

- 科目：会计科目编码，可含通配（如 "1001*"）
- 取数类型：Y=余额、JF=借方发生、DF=贷方发生、JC=借方累计、DC=贷方累计 等
- 期间：0=当前期间，负数往前推
- 币别：0=综合本位币

**示例**：
- 现金期末余额：`ACCT("1001","Y",0,0,0,0,"",0)`
- 应收账款本期借方发生：`ACCT("1122","JF",0,0,0,0,"",0)`

## 二、直接SQL账表 SQL 常用写法

### 单据状态
```sql
FDocumentStatus = 'A'    -- 已审核
FDocumentStatus IN ('A','B')  -- 审核+暂存
```

### 组织过滤
```sql
FCreateOrgId = @OrgId
FUseOrgId IN (@OrgIds)
```

### 金额汇总（含税/未税）
```sql
SELECT FBillNo, SUM(FAmount) AS 金额, SUM(FTAXAMOUNT) AS 税额, SUM(FALLAMOUNT) AS 价税合计
FROM T_SAL_SALEORDER GROUP BY FBillNo
```

### 基础资料关联（取编码/名称）
```sql
SELECT m.FNUMBER AS 物料编码, m.FNAME AS 物料名称
FROM T_BD_MATERIAL m
```

### 按期间/日期过滤
```sql
FDate >= @StartDate AND FDate < DATEADD(DAY, 1, @EndDate)
-- 或按会计期间：FPeriodId = @PeriodId
```

## 三、取数插件（C#，AbstractReportPlugIn）

动态表单报表/账表需要复杂取数时，编写报表插件。基类：`AbstractReportPlugIn`（Kingdee.BOS.Report.PlugIn 命名空间）。

### 核心方法与事件

| 成员 | 用途 |
|---|---|
| `OnInitialize` | 初始化，可设置参数默认值 |
| `OnPrepareFilter` / `OnGetReportData` | 取数前准备（设置过滤条件） |
| `GetReportData` | 返回报表数据（DataSet） |
| `OnBuildReportParameter` | 构建报表参数 |
| `BarItemClick` | 工具栏按钮点击 |
| `EntryButtonClick` / `CellClick` | 单元格点击（下钻） |
| `GetReportHeadInfo` | 报表头信息 |
| `OnGetReportDataFinish` | 取数完成事件 |

### 插件开发步骤

1. BOS 创建动态表单（类型选"报表"）或账表
2. 添加报表插件（C# 类继承 AbstractReportPlugIn）
3. 重写 GetReportData 返回 DataSet：
```csharp
public override DataSet GetReportData()
{
    // 获取过滤条件
    // 执行查询（QueryServiceHelper / DBServiceHelper）
    // 组装 DataSet 返回
}
```
4. 编译 DLL，在 BOS 中挂接插件
5. 发布授权

### 过滤条件获取（插件中）

```csharp
// 获取账表/报表过滤条件
// 通过 FilterParameter / 表单参数集合读取用户选择的过滤值
```

### 下钻实现（点击行打开另一报表）

1. 报表单元格/行双击事件（CellClick / RowClick）
2. 构造目标报表参数（如 FID、期间）
3. 调用 `ShowForm` 打开明细报表或单据

## 四、报表性能建议（插件取数）

- 一次取数，不要循环查库
- 大批量数据使用分页（Paging）
- 复杂聚合尽量下推到 SQL，不要在 C# 内存中做
- 缓存不变的基础数据（组织、物料名称）

## 五、常用命名空间

```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS.Core.Report.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.App.Data;
```

> 插件 API 因版本而异，实际开发时以当前环境的程序集与接口为准，勿凭本文档签名直接编译。
