动态内表的建立与应用Word文件下载.docx
- 文档编号:16729839
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:14
- 大小:21.03KB
动态内表的建立与应用Word文件下载.docx
《动态内表的建立与应用Word文件下载.docx》由会员分享,可在线阅读,更多相关《动态内表的建立与应用Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
<
=boms-idnrk.
*---------------------------------------------------------------------*
*FORMget_data*
FORMget_data.
*SelectDatafromtable.
SELECT*INTOTABLE<
FROM(p_table).
ENDFORM.
*FORMwrite_out*
FORMwrite_out.
*Writeoutdatafromtable.
LOOPAT<
INTO<
DO.
ASSIGNCOMPONENTsy-index
OFSTRUCTURE<
TO<
IFsy-subrc<
>
0.
EXIT.
ENDIF.
IFsy-index=1.
WRITE:
ELSE.
ENDDO.
ENDLOOP.
这两天做了一个这样的需求,其中要求根据用户输入的工资项(T512W-LGART)查找数据,并输出到ALV,要求是输出跟着输入变。
由于工资项的配置信息可能会变,因此用于存储要显示的数据的内表就不能预先知道,因此不得不寻求动态内表的构建方法。
其实网上的例子也有不少,但是都缺少说明,折腾了一上午才弄明白一些,写出来与大家分享。
REPORT
Z_DT2.
type-pools:
abap.
*以t512w为例,构建一个动态内表
tables:
t512w.
*field-symbols是一个标志,你可以理解为一个指针,将来创建的内表就要通过它们来访问
[小于号]dyn_table>
typestandardtable,
[小于号]dyn_wa>
[小于号]dyn_field>
*这里定义了一个dy_table和一个dy_line类型是引用,但todata未能理解是什么意思,我觉得应该是说指向为空的意思
dy_line
typereftodata,
*用于存储即将构建的动态内表结构
ifctypelvc_t_fcat,
xfctypelvc_s_fcat.
beginoft_lgartoccurs0,
LGARTliket512w-lgart,
endoft_lgart.
select-options:
S_LGARTFORt512w-lgart.
start-of-selection.
*首先从数据库中把符合用户输入的LGART填入内表,将来构建的动态内表每一列就是LGART中的每一行。
selectlgartintot_lgart-lgartfromt512wwherelgartins_lgartandMOLGA='
28'
appendt_lgart.
endselect.
*循环读取内表t_lgart,对于每行构建内表
loopatt_lgart.
*这里偷了个懒,因为工资项中会有/103这样的数据,而/是不能用左列明的,大家可以自己写一个替换逻辑,把/替换成_之类的字符。
checkt_lgart-lgart+0
(1)ne'
/'
*列名就用lgart值
xfc-fieldname=t_lgart-lgart.
xfc-datatype='
C'
xfc-inttype='
xfc-intlen=6.
xfc-decimals=0.
endloop.
*此处调用一个方法,这个方法用于构建动态内表,输入的就是要构建的结构,输出的就是一个dy_table,之前定义过,但是并不能直接访问。
callmethodcl_alv_table_create=>
EXPORTING
it_fieldcatalog=ifc
IMPORTING
ep_table
=dy_table.
*设定<
指向dy_table
assigndy_table->
*下面这句建立了一个<
类型的工作区Workarea
createdatady_linelikelineof<
*同理设定指针
assigndy_line->
于是便动态的建立了一个内表和一个工作区,由于此方法建立的内表没有headerline,所以需要一个工作区。
下面是取数或者赋值的方法:
*此行中的xxxx1就是列名
ASSIGNCOMPONENTxxxx1OFSTRUCTURE<
*此行的作用就是给<
中的该列一个值
=xxxx2.
*用Append就可以把该行添加到表中了
APPEND<
如上所述,即可以动态构建内表,这种方法主要用于表结构无法确定有几列,几有哪些列,尤其与信息配置有关的时候,就只能用这种方法,否则配置一变,程序就不能用了。
才疏学浅,学习体会总结出来希望能对大家有所帮助,有不对的地方希望大家指正,向大家学习!
例子:
ZPSR026
MESSAGE-ID
zmps.
TYPE-POOLS:
slis.
*--
TABLSE
TABLES:
ZPST001,
ZPST017
BKPF.
DATA:
gt_fieldcat
TYPE
slis_t_fieldcat_alv,
gt_layout
slis_layout_alv,
gt_sort
slis_t_sortinfo_alv,
gt_events
slis_t_event,
gt_list_top_of_page
slis_t_listheader.
BEGIN
OF
Btab
OCCURS
0,
KOSTL
ZPST001-KOSTL,
"
연구소코드
GJAHR
BKPF-GJAHR,
회계연도
LTEXT
CSKT-KTEXT,
연구소이름
RVAMT
ZPST017-RVAMT,
입금액
COM
I,
제수량
PSPNR
ZPST017-PSPNR,
END
Btab.
DATA
JTAB
LIKE
0
WITH
HEADER
LINE.
BTAB에
데타를
최종가공
IT_ZPST001
ZPST001
LINE.
필드이름
만들기위한
변수들.
W_RVAMT
STRING.
W_COM
ALV
헤더이름
C_RVAMT
C_COM
Z_KOSTL
W_Amount
C_ZYEAR
Amount
I.
년도개수
date
type
string.
C_date
=============동태적인
itab선언=========
*type-pools:
standard
table,
itab구조
itab
헤더
.
필드
dy_table
ref
to
data,
data,
항
xfc
lvc_s_fcat,
렬
ifc
lvc_t_fcat.
列itab
====================================
SELECTION-SCREEN
BLOCK
b1
FRAME
TITLE
text-001.
SKIP
1.
SELECT-OPTIONS:
S_GJAHR
FOR
BKPF-GJAHR
NO-EXTENSION.
b1.
AT
SELECTION-SCREEN.
IF
S_GJAHR-LOW
=
'
0000'
AND
S_GJAHR-HIGH
message
e143(zmps).
ELSEIF
S_GJAHR-LOW.
CONCATENATE
년'
INTO
C_ZYEAR.
S_GJAHR-HIGH.
-
+
C_ZYEAR
SEPARATED
BY
~'
ENDIF.
========동태적인
필드추가==================
출력시
연구소명
년도
입금.
입금.......
입금
============================================
clear
xfc.
xfc-fieldname
KOSTL'
xfc-datatype
='
CHAR'
xfc-intlen
10.
append
ifc.
LTEXT'
20.
DO
TIMES.
조회조건에
따라
입금과
수량
개수가
변함
CLEAR
W_COM.
W_RVAMT.
COM'
W_COM.
수량
12.
RVAMT'
W_RVAMT.
CURR'
ENDDO.
call
method
cl_alv_table_create=>
exporting
it_fieldcatalog
ifc
importing
dy_table.
assign
dy_table->
*
create
data
like
line
of
dy_line->
START-OF-SELECTION.
PERFORM
get_data.
SET_data.
ALV에
데타
넣기
gt_layout.
gt_fieldcat.
comment_build
USING
gt_list_top_of_page.
eventtab_build
gt_events.
GRID_list.
END-OF-SELECTION.
*&
---------------------------------------------------------------------*
Form
GET_DATA
text
*----------------------------------------------------------------------*
-->
p1
--
p2
form
GET_DATA
SELECT
FROM
CORRESPONDING
FIELDS
TABLE
BTAB
WHERE
IN
S_GJAHR.
SORT
BTAB
DESCENDING
ASCENDING.
IT_ZPST001.
LOOP
BTAB.
READ
KEY
BTAB-PSPNR.
sy-subrc
0.
BTAB-KOSTL
IT_ZPST001-KOSTL.
IT_ZPST001-KOSTL
%'
Z_KOSTL.
SINGLE
ltext
cskt
BTAB-LTEXT
kostl
datbi
EQ
99991231'
BTAB-COM
MODIFY
ENDLOOP.
녕구소별
과제
건수와
입금총합구하기.
JTAB-KOSTL
BTAB-KOSTL.
JTAB-LTEXT
BTAB-LTEXT.
JTAB-GJAHR
BTAB-GJAHR.
NEW
GJAHR.
SUM.
JTAB-RVAMT
BTAB-RVAMT.
JTAB-COM
BTAB-COM.
APPEND
JTAB.
ENDAT.
endform.
SET_DATA
SET_DATA
DESCENDING.
^$*)*)@&
r*q%@*)&
@*(@&
$()q'
DATE
IS
NOT
INITIAL.
TO
JTAB-KOSTL.
C_date.
TIMES.
EXIT.
else.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 建立 应用