ALV列(Column)换到行(Row) 之 列上限不固定篇
有时我们的ALV列数难以确定,如果采用列数上限固定的话,可能会很多(此时不能正确全部),或者很少(此时平白无故运行时多占用内存),所以比较好的方法是,使用Method
先看效果:
如果选中下方ALV的蓝色部分字段,按下屏幕上的Change按钮后(假设选中了Document Type列):
发现上图中,行和列已经产生了变化。如果选择Company Code和Fiscal Year的话,也是可以互换行列的。
=>也许有人觉得这个功能没啥用,但实际现在很火的BI,就是提供了各种维度(Dimension)的数据统计,使传统的report受到了巨大的冲击。当然,我这里做的这样的一个小功能,还是和BI的强大功能相去甚远的,但是如果正好有类似的需求,又没有上BI,那倒也不失为一种退而求其次的方法
具体实现代码如下:
*&---------------------------------------------------------------------*
*& Report ZWHUR9000
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zwhur9001.
TYPES: BEGIN OF typ_strc1,
bukrs TYPE bukrs,
hkont TYPE hkont,
gjahr TYPE gjahr,
blart TYPE blart,
total TYPE tslvt12,
END OF typ_strc1,
BEGIN OF typ_hkont,
hkont TYPE hkont,
END OF typ_hkont.
************************************************************************
* DATA DEFINATION
************************************************************************
DATA: itab_strc1 TYPE STANDARD TABLE OF typ_strc1,
itab_hkont TYPE STANDARD TABLE OF typ_hkont,
wa_strc1 TYPE typ_strc1.
DATA: gc_container1 TYPE REF TO cl_gui_custom_container, "Container1
gc_container2 TYPE REF TO cl_gui_custom_container, "Container2
gc_grid1 TYPE REF TO cl_gui_alv_grid, "ALV Object1
gc_grid2 TYPE REF TO cl_gui_alv_grid. "ALV Object2
DATA: itab_fcat1 TYPE lvc_t_fcat,
itab_fcat2 TYPE lvc_t_fcat,
wa_fcat TYPE lvc_s_fcat.
FIELD-SYMBOLS:
<fs_itab> TYPE STANDARD TABLE,
<fs_wa> TYPE ANY,
<fs_itab_field> TYPE STANDARD TABLE,
<fs_wa_field> TYPE ANY.
************************************************************************
* SELECTION SCREEN
************************************************************************
SELECT-OPTIONS: s_hkont FOR wa_strc1-hkont NO INTERVALS OBLIGATORY.
************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
PERFORM frm_get_bsis.
PERFORM frm_create_dyn_table.
PERFORM frm_cal_result.
CALL SCREEN 1001.
*&---------------------------------------------------------------------*
*& Form FRM_GET_BSIS
*&---------------------------------------------------------------------*
* select data for test
*----------------------------------------------------------------------*
FORM frm_get_bsis .
DATA: l_wa_hkont TYPE typ_hkont.
SELECT bukrs
hkont
gjahr
blart
dmbtr
FROM bsis
INTO TABLE itab_strc1
WHERE hkont IN s_hkont.
IF sy-subrc <> 0.
MESSAGE 'No data found!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ELSE.
SORT itab_strc1 BY bukrs
gjahr
blart
hkont.
ENDIF.
CLEAR wa_strc1.
LOOP AT itab_strc1 INTO wa_strc1.
READ TABLE itab_hkont TRANSPORTING NO FIELDS WITH KEY hkont = wa_strc1-hkont.
IF sy-subrc <> 0.
l_wa_hkont-hkont = wa_strc1-hkont.
APPEND l_wa_hkont TO itab_hkont.
ENDIF.
CLEAR wa_strc1.
ENDLOOP.
ENDFORM. " FRM_GET_BSIS
*&---------------------------------------------------------------------*
*& Form FRM_CAL_RESULT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_cal_result .
FIELD-SYMBOLS:<fs_item> TYPE ANY.
DATA: l_wrk_idx TYPE i.
*
CLEAR wa_strc1.
LOOP AT itab_strc1 INTO wa_strc1.
ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <fs_wa> TO <fs_item>.
IF sy-subrc = 0.
<fs_item> = wa_strc1-bukrs.
ENDIF.
ASSIGN COMPONENT 'GJAHR' OF STRUCTURE <fs_wa> TO <fs_item>.
IF sy-subrc = 0.
<fs_item> = wa_strc1-gjahr.
ENDIF.
ASSIGN COMPONENT 'BLART' OF STRUCTURE <fs_wa> TO <fs_item>.
IF sy-subrc = 0.
<fs_item> = wa_strc1-blart.
ENDIF.
* calculate out total for every G/L
READ TABLE itab_hkont TRANSPORTING NO FIELDS WITH KEY hkont = wa_strc1-hkont.
l_wrk_idx = sy-tabix + 3.
ASSIGN COMPONENT l_wrk_idx OF STRUCTURE <fs_wa> TO <fs_item>.
IF sy-subrc = 0.
<fs_item> = wa_strc1-total.
ENDIF.
ASSIGN COMPONENT 'TOTAL' OF STRUCTURE <fs_wa> TO <fs_item>.
IF sy-subrc = 0.
<fs_item> = wa_strc1-total.
ENDIF.
* Sum
COLLECT <fs_wa> INTO <fs_itab>.
CLEAR:<fs_wa>,
wa_strc1.
ENDLOOP.
ENDFORM. " FRM_CAL_RESULT
*&---------------------------------------------------------------------*
*& Module STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
* Status
*----------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
SET PF-STATUS 'PF_1001'.
SET TITLEBAR 'TTL_1001'.
ENDMODULE. " STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT_COMMAND INPUT
*&---------------------------------------------------------------------*
* Exit Command
*----------------------------------------------------------------------*
MODULE exit_command INPUT.
LEAVE TO SCREEN 0.
ENDMODULE. " EXIT_COMMAND INPUT
*&---------------------------------------------------------------------*
*& Module DATA_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
* data output
*----------------------------------------------------------------------*
MODULE data_display OUTPUT.
PERFORM frm_dis_alv1.
PERFORM frm_dis_alv2.
ENDMODULE. " DATA_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
*& Form FRM_SET_FCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FNAME Field name
* -->P_TEXT_M Middle text
* -->P_TEXT_L Long text
* -->P_IS_KEY flag:X=key
* -->P_LENGTH output length
*----------------------------------------------------------------------*
FORM frm_set_fcat USING p_fname TYPE c
p_text_m TYPE c
p_text_l TYPE c
p_is_key TYPE c
p_length TYPE n
CHANGING it_fcat TYPE lvc_t_fcat.
CLEAR wa_fcat.
wa_fcat-fieldname = p_fname.
wa_fcat-scrtext_m = p_text_m.
wa_fcat-scrtext_l = p_text_l.
wa_fcat-key = p_is_key.
wa_fcat-outputlen = p_length.
APPEND wa_fcat TO it_fcat.
ENDFORM. " FRM_SET_FCAT
*&---------------------------------------------------------------------*
*& Form FRM_DIS_ALV1
*&---------------------------------------------------------------------*
* Grid1 output
*----------------------------------------------------------------------*
FORM frm_dis_alv1 .
DATA: l_itab_sort TYPE lvc_t_sort,
l_wa_sort TYPE lvc_s_sort.
l_wa_sort-fieldname = 'BUKRS'.
l_wa_sort-up = 'X'.
APPEND l_wa_sort TO l_itab_sort.
l_wa_sort-fieldname = 'GJAHR'.
l_wa_sort-up = 'X'.
APPEND l_wa_sort TO l_itab_sort.
l_wa_sort-fieldname = 'BLART'.
l_wa_sort-up = 'X'.
APPEND l_wa_sort TO l_itab_sort.
l_wa_sort-fieldname = 'HKONT'.
l_wa_sort-up = 'X'.
APPEND l_wa_sort TO l_itab_sort.
*
IF gc_container1 IS INITIAL.
PERFORM frm_set_fcat USING 'BUKRS'
'Comp.Cd'
'Company Code'
'X'
'4'
CHANGING itab_fcat1.
PERFORM frm_set_fcat USING 'GJAHR'
'Fis.Y'
'Fiscal Year'
'X'
'4'
CHANGING itab_fcat1.
PERFORM frm_set_fcat USING 'BLART'
'Doc.T'
'Document Type'
'X'
'4'
CHANGING itab_fcat1.
PERFORM frm_set_fcat USING 'HKONT'
'GL'
'G/L Account'
'X'
'10'
CHANGING itab_fcat1.
PERFORM frm_set_fcat USING 'TOTAL'
'Total'
'Total Amount'
''
'12'
CHANGING itab_fcat1.
CREATE OBJECT gc_container1
EXPORTING
container_name = 'CUS_CTL1'.
CREATE OBJECT gc_grid1
EXPORTING
i_parent = gc_container1.
CALL METHOD gc_grid1->set_table_for_first_display
* EXPORTING
* i_buffer_active =
* i_bypassing_buffer =
* i_consistency_check =
* i_structure_name =
* is_variant =
* i_save =
* i_default = 'X'
* is_layout =
* is_print =
* it_special_groups =
* it_toolbar_excluding =
* it_hyperlink =
* it_alv_graphics =
* it_except_qinfo =
* ir_salv_adapter =
CHANGING
it_outtab = itab_strc1
it_fieldcatalog = itab_fcat1
it_sort = l_itab_sort.
ELSE.
CALL METHOD gc_grid1->refresh_table_display.
ENDIF.
ENDFORM. " FRM_DIS_ALV1
*&---------------------------------------------------------------------*
*& Form FRM_DIS_ALV2
*&---------------------------------------------------------------------*
* Grid2 output
*----------------------------------------------------------------------*
FORM frm_dis_alv2 .
IF gc_container2 IS INITIAL.
CREATE OBJECT gc_container2
EXPORTING
container_name = 'CUS_CTL2'.
CREATE OBJECT gc_grid2
EXPORTING
i_parent = gc_container2.
ENDIF.
CALL METHOD gc_grid2->set_table_for_first_display
* EXPORTING
* i_buffer_active =
* i_bypassing_buffer =
* i_consistency_check =
* i_structure_name =
* is_variant =
* i_save =
* i_default = 'X'
* is_layout =
* is_print =
* it_special_groups =
* it_toolbar_excluding = l_itab_excl
* it_hyperlink =
* it_alv_graphics =
* it_except_qinfo =
* ir_salv_adapter =
CHANGING
it_outtab = <fs_itab>
it_fieldcatalog = itab_fcat2.
ENDFORM. " FRM_DIS_ALV2
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DYN_TABLE
*&---------------------------------------------------------------------*
* Create Dynamic Internal Table
*----------------------------------------------------------------------*
FORM frm_create_dyn_table .
DATA: l_wa_hkont TYPE typ_hkont,
l_idx(2) TYPE n,
l_fname(10) TYPE c.
DATA: l_itab_data TYPE REF TO data,
l_wa_data TYPE REF TO data.
* Company Code
PERFORM frm_set_fcat USING 'BUKRS'
'Comp.Cd'
'Company Code'
'X'
'4'
CHANGING itab_fcat2.
* Fiscal Year
PERFORM frm_set_fcat USING 'GJAHR'
'Fis.Y'
'Fiscal Year'
'X'
'4'
CHANGING itab_fcat2.
* Document Type
PERFORM frm_set_fcat USING 'BLART'
'Doc.T'
'Document Type'
'X'
'4'
CHANGING itab_fcat2.
* field cat for every G/L
LOOP AT itab_hkont INTO l_wa_hkont.
l_idx = sy-tabix.
CONCATENATE 'HKONT'
l_idx
INTO l_fname.
CLEAR wa_fcat.
wa_fcat-fieldname = l_fname.
wa_fcat-scrtext_m = l_wa_hkont-hkont.
wa_fcat-scrtext_l = l_wa_hkont-hkont.
wa_fcat-key = space.
wa_fcat-outputlen = 10.
****IMPORTANT********************************************
wa_fcat-ref_field = 'DMBTR'. "
wa_fcat-ref_table = 'BSIS'. "
*********************************************************
APPEND wa_fcat TO itab_fcat2.
ENDLOOP.
* Total
CLEAR wa_fcat.
wa_fcat-fieldname = 'TOTAL'.
wa_fcat-scrtext_m = 'Total'.
wa_fcat-scrtext_l = 'Total Amount'.
wa_fcat-key = space.
wa_fcat-outputlen = 12.
****IMPORTANT********************************************
wa_fcat-ref_field = 'DMBTR'. "
wa_fcat-ref_table = 'BSIS'. "
*********************************************************
APPEND wa_fcat TO itab_fcat2.
* itab creation
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = itab_fcat2
IMPORTING
ep_table = l_itab_data
EXCEPTIONS
generate_subpool_dir_full = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE 'Create Table failed!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ELSE.
ASSIGN l_itab_data->* TO <fs_itab>.
CREATE DATA l_wa_data LIKE LINE OF <fs_itab>.
ASSIGN l_wa_data->* TO <fs_wa>.
ENDIF.
ENDFORM. " FRM_CREATE_DYN_TABLE
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1001 INPUT
*&---------------------------------------------------------------------*
* User Command
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
CASE sy-ucomm.
WHEN 'CHG'.
PERFORM frm_row_column.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_1001 INPUT
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_ITAB_BY_FIELDNAME
*&---------------------------------------------------------------------*
* Create Dynamic Itab
*----------------------------------------------------------------------*
* -->iv_fieldname text
*----------------------------------------------------------------------*
FORM frm_create_itab_by_fieldname USING value(iv_fieldname) TYPE c.
DATA: l_itab_fcat TYPE lvc_t_fcat,
l_wa_fcat TYPE lvc_s_fcat.
DATA: l_itab_any TYPE REF TO data,
l_wa_any TYPE REF TO data.
FIELD-SYMBOLS:
<fs_item1> TYPE ANY,
<fs_item2> TYPE ANY,
<fs_fcat> TYPE lvc_s_fcat.
CLEAR l_wa_fcat.
l_wa_fcat-fieldname = iv_fieldname.
l_wa_fcat-ref_field = iv_fieldname.
l_wa_fcat-ref_table = 'BSIS'.
APPEND l_wa_fcat TO l_itab_fcat.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = l_itab_fcat
IMPORTING
ep_table = l_itab_any.
ASSIGN l_itab_any->* TO <fs_itab_field>.
CREATE DATA l_wa_any LIKE LINE OF <fs_itab_field>.
ASSIGN l_wa_any->* TO <fs_wa_field>.
* fieldcat setting for the second ALV
REFRESH: itab_fcat2.
itab_fcat2 = itab_fcat1.
* delete from fieldcat if the column was selected
READ TABLE itab_fcat1 TRANSPORTING NO FIELDS WITH KEY fieldname = iv_fieldname.
DELETE itab_fcat2 INDEX sy-tabix.
* get all items for selected columns
LOOP AT itab_strc1 INTO wa_strc1.
ASSIGN COMPONENT iv_fieldname OF STRUCTURE wa_strc1 TO <fs_item1>.
ASSIGN COMPONENT iv_fieldname OF STRUCTURE <fs_wa_field> TO <fs_item2>.
<fs_item2> = <fs_item1>.
COLLECT <fs_wa_field> INTO <fs_itab_field>.
CLEAR <fs_wa_field>.
ENDLOOP.
LOOP AT <fs_itab_field> ASSIGNING <fs_wa_field>.
* add fieldcat for selected row => column
CLEAR wa_fcat.
wa_fcat-fieldname = <fs_wa_field>.
wa_fcat-scrtext_m = <fs_wa_field>.
wa_fcat-scrtext_l = <fs_wa_field>.
wa_fcat-key = space.
wa_fcat-outputlen = 12.
APPEND wa_fcat TO itab_fcat2.
ENDLOOP.
* set TOTAL as last column
CLEAR wa_fcat.
READ TABLE itab_fcat2 INTO wa_fcat WITH KEY fieldname = 'TOTAL'.
DELETE itab_fcat2 WHERE fieldname = 'TOTAL'.
APPEND wa_fcat TO itab_fcat2.
l_itab_fcat = itab_fcat2.
LOOP AT l_itab_fcat ASSIGNING <fs_fcat> FROM 4.
<fs_fcat>-ref_table = 'BSIS'.
<fs_fcat>-ref_field = 'DMBTR'.
ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = l_itab_fcat
IMPORTING
ep_table = l_itab_any.
ASSIGN l_itab_any->* TO <fs_itab>.
CREATE DATA l_wa_any LIKE LINE OF <fs_itab>.
ASSIGN l_wa_any->* TO <fs_wa>.
ENDFORM. " FRM_CREATE_ITAB_BY_FIELDNAME
*&---------------------------------------------------------------------*
*& Form FRM_DATA_SET
*&---------------------------------------------------------------------*
* set content for new Dynamic table
*----------------------------------------------------------------------*
* -->iv_fieldname text
*----------------------------------------------------------------------*
FORM frm_data_set USING value(iv_fieldname) TYPE c.
FIELD-SYMBOLS: <l_fs01> TYPE ANY,
<l_fs_value> TYPE ANY.
DATA: l_wrk_idx TYPE i.
LOOP AT itab_strc1 INTO wa_strc1.
* get value for selected column
ASSIGN COMPONENT iv_fieldname OF STRUCTURE wa_strc1 TO <l_fs01>.
MOVE-CORRESPONDING wa_strc1 TO <fs_wa>.
* get the index in result table
READ TABLE <fs_itab_field> WITH KEY (iv_fieldname) = <l_fs01> TRANSPORTING NO FIELDS.
l_wrk_idx = sy-tabix + 3.
ASSIGN COMPONENT l_wrk_idx OF STRUCTURE <fs_wa> TO <l_fs_value>.
<l_fs_value> = wa_strc1-total.
ASSIGN COMPONENT 'TOTAL' OF STRUCTURE <fs_wa> TO <l_fs_value>.
<l_fs_value> = wa_strc1-total.
COLLECT <fs_wa> INTO <fs_itab>.
CLEAR: <fs_wa>,
wa_strc1.
ENDLOOP.
ENDFORM. " FRM_DATA_SET
*&---------------------------------------------------------------------*
*& Form FRM_ROW_COLUMN
*&---------------------------------------------------------------------*
* Row to Column
*----------------------------------------------------------------------*
FORM frm_row_column .
DATA: l_itab_selected TYPE lvc_t_col,
l_wa_selected TYPE lvc_s_col.
CALL METHOD gc_grid2->get_selected_columns
IMPORTING
et_index_columns = l_itab_selected.
* check columns be selected
DESCRIBE TABLE l_itab_selected.
IF sy-tfill >= 2
OR sy-tfill = 0.
MESSAGE 'Please select 1 column!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE SCREEN.
ENDIF.
READ TABLE l_itab_selected INTO l_wa_selected INDEX 1.
IF l_wa_selected-fieldname <> 'BUKRS'
AND l_wa_selected-fieldname <> 'GJAHR'
AND l_wa_selected-fieldname <> 'BLART'
AND l_wa_selected-fieldname <> 'HKONT'.
MESSAGE 'Please select a key column in ALV!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE SCREEN.
ENDIF.
"FIELDNAME
PERFORM frm_create_itab_by_fieldname USING l_wa_selected-fieldname.
"set value into <fs_itab>
PERFORM frm_data_set USING l_wa_selected-fieldname.
ENDFORM. " FRM_ROW_COLUMN
ALV列(Column)换到行(Row) 之 列上限不固定篇相关推荐
- oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名
前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...
- SQL Server 行转列,列转行。多行转成一列
一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...
- python怎么选取第几行第几列_python DataFrame获取行数、列数、索引及第几行第几列的值方法...
python DataFrame获取行数.列数.索引及第几行第几列的值方法 更新时间:2018年04月08日 16:22:00 作者:小白九九 下面小编就为大家分享一篇python DataFrame ...
- ALV中动态内表+行转化为列
转换为: REPORT z_barry_test_fieldsymols . TYPE-POOLS: slis. TABLES: mseg,mkpf. DATA: gd_fieldcat TYPE s ...
- vue element-ui自定义表头,动态添加表头,新增行、新增列、删除行、删除列
vue element-ui表格怎样自定义表头,动态添加表头,新增行.新增列.删除行.删除列 需求描述 1.自定义表头,表头里插入输入框 2.默认初始化几行几列占位 3.新增行 4.新增列 5.右键点 ...
- bootstraptable列宽自适应内容_多列列表框行高和列宽的自适应调整
LabVIEW:2015 在使用多列列表框(Multicolumn Listbox)时,有时不同列显示的内容长度不一致,为了显示更加美观,并节省界面显示空间,需要实现多列列表框的行高和列宽的自适应调整 ...
- excel2010设置列宽为像素_Excel2010中调整行高和列宽的方法
Excel2010的默认情况下,Excel中所有行的高度和所有列的宽度都是相等的.可以利用鼠标拖动方式和"格式"列表中的命令来调整Excel的行高和列宽. 1.鼠标拖动法 在对行高 ...
- 行存储和列存储小介绍
.定义 1.1定义 Sybase在2004年左右就推出了列存储的Sybase IQ数据库系统,主要用于在线分析.数据挖掘等查询密集型应用.列存储,缩写为DSM,相对于NSM(N-ary storage ...
- Microsoft Excel 单元格行高和列宽
Microsoft Excel 单元格行高和列宽 格式 -> 自动调整行高 自动调整列宽 References https://yongqiang.blog.csdn.net/
最新文章
- 提高网站访问性能——Tomcat优化
- zerodivisionerror什么意思python-python里的raise是什么意思
- 公司内部图书管理界面原型设计图
- 彻底弄懂dalvik字节码【一】
- ktor框架用到了netty吗_如何使用 Ktor 快速开发 Web 项目
- 牛津、剑桥、OpenAI联合发出AI预警《人工智能的恶意使用》
- -[UIView hitTest:withEvent:] 方法总结
- tar打包/解包用法
- css美化浏览器默认滚动条样式
- 数据人必会的Excel|掌握32个Excel小技巧,成为效率达人(一)
- 如何设置ddns动态域名服务实现外网访问
- Windows 2003 Server报 由于这台计算机没有远程桌面客户端访问许可证
- ssm智慧养老服务平台毕业设计-附源码211709
- tar 慢 加快_加快慢的Outlook 2007
- 实时时间(24小时制)
- 记一次 idea 配置scala 和运行 IDEA 错误: 找不到或无法加载主类
- sql注入基础原理(SQL injection)
- Learning to Compare Image Patches via Convolutional Neural Networks
- SpringCloud无法获取Nacos中的配置文件信息
- 【附源码】计算机毕业设计JAVA罪犯信息管理系统