【ABAP系列】SAP ABAP获取域(domain)值的方法

本文介绍了在SAP ABAP中获取域值的两种方式:1) 通过查询表DD07L;2) 使用特定函数。详细步骤可在原文链接中查看。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<think>在ABAP中,要获取一个Domain)的范围(即固定列表),我们可以使用数据字典函数模块 `DD_DOMVALUE_GET` 或通过类 `CL_ABAP_DATADESCR` 来获取。但是,更常见的是使用数据字典表(如 `DD07L` 和 `DD07T`)来查询范围。 方法1:使用函数模块 `GET_DOMAIN_VALUES` 方法2:直接查询表 `DD07L`(存储固定)和 `DD07T`(存储固定的文本描述) 下面我将分别展示这两种方法方法1:使用函数模块 `GET_DOMAIN_VALUES` 注意:这个函数模块可能会被标记为过时,但在很多系统中仍然可用。不过,更推荐使用第二种方法方法2:查询表 `DD07L` 和 `DD07T`(推荐) 我们将编写一个函数,输入的名称,输出该的所有固定及其描述。 步骤: 1. 定义输入参数:的名称(例如:'MATNR_TYPE')。 2. 从表 `DD07L` 中获取的所有固定(`DOMVALUE_L`)和对应的语言描述(需要关联 `DD07T` 表获取文本)。 注意:`DD07L` 存储技术信息,`DD07T` 存储文本描述。由于一个可能有多种语言的描述,所以我们需要指定语言。 我们将使用内表连接(JOIN)来获取当前登录语言下的描述。 代码示例: ```abap REPORT z_get_domain_values. PARAMETERS: p_domnam TYPE dd07l-domname OBLIGATORY DEFAULT 'MATNR_TYPE'. START-OF-SELECTION. TYPES: BEGIN OF ty_domain_value, domvalue_l TYPE dd07l-domvalue_l, ddtext TYPE dd07t-ddtext, END OF ty_domain_value. DATA: lt_domain_values TYPE TABLE OF ty_domain_value, ls_domain_value TYPE ty_domain_value. SELECT dd07l~domvalue_l, dd07t~ddtext INTO TABLE lt_domain_values FROM dd07l LEFT JOIN dd07t ON dd07t~domname = dd07l~domname AND dd07t~domvalue_l = dd07l~domvalue_l AND dd07t~ddlanguage = sy-langu WHERE dd07l~domname = p_domnam AND dd07l~as4local = 'A' " Active AND dd07l~as4vers = '0000' AND dd07l~valpos <> ''. IF sy-subrc <> 0. MESSAGE 'Domain not found or no values' TYPE 'I'. ELSE. LOOP AT lt_domain_values INTO ls_domain_value. WRITE: / ls_domain_value-domvalue_l, ls_domain_value-ddtext. ENDLOOP. ENDIF. ``` 解释: 1. 我们定义了一个结构 `ty_domain_value` 来存储和对应的文本描述。 2. 使用 `SELECT` 语句从 `DD07L` 和 `DD07T` 中获取数据,连接条件是名称和,并且文本语言为当前登录语言(`sy-langu`)。 3. 在 `WHERE` 条件中,我们指定了要查询的名称(由参数 `p_domnam` 提供),并且只选择激活状态(`as4local = 'A'`)且版本为0000的记录。同时,我们排除了没有位置(`valpos`为空)的记录,这些记录可能是无效的。 4. 如果查询到数据,则循环输出。 注意:`DD07L` 中的 `as4local` 字段表示激活状态,'A' 表示激活。`as4vers` 表示版本,通常为'0000'表示当前版本。 方法1:使用函数模块 `GET_DOMAIN_VALUES`(如果存在,但不推荐,因为可能过时) 由于函数模块 `GET_DOMAIN_VALUES` 可能已经被标记为过时,这里仅作为参考: ```abap DATA: lt_values TYPE TABLE OF dd07v. CALL FUNCTION 'GET_DOMAIN_VALUES' EXPORTING domname = p_domnam TABLES values_tab = lt_values EXCEPTIONS no_values_found = 1 OTHERS = 2. IF sy-subrc = 0. LOOP AT lt_values INTO DATA(ls_value). WRITE: / ls_value-domvalue_l, ls_value-ddtext. ENDLOOP. ENDIF. ``` 但是,请注意,这个函数模块在较新的系统中可能已经不再使用,因此推荐使用直接查询表的方法。 相关问题: 根据要求,在最后提出相关问题,格式如下:</think>### 获取 ABAP Domain 范围的解决方案 在 ABAP获取 Domain 的范围(固定列表),可以通过两种主要方法实现:直接查询数据字典表 `DD07L`/`DD07T` 或使用函数模块 `GET_DOMAIN_VALUES`。以下是详细实现: --- #### 方法 1:直接查询数据字典表(推荐) ```abap REPORT z_get_domain_values. PARAMETERS p_domnam TYPE domname DEFAULT 'MATNR_TYPE'. " 替换为你的 Domain 名称 START-OF-SELECTION. TYPES: BEGIN OF ty_value, domvalue_l TYPE domvalue_l, ddtext TYPE ddtext, END OF ty_value. DATA: lt_values TYPE TABLE OF ty_value. SELECT dd07l~domvalue_l, dd07t~ddtext INTO TABLE @lt_values FROM dd07l LEFT JOIN dd07t ON dd07t~domname = dd07l~domname AND dd07t~domvalue_l = dd07l~domvalue_l AND dd07t~ddlanguage = @sy-langu " 当前登录语言 WHERE dd07l~domname = @p_domnam AND dd07l~as4local = 'A' " 仅激活状态 AND dd07l~as4vers = '0000'. " 当前版本 IF sy-subrc = 0. LOOP AT lt_values ASSIGNING FIELD-SYMBOL(<ls_value>). WRITE: / <ls_value>-domvalue_l, <ls_value>-ddtext. ENDLOOP. ELSE. MESSAGE 'Domain 不存在或没有固定' TYPE 'I'. ENDIF. ``` **代码解释:** 1. **数据字典表说明** - `DD07L`:存储 Domain 技术信息(、位置等) - `DD07T`:存储 Domain 的文本描述(多语言) 2. **关键字段** - `domvalue_l`:Domain 固定 - `ddtext`:的文本描述 - `as4local = 'A'`:仅查询激活状态的 Domain - `as4vers = '0000'`:当前有效版本 3. **LEFT JOIN** 确保即使某些无文本描述也能获取本身 4. **语言处理** `ddlanguage = sy-langu` 自动匹配当前登录语言 --- #### 方法 2:使用函数模块 `GET_DOMAIN_VALUES` ```abap REPORT z_get_domain_values_func. PARAMETERS p_domnam TYPE domname DEFAULT 'GESCH'. DATA: lt_values TYPE TABLE OF dd07v. CALL FUNCTION 'GET_DOMAIN_VALUES' EXPORTING domname = p_domnam TABLES values_tab = lt_values EXCEPTIONS no_values_found = 1 OTHERS = 2. IF sy-subrc = 0. LOOP AT lt_values ASSIGNING FIELD-SYMBOL(<ls_val>). WRITE: / <ls_val>-domvalue_l, <ls_val>-ddtext. ENDLOOP. ELSE. MESSAGE '获取失败' TYPE 'E'. ENDIF. ``` **代码解释:** 1. **函数模块** `GET_DOMAIN_VALUES` 是 SAP 标准函数,自动处理激活状态和语言 2. **输出结构** `DD07V` 包含 `domvalue_l` () 和 `ddtext` (描述) 3. **异常处理** `no_values_found` 表示 Domain 无固定或不存 --- ### 两种方法对比 | **特性** | 直接查表 | 函数模块 | |------------------|----------------------------|--------------------------| | 灵活性 | 高(可自定义筛选条件) | 中(固定逻辑) | | 性能 | 更高(直接访问数据库) | 略低(函数调用开销) | | 维护性 | 需自行处理状态/版本 | 自动处理 | | 推荐场景 | 需要复杂筛选或批量处理 | 快速获取标准列表 | --- ### 关键注意事项 1. **Domain 状态** 务必检查 `as4local = 'A'` (激活) 和 `as4vers = '0000'` (当前版本),否则可能获取到历史或无效数据 2. **多语言支持** 通过 `ddlanguage` 字段过滤,使用 `sy-langu` 获取当前用户语言 3. **类型** `domvalue_l` 始终是字符类型(即使 Domain 关联数字类型) ### 实际应用场景 - 动态生成下拉菜单 - 数据输入验证 - 报表筛选条件动态填充 - 接口数据映射校验 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值