本页来源
以「2026 年年度预算 G&A 编制 V0→V1」为例,按流程表驱动的顺序还原报表使用顺序、挂载程序、数据流转,以及数据丢失与颗粒度不一致的高风险场景。
内容同步自知识库:20-多项目管理\P2026-01-海油-运维\海油-预算-输出\2026年度预算-GA编制-V0到V1链路解析-20260911-V2流程表驱动版.md
2026年度预算 G&A 编制 V0→V1 全链路解析(流程表驱动版)¶
本版修正了上一版的分析逻辑。上一版从程序出发反查报表("用户保存 → 触发程序 → 看程序写了什么"), 因果倒置。正确的主链是:流程表约定用哪些报表 → 用户按序打开录入 → 保存动作触发报表挂载的程序。 程序是报表的属性,不是链路的起点。
〇、方法论:为什么必须"流程表优先"¶
0.1 两种分析路径的差异¶
| 上一版(程序驱动)❌ | 本版(流程表驱动)✅ | |
|---|---|---|
| 起点 | 存储过程(CPM_SP_GA_*) |
流程表(导航页) |
| 中段 | 反查哪些报表挂了这个 SP | 报表使用顺序(轮次 × 角色) |
| 终点 | 报表 | 报表挂载的程序 → 程序链 |
| 能回答 | "这个程序会改哪些数据" | "这条业务链上,谁在什么时候填哪张表,填完发生什么" |
| 失掉什么 | 业务语义、角色归属、先后顺序 | — |
结论:程序驱动只能做排障(某个 SP 出错影响谁),不能做链路设计(这条链是怎么组织的)。 本版全部结论以流程表为骨架重建。
0.2 ⚠️ 适用范围声明¶
"流程表(导航页)约定报表清单"是海油项目的落地方式(环境配置),不是 Tagetik 通用机制。
- Tagetik 平台不强制用导航页来组织报表使用顺序;
- 平台自带的流程机制是
RACCOLTA采集流程族(流程 → 类型 → 阶段 → 报表绑定), 但海油没有用它来区分 V0/V1 或部门(实测见 §1.4); - 其他项目可能:不用导航页、用
RACCOLTA正经配置、或干脆靠文档/人工约定。 - 迁移到别的客户时,必须重新确认"哪张表/哪个页面承载使用约定",不能照搬本报告。
0.3 流程表的载体:不是 RACCOLTA,而是三张导航报表¶
我先按"流程表 = 数据库流程表"做了排查,实测否定了这个假设:
| 检验项 | 实测结果 | 结论 |
|---|---|---|
RACCOLTA 流程实例 |
仅 5 条($、$PROCESS、CI_PROCESS、CI_BGT_ADJUST、CI_ESTIMATE) |
是平台标准采集流程,非海油业务约定 |
RACCOLTA_TIPO 节点类型 |
只有 $PDM(Standard data model)一种 |
没有 V0/V1、BU/FD/Planning 节点 |
RACCOLTA_PROSPETTO 绑定 |
CI_PROCESS 绑 1774 张、CI_BGT_ADJUST 绑 1772 张(≈全库) |
绑定范围过宽,不具备"选用"语义 |
COD_FASE 阶段取值 |
$STEP / PLETL / STEP1 |
不是 LO/IC/CA 三阶段 |
RACCOLTA_ATTIVITA |
挂的是平台标准动作(CFP/DISGNOSTIC/CLOSING),FLAG_ESEGUI 多为 0 |
未用于海油自研程序 |
真正的流程表 = 三张流程引导报表(用户已确认):
| 导航页 | 名称 | 角色 | 页数 | 超链接 | 可达报表 | 目录分布佐证 |
|---|---|---|---|---|---|---|
A1501_01 |
WorkFlow_WP&B | BU 编制 | 6 | 214 | 187 | COMMON 47 / BU INPUT 46 / BU 32 / BU OUTPUT 18 |
A1502_01 |
WorkFlow_WP&B_FD | 专业部门(FD)编制 | 10 | 425 | 281 | FD 73 / FD ADJ 40 / FD OUTPUT 31 / FD INPUT 22 |
A1500 |
WorkFlow_WP&B_Planning | Planning 统筹 | 5 | 301 | 232 | 横跨 P&L/FD/BU/敏感性分析,最均衡 |
三者去重共 700 张报表,941 条链接明细(CSV 见交付物)。
技术实现:导航页不用 PROSPETTO.FLAG_REPORT_LIST(全库 0 条),
而是靠 actionLists 里的 HyperlinkNN 动作节点承载,每条链接携带维度上下文做跳转。
一、流程表的内部结构(怎么读它)¶
1.1 页(模板)= 轮次/主题分组¶
导航页的每个 ReportTemplateVO 是一"页",页内挂若干超链接。页号是版面序号,不是业务步骤序号——
A1502_01 的页#00 是 V3FINAL、页#01 才是 V1,光看页号会判错顺序。
正确的读法:按页内报表的版本后缀归组。
1.2 版本信息藏在哪¶
排查结果:
| 假设载体 | 实测 | 结论 |
|---|---|---|
| 模板名 | Template00~Template13,无语义 |
❌ 不是 |
超链接的 CAT_$ 上下文 |
普遍是多版本集合(如 V0×37 / V1×33 / V2×33 / V3×20 / V4×17 同现) | ❌ 不按版本过滤 |
| 报表编码 + 名称后缀 | A070205_01(-V1)、A070205_039(-V2)、A070205_040(-V3FINAL)、A070205_041(-V4) |
✅ 版本由报表自身承载 |
所以:"V0/V1 用哪些报表"这个约定,落地形态是——导航页的某一页(Tab)内,列着该轮次要用的报表,报表名自带版本后缀。 用户在页面上从第一条点到最末一条。
1.3 解析工具(新增)¶
技能 tagetik-app-anatomy 新增脚本 tk_flow.py,一条命令把导航页翻译成可读清单:
PY=~/binaries/python/envs/default/Scripts/python.exe # 托管 Python
S=~/.workbuddy/skills/tagetik-app-anatomy
# 三张流程表全量 → 页级清单(含每张报表挂载的程序)
$PY $S/scripts/tk_flow.py home_hy_app --nav A1501_01 A1502_01 A1500 --csv flow.csv
# 按版本切分
$PY $S/scripts/tk_flow.py home_hy_app --nav A1502_01 --by-version
# 单页细看
$PY $S/scripts/tk_flow.py home_hy_app --nav A1502_01 --page 1
脚本按目标报表名/编码自动归类主题(装载/ETL、录入/编制、输出/报告、提交/锁定), 并自动关联
launchers.csv缓存里的挂载程序。加--live可对未命中缓存的报表实时解析(注意内存)。
1.4 页级全貌¶
| 导航页 | 页 | 链接 | 报表 | 主题构成 | 业务含义 |
|---|---|---|---|---|---|
| A1501_01(BU) | #00 | 22 | 22 | 装载/ETL 26 | 数据装载(所有 ETL) |
| #01 | 8 | 8 | 输出 7 / 录入 1 | BU 输出报告 | |
| #03 | 47 | 46 | 录入 28 / 其他 16 / 输出 5 / 提交 2 | V0 录入主战场 | |
| #05 | 65 | 58 | 录入 51 / 其他 23 / 提交 2 | V3 调整录入 | |
| #06 | 50 | 49 | 输出 39 / 其他 11 | 输出报告 | |
| #07 | 22 | 21 | 录入 35 / 其他 10 / 提交 1 | 主数据(Asset/WI-PI/项目) | |
| A1502_01(FD) | #00 | 45 | 41 | — | V3FINAL |
| #01 | 74 | 64 | — | V1 | |
| #02 | 76 | 65 | — | V2 | |
| #04 | 28 | 26 | — | V3 | |
| #05 | 35 | 32 | — | V4 / Released | |
| #07 | 19 | 19 | — | 压实版专项 | |
| #09 | 42 | 35 | — | 汇总/输出 | |
| #11 | 83 | 78 | — | 多版本总览(V0~V5 同现) | |
| A1500(Planning) | #05 | 84 | 81 | 输出 48 | Planning 输出 |
| #07 | 176 | 121 | 录入 95 / 其他 87 / 输出 17 / 提交 5 | 各版本调整总览(V1~V3 全套) | |
| #08 | 15 | 15 | — | 压实版(Planning) | |
| #09 | 21 | 20 | 录入 36 / 其他 10 | 补充录入 |
脏链:
A1501_01指向的A0702_041、A0702_042,A1502_01指向的A0805_02、A1602_04已不在PROSPETTO主档(共 4 条悬空链接)。
二、G&A 编制链的报表使用顺序(核心)¶
2.1 总览:轮次 × 角色 × 报表¶
┌──────────────── V0 轮 ────────────────┐
ETL 装载 ──► BU 线(A1501_01 页#00+#03) ┐
部门线(A1500 页#07) ├─► 双轨并行,同轮
┘
┌──────────────── V1 轮(专业部门修正)────────────────┐
办公类(规划计划部)│ A070205_01 / _011 / _012 / _013 / _038 │
人工成本(人力资源部)│ A0704_02 / A0704_03 │
IT 费(科技与数智化部)│ A1102_06 / A1103_08 │
总部参考 │ A070105_13 │
└───────────────────────────────────────────────────┘
▼
V2(目标拆分 A070205_021~026)→ V3(A0703_13/14/15、A070205_031~033、A0704_040、A1102_09)
▼
V3FINAL(A070205_034/040、A070205_05/06、A1102_092)
▼
V4(A070205_041)→ Released(A070205_04/07/08/09、A1102_10)
▼
压实版专项(A230131~136 调整 / A230231~234 输出)
2.2 V0 轮:BU 线与部门线双轨并行¶
2.2.1 步骤 0 — 数据装载(A1501_01 页#00)¶
22 张 ETL 表,其中与本链相关:
A1704_01 Direct G&A ETL、A1708_01 IT G&A ETL。
(ETL 表本身不挂自研程序,是 Tagetik 标准数据装载入口。)
2.2.2 步骤 1 — BU 填报(A1501_01 页#03,46 张)¶
| 序 | 报表 | 名称 | 挂载程序(槽位顺序) |
|---|---|---|---|
| 1 | A070104_01 |
Direct G&A WP&B-Input (Just for V0) ← V0 主入口 | GA_001(N) → AW_001(S,btn) → GA_008_2(S,btn,ref) → A02(S,btn) |
| 2 | A070105_22 |
Consulting Fee Input-V0 | GA_AW_015(S) · GA_RUN01(S) · AW_DELETE(S,ref) |
| 3 | A070105_23 |
General Service Fee Input-V0 | 同 _22 |
| 4 | A070105_26 |
Audit Fee Input-V0 | 同 _22 |
| — | A0701_01 |
Direct G&A Submit | 无程序(纯提交态) |
| — | A070104_02 |
WP&B - INPUT IFRS16 -G&A | 无 |
| — | A070104_04 |
合作油田管理费 | 无 |
| — | A070105_02 |
Direct_Net G&A | GA_008_2(N) |
| — | A070105_11 |
Direct G&A Actual Data - Input | GA600(N) |
| — | A070105_13 |
总部参考G&A | GA_009(S,ref) |
| — | A070105_16~21 |
上级管理费 / 租赁费 / 差旅费 / 宣传费 / 物业管理费 / 人工成本First Spend | 均无程序 |
| — | A1101_01 |
IT G&A WP&B Input | IT_002(S) → GA_002(S,ref) → A03(S,btn) |
A070104_01是 V0 的原点:用户在这张表录入 → 保存触发GA_001(部门/Office 归集 + INP 整合)→AW_001(行转列回填表单)→GA_008_2(各层级 BU_INP)→A02。
2.2.3 步骤 2 — 部门填报(A1500 页#07)¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A0703_10 |
Direct G&A Input by Department-V0 | GA_001(N) · GA_RUN03(S,btn) · A05(S,btn) |
A0703_11 |
Consulting Fee Input By Department-V0 | GA900(N) · GA_AW_004(N) · AW_DELETE(S,ref) · GA_RUN02(S,btn) |
A0703_12 |
General Service Fee Input by Department-V0 | GA_RUN02(S,btn) · AW_DELETE(S,ref) |
A0703_16 |
Audit Fee Input by Department-V0 | GA_RUN02(S,btn) · AW_DELETE(S,ref) · AW_DELETE(S,ref) ← 重复挂载 |
部门线走的是
GA_RUN02(内含GA_AW_004+GA900),把部门明细转到 BU 表的美元/人民币账套要素 ——这正是AW_BGT_GA0001里本部行的来源。 注意 V3 版同族表A0703_13/14/15结构相同,只是版本不同。
2.3 V1 轮:专业部门修正(分四条线)¶
入口页 = A1502_01 页#01(74 条链接 / 64 张报表)。
线 1:办公类(不含 IT)— 规划计划部¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A070205_01 |
G&A WP&B-ADJ-V1 ← V1 主入口 | GA_007(S) · GA_005(S,ref) · GA_006(N) · WORKFLOW1(S,ref) |
A070205_011 |
Direct G&A WP&B-ADJ1 - By BU | GA_003(S,ref) · WORKFLOW1(S,ref) |
A070205_012 |
Direct G&A WP&B-ADJ1 - By Office | GA_004(S) · GA_008(S,ref) · WORKFLOW1(S,ref) |
A070205_013 |
G&A WP&B-ADJ-V1 (Batch) | GA_005(S) · GA_007(S,ref) · GA_006(N) |
A070205_038 |
Direct G&A 办公类(不含IT)-ADJ-V1 | AW_005(S,btn) · AW_006(S,btn) |
A070105_13 |
总部参考G&A | GA_009(S,ref) |
线 2:人工成本 — 人力资源部¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A0704_02 |
HR Direct G&A ADJ V1-By BU | GA_003(S,ref) · WORKFLOW1(S,ref) |
A0704_03 |
HR Direct G&A ADJ V1-By Office | GA_004(S) · GA_008(S,ref) · WORKFLOW1(S,ref) |
A0704_04 |
人工成本First Spend调整表 | 无 |
线 3:IT 费 — 科技与数智化部¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A1102_06 |
IT G&A WP&B-ADJ-V1 | GA700(N) · IT_004(S) · IT_002(S) · GA_002(S,ref) · A03(S,btn) · WORKFLOW1(S,ref) |
A1103_08 |
IT G&A WP&B Input | — |
2.4 V2 轮(A1502_01 页#02)¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A070205_021 |
G&A Target Split WP&B-ADJ-V2 | GA141(N) |
A070205_022 |
Direct G&A WP&B-ADJ-V2 - By BU | GA_003(S) · WORKFLOW1(S,ref) |
A070205_023 |
Direct G&A WP&B-ADJ-V2 - By Office | GA_008(S,ref) · GA_004(S) · WORKFLOW1(S,ref) |
A070205_024 |
Net G&A WP&B -ADJ-V2 | GA_005(S) · GA_007(S) · GA_006(N) · WORKFLOW1(S,ref) |
A070205_025 |
HR Direct G&A ADJ V2-By BU | WORKFLOW1(S,ref) · GA_003(S,ref) |
A070205_026 |
HR Direct G&A ADJ V2-By Office | GA_004(S) · GA_008(S,ref) |
A070205_039 |
Direct G&A 办公类(不含IT)-ADJ-V2 | AW_005(S,btn) · AW_006(S,btn) · RUN04(S,btn) |
A0704_07 |
合作油田管理费调整表-V2 | 无 |
A1102_07 |
IT G&A WP&B-ADJ-V2-FD | IT_005(S) · A03(S,btn) · WORKFLOW1(S,ref) |
2.5 V3 轮(A1502_01 页#04)¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A070205_031 |
合作油田管理费-ADJ-V3 | GA058(N) |
A070205_032 |
Direct G&A WP&B-ADJ-V3(by BU) | 无 |
A070205_033 |
Net G&A WP&B-ADJ-V3 | GA_006(N) |
A0703_13 |
Direct G&A Input by Department-V3 | GA_RUN03(S,btn) |
A0703_14 |
Consulting Fee Input By Department-V3 | GA900(N) · GA_AW_004(N) · AW_DELETE(S,ref) · GA_RUN02(S,btn) |
A0703_15 |
General Service Fee Input by Department-V3 | GA_RUN02(S,btn) · AW_DELETE(S,ref) |
A0704_040 |
行政办公设备-ADJ-V3 | GA600(S,ref) |
A1102_09 |
IT G&A WP&B-ADJ-V3 | IT_002(S) · GA_002(S,ref) |
2.6 V3FINAL / V4 / Released¶
| 轮次 | 报表 | 名称 | 挂载程序 |
|---|---|---|---|
| V3FINAL | A070205_034 |
Net G&A-FD-V3Final | GA_006(N) · WORKFLOW1(S) |
| V3FINAL | A070205_040 |
办公类(不含IT)-ADJ-V3FINAL | AW_005(S,btn) · AW_006(S,btn) · RUN04(S,btn) |
| V3FINAL | A070205_05 |
Direct G&A-FD-V3Fin | WORKFLOW1(S,ref) |
| V3FINAL | A070205_06 |
Direct G&A-HR-V3Fin | WORKFLOW1(S,ref) |
| V3FINAL | A1102_092 |
IT G&A WP&B-ADJ-FD-V3Fin | IT_002 · GA_002 · A03 · WORKFLOW1 |
| V4 | A070205_041 |
办公类(不含IT)-ADJ-V4 | AW_005(N ← 已停用!) · AW_006(S,btn) · RUN04(S,btn) |
| Released | A070205_04 |
G&A-WP&B-Budget Released | WORKFLOW1(S,ref) |
| Released | A070205_07 |
HR Direct G&A-WP&B-Budget Released | GA_008_2(S,btn) · A02(S,btn) · WORKFLOW1(S,ref) |
| Released | A070205_08 |
Direct G&A-WP&B-Budget Released | GA_008_2(S,btn) · WORKFLOW1(S,ref) |
| Released | A070205_09 |
Direct G&A-WP&B-Budget Released-CI HQ | RUN03(S) · WORKFLOW1(S,ref) |
| Released | A1102_10 |
IT G&A WP&B-Budget Released | IT_002 · GA_002 · A03 · WORKFLOW1 |
2.7 压实版专项(A1502_01 页#07 / A1500 页#08)¶
| 报表 | 名称 | 挂载程序 |
|---|---|---|
A230131 |
分摊前管理费压实版调整表-规划计划部 | AW_005(S,btn) · AW_006(S,btn) |
A230132 |
分摊前管理费压实版调整表-行政管理部 | 同 |
A230133 |
分摊前管理费压实版调整表-科技与数智化部(IT G&A) | 无 |
A230134 |
分摊前管理费压实版调整表-人力资源部 | AW_005 · AW_006 |
A230135 |
分摊前管理费压实版调整表-其他归口部门 | AW_005 · AW_006 |
A230136 |
分摊前到分摊后管理费压实版调整表 | GA_008_2(N) · GA_008_YS(S,btn) |
A230231 |
分摊前管理费压实版输出表-规划计划部 | AW_005·AW_006·AW_005·AW_006 ← 重复挂载两遍 |
A230232 |
分摊前管理费压实版输出表-行政管理部 | AW_005 · AW_006 |
三、程序清单与职责定型¶
3.1 G&A 链全部程序(32 个)¶
| 程序 | 官方注释(使用场景) | 源 | 目标 | 粒度 | 调用方 |
|---|---|---|---|---|---|
GA_001 |
Direct 按部门/Office 收集 → INP 整合;各 INP 加总到合计节点 | 部门/Office 明细 | DATI_SALDI_LORDI(FW) |
科目×月 | RUN03、RUN04、报表挂载 |
GA_002 |
IT G&A 3 个明细科目汇总 GA05-INP | GA05.01/02/03 | GA05_INP | 科目×月 | A1102_*、A1101_01 |
GA_003 |
将 BU 层面六大类年度值拆解到办公室层面 | BU 六大类 | Office 六大类 | 年 | A070205_011/022、A0704_02 |
GA_004 |
V1+:Office 上 Direct G&A 六大类拆到明细、全年拆到月 | Office 六大类 | 明细×月 | 月 | A070205_012/023/026、A0704_03 |
GA_005 |
V1+ 分摊:取 Reclass 差值 → 等比例缩放至 Reclass 科目 | Reclass 科目 | Reclass 科目 | 月 | A070205_01/013/024 |
GA_006 |
Net 作为 Direct 上报;取配置表需合计上报口径的 Asset | Net G&A / Direct | 冲抵 + INP 合成 | 月 | A070205_01/024/033/034、A0700_08、A0703_08 |
GA_007 |
V1+:拆分 Indirect 和 Net G&A 从年度到月 | 年度 | 月 | 月 | A070205_01/013/024 |
GA_008 |
计算 G&A 各层级 BU_INP | 明细 | BU_INP | 科目×月 | A070205_012/023/026、A0704_03 |
GA_008_2 |
计算 G&A 各层级 BU_INP | 明细 | BU_INP | 科目×月 | A070104_01、A0700_07、RUN03、RUN04 等 |
GA_008_YS |
同 GA_008(压实版专用变体) |
明细 | BU_INP | 科目×月 | A230136 |
GA_009 |
计算 BU_INP,只适用伊拉克、乌干达,DEST5='ZH20402_02' |
录入明细 | BU_INP | 科目×月 | A070105_13、A0700_0x |
GA058 |
所有版本:将 location 数据存储到相应 Office 节点 | location | Office | — | A070205_031 |
GA141 |
V2:E_NONE 上五大类目标值拆分到各办公室/资产(不含 IT;不处理伊拉克/乌干达) | E_NONE | Office/资产 | — | A070205_021 |
GA600 |
G&A 各表总的调用程序 | — | — | — | A0704_040、A070105_11 |
GA700 |
预算调整总调用程序 | — | — | — | A1102_06 |
GA800 |
咨询费/一般服务费 → FW(写 AW_BGT_GA0001) |
AW 表单 | FW | — | RUN04 |
GA900 |
同类(写 AW_BGT_GA0003) |
AW 表单 | FW | — | RUN02、RUN04、A0703_11/14 |
AW_001 |
行转列回填表单(FW → AW 表单) | FW | AW_BGT_GA0001 |
行级 | A070104_01、A0700_07 |
AW_002 |
组织映射(GA01 + GA03 双表);FW 往 GA03 传输时的组织架构处理 | FW | AW 表单 | — | RUN03 |
AW_003 |
部门数据更新到美元/人民币账套 | 部门 | 双账套 | — | RUN03、RUN04 |
AW_004 |
调用 A06 + 科目处理 |
AW | FW | — | A0703_11/14 |
AW_005 |
V1 拆分:把"正式/待批合计"摊到 12 个月 | 合计列 | 月份列 | 月 | A070205_038~041、A230131~135/231/232 |
AW_006 |
V1 传输:AW 表单 39 列 unpivot → 回写 FW + AW03 | AW 表单 | FW | 月 | 同 AW_005 |
AW_015 |
匹配 BU(UPDATE AW_BGT_GA0001 SET BU=LEFT(AIH_ENTITY,7)) |
— | AW 表单 | 行 | A070105_22/23/26 |
AW_DELETE |
提交即删:动态 SQL 删空行 | — | 任意 AW 表 | 全表 | A070105_22/23/24/25/26、A0703_11/12/14/15/16 |
RUN01 |
编排:咨询费/一般服务费 → FW | — | — | — | A070105_22/23/24/25/26 |
RUN02 |
编排:部门明细 → BU 双账套 | — | — | — | A0703_11/12/14/15/16 |
RUN03 |
编排(按版本分支):见 §5.3 | — | — | — | A0703_10/13、A070205_09 |
RUN04 |
编排:GA900×2 → GA800×2 → AW_003 → GA_001 → GA_008_2(全 E0) |
— | — | — | A070205_039/040/041 |
WORKFLOW1 |
流程状态机:见 §5.4 | — | DATI_SALDI_LORDI |
— | V1+ 几乎所有表单 |
A02 / A03 / A05 |
清理+重算类(DELETE ... WHERE COD_SCENARIO=… AND COD_CATEGORIA=…) |
— | — | — | 见上表 |
IT_002 / IT_004 / IT_005 |
IT G&A 明细汇总 / 年度拆月 / ITEM 拆月 | — | — | — | A1102_*、A1101_01 |
3.2 三个编排器调用了什么¶
-- CPM_SP_GA_RUN01 → 咨询费/一般服务费回填
EXEC CPM_SP_GA_AW_001 ... / CPM_SP_GA_AW_004 ...
-- CPM_SP_GA_RUN02 → 部门 → BU 双账套
EXEC CPM_SP_GA_AW_004 ... -- 部门明细
EXEC CPM_SP_GA900 ... -- → AW_BGT_GA0003
-- CPM_SP_GA_RUN03(按版本分支,见 §5.3)
EXEC CPM_SP_GA_AW_003 -- 部门数据更新到美元/人民币账套(无条件)
EXEC CPM_SP_GA_AW_002 -- 更新 GA01(无条件)
IF @PI_CATEGORIA='V0' → EXEC CPM_SP_GA_001 @ENTITY=LEFT(@ENTITY,10)
IF @PI_CATEGORIA='V1' → EXEC CPM_SP_GA_001 @ENTITY='E00000101' (人民币套)
EXEC CPM_SP_GA_001 @ENTITY='E00000100' (美元套)
EXEC CPM_SP_GA_008_2 @ENTITY=LEFT(@ENTITY,7) -- 无条件
-- CPM_SP_GA_RUN04(无 @ENTITY 参数 → 一律全量 E0)
EXEC CPM_SP_GA900 @PI_DEST2='GA04.15', @ENTITY='E11_E000001'
EXEC CPM_SP_GA900 @PI_DEST2='GA04.16', @ENTITY='E11_E000001'
EXEC CPM_SP_GA800 @PI_DEST2='GA04.15', @ENTITY='E0'
EXEC CPM_SP_GA800 @PI_DEST2='GA04.16', @ENTITY='E0'
EXEC CPM_SP_GA_AW_003
EXEC CPM_SP_GA_001 @ENTITY='E0'
EXEC CPM_SP_GA_008_2 @ENTITY='E0'
四、关键调用链与数据流转路径¶
4.1 分层视图¶
┌─ 用户操作层 ─────────────────────────────────────────────────────────┐
│ 流程表(A1501_01/A1502_01/A1500) → 定位报表 → 打开 → 录入 → 【保存】 │
└──────────────────────────────┬───────────────────────────────────────┘
│ launcher(onSave=S)
┌─ 程序层 ─────────────────────▼───────────────────────────────────────┐
│ V0 : GA_001 ─► AW_001 ─► GA_008_2 ─► A02 (BU 主入口) │
│ 部门线: GA_RUN02/AW_004/GA900 + AW_DELETE │
│ V1 : GA_007 ─► GA_005 ─► GA_006 ─► WORKFLOW1 (办公类主入口) │
│ HR: GA_003 / GA_004+GA_008 + WORKFLOW1 │
│ IT: IT_004 ─► IT_002 ─► GA_002 ─► A03 + WORKFLOW1 │
│ 办公类专用线: AW_005 ─► AW_006 ─► RUN04 │
│ V2+: 增加 GA141(目标拆分)、RUN04 归集重算 │
└──────────────────────────────┬───────────────────────────────────────┘
│ INSERT / DELETE / UPDATE
┌─ 数据层 ─────────────────────▼───────────────────────────────────────┐
│ FW 层 DATI_SALDI_LORDI(主体) / DATI_SALDI_IC(往来) / DATI_NOTE │
│ AW 表单层 AW_BGT_GA0001_000001(GA01)/ GA0002 / GA0003 / GA0004/5 │
│ 流程状态层 DATI_SALDI_LORDI 内 A_COM_028 + WF02/WF03 + DEST5=预算类 │
└──────────────────────────────────────────────────────────────────────┘
4.2 V0 → V1 的完整数据流向¶
① V0 BU 填报
A070104_01 录入 ──保存──► GA_001(部门归集 → INP)
──► AW_001(FW → AW_BGT_GA0001 行转列回填)
──► GA_008_2(各层级 BU_INP)
──► A02(清理)
② V0 部门填报
A0703_10/11/12/16 ──保存──► GA_RUN02 / GA900 / AW_004
──► AW_DELETE(删空行)
③ V1 专业部门修正(四条线并行,互不感知)
办公类 A070205_01 ──保存──► GA_007(年度→月)
──► GA_005(Reclass 重分摊)
──► GA_006(Net 作 Direct 上报)
──► WORKFLOW1(置提交流程状态)
办公类 A070205_038 ─保存──► AW_005(合计→12 月)
──► AW_006(AW 表单 unpivot → FW)
HR A0704_02/03 ─保存──► GA_003 → GA_004+GA_008 → WORKFLOW1
IT A1102_06 ─保存──► IT_004 → IT_002 → GA_002 → A03 → WORKFLOW1
④ V2/V3/V4 逐轮重复③,办公类额外触发 RUN04(全量归集重算)
方向要点(必须分清):
- AW_001/AW_002/GA800/GA900:FW → AW 表单回填
- AW_006:AW 表单 → FW 传输(方向相反,构成闭环)
- GA_001/GA_008/GA_003/GA_004:FW 内部层级搬运
- WORKFLOW1:只写流程状态行(A_COM_028),不动业务金额
五、数据流转的关键机制¶
5.1 粒度坐标:三层正交切片¶
所有 G&A 数据都由这组坐标唯一定位:
CONTO(2 值) × DEST4(3 值) × PERIODO(12 值)
A_COM_003(年度) ZH1_001 01…12
A_COM_004(月度) ZH1_002
ZH1_003
× DEST5(口径) × DEST2(科目)× AZIENDA(实体)× CATEGORIA(版本)
ZH20402_01 编制版G&A抵消
ZH20402_02 G&A 补充明细
ZZ2_NONE 默认
ZH20406_07/08 提交状态位
5.2 粒度变换的四个动作¶
| 程序 | 变换 | 风险 |
|---|---|---|
GA_001 |
明细 → LEFT(COD_DEST2,4)+'_INP' 汇总 |
写入集合 ≠ 删除集合时,写而不删 |
GA_003 |
BU 六大类 → Office 六大类(年内) | — |
GA_004 |
Office 六大类 → 明细;年 → 月 | 除以 0 / NULL |
AW_005 |
合计 → 12 个月(按比例) | 分母为 0 时整体清零 |
GA_005 |
Reclass 差值等比例缩放 | 分母为 0 时跳过 |
5.3 RUN03 的版本分支(重要)¶
IF @PI_CATEGORIA = 'V0' BEGIN
EXEC CPM_SP_GA_001 @ENTITY = @AZI -- LEFT(@ENTITY,10),用传入实体
END
IF @PI_CATEGORIA = 'V1' BEGIN
EXEC CPM_SP_GA_001 @ENTITY = 'E00000101' -- 人民币账套
EXEC CPM_SP_GA_001 @ENTITY = 'E00000100' -- 美元账套
END
EXEC CPM_SP_GA_008_2 @ENTITY = @AZI02 -- LEFT(@ENTITY,7)
V0 与 V1 的归集范围不同:V0 按传入实体归集,V1 强制归集到本部双账套。 这是"版本间口径差异"的合法来源之一,但也意味着——同一条数据在 V0 和 V1 会被归到不同实体节点。
5.4 WORKFLOW1:流程状态不在流程表里¶
状态存储位置:DATI_SALDI_LORDI
- COD_CONTO = 'A_COM_028'(状态专用科目)
- COD_DEST2 ∈ {WF02, WF03}(两个状态位)
- COD_DEST5 = 预算类别(CAP_xx / ZH20406_07 / ZH20406_08…)
- IMPORTO = 1 表示"已提交"
源码注释原文:"如果专业部门已提交,则自动更新状态(保证专业部门不能撤回状态)"。
程序会按 DEST5_GERARCHIA_ABBI 的 ZH204/ZH20406 层次做状态传播
(勘探投资提交 → 5 个预算类型连带提交;生产资本化提交 → 7 个预算类型连带提交)。
认知修正:真正的"流程动作"承接者是挂在业务表单上的
WORKFLOW1, 不是那三张导航页。导航页只做导航。
六、数据丢失高风险场景¶
判定口径:"删除范围 ⊋ 重建范围"即构成丢失风险。 「已发生」= 当前库中已能查到异常数据;「潜在」= 当前数据恰好成立,但无校验保护。
🔴 P0-1 GA_006 全实体删除 × 2 实体白名单(本版新发现,最严重)¶
-- 第 1 段:删除(L95-98)—— 只限版本+场景+DEST5,不限实体、不限科目、不限 DEST2
DELETE FROM DATI_SALDI_LORDI
WHERE COD_CATEGORIA = @PI_CATEGORIA
AND COD_SCENARIO = @PI_SCENARIO
AND COD_DEST5 = 'ZH20402_01'
-- 第 1 段:重建(L162-201)—— 限 #AZI 实体
INSERT INTO DATI_SALDI_LORDI ...
FROM DATI_SALDI_LORDI TA
WHERE ... AND COD_AZIENDA IN (SELECT COD_AZIENDA FROM #AZI) ...
#AZI 来源(L23-34):
SELECT COD_AZIENDA INTO #AZI FROM DATI_NOTE
WHERE COD_CATEGORIA='$AMOUNT' AND COD_CONTO='A_COM_028' AND COD_PERIODO='01'
AND COD_SCENARIO='S_NONE' AND COD_DEST2='GAH00_022' AND NOTE='Y'
| 实测项 | 值 |
|---|---|
| 白名单实体数 | 2(E0000050001 米桑油田项目 / E0000050002 阿拉伯湾勘探项目) |
实际带 DEST5='ZH20402_01' 数据的实体数 |
21 |
| 涉及的(场景,版本)组合 | 29 / 26 |
| 总行数 | 141,731 |
| 数据的写入方 | GA_006_3.1(3 实体) / GA_008_1(2 实体) / GA_006_1.3(2 实体) |
触发条件:任何实体(非 E0000050001/2)在该场景该版本执行 GA_006 时。
后果:
1. 超出白名单的实体的 ZH20402_01 数据被删除且不重建;
2. 其他程序(GA_008)写入的行也被一并删除——因为它们同样带 DEST5='ZH20402_01'。
实例(2023BGT/V2):该口径下 3 个实体有 GA_006 数据、2 个实体有 GA_008 数据,
执行 GA_006 会清掉全部,只重建白名单内的部分。
这是整条链路上最严重的数据丢失风险,且与"用户保存"直接绑定(
A070205_01保存即触发)。
🔴 P0-2 GA07_INP 写而不删 → 已实测 18 倍重复¶
GA_001 写入 LEFT(COD_DEST2,4)+'_INP'(7 项),DELETE 白名单(W05/GAH0201)只有 6 项,缺口 GA07_INP。
| 实测 | 值 |
|---|---|
| 重复键 | COD_DEST2='GA07_INP' 同一业务键 18 条重复行 |
| PROVENIENZA | CPM_SP_COPYRF_NEW__3.1 |
| 影响 | 任何 SUM 聚合虚增 18 倍 |
🔴 P0-3 AW_001 删除范围 > 重建范围¶
DELETE 不限 CONTO/DEST4,INSERT 限定 CONTO IN ('A_COM_003','A_COM_004') + DEST4 IN ('ZH1_001','ZH1_002','ZH1_003')。
实测缺口(FW 层 GA04.01 下存在但进不了表单):
A_COM_220 / A_COM_219 / A_COM_223 × ZH1_OTHER_003/004/005 = 6 类切片。
🔴 P0-4 AW_005 结构性清零(潜在)¶
- Wave① 比例 =
GA01024 / NULLIF(Σ月份, 0)→GA01024=0时比例 = 0 → 12 个月被整体清零 GA01037=0→ Wave② 不触发 → 永久丢失@PI_AT06传空 →#AT06空 → UPDATE 命中 0 行,静默"成功"
当前状态:不变量(合计 = 月份和)在 21,481 行上 0 偏离,尚未触发。 触发条件:用户只填合计列后清空 / 参数传空。
🟠 P1-1 AW_DELETE 参数未生效(动态 SQL)¶
CREATE PROCEDURE CPM_SP_AW_DELETE @TableName AS VARCHAR(80), @PI_SCE AS VARCHAR(80), @PI_CAT AS VARCHAR(80)
...
SET @SqlQuery = N'DELETE FROM ' + @TableName + N' WHERE ISNULL(GA01011,0)=0 AND GA01001 IS NULL ... '
@PI_SCE / @PI_CAT 传入但 WHERE 中完全未使用 → 作用域只有表名:
一个 BU 提交会清掉所有场景/版本/实体的空行。
且判空漏了 GA01024(正式合计)/GA01037(待批合计)/GA01052(备注)
→ "GA01011=0 但 GA01024≠0"的行被当空行删除(这正是 AW_005 清零路径的产物,两个缺陷会叠加)。
当前实测 0 行命中,但已有 39 行"预算合计为 0 而备注非空"擦边。
🟠 P1-2 WORKFLOW1 全实体删状态¶
DELETE FROM DATI_SALDI_LORDI WHERE COD_CONTO='A_COM_028' AND COD_DEST2='WF03'
AND COD_CATEGORIA=@CATEGORY AND COD_SCENARIO=@SCENARIO -- 不限实体
🟠 P1-3 CPM_SP_GA_007 当前不可运行¶
L127 引用未声明的临时表 #DEST2_DIRECTGA(未注释)→ Invalid object name。
另含 NULL 除法与字符串拼接 JOIN 键(TA.COD_DEST2 + TC.COD_DEST2)。
挂在 A070205_013 G&A WP&B-ADJ-V1 (Batch) 上,用户点按钮即报错。
🟠 P1-4 同族报表行为不一致¶
| 报表 | 版本 | AW_005 开关 |
后果 |
|---|---|---|---|
A070205_038 |
V1 | onSave=S | 拆分 + 传输,无 RUN04 |
A070205_039 |
V2 | onSave=S | 拆分 + 传输 + RUN04 |
A070205_040 |
V3FINAL | onSave=S | 同 V2 |
A070205_041 |
V4 | onSave=N(已停用) | 跳过拆分,只传输 + RUN04 |
→ V4 版保存时口径与前序版本分叉(月份列不更新,直接传输旧值)。
🟠 P1-5 重复挂载(同一程序挂两遍)¶
| 报表 | 重复项 |
|---|---|
A0703_16(审计费 V0) |
AW_DELETE × 2 |
A230231(压实版输出表) |
AW_005 + AW_006 各 × 2 |
后果:同一保存动作重复执行全表删除,窗口内并发时可能清掉对方刚写入的数据。
🟠 P1-6 备份目录的报表仍挂生产程序¶
A0705_10(Direct G&A By Office)位于「备份」目录,却挂着 AW_001 + GA_001 + GA_008_2 三个生产程序。
在备份表上点保存 → 直接写生产 FW。
⚪ P2 GA_006 大段逻辑被注释¶
L202-364 整段("没有 Direct G&A 的,按默认科目等分到六大类")在 /* */ 中,
但文件头注释仍宣称该功能存在 → 文档与实现不一致,维护时易误判。
七、颗粒度不一致的成因¶
7.1 三层正交切片 × 硬编码 CASE 矩阵¶
AW_006 把表单 39 列映射到 CONTO(2) × DEST4(3) × PERIODO(12) = 72 个组合,
全部靠 CASE WHEN Product IN (...) 手工枚举。
7.2 字段物理列序 ≠ 语义月序(已实锤)¶
AW_001 源码中 10 月/11 月待批字段写反:
- 应:10 月 → GA01047、11 月 → GA01048
- 实现:错位,10 月与 11 月的待批值互换
根因:映射靠人工对照列序,无元数据校验。
7.3 三层实体粒度未打通¶
| 层 | 形态 | 用途 |
|---|---|---|
| 明细实体 | E00000100_01~_22(本部 22 部门)、海外项目实体 |
录入 |
| 7 位公司级 | LEFT(COD_AZIENDA,7) |
归集 |
_INP 影子实体 |
GAxx_INP / Exxxxxxx_INP |
汇总 |
GA_008_2 的 DELETE 有 CI03 白名单校验而 INSERT 没有 → 结构上不对称
(当前 38/38 全覆盖,属潜在)。
7.4 版本分支导致同数据不同归集¶
RUN03:V0 用传入实体、V1 用本部双账套(§5.3)→ 同一条明细在 V0/V1 落在不同节点。
7.5 四条 V1 专业线互不感知¶
办公类 / 人力资源 / IT / 总部参考四条线各挂各的程序, 没有任何一处做"四条线合并后的完整性校验"。 任一条线的版本或参数不一致,就会出现"同一张汇总表里办公类对、IT 类是旧的"。
7.6 配置外置带来的静默失败¶
GA_006依赖DATI_NOTE(GAH00_022 / NOTE='Y')→ 配置缺失则#AZI为空 → 全程序静默 0 行,不报错AW_001依赖AW_BGT_GA0002映射表做 INNER JOIN → 缺一行即静默丢一个科目 (当前 20/20 对齐,无外键保护)GA_141依赖DEST2_RATIO(A_COM_146 / NOTE='Y')
7.7 统计口径分叉¶
GA_009写DEST5='ZH20402_02'(G&A 补充明细),GA_006写ZH20402_01(编制版G&A抵消)- 同一个 BU_INP 节点,可能同时有两条口径的数据 → 按
DEST5汇总与不按DEST5汇总结果不同
八、依赖与冲突点¶
8.1 同表多写方(冲突源)¶
| 表 / 切片 | 写入方 | 冲突说明 |
|---|---|---|
DATI_SALDI_LORDI @ DEST5='ZH20402_01' |
GA_006、GA_008 |
GA_006 的 DELETE 会清掉 GA_008 的结果 |
DATI_SALDI_LORDI @ A_COM_028(状态) |
WORKFLOW1 |
全实体删除,先提交者状态可能被后来者清掉 |
AW_BGT_GA0001_000001 |
AW_001、GA800、AW_015、GA_002 |
多方写同一数据集 |
DATI_SALDI_LORDI @ 月份列 |
AW_005(拆分)、GA_004(年→月)、GA_007(年→月) |
三套拆月逻辑并存,先后顺序影响结果 |
DATI_SALDI_LORDI @ _INP |
GA_001、GA_008、GA_008_2、GA_008_YS、GA_009、GA_002 |
6 个程序写同一命名族 |
8.2 执行顺序敏感¶
| 场景 | 顺序要求 | 违反后果 |
|---|---|---|
A070205_039/040/041 保存 |
AW_005 → AW_006 → RUN04 |
RUN04 内含 GA_001+GA_008_2(全量 E0),而 AW_006 已写过同一批 _INP → 重复计算 |
A0703_11/14 保存 |
GA900/GA_AW_004 → GA_RUN02 → AW_DELETE |
AW_DELETE 最后跑会删掉刚写入的空行(当前恰好安全,但脆弱) |
| V1 四条线 | 办公类 / HR / IT 无顺序约定 | 汇总表可能读取到部分更新状态 |
8.3 版本间行为矩阵(实测)¶
| 行为 | V0 | V1 | V2 | V3 | V3FINAL | V4 |
|---|---|---|---|---|---|---|
| 归集实体(RUN03) | 传入实体 | 本部双账套 | — | — | — | — |
WORKFLOW1 状态 |
❌ 无 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 办公类拆分 | — | AW_005✅ |
✅ | ✅ | ✅ | ❌ 已停用 |
归集重算 RUN04 |
— | ❌ 无 | ✅ | — | ✅ | ✅ |
九、整合方案与建议¶
9.1 紧急修复(按优先级)¶
| # | 对象 | 问题 | 修复建议 | 验证方式 |
|---|---|---|---|---|
| 1 | GA_006 L95 |
删除不限实体 | 在 DELETE 补 AND COD_AZIENDA IN (SELECT COD_AZIENDA FROM #AZI),或把重建范围扩到全实体 |
修复前后对比 DEST5='ZH20402_01' 的行数与实体数 |
| 2 | GA07_INP |
写而不删 → 18 倍重复 | 把 GA07_INP 补进 GA_001 的 DELETE 白名单;并清理存量重复行 |
HAVING COUNT(*)>1 应为 0 |
| 3 | AW_DELETE |
@PI_SCE/@PI_CAT 未用 + 判空漏列 |
WHERE 补 COD_SCENARIO=@PI_SCE AND COD_CATEGORIA=@PI_CAT;判空补 GA01024/GA01037/GA01052 |
单实体提交后其他实体行数不变 |
| 4 | AW_001 |
删了不回填 | 统一 DELETE 与 INSERT 的 CONTO/DEST4 口径 |
6 类切片能否进表单 |
| 5 | GA_007 |
引用未声明临时表 | 补 SELECT ... INTO #DEST2_DIRECTGA 声明 |
在 A070205_013 上点按钮 |
| 6 | A070205_041 |
AW_005 已停用 |
确认 V4 是否应拆分;若应,恢复 onSave=S |
对比 V3FINAL/V4 月份列 |
| 7 | A0703_16 / A230231 |
重复挂载 | 去掉重复的 launcher 槽位 | 保存后日志只执行一次 |
| 8 | A0705_10 |
备份目录挂生产程序 | 摘除三个 launcher,或移出生产环境 | — |
9.2 结构性方案¶
方案 A — 给每个"删除+重建"程序加统一护栏
-- 在程序的删除段之前插入范围一致性断言
DECLARE @del_cnt INT, @ins_cnt INT;
-- 删除前统计将被删除的行数(与 DELETE 同条件)
-- 执行后统计重建行数
IF (@ins_cnt < @del_cnt * 0.5) -- 阈值可调
RAISERROR('GA_xxx: 重建行数显著少于删除行数,可能存在数据丢失', 16, 1);
方案 B — 统一"配置驱动"的实体/科目白名单
现状:#AZI 藏在 DATI_NOTE、映射藏在 AW_BGT_GA0002、比例藏在 DEST2_RATIO,
且缺失时静默降级为 0 行。
建议:建一张显式配置表(如 CFG_GA_SCOPE),字段 程序名 / 场景 / 版本 / 实体范围 / 生效日期,
程序启动时校验"范围非空",否则抛错。
方案 C — 消除重复的拆月逻辑
AW_005(合计→月)、GA_004(年→月)、GA_007(年→月)三套并存。
建议收敛为一套公共拆月程序,按 DEST5 区分口径。
方案 D — 四条 V1 线的合并校验
在 V1 结束、V2 开始前,增加一个跨线完整性校验: 校验对象 = 办公类 / 人力资源 / IT / 总部参考四条线的目标集合是否全部有值。 收益:把"某条线没跑/跑错"从"汇总表看着不对"变成"明确报错"。
方案 E — 流程状态集中化
WORKFLOW1 把状态写在 DATI_SALDI_LORDI(业务数据表)里,
导致每次删状态是全实体扫描、每次查状态是全表条件扫描。
建议独立状态表(实体 / 场景 / 版本 / 预算类别 / 状态 / 时间 / 用户),
DELETE 与 INSERT 都限实体。
9.3 运维建议¶
- 建立"保存动作影响面清单":把本报告 §2 的「报表 → 程序」表交付业务,
标注哪些报表保存即触发全量重算(
A070205_039/040/041的RUN04)。 - 轮次切换时做数据快照:每轮次(V0→V1→V2…)开始前备份
DATI_SALDI_LORDI的相关切片 (按COD_SCENARIO + COD_CATEGORIA + COD_DEST2 LIKE 'GA%')。 - 监控三张关键视图:
DEST5='ZH20402_01'的实体数是否等于白名单实体数(P0-1 哨兵)GA07_INP是否出现重复键(P0-2 哨兵)A_COM_028状态的实体覆盖度(P1-2 哨兵)- 并发窗口管控:
A0703_16、A230231重复挂载 + 全表删除, 避免多人同时保存同一轮次。 - 配置变更评审:
DATI_NOTE、AW_BGT_GA0002、DEST2_RATIO三张配置表 建议纳入变更审批(改动即影响全链路)。 - 代码评审要点:新写 G&A 程序时,强制检查
①
DELETE与INSERT的 WHERE 条件是否等价;② 分母是否做了 0 保护;③ 配置为空是否会静默。 - 修复回归清单:修复后重跑一轮 V0→V1,对比"修复前后各版本
DEST2 × DEST4 × PERIODO汇总值"。
9.4 待业务确认(5 项)¶
| # | 问题 | 影响 |
|---|---|---|
| 1 | A_COM_219/220/223、ZH1_OTHER_003/004/005 这 6 类切片是否属于 G&A 上报口径? |
决定 P0-3 是"加校验拦截"还是"扩大程序口径" |
| 2 | GA_006 的 #AZI 只放 2 个海外项目实体,是设计意图还是配置遗漏? |
决定 P0-1 的修复方向(收窄删除 vs 扩大重建) |
| 3 | A070205_041(V4)的 AW_005 停用是有意简化还是误操作? |
决定 P1-4 |
| 4 | V1 四条专业线(办公/HR/IT/总部)的完成顺序是否有业务约定? | 决定方案 D 的校验时机 |
| 5 | 压实版(A2301xx)与常规版本(A070205_xxx)的数据是否应隔离? |
两者用同一套 AW_005/AW_006,可能互相覆盖 |
十、附录¶
10.1 复现命令¶
PY=~/binaries/python/envs/default/Scripts/python.exe
S=~/.workbuddy/skills/tagetik-app-anatomy
# ① 流程表 → 报表清单(含挂载程序)
$PY $S/scripts/tk_flow.py home_hy_app --nav A1501_01 A1502_01 A1500 --csv flow_table.csv
$PY $S/scripts/tk_flow.py home_hy_app --nav A1502_01 --by-version
# ② 单张报表全息解剖(模板×矩阵 / launcher / 超链接 / 流程 / 权限)
$PY $S/scripts/tk_report.py home_hy_app A070104_01
# ③ 批量导出程序源码
$PY $S/scripts/tk_app.py home_hy_app sp-dump --names "CPM_SP_GA_001,CPM_SP_GA_005,CPM_SP_GA_006"
# ④ 全库报表×程序挂载映射
$PY $S/scripts/tk_scan_launchers.py home_hy_app --out launchers.csv
10.2 关键 SQL¶
-- 流程表(导航页)的链接清单:直接从 XML 抽 Hyperlink
-- 见 tk_flow.py 的 parse_nav():遍历 templates → ReportTemplateVO → actionLists → HyperlinkNN
-- 目标报表由 DimensionOid 的 PROSPETTO 前缀给出
-- ① P0-1 哨兵:白名单外实体
SELECT COUNT(DISTINCT COD_AZIENDA) AS 实际实体数 FROM DATI_SALDI_LORDI
WHERE COD_DEST5='ZH20402_01' AND COD_CONTO IN ('A_COM_003','A_COM_004');
-- 对比 DATI_NOTE 中 GAH00_022 / NOTE='Y' 的实体数
-- ② P0-2 哨兵:GA07_INP 重复
SELECT COD_SCENARIO, COD_CATEGORIA, COD_AZIENDA, COD_PERIODO, COD_CONTO, COD_DEST4, COUNT(*)
FROM DATI_SALDI_LORDI WHERE COD_DEST2='GA07_INP'
GROUP BY COD_SCENARIO, COD_CATEGORIA, COD_AZIENDA, COD_PERIODO, COD_CONTO, COD_DEST4
HAVING COUNT(*) > 1;
-- ③ P0-3 缺口:FW 层有、表单口径外
SELECT COD_CONTO, COD_DEST4, COUNT(*) FROM DATI_SALDI_LORDI
WHERE COD_DEST2='GA04.01' AND COD_DEST1='PART000' AND COD_DEST3='PRO_NONE' AND COD_DEST5='ZZ2_NONE'
GROUP BY COD_CONTO, COD_DEST4 ORDER BY 3 DESC;
-- ④ P1-2 哨兵:流程状态覆盖
SELECT COUNT(DISTINCT COD_AZIENDA) FROM DATI_SALDI_LORDI
WHERE COD_CONTO='A_COM_028' AND COD_DEST2 IN ('WF02','WF03')
AND COD_CATEGORIA=@CAT AND COD_SCENARIO=@SCE;
10.3 交付物清单¶
| 文件 | 内容 |
|---|---|
2026年度预算-GA编制-V0到V1链路解析-20260911-V2流程表驱动版.md |
本报告 |
流程表-报表使用清单-A1500-A1502_01-A1501_01-20260911.csv |
三张流程表的链接级明细(1176 行,含版本上下文与挂载程序) |
报表挂载程序全库扫描-TGK_PROD-20260911.csv |
全库报表 × 程序挂载映射 |
FW-AW归属全库扫描-TGK_PROD-20260910.csv |
全库矩阵级 FW/AW 归属 |
10.4 与上一版报告的差异¶
| 项 | 上一版(20260911.md) | 本版 |
|---|---|---|
| 分析起点 | 存储过程 | 流程表(导航页) |
| 链路骨架 | 程序调用链 | 轮次 × 角色 × 报表 |
| V0 部门线 | 缺失 | ✅ 补入(A0703_10/11/12/16) |
| V1 主入口 | 仅 A070205_039/040/041 |
✅ 补入 A070205_01/011/012/013/038 |
| HR / IT / 总部线 | 未覆盖 | ✅ 四线齐备 |
| 压实版 | 未覆盖 | ✅ 补入(A2301xx) |
GA_006 P0 风险 |
未发现 | ✅ 新增,最严重 |
V1 vs V2+ 的 RUN04 差异 |
未识别 | ✅ 识别 |
GA_006 官方注释的"等分六大类" |
— | ✅ 识别为已注释(文档与实现不符) |
上一版报告保留作为程序视角的补充材料,但链路结论以本版为准。