作者 idan lian 如需转载备注出处
BW信息对象-层级结构
RSH1 维护信息对象层级
这里的文本描述对应T表中的描述,文本数据源加载之后有数据
信息对象层级H表
以上描述都是根据自我理解翻译的,非官方翻译
层级标识:自动生成,其实就是创建的层级标题的技术编码,这上面就是H1,H2创建生成的标识
版本:自动生成,A激活版本 如下图
节点编码:创建数据源时需要给值,每一个层级标题下,每一个节点都对应唯一一个编码,向下延续,如何在RSH1中维护节点后会自动生成,正序排列
等级编码:自动生成,根据节点编码,父节点编码,来决定是哪一个等级的,通俗就是展开是第几层
父节点编码:创建数据源时需要给值,上一级的编码,在RSH1时把节点挂在另一个节点下面,那么另一个节点就是他的父节点
子节点的第一个编码:创建数据源时不用给值,自动生成,就是下一等级的第一个编码
兄弟节点下一个编码: 同一级别的下一个编码
数据源
层次结构文本数据源
标准层次数据源
例如成本中心等层级数据源,在S4中有标准的,没用过,暂时不写
转换&DTP
对应五个转换
1层级标题,层级结构技术名称比需有值,就是H1,H2
不是必须的
必须维护,尤其是NODEID,父节点,信息对象等,常用的链接如下,其他可以不维护
文本,可以不维护
文本,可以不维护
文本层级数据源
DTP转换选择层级标题,这里层级标题是创建数据源时生成的,也就是H1,H2,只有文本层级数据源的转换才有这个选项
专家例程实现案例 利用属性数据源实现层级结构的加载
需求:
SUBJECT-CRD8UDZ | 文本 | H1层次结构 |
S02 | 在建工程项目 | 默认值:SALL |
ZTFI_HB_CIP-PSPID(项目定义) | ZTFI_HB_CIP- | 默认值:S02 |
ZTFI_HB_CIP-AUFNR(订单) | ZTFI_HB_CIP- KTEXT | 默认值:S02 |
将项目ID与描述保存在与维度SUBJECT的CRD8UDZ、中,父项固定为“S02”。再用处理链,将成员复制到BPC维度SUBJECT中去。
其实就是生成父节点,并根据来源的数据源根据 向下进行编码,这里我们通过专家例程实现,最重要的是理解我们需要处理哪些字段,还有各个字段对应的含义,不懂可以再2参考上面写的。
创建属性数据源,实现自动编码,固定父节点,其他规则搞懂各个字段含义照葫芦画瓢即可
专家例程实现,代码如下:
IF SOURCE_PACKAGE IS NOT INITIAL.
" 定义一些常量
CONSTANTS: lc_hier TYPE rshienm VALUE 'PARENTH1',
lc_act TYPE rsobjvers VALUE 'A',
lc_ZSUB TYPE rsiobjnm VALUE 'ZSUB_TEXT',
lc_ZH TYPE c LENGTH 1 VALUE '1'.
" Data Declaration
DATA: lv_prnt_id TYPE rshienodid,
lv_max_nodeid TYPE rshienodid,
lv_PARENTID TYPE rshienodid.
" 定义宏 +1 用于之后的编码
DEFINE increment.
&1 = &1 + 1.
END-OF-DEFINITION.
break-point.
" 查出层级对应的唯一技术标识 rshiedir是记录层级信息的标准表 有所有层级
SELECT SINGLE hieid
FROM rshiedir
INTO @DATA(lv_hieid_hier_ZSUB_TEXT)
WHERE hienm = @lc_hier AND IOBJNM = @lc_ZSUB.
" 获取层级表最大的nodeid 后语基于这个多nodeid顺序编码
SELECT SINGLE MAX( nodeid )
FROM /BIC/HZSUB_TEXT
WHERE HIEID = @lv_hieid_hier_ZSUB_TEXT
INTO @lv_max_nodeid.
" 查出需要固定为父节点的NODEID
" 查询目前的层级结构H表字段,用于之后赋值
SELECT *
FROM /BIC/HZSUB_TEXT
INTO TABLE @DATA(lt_existing_parents)
WHERE hieid = @lv_hieid_hier_ZSUB_TEXT
AND objvers = @lc_act.
SORT lt_existing_parents BY NODEID.
" 把层级H表赋值给结构包
LOOP AT lt_existing_parents INTO DATA(LS_H).
RESULT_PACKAGE_3 = VALUE #( BASE RESULT_PACKAGE_3 (
OBJECTID = lv_hieid_hier_ZSUB_TEXT
H_NODEID = LS_H-NODEID
H_IOBJNM = LS_H-IOBJNM
H_PARENTID = ls_h-PARENTID
" H_CHILDID = ls_h-CHILDID
" H_NEXTID = ls_h-NODEID
H_TLEVEL = ls_h-TLEVEL
H_LINK = ls_h-LINK
H_HIERNODE = ls_h-NODENAME
/BIC/ZSUB_TEXT = ls_h-NODENAME
) ).
ENDLOOP.
SORT lt_existing_parents BY hieid nodename.
" 对数据来源进行处理 本项目需求 不通用
LOOP AT SOURCE_PACKAGE ASSIGNING <source_fields>.
IF <source_fields>-pspid = ''.
<source_fields>-pspid = <source_fields>-aufnr.
<source_fields>-POST1 = <source_fields>-KTEXT.
ENDIF.
ENDLOOP.
SORT SOURCE_PACKAGE BY PSPID .
"固定父节点
IF RESULT_PACKAGE_3[] IS INITIAL."只有初始化时赋值
RESULT_PACKAGE_3 = VALUE #( BASE RESULT_PACKAGE_3
( objectid = lv_hieid_hier_ZSUB_TEXT
h_nodeid = 00000001
h_iobjnm = 'ZSUB_TEXT'
/BIC/ZSUB_TEXT = 'SALL'
h_parentid = 00000000 " S02的nodeid
h_tlevel = 01 "固定第1层级
h_hiernode = 'SALL')
( objectid = lv_hieid_hier_ZSUB_TEXT
h_nodeid = 00000002
h_iobjnm = 'ZSUB_TEXT'
/BIC/ZSUB_TEXT = 'S02'
h_parentid = 00000001 "
h_tlevel = 02 "固定第2层级
h_hiernode = 'S02')
( objectid = lv_hieid_hier_ZSUB_TEXT
h_nodeid = 00000003
h_iobjnm = 'ZSUB_TEXT'
/BIC/ZSUB_TEXT = 'S03'
h_parentid = 00000001 "
h_tlevel = 02 "固定第2层级
h_hiernode = 'S03')
).
" 当前行赋值 作为之后编码使用 之前已固定赋值三行 所以从3开始编码
DATA(lv_index) = 00000003. "初始化时从3开始编码 有三个固定值
ELSE.
lv_index = 00000000."非初始化从000开始
ENDIF.
" 开始循环赋值
LOOP AT SOURCE_PACKAGE ASSIGNING <source_fields>.
IF <source_fields>-PSPID <> ''.
" Fill result_package_1 with the technical name
" for the hierarchy.
" RESULT_PACKAGE_1 层级标题赋值 其实主要是h_hienm object_ID无所谓
RESULT_PACKAGE_1 = VALUE #( BASE RESULT_PACKAGE_1 (
objectid = lv_hieid_hier_ZSUB_TEXT
h_hienm = lc_hier
) ).
" 通过宏进行对当前行加1
increment lv_index.
" 读取H表的内表,判断数据来源中是否已有此数据,没有才进行插入赋值
READ TABLE lt_existing_parents ASSIGNING
FIELD-SYMBOL(<ep_sub_text>)
WITH KEY hieid = lv_hieid_hier_ZSUB_TEXT
nodename = <source_fields>-pspid
BINARY SEARCH.
IF sy-subrc <> 0.
" result_package_3.最关键 是关键的层级信息 nodeid 父节点等赋值
RESULT_PACKAGE_3 = VALUE #( BASE RESULT_PACKAGE_3 (
objectid = lv_hieid_hier_ZSUB_TEXT
h_nodeid = lv_max_nodeid + lv_index
h_iobjnm = 'ZSUB_TEXT'
/BIC/ZSUB_TEXT = <source_fields>-pspid
h_parentid = 00000002 " S02的nodeid
h_tlevel = 03 "固定第三层级
h_hiernode = <source_fields>-pspid
"Always 02
) ).
ENDIF.
" RESULT_PACKAGE_4 生成层级文本的 但是没生效 后通过TEXT转换数据源赋值
RESULT_PACKAGE_4 = VALUE #( BASE RESULT_PACKAGE_4 (
objectid = lv_hieid_hier_ZSUB_TEXT
langu = lc_ZH
h_hiernode = <source_fields>-pspid
txtlg = <source_fields>-post1
txtmd = <source_fields>-post1
txtsh = <source_fields>-post1
) ).
ENDIF.
ENDLOOP.
ENDIF.
实现之后RSH1中检查是否完成
H表数据如下
注意:
1.这里层次结构文本不好用,必须的链接TEXT文本数据源的转换才行。
2.,层级中的特征值都需要在主数据P表中存在,如果需要展示文本需要在信息对象T表中存在,所以除了维护层级的转换之外,还要处理主数据和文本的转换。