ITPub博客

首页 > 数据库 > 数据库开发技术 > 动态的实现任意表的ALV显示02

动态的实现任意表的ALV显示02

原创 数据库开发技术 作者:mmccking 时间:2009-06-15 23:43:22 0 删除 编辑
ABAP 动态的实现任意表的ALV显示(学习动态构建表格和结构)[@more@]

第一部分:程序框架
REPORT ZALV_20090304_EVENT.

INCLUDE ZALV_DATA_INTI.
INCLUDE ZALV_EVENT_F01.

START-OF-SELECTION.

PERFORM SUB_ALV_DATA_GET.
第二部分:INCLUDE ZALV_DATA_INTI.
TYPE-POOLS:ABAP.
PARAMETERS P_NAME TYPE OBJNAME.
DATA LT_TABLE TYPE TABLE OF DFIES.
DATA LS_TABLE TYPE DFIES.

CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
TABNAME = P_NAME
TABLES
* X031L_TAB =
DFIES_TAB = LT_TABLE
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

DATA LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR.
DATA LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR.
DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR.
DATA LR_DATA TYPE REF TO CL_ABAP_DATADESCR.
DATA L_STRING TYPE STRING.
DATA LT_COMP TYPE ABAP_COMPONENT_TAB.
DATA LS_COMP LIKE LINE OF LT_COMP.
DATA E_WA TYPE REF TO DATA.
DATA E_TABLE TYPE REF TO DATA.


FIELD-SYMBOLS TYPE STANDARD TABLE.
FIELD-SYMBOLS TYPE ANY.

LOOP AT LT_TABLE INTO LS_TABLE.
CONCATENATE LS_TABLE-TABNAME '-' LS_TABLE-FIELDNAME INTO L_STRING.
* L_STRING = LS_COMP-NAME.
LS_COMP-NAME = LS_TABLE-FIELDNAME.
CALL METHOD CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
EXPORTING
P_NAME = L_STRING
RECEIVING
P_DESCR_REF = LR_TYPE
EXCEPTIONS
TYPE_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


LS_COMP-TYPE ?= LR_TYPE.
APPEND LS_COMP TO LT_COMP.
CLEAR LS_COMP.
ENDLOOP.

CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
EXPORTING
P_COMPONENTS = LT_COMP
RECEIVING
P_RESULT = LR_STRUC
.

CALL METHOD CL_ABAP_TABLEDESCR=>CREATE
EXPORTING
P_LINE_TYPE = LR_STRUC
RECEIVING
P_RESULT = LR_TABLE
.

CREATE DATA E_WA TYPE HANDLE LR_STRUC.
CREATE DATA E_TABLE TYPE HANDLE LR_TABLE.


ASSIGN E_WA->* TO .
ASSIGN E_TABLE->* TO .
第三部分:INCLUDE ZALV_EVENT_F01.
FORM SUB_ALV_DATA_GET .

SELECT * INTO CORRESPONDING FIELDS OF TABLE FROM (P_NAME).
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_STRUCTURE_NAME = P_NAME
TABLES
T_OUTTAB =
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " SUB_ALV_DATA_GET

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ABAP动态创建表结构的方法


DATA: LR_EXCEPTION TYPE REF TO CX_ROOT.
DATA: LT_COMP TYPE ABAP_COMPONENT_TAB.
DATA: LS_COMP LIKE LINE OF LT_COMP.
DATA: L_FIELD TYPE STRING.
DATA: LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR.
DATA: LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR.
DATA: LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR.
TRY.
LOOP AT IT_QUERYFIELDS.
CONCATENATE IT_QUERYFIELDS-TABLENAME '-' IT_QUERYFIELDS-FIELDNAME INTO L_FIELD.
IF I_NOTABLENAME EQ 'X'.
LS_COMP-NAME = IT_QUERYFIELDS-FIELDNAME.
ELSE.
CONCATENATE IT_QUERYFIELDS-TABLENAME '_' IT_QUERYFIELDS-FIELDNAME INTO LS_COMP-NAME.
ENDIF.
CALL METHOD CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
EXPORTING
P_NAME = L_FIELD
RECEIVING
P_DESCR_REF = LR_TYPE
EXCEPTIONS
TYPE_NOT_FOUND = 1.
IF SY-SUBRC <> 0.
E_RC = 1.
EXIT.
ENDIF.
LS_COMP-TYPE ?= LR_TYPE.
APPEND LS_COMP TO LT_COMP.
CLEAR LS_COMP.
ENDLOOP.

CHECK E_RC = 0.
CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
EXPORTING
P_COMPONENTS = LT_COMP
RECEIVING
P_RESULT = LR_STRUC.

CALL METHOD CL_ABAP_TABLEDESCR=>CREATE
EXPORTING
P_LINE_TYPE = LR_STRUC
RECEIVING
P_RESULT = LR_TABLE.

CREATE DATA E_WA TYPE HANDLE LR_STRUC.
CREATE DATA E_TABLE TYPE HANDLE LR_TABLE.

CATCH CX_ROOT INTO LR_EXCEPTION .
CALL METHOD LR_EXCEPTION->IF_MESSAGE~GET_TEXT
RECEIVING
RESULT = E_MESSAGE.
E_RC = 1.
ENDTRY.
代码分析:ABAP_COMPONENT_TAB,在程序中,首先要用TYPE-POOLS:ABAP.声明一下。这个段代码是一个RFC的代码。声明部分不在这里。
注意查询ABAP_COMPONTET_TAB的结构。其中 的 NAME和 TYPE需要注意赋值的变量的类型。
LS_COMP-TYPE ?= LR_TYPE. 子类继承。将 LR_TYPE的内容 赋给LS_COMP-TYPE 注意他的类型TYPE RRF TO DATADESCR. LR_TYPE TYPE RRF TO TYPEDESCR.
[url=]CL_ABAP_TYPEDESCR[/url]
|
|--
[url=]CL_ABAP_DATADESCR[/url]
| |
| |--
[url=]CL_ABAP_ELEMDESCR[/url]
| |--
[url=]CL_ABAP_REFDESCR[/url]
| |--
[url=]CL_ABAP_COMPLEXDESCR[/url]
| |
| |--
[url=]CL_ABAP_STRUCTDESCR[/url]
| |--
[url=]CL_ABAP_TABLEDESCR[/url]
|
|--
[url=]CL_ABAP_OBJECTDESCR[/url]
|
|--
[url=]CL_ABAP_CLASSDESCR[/url]
|--
[url=]CL_ABAP_INTFDESCR[/url]
这个时候创建的是一个类型引用,用 CREATE DATA E_WA 接受这个类型。
E_WA的类型
和E_TABLE类型都是 TYPE REF TO DATA.
当要使用这个动态创建的表结构的时候,就需要FILED-SYBOMLS: <> TYPE.
ASSIGN E_WA->* TO <>.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8356764/viewspace-1023159/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
风太大,吹乱了我的头发~

注册时间:2008-03-11

  • 博文量
    94
  • 访问量
    403026