涉及到的知识点:
cl_gui_alv_grid--ALV控件
cl_gui_custom_container--gui容器
屏幕的创建以及调用
子程序的创建及调用
DYNP_VALUES_READ函数的调用及使用方法(从屏幕获取值)
按钮事件的调用
废话不多说,上代码
*&---------------------------------------------------------------------*
*& Report Z_ALV_TABLE_CONTROL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_alv_table_control.
DATA:gRId TYPE REF TO cl_gui_alv_gRId, "调用avl控件
g_custom_container TYPE REF TO cl_gui_custom_container,
gt_sflight TYPE TABLE OF sflight.
DATA:ok_code TYPE sy-ucomm,
save_code TYPE sy-ucomm.
DATA:carrid LIKE sflight-carrid,
connid TYPE n LENGTH 4, "这里尝试使用 connid like sflight-connid.无法查询 具体原因未知
fldate LIKE sflight-fldate,
price TYPE c LENGTH 10,
currency LIKE sflight-currency,
planetype LIKE sflight-planetype,
seatsmax TYPE c LENGTH 10,
seatsocc TYPE c LENGTH 10,
paymentsum TYPE c LENGTH 10.
DATA:gt_field TYPE TABLE OF dynpread,
gs_field TYPE dynpread.
DATA:gs_str TYPE c LENGTH 200,
gt_str LIKE TABLE OF gs_str.
CALL SCREEN 200.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF g_custom_container IS INITIAL.
CREATE OBJECT g_custom_container
EXPORTING
container_name = 'CCCONTAINER'. "实例化自定义容器控件
CREATE OBJECT gRId
EXPORTING
i_parent = g_custom_container. "实例化ALV GRID控件
ENDIF.
PERFORM get_input_data USING
carrid
connid
fldate
price
currency
planetype
seatsmax
seatsocc
paymentsum. "获取用户输入的值
PERFORM con_str_sql USING
carrid
connid
fldate
price
currency
planetype
seatsmax
seatsocc
paymentsum
CHANGING gs_str. "动态sql语句拼接
SELECT * FROM sflight INTO TABLE gt_sflight WHERE (gt_str).
CLEAR gt_str.
CALL METHOD grid->set_table_for_first_display "调用方法输出gt_sflight数据
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
it_outtab = gt_sflight.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code. "屏幕100的按钮事件调用
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'RETRUN'.
CALL SCREEN 200. "点击返回调用屏幕200
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code. "屏幕200的按钮事件调用
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'QUERY'.
CALL SCREEN 100. "点击查询调用屏幕100
WHEN OTHERS.
ENDCASE.
ENDMODULE.
FORM get_input_data USING carrid connid fldate price currency planetype seatsmax seatsocc paymentsum.
gs_field-fieldname = 'CARRID'. "获取屏幕上用户输入的值
APPEND gs_field TO gt_field.
gs_field-fieldname = 'CONNID'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'FLDATE'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'PRICE'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'CURRENCY'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'PLANETYPE'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'SEATSMAX'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'SEATSOCC'.
APPEND gs_field TO gt_field.
gs_field-fieldname = 'PAYMENTSUM'.
APPEND gs_field TO gt_field.
CALL FUNCTION 'DYNP_VALUES_READ' "调用函数dynp_values_read获取屏幕元素值
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
translate_to_upper = 'X'
TABLES
dynpfields = gt_field
EXCEPTIONS "异常
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc = 0.
* Implement suitable error handling here
LOOP AT gt_field INTO gs_field.
IF gs_field-fieldname = 'CARRID'.
carrid = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'CONNID'. "fieldname和fieldvalue可以理解为键值对
connid = gs_field-fieldvalue. "利用name获取value
ELSEIF gs_field-fieldname = 'FLDATE'.
fldate = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'PRICE'.
price = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'CURRENCY'.
currency = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'PLANETYPE'.
planetype = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'SEATSMAX'.
seatsmax = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'SEATSOCC'.
seatsocc = gs_field-fieldvalue.
ELSEIF gs_field-fieldname = 'PAYMENTSUM'.
paymentsum = gs_field-fieldvalue.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
FORM con_str_sql USING carrid connid fldate price currency planetype seatsmax seatsocc paymentsum CHANGING gs_str.
CLEAR: gt_str,gs_str.
gs_str = ' mandt = 100 '.
APPEND gs_str TO gt_str.
IF carrid IS NOT INITIAL.
CONCATENATE ' and carrid = ''' carrid '''' INTO gs_str.
APPEND gs_str TO gt_str.
ENDIF.
IF connid IS NOT INITIAL.
CONCATENATE ' and connid = ' connid INTO gs_str SEPARATED BY ' '.
APPEND gs_str TO gt_str.
ENDIF.
IF fldate IS NOT INITIAL.
CONCATENATE ' and fldate = ''' fldate '''' INTO gs_str.
APPEND gs_str TO gt_str.
ENDIF.
IF price IS NOT INITIAL.
CONCATENATE ' and price = ''' price '''' INTO gs_str SEPARATED BY ' '.
APPEND gs_str TO gt_str.
ENDIF.
IF currency IS NOT INITIAL.
CONCATENATE ' and currency = ''' currency '''' INTO gs_str.
APPEND gs_str TO gt_str.
ENDIF.
IF planetype IS NOT INITIAL.
CONCATENATE ' and planetype = ''' planetype '''' INTO gs_str.
APPEND gs_str TO gt_str.
ENDIF.
IF seatsmax IS NOT INITIAL.
CONCATENATE ' and seatsmax = ' seatsmax INTO gs_str SEPARATED BY ' '.
APPEND gs_str TO gt_str.
ENDIF.
IF seatsocc IS NOT INITIAL.
CONCATENATE ' and seatsocc = ' seatsocc INTO gs_str SEPARATED BY ' '.
APPEND gs_str TO gt_str.
ENDIF.
IF paymentsum IS NOT INITIAL.
CONCATENATE ' and paymentsum = ''' paymentsum '''' INTO gs_str SEPARATED BY ' '.
APPEND gs_str TO gt_str.
ENDIF.
ENDFORM.
对象导航器界面:
屏幕100的布局:
屏幕200的布局:
屏幕创建的过程就不画了,有需要评论区留言我再出个图文教程。
以上就是例子,运行效果如下:
结束。。。。。。