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.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. 激活
|
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 计算指标与限定
" 场景:计算毛利率 = (收入 - 成本) / 收入
" 方法一:公式 1. 在 Columns 区右键 → 新建计算指标 2. 公式: ( 收入 - 成本 ) / 收入 * 100 3. 设置:百分比格式,保留2位小数
" 方法二:ABAP 例程(复杂计算) " 在公式中嵌入 ABAP 代码处理特殊逻辑
|
" 场景:只显示期间 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 数据库级优化
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;
|
第七篇: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 架构。