•
Field Symbol
的几种特性
–
在程序
中
Field Symbol
允许动态访问变量
–
Field Symbol
不占有自己特有的内存空间
–
Field
Symbol
的数据名与属性到执行时刻(
Runtime
)才能确定
–
Field
Symbol
可以指定所有数据对象
–
一旦
Field
Symbol
被分配到,则它与一般数据对象没有太大区别。同样可以使用类似于
MOVE
之类的语句
–
Field
Symbol
可以明确指定数据类型,也可以不指定数据类型。若不指定,则会继承被分配的字段(对象)的数据类型
•
Assign
语句的基本结构
–
静态
分配
–
字段名已知
•
ASSIGN
dobj
TO <
fs
> .
–
动态分配
–
字段名无法知道
•
ASSSIGN (
dobj
) TO <
fs
> .
•
将结构体字段分配到
Field Symbol
中
–
ASSIGN COMPONENT comp OF STRUCTURE
struc
TO <
fs
> .
–
Comp
可以为行编号或者字段名
•
类型更改,可以通过
casting
把一个不同类型的变量分配给一个
<
fs
>
–
隐
式型
变化:
ASSIGN <
var
> TO <
fs
> CASTING.
–
显式型变化:
ASSIGN <var> TO <fs> CASTING TYPE…
• 基本定义 语句– 如果指定为 Generic Type ,必须使用 TYPE ANY TABLE• 分配 语句– ASSIGN itab TO < f_s > .• 在读取时,需要使用动态指定方式读取字段– READ TABLE < f_s > INTO structure WITH KEY ( dobj ) = val1.– 明确指定 字段名会产生错误• 内表循环修改– LOOP 使用 ASSIGNING 语句,不需要使用 MODIFY 语句– 直接 修改存储在内存中的值,所以可以省略内表值复制到结构体再执行 MODIFY 的过程,提高性能• 目的– 创建列数不确定的内表• 步骤– 动态 内表的 创建。首先 要定义动态结构,然后再根据定义的动态结构利用系统一个标准的 method :” cl_alv_table_create => create_dynamic_table “ 生成动态内表 。• 可以使用 DO 循环, 动态指定字段– 动态 内表的 赋值。遍历 动态结构,获取指定的字段,然后给指定的字段赋值 。• 可以使用 LOOP 循环中的 AT 事件,将基本表中的数据分块赋值到动态表中动态内表的读取显示。与赋值相似,遍历动态结构,获取指定的字段,然后读取对应字段的值。或使用输出工具直接输出
*&---------------------------------------------------------------------*
*& Report ZJJ_TEST_08
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zjj_test_08.
TABLES:mara,zcus_incom.
DATA gt_order TYPE STANDARD TABLE OF mara.
DATA gt_fieldcat TYPE lvc_t_fcat.
DATA gs_fieldcat TYPE lvc_s_fcat.
DATA gv_pos TYPE int4.
DEFINE %%add_fieldcat.
CLEAR gs_fieldcat.
gv_pos = gv_pos + 1.
gs_fieldcat-col_pos = gv_pos.
gs_fieldcat-fieldname = &1.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-outputlen = 10.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
FIELD-SYMBOLS:<ft_vb> TYPE STANDARD TABLE,
<fs_vb> TYPE any,
<fv_field> TYPE any.
PARAMETERS:p_year TYPE zcus_incom-zyear.
SELECT-OPTIONS:s_month FOR zcus_incom-zmonth.
START-OF-SELECTION.
PERFORM get_data.
FORM get_data.
DATA lt_data TYPE STANDARD TABLE OF zcus_incom.
DATA ls_data1 TYPE zcus_incom.
DATA lv_cnt TYPE int4.
DATA lv_month TYPE zcus_incom-zmonth.
DATA lv_month1 TYPE int4 value 1.
DATA lv_monthstr TYPE char10.
DATA lv_fieldname TYPE string.
DATA: lt_newtable TYPE REF TO data,
ls_newline TYPE REF TO data.
SELECT * FROM zcus_incom INTO CORRESPONDING FIELDS OF TABLE @lt_data WHERE zmonth IN @s_month.
SORT lt_data BY company zyear zmonth.
READ TABLE s_month INTO DATA(ls_month) INDEX 1.
ls_month-high = COND #( WHEN ls_month-high IS INITIAL THEN 12 ELSE ls_month-high ).
ls_month-low = COND #( WHEN ls_month-low IS INITIAL THEN 12 ELSE 1 ).
lv_cnt = ls_month-high - ls_month-low + 1.
%%add_fieldcat 'COMPANY' '公司'.
%%add_fieldcat 'ZYEAR' '年份'.
DO 12 TIMES.
lv_month = sy-index.
IF lv_month IN s_month.
lv_monthstr = |{ lv_month1 }月|.
lv_fieldname = |MONTH_{ lv_month }|.
CONDENSE lv_fieldname NO-GAPS.
%%add_fieldcat lv_fieldname lv_monthstr.
ENDIF.
lv_month1 = lv_month1 + 1.
CLEAR:lv_fieldname,lv_monthstr.
ENDDO.
%%add_fieldcat 'WEARS' '货币单位'.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
* i_style_table =
it_fieldcatalog = gt_fieldcat
* i_length_in_byte =
IMPORTING
ep_table = lt_newtable
* e_style_fname =
EXCEPTIONS
generate_subpool_dir_full = 1
* others = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ASSIGN lt_newtable->* TO <ft_vb>.
CREATE DATA ls_newline LIKE LINE OF <ft_vb>.
ASSIGN ls_newline->* TO <fs_vb>.
" SORT lt_data BY zyear company.
LOOP AT lt_data INTO DATA(ls_data).
MOVE-CORRESPONDING ls_data TO ls_data1.
AT NEW company.
ASSIGN COMPONENT 'COMPANY' OF STRUCTURE <fs_vb> TO <fv_field>.
<fv_field> = ls_data1-company.
ASSIGN COMPONENT 'ZYEAR' OF STRUCTURE <fs_vb> TO <fv_field>.
<fv_field> = ls_data1-zyear.
ASSIGN COMPONENT 'WEARS' OF STRUCTURE <fs_vb> TO <fv_field>.
<fv_field> = ls_data1-wears.
ENDAT.
lv_fieldname = |MONTH_{ ls_data1-zmonth }|.
CONDENSE lv_fieldname NO-GAPS.
ASSIGN COMPONENT lv_fieldname OF STRUCTURE <fs_vb> TO <fv_field>.
<fv_field> = ls_data1-income.
AT END OF company.
APPEND <fs_vb> TO <ft_vb>.
ENDAT.
CLEAR :ls_data,ls_data1.
ENDLOOP.
IF <ft_vb> IS NOT INITIAL.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
i_callback_program = sy-repid
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT_LVC =
it_fieldcat_lvc = gt_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = <ft_vb>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDFORM.
执行效果如下:根据筛选项展示不同的月份数据