SAP BW 数据仓库

本文从零开始,循序渐进地介绍 SAP BW(Business Warehouse)的核心概念、数据建模、ETL 开发、查询设计及性能优化,适合 ABAP/FICO 背景的开发者入门 BW。


第一篇:基础认知

1.1 什么是 SAP BW

SAP BW(Business Warehouse)是 SAP 的企业级数据仓库解决方案,用于从多个源系统(SAP ECC、S/4HANA、外部数据库、文件等)抽取数据,经过清洗、转换、整合后,以面向分析的方式存储,最终通过报表和仪表盘呈现给业务用户。

核心定位:

维度 说明
OLTP vs OLAP ECC/S4 是 OLTP(事务处理),BW 是 OLAP(分析处理)
面向对象 OLTP 面向业务流程,BW 面向分析主题
数据整合 将多源数据统一到一个语义一致的模型中

版本演进:

BW 3.x → BW 7.0 → BW 7.3 → BW 7.5 → BW/4HANA 1.0 → BW/4HANA 2.0
  • BW 7.5 on HANA:传统 BW 架构 + HANA 数据库加速
  • BW/4HANA:全新建模工具(BW Modeling Tools),淘汰旧对象(InfoCube、DSO 等),统一为 ADSO

1.2 BW 在 SAP 技术栈中的位置

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ SAP ECC │ │ S/4HANA │ │ 外部系统 │
│ (源系统) │ │ (源系统) │ │ (CSV/DB) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────────┐
│ SAP BW / BW/4HANA │
│ 抽取(Extract) → 转换(Transform) → 加载(Load) │
│ 数据存储层 │
└──────────────────┬───────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ 分析展现层 │
│ BEx Query / Analysis for Excel / SAC / Lumira │
└──────────────────────────────────────────────────┘

1.3 BW 核心术语速查

术语 含义 类比
InfoObject BW 中最小的数据单元,分特征(Characteristic)和指标(Key Figure) 类似数据库的字段/列
InfoProvider 可以被查询的数据存储对象的统称 类似数据库的表/视图
DataSource 源系统的数据抽取结构定义 类似抽取接口的表结构
Transformation 数据从源到目标的映射和转换规则 类似 ETL 中的 T
DTP (Data Transfer Process) 实际执行数据加载的程序 类似 ETL 的 Job
InfoPackage 触发从源系统到 PSA 的数据抽取(旧架构) 类似抽取调度
Process Chain 一组按顺序/并行执行的后台任务链 类似调度编排
Query 面向用户的报表查询 类似 SQL SELECT

第二篇:BW 架构与核心对象

2.1 BW 分层架构(LSA/LSA++)

BW 采用分层架构设计,典型分为三层:

┌───────────────────────────────────────┐
│ 数据获取层 (Acquisition) │
│ DataSource → PSA → DSO/ADSO (原始数据) │
├───────────────────────────────────────┤
│ 数据整合层 (Corporate) │
│ 主数据 → 整合 ADSO → InfoCube │
├───────────────────────────────────────┤
│ 数据展现层 (Reporting) │
│ 聚合 → MultiProvider → Query │
└───────────────────────────────────────┘

LSA++(Layered Scalable Architecture) 是 BW on HANA 时代推荐的架构,强调:

  • 数据分层明确,每层职责单一
  • 利用 HANA 内存计算,减少冗余层
  • ADSO 统一替代 DSO + InfoCube

2.2 InfoObject(信息对象)

InfoObject 是 BW 建模的基础砖块,分为两大类:

2.2.1 特征(Characteristic)

描述业务维度,如公司代码、会计科目、物料号。

关键属性:

属性 说明
主数据(Master Data) 特征的描述性属性,独立存储在文本表/属性表
层次结构(Hierarchy) 如科目层次:总账科目 → 科目组 → 报表行项目
导航属性(Navigation Attr.) 可在查询中作为筛选/分组维度使用
属性(Attribute) 特征的附加描述字段

操作路径: RSA1 → 信息对象 → 右键创建

" 示例:创建特征 ZMATNR(物料号)
" - 数据类型: CHAR
" - 长度: 18
" - 主数据: 勾选(允许维护文本和属性)
" - 层次结构: 按需启用

2.2.2 关键指标(Key Figure)

描述业务度量值,如金额、数量、单价。

关键属性:

属性 选项 说明
类型 数量 / 金额 / 数字 / 整数 / 日期 数据格式
聚合 求和 / 最大 / 最小 / 平均 / 覆盖 查询时的汇总方式
单位 固定 / 从特征获取 金额对应币种,数量对应单位
累积/非累积 累积值 / 期间值 / 余额 用于库存/余额类指标

2.3 DataSource(数据源)

DataSource 定义了从源系统抽取数据的结构和方式。

类型:

类型 说明 场景
标准 DataSource SAP 预定义,如 0FI_GL_4(总账行项目) 标准 FI/CO/MM/SD 抽取
自定义 DataSource 基于视图/函数模块/DB 查询 自定义表/逻辑抽取
UD (Universal Data) BW/4HANA 推荐,基于 HANA 优化 新项目首选
Flat File 从 CSV/Excel 文件加载 外部数据源

标准 FI DataSource 常用清单:

DataSource 描述 对应源表
0FI_GL_4 总账行项目 BSEG/BKPF
0FI_AP_4 应付行项目 BSIK/BSAK
0FI_AR_4 应收行项目 BSID/BSAD
0CO_OM_CCA_1 成本中心实际数据 COSP/COSS
0CO_OM_OPA_1 内部订单实际数据 COEP

2.4 数据存储对象

2.4.1 DSO(DataStore Object)— 旧架构

三层表结构:激活队列表(A) + 变更日志表(C) + 新数据表(N)。

写入模式:
N 表 ← 新数据先写入
A 表 ← 激活后,N→A(覆盖/追加)
C 表 ← 记录变更历史(用于增量抽取下游)

关键设置:

设置 选项 说明
DSO 类型 标准 / 写优化 / 直接更新 标准最常用
覆盖/追加 覆盖(Overwrite) / 追加(Add) 覆盖=按key更新,追加=插入
唯一键 由特征组合决定 决定”覆盖”的粒度

2.4.2 ADSO(Advanced DSO)— BW/4HANA 统一对象

ADSO 统一了 DSO 和 InfoCube 的功能,通过组合不同行为模式实现:

行为模式 等效旧对象 说明
数据获取层 (Inbound) PSA 暂存原始数据
标准 DSO 标准 DSO 激活+变更日志
仅写入 (Write-optimized) 写优化 DSO 无激活步骤
信息立方体 (InfoCube) InfoCube 星型模型,事实表+维度表
直接更新 直接更新 DSO ABAP 程序直接写入
集合 (Planning) 计划 InfoCube 用于 IP(Integrated Planning)

ADSO 创建示例(BW Modeling Tools / Eclipse):

1. 打开 Eclipse → BW Modeling Tools
2. 右键 InfoArea → New → ADSO
3. 设置:
- 名称: ZDSO_FI_DOC
- 类型: Standard DataStore Object
- Key Fields: 会计年度 + 凭证号 + 行项目号
- Data Fields: 金额、数量等指标
4. 激活

2.4.3 InfoCube — 旧架构

星型模型结构:

                    ┌──────────┐
│ 维度表1 │
│ (时间) │
└────┬─────┘
│
┌──────────┐ ┌───────┴────────┐ ┌──────────┐
│ 维度表2 │────│ 事实表 │────│ 维度表3 │
│ (公司代码) │ │ (金额/数量) │ │ (科目) │
└──────────┘ └───────┬────────┘ └──────────┘
│
┌────┴─────┐
│ 维度表4 │
│ (物料) │
└──────────┘

事实表很小(只有指标+维度外键),维度表存储明细,查询时通过维度关联。

2.5 MultiProvider / CompositeProvider

MultiProvider(旧): 逻辑合并多个 InfoProvider,本身不存储数据,查询时 UNION 所有子 Provider。

CompositeProvider(新/推荐): 支持 UNION 和 JOIN 操作,替代 MultiProvider。

场景:将实际数据和预算数据合并展示

CompositeProvider: ZCPLAN_ACTUAL
├── ADSO: ZDSO_ACTUAL (实际数据)
└── ADSO: ZDSO_BUDGET (预算数据)

映射:
金额(实际) = 来自 ZDSO_ACTUAL.S_AMOUNT
金额(预算) = 来自 ZDSO_BUDGET.S_AMOUNT

第三篇:ETL 开发实操

3.1 数据抽取流程总览

源系统(ECC/S4)                  BW 系统
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 数据源 │───→│ PSA │───→│ 转换 │───→│ 目标 │
│DataSource│ │(暂存) │ │Transf. │ │ ADSO │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
InfoPackage DTP(含转换规则)
(抽取调度) (加载调度)

3.2 实操:从 ECC 抽取总账数据到 BW

Step 1:在源系统激活 DataSource

" 在 ECC 源系统中
" 事务码 RSA5:安装标准业务内容 DataSource
" - 找到 0FI_GL_4(总账行项目)
" - 右键 → Install DataSource

" 事务码 RSA6:检查已激活的 DataSource
" 确认 0FI_GL_4 已存在且状态为 active

" 事务码 LBWE:自定义增量抽取(LO Cockpit)
" 适用于后勤数据(MM/SD),FI 数据一般用标准增量

Step 2:在 BW 创建源系统连接

" 事务码 RSA1 → 源系统
" - 右键创建 → SAP Application (ECC)
" - 填写:系统 ID、客户端、主机名、用户名密码
" - 测试连接

Step 3:复制 DataSource 到 BW

" 事务码 RSA1 → 数据源
" - 右键 → 复制元数据
" - 选择源系统 → 找到 0FI_GL_4 → 复制
" - 激活

Step 4:创建目标 ADSO

BW Modeling Tools (Eclipse):
1. 新建 ADSO: ZDSO_GL_LINE
2. 设置 Key: 0FISCYEAR(会计年度) + 0DOCNR(凭证号) + 0DOCLINE(行项目)
3. 设置 Data: 0DEBIT(借方金额) + 0CREDIT(贷方金额) + 0AMOUNT(净额)
4. 激活

Step 5:创建 Transformation(转换规则)

BW Modeling Tools:
1. 右键目标 ADSO → New Data Flow
2. 拖入 DataSource 0FI_GL_4
3. 创建 Transformation:Source → Target
4. 映射规则:
- 简单映射: BUKRS → 0COMP_CODE(公司代码)
- 简单映射: HKONT → 0GL_ACCOUNT(总账科目)
- 简单映射: DMBTR → 0AMOUNT(金额)
- 例程(Routine): 特殊逻辑转换

转换规则类型:

类型 说明 使用场景
直接赋值 (Direct) 源字段=目标字段 字段一一对应
常量 (Constant) 固定值 填充默认值
例程 (Routine) ABAP 代码 复杂逻辑
公式 (Formula) 数学运算 计算字段
开始例程 批量预处理 删除/修改源数据包
结束例程 批量后处理 计算派生字段

例程示例(开始例程):

" 开始例程:过滤非有效数据
" 在 Transformation → 双击开始例程

DELETE SOURCE_PACKAGE WHERE BSCHL = ''.
" 删除记账码为空的行

" 例程示例(字段例程):
" 将公司代码+会计科目拼接为自定义维度
RESULT = SOURCE_FIELDS-BUKRS && SOURCE_FIELDS-HKONT.

Step 6:创建 DTP(数据传输过程)

BW Modeling Tools:
1. 右键 Transformation → New DTP
2. 设置:
- 提取模式: Delta(增量)/ Full(全量)/ Init(初始化)
- 过滤条件: 可限定日期范围、公司代码等
- 错误处理: 错误行写入错误栈(error stack)
3. 激活

抽取模式选择:

模式 说明 适用场景
Full 每次全量抽取所有数据 初始加载、小表
Init + Delta 初始化后只抽取增量 生产日常运行
Init without Data 仅初始化指针不传数据 特殊场景

Step 7:执行加载

" 方式一:手动执行
" BW Modeling Tools → 右键 DTP → Execute
" 或
" 事务码 RSA1 → DTP → 右键 → 执行

" 方式二:Process Chain 调度(推荐用于生产)
" 在 Process Chain 中编排 DTP 执行顺序

3.3 实操:从 Flat File 加载外部数据

场景:加载 Excel 格式的预算数据

" 文件: budget_2026.csv
COMP_CODE,FISC_YEAR,PERIOD,GL_ACCOUNT,AMOUNT,CURRENCY
1000,2026,1,41010000,50000.00,CNY
1000,2026,2,41010000,55000.00,CNY
2000,2026,1,41010000,30000.00,CNY

步骤:

" 1. 创建文件源系统连接
" RSA1 → 源系统 → 右键 → Flat File
" 填写文件路径和格式(CSV/定长)

" 2. 创建 DataSource(类型: Flat File)
" RSA1 → 数据源 → 右键 → 创建
" - 名称: ZDS_FILE_BUDGET
" - 源系统: 上一步创建的文件连接
" - 定义字段结构(与 CSV 列对应)
" - 分隔符: 逗号
" - 首行标题: 勾选

" 3. 上传文件
" 事务码 RSA3(源系统端) 或 InfoPackage 中指定文件路径

" 4. 后续步骤同 3.2 的 Step 5-7

3.4 增量抽取机制详解

Delta(增量) 是 BW 生产环境的核心机制,避免每次全量加载。

FI 数据增量原理

ECC 源表增量标记:

BSEG 表字段:
- UPDMODE: 更新模式标记
- DATBI: 增量截止日期

BW Delta Queue:
- RSA7(ECC 端):查看增量队列
- 0FI_GL_4 使用 FISL(财务特定逻辑)增量
- 增量标识:基于会计期间 + 凭证日期 + 记账状态

通用增量机制

机制 适用场景 说明
时间戳 (Timestamp) 主数据 基于 LASTMODIFIED 时间戳
增量队列 (Delta Queue) 事务数据 RSA7 管理,基于变更文档
序列号 (Numeric Pointer) 日志类 基于序列号递增
日期 (Calendar Day) 日期相关 基于日期字段

第四篇:查询设计

4.1 BEx Query Designer 基础

BEx Query Designer 是 BW 查询的可视化设计工具(经典版 BW),BW/4HANA 中推荐用 Eclipse 中的 BW Query Designer。

查询结构

┌─────────────────────────────────────────┐
│ BEx Query │
├──────────────┬──────────────────────────┤
│ 行(Rows) │ 列(Columns) │
│ 特征/维度 │ 关键指标 │
│ │ │
│ 会计年度 │ 金额 │ 数量 │
│ 公司代码 │ │ │
│ 科目 │ │ │
├──────────────┴──────────────────────────┤
│ 筛选(Filters) │
│ 固定筛选: 期间 = 1-12, 会计年度 = 2026 │
│ 变量: 公司代码 = ? (运行时输入) │
└─────────────────────────────────────────┘

创建查询步骤

" 事务码 RSRT (Query Monitor)
" - 或 Eclipse BW Modeling Tools → 右键 ADSO → New Query

" 1. 选择 InfoProvider: ZDSO_GL_LINE
" 2. 行: 拖入 0GL_ACCOUNT (总账科目)
" 3. 列: 拖入 0AMOUNT (金额)
" 4. 筛选: 固定 0FISCYEAR = 2026
" 5. 保存并激活

4.2 变量(Variable)

变量是 BW 查询的参数化机制,运行时由用户输入。

变量类型 说明 示例
特征值变量 筛选特定特征值 公司代码 = ?
层次结构变量 选择层次节点 科目层次节点 = ?
文本变量 动态文本 标题显示当前期间
公式变量 动态计算参数 汇率 = ?
偏移量变量 偏移计算 前N期 = ?

创建变量示例:

" 在 Query Designer 中:
1. 将 0COMP_CODE 拖入筛选区
2. 右键 → 选择变量 → 新建
3. 设置:
- 名称: ZVAR_COMPCODE
- 类型: 用户输入 (User Entry)
- 处理方式: 单值 / 范围 / 多选
- 默认值: 1000(可选)
4. 保存

4.3 计算指标与限定

计算指标(Calculated Key Figure)

" 场景:计算毛利率 = (收入 - 成本) / 收入

" 方法一:公式
1. 在 Columns 区右键 → 新建计算指标
2. 公式: ( 收入 - 成本 ) / 收入 * 100
3. 设置:百分比格式,保留2位小数

" 方法二:ABAP 例程(复杂计算)
" 在公式中嵌入 ABAP 代码处理特殊逻辑

限定指标(Restricted Key Figure)

" 场景:只显示期间 1-6 的金额

1. 在 Columns 区右键 → 新建限定指标
2. 基础指标: 0AMOUNT
3. 限定条件: 0FISCPER 范围 001-006
4. 结果:只有上半年数据参与计算

4.4 跳转与钻取(Drill-Down)

" 层次钻取示例:
" 顶层: 利润表 → 收入合计 → 1000万
" ↓ 点击钻取
" 中层: 按科目组 → 主营业务收入 800万 / 其他业务收入 200万
" ↓ 再次钻取
" 底层: 按明细科目 → 产品A收入 500万 / 产品B收入 300万

" 配置方式:
" InfoObject → 层次结构 → 定义父子关系
" Query → 行 → 展示层次结构

第五篇:Process Chain(处理链)

5.1 Process Chain 概念

Process Chain 是 BW 中的调度编排工具,将一系列 ETL 步骤按依赖关系组织起来,支持定时执行和错误处理。

5.2 典型 Process Chain 结构

┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│ 开始 │───→│ 信息包 │───→│ DTP │───→│ 激活 │
│ (Start) │ │InfoPack │ │ │ │(Activate)│
└──────────┘ └──────────┘ └──────────┘ └──────────┘
│
▼
┌──────────┐
│ 索引重建 │
│(Index) │
└──────────┘
│
▼
┌──────────┐
│ 结束 │
│(End) │
└──────────┘

5.3 创建 Process Chain 实操

" 事务码 RSPC (Process Chain Maintenance)

" 1. 新建 Process Chain
" - 名称: ZPC_DAILY_GL
" - 描述: 每日总账数据加载

" 2. 拖入开始步骤
" - 右键 → Process Type → Start
" - 设置调度: 每天 02:00 执行

" 3. 拖入信息包(旧架构)或直接用 DTP
" - 连接 Start → InfoPackage → DTP

" 4. 添加后续步骤
" - 删除索引 (Delete Index)
" - 加载 DTP
" - 重建索引 (Create Index)
" - 数据库统计信息更新

" 5. 错误处理
" - 右键步骤 → 属性 → 出错时: 中止链 / 忽略继续 / 发邮件通知

" 6. 激活并执行
" - 右键 → 激活
" - 右键 → 执行(立即)
" - 事务码 RSPCM:监控执行状态

5.4 Process Chain 监控

" 事务码 RSPCM:Process Chain Monitor
" - 显示所有 Process Chain 的当前状态
" - 绿色: 成功 / 红色: 失败 / 黄色: 运行中 / 灰色: 未执行
"
" 双击失败步骤 → 查看日志 → 定位错误原因
" 常见错误:
" - 数据源不存在或未激活
" - 源系统连接断开
" - 转换规则运行时错误(例程 bug)
" - 目标表锁冲突

第六篇:性能优化

6.1 查询性能优化

6.1.1 聚合(Aggregate)

" 聚合 = 预计算的部分汇总
"
" 问题:查询按"公司代码+科目"汇总 100万条记录 → 慢
" 解决:创建聚合,预计算"公司代码"级别的汇总
"
" 路径:RSA1 → InfoProvider → 右键 → 创建聚合
" 选择常用筛选维度(如公司代码、会计年度)
" 系统自动维护聚合表,查询命中时直接读取

6.1.2 查询属性优化

" Query Designer → 查询属性:

" 1. Read Data in Background (后台读取)
" - 适合大报表,后台计算后推送到前端
"
" 2. HANA Processing
" - BW on HANA: 启用 HANA 侧计算
" - 减少 ABAP 应用层数据搬运
"
" 3. 行集压缩 (Rows Compression)
" - 去除空行,减少传输量
"
" 4. 限定范围查询
" - 强制用户输入筛选条件,避免全表扫描

6.1.3 HANA 优化视图

" BW on HANA / BW/4HANA 核心优化:

" 1. InfoProvider 生成 HANA 视图
" - Calculation View (计算视图)
" - 直接在 HANA 层完成聚合
"
" 2. 使用 CompositeProvider 替代 MultiProvider
" - CompositeProvider 可下推 JOIN/UNION 到 HANA
"
" 3. ADSO 分区 (Partitioning)
" - 按会计年度分区,查询只扫描相关分区
" - RSA1 → ADSO → 属性 → 分区设置

6.2 加载性能优化

" 1. DTP 并行处理
" - DTP 属性 → 设置并行处理进程数
" - 通常 3-8 个并行进程
"
" 2. 数据包大小
" - InfoPackage / DTP → 数据包大小设置
" - 推荐: 50,000 - 200,000 条/包
"
" 3. 源系统端优化
" - 源表建立合适索引
" - 增量抽取代替全量抽取
"
" 4. 索引管理
" - 加载前删除索引,加载后重建
" - 在 Process Chain 中编排

6.3 数据库级优化

-- BW on HANA: 检查表大小
SELECT table_name, record_count, memory_size_in_total
FROM m_tables
WHERE schema_name = 'SAPHANADB'
AND table_name LIKE '/BIC/F%' -- 事实表
ORDER BY memory_size_in_total DESC;

-- 查看查询执行计划
-- RSRT → 查询 → Display SQL/HANA Plan
-- 可以看到 HANA 执行的实际 SQL 及耗时

第七篇:BW/4HANA 新特性

7.1 BW/4HANA 与传统 BW 的区别

维度 传统 BW 7.x BW/4HANA
数据库 Oracle / SQL Server / DB2 / HANA 仅 HANA
建模工具 RSA1 (GUI) BW Modeling Tools (Eclipse)
存储对象 DSO + InfoCube + PSA ADSO 统一
合并层 MultiProvider CompositeProvider
抽取 DataSource + InfoPackage + DTP DataSource + DTP(无 InfoPackage)
流式数据 不支持 支持 SAP HANA Smart Data Integration
ODP 可选 推荐的抽取框架

7.2 ODP(Operational Data Provisioning)

ODP 是 BW/4HANA 推荐的数据抽取框架,统一替代传统的 DataSource 机制。

" ODP 数据源类型:
" - ODP_SAP: SAP 应用系统(ECC/S4)
" - ODP_BW: BW 系统间的复制
" - ODP_HANA: HANA 视图/计算视图
" - ODP_SLT: SLT 实时复制
" - ODP_CDS: CDS View(S/4HANA 推荐)

" S/4HANA 时代的数据源变化:
" 传统: 基于表/视图/函数模块的 DataSource → 维护困难
" 新: 基于 ABAP CDS View → 自动暴露为 ODP 数据源

7.3 CDS View 数据源示例

" 在 S/4HANA 中定义 CDS View:

@AbapCatalog.sqlViewName: 'ZIFIGLDOCV'
@Analytics.dataCategory: #CUBE -- 标记为分析立方体
@Analytics.dataExtraction.enabled: true -- 启用数据抽取
define view ZI_FI_GLDocument
as select from bkpf
inner join bseg on bkpf.bukrs = bseg.bukrs
and bkpf.belnr = bseg.belnr
and bkpf.gjahr = bseg.gjahr
{
key bkpf.bukrs as CompanyCode,
key bkpf.belnr as DocumentNumber,
key bkpf.gjahr as FiscalYear,
key bseg.buzei as LineItem,
bseg.hkont as GLAccount,
bseg.dmbtr as AmountLocal,
bseg.waers as Currency
}
where bvorg = ''
and bstat = ''
"
" 在 BW 中创建 ODP_SAP 连接 → 自动识别此 CDS View
" 无需在 ECC 中维护传统 DataSource

第八篇:实战场景

8.1 场景一:财务报表(利润表)

" 需求:按科目层次展示利润表,支持按公司代码/期间筛选

" 1. InfoObject 层次设计
" - 0GL_ACCOUNT 创建层次结构:
" 利润表
" ├── 一、营业收入
" │ ├── 主营业务收入
" │ └── 其他业务收入
" ├── 二、营业成本
" │ ├── 主营业务成本
" │ └── 其他业务成本
" ├── 三、期间费用
" │ ├── 销售费用
" │ ├── 管理费用
" │ └── 财务费用
" └── 四、营业利润

" 2. Query 设计
" - 行: 0GL_ACCOUNT (使用上述层次)
" - 列: 0AMOUNT (借方-贷方)
" - 筛选: 0COMP_CODE = ?, 0FISCPER = ?
" - 计算指标: 营业利润 = 营业收入 - 营业成本 - 期间费用

8.2 场景二:库存分析

" 需求:展示各工厂各物料的期初库存、入库、出库、期末库存

" 关键指标设计:
" - 期初库存: 使用偏移量变量,取上期末余额
" - 入库数量: 限定移动类型 = 101/102 等
" - 出库数量: 限定移动类型 = 201/202 等
" - 期末库存: 非累积关键指标(Ncumulative)

" ADSO 设置:
" - 类型: 非累积 InfoCube 行为
" - 非累积关键指标: 库存数量
" - 入流/出流关键指标: 入库数量 / 出库数量
"
" 查询中:
" - 期末库存 = 期初 + 入库 - 出库
" - 系统自动按时间序列计算

8.3 场景三:实时数据集成

" BW/4HANA + HANA SDI (Smart Data Integration)

" 场景:实时监控 S/4HANA 销售订单状态

" 1. HANA SDI 配置
" - 安装 Data Provisioning Agent
" - 注册到 HANA
" - 创建 Remote Source(连接 S/4HANA)
"
" 2. 虚拟表 (Virtual Table)
" - 在 HANA 中创建虚拟表,指向 S/4HANA 的 CDS View
" - 实时读取,不存储
"
" 3. BW 集成
" - CompositeProvider 引用 HANA 虚拟表
" - 与 BW 历史数据 JOIN
" - 查询时实时获取最新数据
"
" 适用场景: 实时仪表盘、准实时 KPI 监控
" 限制: 大数据量下性能依赖源系统响应速度

第九篇:常用事务码速查

9.1 建模与管理

事务码 功能
RSA1 数据仓库工作台(主入口)
RSD1 维护 InfoObject
RSDODS 维护 DSO
RSMNGR ADSO 管理
RSDS 维护 DataSource
RSTRAN 维护 Transformation
RSDTP 维护 DTP

9.2 查询与报表

事务码 功能
RSRT 查询监视器(执行/调试查询)
RSRQ 查询属性管理
RRMX BEx Analyzer 启动器
RSBBS BEx 跳转维护

9.3 监控与调度

事务码 功能
RSPC Process Chain 维护
RSPCM Process Chain 监控器
RSMO 数据加载监控器
RSA7 源系统增量队列查看
RSDMPROM 数据加载概览
ST13 BW 工具集(性能分析等)

9.4 传输与管理

事务码 功能
SE09/SE10 传输管理系统
RSA1 → 传输 BW 对象传输
RSTCO 传输日志查看

第十篇:常见问题排查

10.1 数据加载失败

" 排查步骤:
" 1. RSMO → 查看加载日志
" 2. 检查错误栈 (Error Stack)
" - DTP → 错误处理 → 有错误的数据行
" 3. 常见原因:
" - 转换例程运行时错误 → 检查 ABAP 代码
" - 主数据缺失 → 目标字段引用的 InfoObject 无对应主数据
" - 数据类型不匹配 → 检查源/目标字段类型
" - 锁冲突 → 检查是否有其他进程锁定了目标表

10.2 查询结果不正确

" 排查步骤:
" 1. RSRT → 查询 → SQL/HANA Plan 查看实际执行的 SQL
" 2. 检查聚合设置:是否命中了错误的聚合
" 3. 检查变量输入:用户输入的筛选条件是否正确
" 4. 检查计算逻辑:公式/例程是否有边界条件未处理
" 5. 验证数据:直接查询 ADSO 激活表,核对底层数据

10.3 Process Chain 报错

" 事务码 RSPCM → 双击红色步骤 → 查看 Job 日志
"
" 常见问题:
" - Start 条件不满足 → 检查前序步骤状态
" - DTP 执行超时 → 调大 timeout / 优化数据量
" - 源系统不可达 → SM59 测试 RFC 连接
" - 后台进程不足 → SM50/RZ12 检查可用进程数

附录:BW 学习路径

入门(1-2月):
├── SAP BW 基本概念和术语
├── InfoObject 设计
├── ADSO 建模
└── 简单查询设计

进阶(3-6月):
├── ETL 开发(转换例程、增量抽取)
├── Process Chain 编排
├── 性能调优基础
└── 复杂查询(计算指标、变量、跳转)

高级(6月+):
├── BW/4HANA 新架构
├── CDS View 数据源
├── LSA++ 分层架构设计
├── HANA 优化视图
└── 实时数据集成

推荐学习资源:

  • SAP Help Portal: help.sap.com/bw
  • SAP Community: community.sap.com/topics/business-warehouse
  • 书籍:《SAP BW/4HANA - An Introduction》
  • 实践: 搭建 BW/4HANA 试用系统(SAP CAL 云应用库)

本文基于 SAP BW 7.5 on HANA / BW/4HANA 2.0 编写,部分旧对象(DSO、InfoCube、InfoPackage)仅适用于传统 BW 版本,BW/4HANA 新项目建议统一使用 ADSO + CompositeProvider + ODP 架构。