ABAP FPM
1.效果
2.查询条件的feed class
SE11创建feed class数据的结构
ZCL_FPM_FIFO_SEARCH
GET_DEFINITION方法代码
METHOD if_fpm_guibb_search~get_definition.
eo_field_catalog_attr ?= cl_abap_structdescr=>describe_by_name( 'ZSS_FIFO_DATA' ).
ENDMETHOD.
PROCESS_EVENT代码
METHOD if_fpm_guibb_search~process_event.
DATA: lo_fpm TYPE REF TO if_fpm,
lo_event_data TYPE REF TO cl_fpm_parameter.
CHECK io_event->mv_event_id = if_fpm_guibb_search=>fpm_execute_search. "查询事件
lo_fpm = cl_fpm_factory=>get_instance( ).
CREATE OBJECT lo_event_data.
lo_event_data->if_fpm_parameter~set_value(
EXPORTING
iv_key = 'SEL_TAB'
iv_value = it_fpm_search_criteria
).
lo_event_data->if_fpm_parameter~set_value(
EXPORTING
iv_key = 'MAX_NUM'
iv_value = iv_max_num_results
).
lo_fpm->raise_event_by_id(
EXPORTING
iv_event_id = if_fpm_guibb_list=>gc_event_list_filter
io_event_data = lo_event_data
).
ENDMETHOD.
3.列表输出结果的feed class
GET_DEFINITION代码
METHOD if_fpm_guibb_list~get_definition.
eo_field_catalog ?= cl_abap_tabledescr=>describe_by_name( 'ZTYT_FIFO_DATA' ).
ENDMETHOD.
PROCESS_EVENT代码
METHOD if_fpm_guibb_list~process_event.
DATA: lt_fpm_search_criteria TYPE fpmgb_t_search_criteria,
lv_max_num TYPE i,
rt_matnr TYPE range_t_matnr,
rs_matnr TYPE range_s_matnr,
ls_rsds TYPE rsdsselopt,
rt_charg TYPE ranges_charg_tt,
rs_charg TYPE range_charg_s,
ls_fifo TYPE zss_fifo_data,
lv1 TYPE i,
ls_chart TYPE zss_fifo_chart.
TYPES:BEGIN OF ty_reason,
sign TYPE ddsign,
option TYPE ddoption,
low TYPE zzreason,
high TYPE zzreason,
END OF ty_reason.
DATA: rt_reason TYPE TABLE OF ty_reason,
rs_reason TYPE ty_reason.
TYPES:BEGIN OF ty_year,
sign TYPE ddsign,
option TYPE ddoption,
low TYPE mjahr,
high TYPE mjahr,
END OF ty_year.
DATA: rt_year TYPE TABLE OF ty_year,
rs_year TYPE ty_year.
TYPES:BEGIN OF ty_month,
sign TYPE ddsign,
option TYPE ddoption,
low TYPE month,
high TYPE month,
END OF ty_month.
DATA: rt_month TYPE TABLE OF ty_month,
rs_month TYPE ty_month.
FIELD-SYMBOLS: <fs_params_search> TYPE fpmgb_s_search_criteria.
CASE io_event->mv_event_id.
WHEN if_fpm_guibb_list~gc_event_list_filter.
io_event->mo_event_data->get_value(
EXPORTING
iv_key = 'SEL_TAB'
IMPORTING
ev_value = lt_fpm_search_criteria
).
io_event->mo_event_data->get_value(
EXPORTING
iv_key = 'MAX_NUM'
IMPORTING
ev_value = lv_max_num
).
LOOP AT lt_fpm_search_criteria INTO DATA(ls_search_criteria).
CLEAR: ls_rsds,rs_matnr.
CASE ls_search_criteria-search_attribute.
WHEN 'MATNR'.
TRY.
cl_fpm_guibb_search_conversion=>to_abap_select_option(
EXPORTING
is_fpm_search_row = ls_search_criteria " GUIBB search: Search operator
RECEIVING
rs_abap_sel_option = ls_rsds " ABAP: Selection option (EQ/BT/CP/...)
).
MOVE-CORRESPONDING ls_rsds TO rs_matnr.
APPEND rs_matnr TO rt_matnr.
CATCH cx_fpmgb.
ENDTRY.
WHEN 'CHARG'.
TRY.
cl_fpm_guibb_search_conversion=>to_abap_select_option(
EXPORTING
is_fpm_search_row = ls_search_criteria " GUIBB search: Search operator
RECEIVING
rs_abap_sel_option = ls_rsds " ABAP: Selection option (EQ/BT/CP/...)
).
MOVE-CORRESPONDING ls_rsds TO rs_charg.
APPEND rs_charg TO rt_charg.
CATCH cx_fpmgb.
ENDTRY.
WHEN 'REASON'.
TRY.
cl_fpm_guibb_search_conversion=>to_abap_select_option(
EXPORTING
is_fpm_search_row = ls_search_criteria " GUIBB search: Search operator
RECEIVING
rs_abap_sel_option = ls_rsds " ABAP: Selection option (EQ/BT/CP/...)
).
MOVE-CORRESPONDING ls_rsds TO rs_reason.
APPEND rs_reason TO rt_reason.
CATCH cx_fpmgb.
ENDTRY.
WHEN 'YEAR'.
TRY.
cl_fpm_guibb_search_conversion=>to_abap_select_option(
EXPORTING
is_fpm_search_row = ls_search_criteria " GUIBB search: Search operator
RECEIVING
rs_abap_sel_option = ls_rsds " ABAP: Selection option (EQ/BT/CP/...)
).
MOVE-CORRESPONDING ls_rsds TO rs_year.
APPEND ls_rsds TO rt_year.
CATCH cx_fpmgb.
ENDTRY.
WHEN 'MONTH'.
TRY.
cl_fpm_guibb_search_conversion=>to_abap_select_option(
EXPORTING
is_fpm_search_row = ls_search_criteria " GUIBB search: Search operator
RECEIVING
rs_abap_sel_option = ls_rsds " ABAP: Selection option (EQ/BT/CP/...)
).
MOVE-CORRESPONDING ls_rsds TO rs_month.
APPEND rs_month TO rt_month.
CATCH cx_fpmgb.
ENDTRY.
ENDCASE.
ENDLOOP.
ENDCASE.
CLEAR: gt_fifo,zcl_fpm_fifo_chart=>gt_fifo.
SELECT a~matnr,b~maktx,a~charg,SUM( a~menge ) AS quantity,
substring( budat_mkpf,1,4 ) AS year,
substring( budat_mkpf,5,2 ) AS month,
c~zzreason_text AS reason
FROM mseg AS a
LEFT JOIN makt AS b
ON a~matnr = b~matnr
INNER JOIN zmmt0008 AS c
ON a~zzreason = c~zzreason
WHERE werks = '1300'
AND a~zzreason <> ''
AND a~matnr IN @rt_matnr
AND a~charg IN @rt_charg
AND a~zzreason IN @rt_reason
AND b~spras = @sy-langu
GROUP BY a~matnr,b~maktx,a~charg,budat_mkpf,c~zzreason_text
INTO TABLE @DATA(lt_temp).
LOOP AT lt_temp INTO DATA(ls_temp).
MOVE-CORRESPONDING ls_temp TO ls_fifo.
COLLECT ls_fifo INTO gt_fifo.
CLEAR: ls_temp,ls_fifo.
ENDLOOP.
CHECK lv_max_num IS NOT INITIAL.
LOOP AT gt_fifo INTO ls_fifo.
lv1 = lv1 + 1.
MOVE-CORRESPONDING ls_fifo TO ls_chart.
COLLECT ls_chart INTO zcl_fpm_fifo_chart=>gt_fifo.
CLEAR: ls_chart.
IF lv1 > lv_max_num.
DELETE gt_fifo.
CONTINUE.
ENDIF.
ENDLOOP.
ENDMETHOD.
GET_DATA代码
METHOD if_fpm_guibb_list~get_data.
IF iv_eventid->mv_event_id = if_fpm_guibb_list~gc_event_list_filter.
ct_data = gt_fifo.
ev_data_changed = abap_true.
ENDIF.
ENDMETHOD.
4.图表CHART分析 feed class
SE11创建CHART的数据结构
因为时间有限,这里偷懒,直接用class的静态属性在多个组件之间共享数据,有更标准的做法
后续有时间再写blog演示
GET_DEFINITION代码
METHOD if_fpm_guibb_chart~get_definition.
DATA lo_field_catalog TYPE REF TO cl_abap_tabledescr.
lo_field_catalog ?= cl_abap_tabledescr=>describe_by_name( 'ZTYT_FIFO_CHART' ).
io_chart_model->get_table_model( )->set_definition(
EXPORTING
io_field_catalog = lo_field_catalog " Runtime Type Services
).
ENDMETHOD.
GET_DATA代码
METHOD if_fpm_guibb_chart~get_data.
IF io_event->mv_event_id = if_fpm_guibb_list=>gc_event_list_filter.
io_chart_data->get_table_model( )->set_data(
EXPORTING
it_data = gt_fifo
).
ENDIF.
ENDMETHOD.
5.事务码FPM_WB创建组件配置
由于我之前已经创建过了,截图都是编辑状态的,和新建略有差异
5.1 创建查询组件的配置
输入步骤2的feed class
添加搜索条件
5.2 创建列表组件的配置
输入步骤3创建的feed class
添加列
5.3 创建图表组件的配置
输入步骤4创建的feed class
图表类型选条形图
5.4 创建OVP概览页面组件配置
通过FPM_OVP_COMPONENT概览页面组件把查询,列表,CHART等组件UIBB BLOCK组合到一个页面
6.创建应用程序配置
点击test fpm应用程序效果