当调用nam时错误

转自:http://kooyee.javaeye.com/blog/309893

当调用nam时,出现如下错误:
[code omitted because of length]
: no event type or button # or keysym
    while executing
"bind Listbox {
%W yview scroll [expr {- (%D / 120) * 4}] units
}"
    invoked from within
"if {[tk windowingsystem] eq "classic" || [tk windowingsystem] eq "aqua"} {
bind Listbox {
%W yview scroll [expr {- (%D)}] units
}
bind Li..."

这个是由于nam调用的tk组件和xproto-7.0.13 不兼容导致的(xproto-7.0.13 新添加了 GenericEvent)。

解决方法:
到这里下载补丁http://bugs.gentoo.org/show_bug.cgi?id=225999

在ns-allinone-2.33下运行
patch -p0
然后重装ns-2.33 patch文件内容:

--- tk8.4.18-orig/generic/tkBind.c	2006-07-21 08:26:54.000000000 +0200
+++ tk8.4.18/generic/tkBind.c 2008-07-05 12:17:10.000000000 +0200
@@ -586,6 +586,9 @@
/* ColormapNotify */ COLORMAP,
/* ClientMessage */ 0,
/* MappingNotify */ 0,
+#ifdef GenericEvent
+ /* GenericEvent */ 0,
+#endif
/* VirtualEvent */ VIRTUAL,
/* Activate */ ACTIVATE,
/* Deactivate */ ACTIVATE,

 

<think>我们正在处理一个关于ABAP函数的问题:用户想调用函数获取数据库表的表头信息(即表的元数据,如字段名、数据类型、长度等)。在SAP ABAP中,获取表结构信息的常用函数是`DDIF_FIELDINFO_GET`或`DDIF_NAMETAB_GET`,但更完整的方式是使用`DDIF_TABL_GET`来获取整个表的元数据。 根据用户的问题,我们需要调用一个函数来获取表的头部信息(表头信息),这通常指的是表的字段定义(字段名、类型、长度等)。在ABAP中,标准函数`DDIF_FIELDINFO_GET`可以用于获取表的字段信息。 但是,请注意,用户要求的是“表头信息”,可能是指表的字段元数据。另一个常用的函数是`DDIF_NAMETAB_GET`,它获取的是表在运行使用的内表格式(NAMETAB)信息,但通常我们使用`DDIF_FIELDINFO_GET`来获取更详细的字段信息。 下面我将介绍如何使用`DDIF_FIELDINFO_GET`函数来获取表的字段信息。 步骤: 1. 定义需要传入的参数:表名(TABNAME)。 2. 定义接收字段信息的内部表。 3. 调用函数`DDIF_FIELDINFO_GET`。 示例代码: ```abap DATA: lt_dfies TYPE TABLE OF dfies, lt_dd03p TYPE TABLE OF dd03p, " 可选,如果需要更底层的信息 lv_tabname TYPE dd02l-tabname VALUE 'MARA'. " 替换为你想查询的表名 CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = lv_tabname * FIELDNAME = ' ' " 如果指定单个字段,则只获取该字段的信息,留空则获取所有字段 * LANGU = SY-LANGU " 语言,默认为当前登录语言 TABLES dfies_tab = lt_dfies " 返回字段信息(用户友好的格式) * FIXED_VALUES = " 固定值(如域固定值) EXCEPTIONS not_found = 1 internal_error = 2 OTHERS = 3. IF sy-subrc = 0. " 成功获取,lt_dfies包含了表的字段信息 " 可以循环lt_dfies查看每个字段的详细信息,如字段名:FIELDNAME,数据类型:DATATYPE,长度:LENG等 ELSE. " 处理错误 ENDIF. ``` 函数`DDIF_FIELDINFO_GET`返回的信息存储在结构为`DFIES`的内部表中。`DFIES`结构包含了字段的详细描述,如字段名、数据类型、长度、描述文本等。 另外,还有一个函数`DDIF_TABL_GET`可以获取表的更全面的信息,包括表头信息(比如表的技术设置、字段列表等)。但是,如果只需要字段信息,使用`DDIF_FIELDINFO_GET`就足够了。 如果用户需要获取表的技术信息(如缓冲设置、维护状态等),那么可以使用`DDIF_TABL_GET`。示例: ```abap DATA: lv_tabname TYPE dd02l-tabname VALUE 'MARA', ls_dd02v TYPE dd02v, " 表的基本信息 lt_dd03p TYPE TABLE OF dd03p. " 字段信息 CALL FUNCTION 'DDIF_TABL_GET' EXPORTING name = lv_tabname state = 'A' " 活动版本 langu = sy-langu IMPORTING dd02v_wa = ls_dd02v TABLES dd03p_tab = lt_dd03p EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc = 0. " 表的基本信息在ls_dd02v中,字段信息在lt_dd03p中 ENDIF. ``` 在`DD03P`表中,存储了每个字段的技术信息,包括字段名、数据类型、长度、小数位数、检查表、检查字段等。 根据用户的需求,他可能只需要字段名和描述等基本信息,因此第一个函数可能更合适。 注意:在ABAP中,表头信息有也指表的工作区的结构,但这里用户明确要求获取元数据,所以上述函数是合适的。 相关问题: 1. 如何获取数据库表的字段列表并动态构建选择屏幕? 2. ABAP中如何根据表名动态读取表数据? 3. 如何获取ABAP数据元素(Data Element)的文本描述? 4. 在ABAP中如何修改数据库表的结构? 以上问题可以帮助用户进一步探索ABAP数据字典操作。 参考引用: [^1]: 文章提到了在ABAP中获取ALV报表数据的几种方案,其中涉及了内存的使用和后台作业等,但未直接涉及获取表头元数据。 [^2]: 这段引用主要介绍了SAP内存和ABAP内存的使用,以及屏幕设计,与表头元数据关系不大。 [^3]: 这是一个SAP ABAP任意表数据查询和下载工具的介绍,提到了单表查询和跨表查询,以及数据下载功能,但也没有直接涉及如何获取表头元数据。 因此,我们主要根据ABAP标准知识来回答。</think>### 在 ABAP 中获取数据库表头信息 在 ABAP 中获取数据库表的表头信息(元数据),可以使用标准函数 `DDIF_FIELDINFO_GET`。以下是实现步骤和示例代码: #### 核心函数说明 ```abap FUNCTION ddif_fieldinfo_get EXPORTING tabname = lv_tabname " 表名 TABLES dfies_tab = lt_dfies " 返回字段信息表 EXCEPTIONS not_found = 1 " 表不存在 internal_error = 2. " 内部错误 ``` #### 完整实现代码 ```abap REPORT z_get_table_header. DATA: lt_dfies TYPE TABLE OF dfies, " 存储表头信息 lv_tabname TYPE dd02l-tabname VALUE 'MARA'. " 替换为你的表名 START-OF-SELECTION. PERFORM get_table_metadata. FORM get_table_metadata. CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = lv_tabname TABLES dfies_tab = lt_dfies EXCEPTIONS not_found = 1 internal_error = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. " 输出表头信息 LOOP AT lt_dfies ASSIGNING FIELD-SYMBOL(<fs_dfies>). WRITE: / <fs_dfies>-fieldname, <fs_dfies>-datatype, <fs_dfies>-leng, <fs_dfies>-scrtext_m. " 字段描述 ENDLOOP. ENDIF. ENDFORM. ``` #### 关键参数说明: 1. **`dfies_tab` 结构字段**: - `FIELDNAME`:字段名(如 `MATNR`) - `DATATYPE`:数据类型(如 `CHAR`, `NUMC`) - `LENG`:字段长度 - `SCRTEXT_M`:字段描述文本 - `KEYFLAG`:是否为主键字段 - `DECIMALS`:小数位数 2. **其他获取元数据的方式**: - 直接查询数据字典表: ```abap SELECT * FROM dd03l WHERE tabname = lv_tabname ORDER BY position. ``` - 使用类 `CL_ABAP_TABLEDESCR`: ```abap DATA(lo_type) = CAST cl_abap_structdescr( cl_abap_tabledescr=>describe_by_name( lv_tabname ) ). ``` #### 注意事项: 1. 需要表名存在于数据字典中 2. 对自定义表需使用开发密钥 3. 生产系统操作需考虑权限问题(`S_TABU_NAM` 权限对象)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值