# 报表开发常见问题排查（FAQ）

按症状对照原因与解决方案。遇到报表问题先看这里。

## 一、发布后报表列表看不到

**症状**：账表已保存发布，用户登录后报表列表中找不到，或提示无权限。

**原因**：功能权限未分配（最常见）。

**解决**：
1. 系统管理 → 角色管理/用户管理 → 找到用户
2. 功能权限 → 勾选该账表功能（含子功能：查询、导出）
3. 重新登录

**补充**：
- 新发布账表默认只有开发/管理员可见
- 检查账表是否发布到了正确的应用/菜单
- 菜单归属（账表分类）影响显示位置

## 二、报表打开但取数为空

**症状**：报表能打开，但表格没有任何数据。

**原因排查顺序**：
1. **过滤参数为空** → 参数无默认值，用户直接查询导致无数据 → 设默认值（当前月/当前组织）
2. **数据权限/组织范围** → SQL 组织过滤与用户可见组织不一致 → 检查组织参数与数据权限
3. **状态过滤** → 单据状态过滤条件（如 FDocumentStatus='A'）过滤掉了目标数据 → 确认状态值
4. **SQL 本身无数据** → 先在数据库管理工具直接执行该 SQL 验证
5. **字段映射** → 数据集字段与 SQL 列不对应（列名/大小写）

**排查动作**：把取数 SQL 复制到 SSMS 直接执行，先确认 SQL 是否有数据，再查参数与权限。

## 三、SQL 报错/执行失败

**常见原因**：
- 写了 `INSERT/UPDATE/DELETE/CREATE` → 直接SQL账表只允许 SELECT
- 表名/字段名错误 → 用数据字典技能核对表名（T_开头）与字段标识
- 字段名大小写/关键字冲突 → 字段名加方括号 `[FKEY]`
- 参数名未定义 → 账表中定义了过滤项才有对应参数
- 动态视图不存在 → 版本差异，以实际环境为准

## 四、报表慢/超时

**优化手段**：
1. SELECT 只取必要列，禁止 `SELECT *`
2. WHERE 加范围过滤（日期、组织）
3. 避免对索引列做函数计算（`YEAR(FDate)` → 改范围比较）
4. 大表关联加索引（FBillNo、FDate、FCreateOrgId、FDocumentStatus）
5. 汇总类报表考虑预聚合/中间表
6. 分页展示，避免一次加载全量

## 五、跨组织取数不对

**症状**：A 组织用户看到 B 组织数据，或看不到本组织数据。

**原因**：
- SQL 没有按组织过滤
- 组织参数未参与 SQL
- 多组织单据用了创建组织（FCreateOrgId）但业务上用使用组织（FUseOrgId）

**解决**：明确业务口径（按创建组织还是使用组织），SQL 与参数统一，配好数据权限。

## 六、金额/数量显示不对（精度、汇总）

- 金额字段类型设为"金额"，数量设为"数量"，不要都用文本
- 汇总行：字段设"合计"方式（求和）
- 精度：字段格式设小数位（金额 2 位、单价 4-6 位）
- 含税/未税口径：FAmount（未税）vs FALLAMOUNT（价税合计），确认业务口径

## 七、导出 Excel 问题

- 导出权限：功能授权需勾选"导出"子功能
- 大数据量导出：分批或提示用户
- 导出格式：金蝶导出 Excel 默认走系统导出服务，列顺序按字段顺序

## 八、账表双击下钻

**需求**：点击报表行打开单据/明细账表。

**实现**：
1. 直接SQL账表 + 表单插件（C#）
2. 在 CellClick/RowClick 事件中获取当前行关键字段（FID）
3. 调用 ShowForm 打开目标单据/报表并传参
参考：账表表单插件（继承 AbstractDynamicFormPlugIn 或对应账表插件基类）

## 九、参数/过滤条件带不过去（下钻传参）

- 目标报表参数名与传入参数名一致
- 传入参数在目标报表中有定义
- 日期参数传字符串需转日期

## 十、数据字典字段查不到

- 字段在扩展元数据（插件自定义字段）→ 从数据字典的扩展元数据中查
- 字段名记错 → 用数据字典技能反查（字段标识 → 表单/表）

## 通用排查口诀

1. 看不见 → 功能权限
2. 没数据 → 参数/权限/SQL 三查
3. SQL 错 → 只读约束 + 表名核对
4. 慢 → 索引 + 减少扫描
5. 串组织 → 组织过滤 + 数据权限
