当前位置:网站首页>SAP ABAP ALV+SMARTFORS 表分页 报表打印程序
SAP ABAP ALV+SMARTFORS 表分页 报表打印程序
2022-08-01 07:39:00 【雨天行舟】
选中 ALV屏幕支持选中、全选或取消全选交货单行项目
打印预览: ALV屏幕:选中交货单行项目,点击打印预览,按打印样式输出交货单打印预览样式
打印 ALV屏幕选中交货单行项目,点击打印,调用打印机,按打印样式输出交货单
大致需求就是:在alv中选中数据然后做出打印.
该程序分:
1.结构定义
2.逻辑取数
3.数据alv显示
4.根据alv选中的数据对应的打印数据
5.调用smartforms
6.输出.
取数alv展示这一块就不再说了.就很简单的.
主要讲解一下smartforms中的一些参数作用.
*smartforms调用
DATA:
*这个参数主要是为了控制结构的.
ls_control TYPE ssfctrlop,
*在传输过程中所做的选项
ls_output TYPE ssfcompop,
*表格在打印开始时返回的值
ls_jobout TYPE ssfcresop,
*这个参数主要是为了动态获取smartforms所调用的程序
gv_fm_name TYPE rs38l_fnam.
在打印smartforms一般会用到四件套
FORM frm_print_data .
DATA: ls_control TYPE ssfctrlop,
ls_output TYPE ssfcompop,
ls_jobout TYPE ssfcresop,
gv_fm_name TYPE rs38l_fnam.
DATA:ls_return TYPE ssfcrescl. "打印返回值 * ls_output-tddest = 'LP01'."为弹出的窗口设置默认的打印设备
ls_output-tdiexit = 'X'. "立刻退出迟于打印预览中的打印/传真 ls_output-tdimmed = 'X'."立即假脱机
ls_output-tddelete = 'X'."立即假脱机删除 ls_output-tdnoprev = ''."无打印预览,给null的话就是打印预览,给X才是无
ls_control-preview = 'X'. " 打印预览 ls_control-no_dialog = ' '."这个三个都是通用的标识符,见名知意
ls_control-no_open = 'X'.
ls_control-no_close = 'X'.
CALL FUNCTION 'SSF_OPEN'
EXPORTING
user_settings = '' "默认是为X的,复选框 output_options = ls_output control_parameters = ls_control IMPORTING job_output_options = ls_jobout EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = 'ZFIFM002' " 所创建smartforms的名称
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
fm_name = gv_fm_name "输出名称 EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. *因为执行smartforms所要使用的函数模块的名称是系统自定的给出的,如:/1BCDWB/SF00000002 主要是为了防止以后在维护smartforms是会自动更改该函数模块名称,因此尽量自定义一下. :如:图一 *把那个名字改一下换成你自己的就可以了 CALL FUNCTION gv_fm_name EXPORTING * ARCHIVE_INDEX = * ARCHIVE_INDEX_TAB = * ARCHIVE_PARAMETERS = control_parameters = ls_control * MAIL_APPL_OBJ = * MAIL_RECIPIENT = * MAIL_SENDER = output_options = ls_output user_settings = '' * IMPORTING * DOCUMENT_OUTPUT_INFO = * JOB_OUTPUT_INFO = * job_output_options = sf_job_output_options TABLES gt_sf = gt_sf "行
gt_head = gt_sf2 "头
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
CLEAR: gt_sf,gt_sf2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SSF_CLOSE'
* IMPORTING
* job_output_info = ls_return
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
图一
对smartforms的调用就这些,接下来看看smartforms是如何做的.
输入:tcodesmartforms
全局设置
1.表格属性
在表格属性当中一般在输出选项中页格式会用的比较多一点,根据业务需求可能要打印的格式会有所不同,在这可以自定义设置.页格式如何自定义:参考该链接
2.表格属性
这里的导入/导出/表/例外的操作你完全可以按照函数模块的方式经行处理,
因为在这定义的参数实际上都是给到系统自动生成的那个函数模块当中去了.
表:这里面的参数是只可以使用表类型结构的参数,可以se11
中去定义然后在定义一个结构
但是要在表类型中行类型添加一个结构
3.全局定义
全局数据:他的意义是为了接收表接口传来的数据
货币/数量字段:这个可以参考这个
页和窗口
同一页中只能有一个主窗口
1.窗口
有四种窗口,常用的就是主次窗口
输出选项:在这里设置的就是这个窗口的总的长和宽,在该窗口下的模板和表不能超过它.
依照我这个smartforms结构
我这里是给抬头行和行数据都做了分页.(根据发货单号打印数据,一个发货单号对应诺干个行项目)
这里的第一层循环是抬头
第二次循环的表
控制分页
以下代码仅供个人参考.
*&---------------------------------------------------------------------*
*& Report ZSDR0002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsdr0001 MESSAGE-ID z_sd_01.
TYPES: BEGIN OF gty_alv,"原型字段 erdat TYPE likp-erdat, vbeln TYPE lips-vbeln, zzdr TYPE c LENGTH 12, posnr TYPE lips-posnr, werks TYPE lips-werks, kunnr TYPE likp-kunnr, name1 TYPE kna1-name1, matnr TYPE lips-matnr, arktx TYPE lips-arktx, lfimg TYPE lips-lfimg, vrkme TYPE lips-vrkme, charg TYPE lips-charg, lgmng TYPE lips-lgmng, meins TYPE lips-meins, zdycs TYPE i, sel TYPE c LENGTH 1, END OF gty_alv. DATA: gt_print TYPE TABLE OF gty_alv, gs_print TYPE gty_alv. *行 DATA: gt_sf TYPE TABLE OF zssd0008, gs_sf TYPE zssd0008. *头 DATA : gt_sf2 TYPE TABLE OF zssd0011, gs_sf2 TYPE zssd0011. *" ALV 显示
DATA: gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat.
**smartforms调用
*DATA: gv_fm_name TYPE rs38l_fnam . "函数名 *DATA : sf_output_options TYPE ssfcompop. *DATA : sf_control_parameters TYPE ssfctrlop. *DATA : sf_job_output_options TYPE ssfcresop. DATA legth TYPE i. "宏定义
DEFINE m_fcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1. "字段 gs_fieldcat-scrtext_l = &2. "字段描述
"gs_fieldcat-checkbox = &3 . "是否复选框
APPEND gs_fieldcat TO gt_fieldcat .
END-OF-DEFINITION.
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_erdat FOR gs_print-erdat NO-EXTENSION ,"凭证日期 s_vbeln FOR gs_print-vbeln NO-EXTENSION. " 交货订单号
PARAMETERS p_zzdr LIKE gs_print-zzdr . "制单人 SELECTION-SCREEN SKIP 2 . "空2行
PARAMETERS r_floor RADIOBUTTON GROUP gp1 . "地板业务 PARAMETERS r_home RADIOBUTTON GROUP gp1 . "家居业务
SELECTION-SCREEN END OF BLOCK bk1.
INITIALIZATION.
START-OF-SELECTION.
IF r_floor = 'X'.
PERFORM frm_get_data."获取数据 ELSEIF r_home = 'X'. MESSAGE '家居业务暂时不可打印,谢谢' TYPE 'W'. EXIT. ENDIF. END-OF-SELECTION. * 显示数据 IF gt_print[] IS NOT INITIAL. PERFORM frm_show_data. ELSE. MESSAGE '未查询到数据,请检查输入!' TYPE 'S' DISPLAY LIKE 'E'. ENDIF. *&---------------------------------------------------------------------* *& Form frm_get_data *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . SELECT lips~matnr lips~arktx lips~lfimg lips~vrkme lips~charg lips~lgmng lips~meins lips~vbeln lips~posnr lips~werks likp~erdat likp~kunnr kna1~name1 FROM likp INNER JOIN lips ON likp~vbeln = lips~vbeln INNER JOIN kna1 ON kna1~kunnr = likp~kunnr INTO CORRESPONDING FIELDS OF TABLE gt_print WHERE likp~erdat IN s_erdat OR lips~vbeln IN s_vbeln. IF sy-subrc <> 0. MESSAGE e000 DISPLAY LIKE 'E'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form frm_show_data *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_show_data . " 显示数据
PERFORM frm_init_layout. " 设置输出屏幕的ALV显示格式 PERFORM frm_init_fieldcat. " 设置输出屏幕的ALV输出字段
PERFORM frm_display_alv. " 调用ALV显示函数显示数据 ENDFORM. *&---------------------------------------------------------------------* *& Form frm_init_layout *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_init_layout . gs_layout-cwidth_opt = 'X'. gs_layout-zebra = 'X'." 颜色交替.
" gs_layout-sel_mode = 0. gs_layout-box_fname = 'SEL'. ENDFORM. *&---------------------------------------------------------------------* *& Form frm_init_fieldcat *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_init_fieldcat . " 设置输出屏幕的ALV输出字段
CLEAR gs_fieldcat.
m_fcat:
'ERDAT' '凭证日期' ,
'VBELN' '交货单号' ,
'ZZDR' '制单人' ,
'POSNR' '行项目号' ,
'WERKS' '交货工厂' ,
'KUNNR' '送达方' ,
'NAME1' '送达方名称' ,
'MATNR' '物料编码' ,
'ARKTX' '物料描述' ,
'LFIMG' '交货数量' ,
'VRKME' '单位' ,
'CHARG' '批次' ,
'LGMNG' '以库存单位的交货数量' ,
'MEINS' '单位' ,
'ZDYCS' '打印次数' .
APPEND gs_fieldcat TO gt_fieldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
"调用显示函数. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat i_callback_user_command = 'USER_CLICK' "响应按钮事件
i_callback_pf_status_set = 'SET_PF_STATUS' "列表按钮 TABLES t_outtab = gt_print EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. FORM set_pf_status USING i_extab TYPE slis_t_extab. SET PF-STATUS '101'. " gui状态栏名称
ENDFORM. "SET_PF_STATUS FORM user_click USING i_ucomm LIKE sy-ucomm i_selfield TYPE slis_selfield. CASE sy-ucomm. WHEN 'PRINT'. PERFORM frm_get_print_data. "获取打印数据
PERFORM frm_print_data. "打印数据 ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form frm_print_data *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_print_data . DATA: ls_control TYPE ssfctrlop, ls_output TYPE ssfcompop, ls_jobout TYPE ssfcresop, gv_fm_name TYPE rs38l_fnam. * ls_output-tddest = 'LP01'. ls_output-tdiexit = 'X'. ls_output-tdimmed = 'X'. ls_output-tddelete = 'X'. ls_output-tdnoprev = ''. ls_control-preview = 'X'. " 打印预览
ls_control-no_dialog = 'X'.
ls_control-no_open = 'X'.
ls_control-no_close = 'X'.
CALL FUNCTION 'SSF_OPEN'
EXPORTING
user_settings = ''
output_options = ls_output
control_parameters = ls_control
IMPORTING
job_output_options = ls_jobout
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZFIFM002'
* VARIANT = ' '
* DIRECT_CALL = ' '
IMPORTING
fm_name = gv_fm_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION gv_fm_name
EXPORTING
* ARCHIVE_INDEX =
* ARCHIVE_INDEX_TAB =
* ARCHIVE_PARAMETERS =
control_parameters = ls_control
* MAIL_APPL_OBJ =
* MAIL_RECIPIENT =
* MAIL_SENDER =
output_options = ls_output
user_settings = ''
* IMPORTING
* DOCUMENT_OUTPUT_INFO =
* JOB_OUTPUT_INFO =
* job_output_options = sf_job_output_options
TABLES
gt_sf = gt_sf "行 gt_head = gt_sf2 "头
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
CLEAR: gt_sf,gt_sf2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CALL FUNCTION 'SSF_CLOSE'
* IMPORTING
* job_output_info = ls_return
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_print_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_print_data .
DATA : gt_st TYPE TABLE OF zssd0008,
gs_st TYPE zssd0008,
gt_st2 TYPE TABLE OF zssd0008,
gs_st2 TYPE zssd0008,
gt_st3 TYPE TABLE OF zssd0008,
gs_st3 TYPE zssd0008.
DATA : gt_print_2 TYPE TABLE OF gty_alv,
gs_print_2 TYPE gty_alv.
DATA num TYPE i VALUE IS INITIAL.
LOOP AT gt_print INTO gs_print WHERE sel = 'X'.
READ TABLE gt_print INTO gs_print_2 INDEX sy-tabix .
APPEND gs_print_2 TO gt_print_2.
legth = lines( gt_print_2 ).
CLEAR: gs_print_2,gs_print.
ENDLOOP.
CLEAR gt_print.
IF legth = 0.
MESSAGE e011 DISPLAY LIKE 'E'.
EXIT.
ENDIF.
LOOP AT gt_print_2 INTO gs_print_2 .
*行项目
SELECT likp~lfdat
lips~kdmat
mara~zbmcl
mara~zggxh
mara~zbzfs
FROM likp
INNER JOIN lips ON likp~vbeln = lips~vbeln
INNER JOIN mara ON lips~matnr = mara~matnr
INTO CORRESPONDING FIELDS OF TABLE gt_st2
WHERE lips~vbeln = gs_print_2-vbeln
AND lips~matnr = gs_print_2-matnr .
SELECT bztxt FROM t171t
INNER JOIN knvv ON knvv~bzirk = t171t~bzirk
INTO CORRESPONDING FIELDS OF TABLE gt_st3
WHERE kunnr = gs_print_2-kunnr.
SELECT stras telf1 FROM kna1
INTO CORRESPONDING FIELDS OF TABLE gt_st
WHERE kunnr = gs_print_2-kunnr.
READ TABLE gt_st2 INTO gs_st2 INDEX 1.
MOVE-CORRESPONDING gs_st2 TO gs_sf.
READ TABLE gt_st INTO gs_st INDEX 1.
gs_sf-stras = gs_st-stras.
gs_sf-telf1 = gs_st-telf1.
READ TABLE gt_st3 INTO gs_st3 INDEX 1.
gs_sf-bztxt = gs_st3-bztxt.
MOVE-CORRESPONDING gs_print_2 TO gs_sf .
APPEND gs_sf TO gt_sf.
*抬头
MOVE-CORRESPONDING gs_sf TO gs_sf2 .
APPEND gs_sf2 TO gt_sf2.
DELETE ADJACENT DUPLICATES FROM gt_sf2 COMPARING vbeln.
CLEAR: gs_sf ,gt_st ,gt_st2,gs_st,gs_st2,gs_st3,gt_st3,gs_sf2.
ENDLOOP.
SORT gt_sf BY name1.
SORT gt_sf2 BY vbeln.
ENDFORM.
边栏推荐
- Datagrip error "The specified database userpassword combination is rejected..."Solutions
- 国内外最顶级的8大plm项目管理系统
- pytest接口自动化测试框架 | 使用函数返回值的形式传入参数值
- 微信小程序请求封装
- Centos install php7.4, build hyperf, forward RDS
- The log causes these pits in the thread block, you have to prevent
- SaaS安全认证综合指南
- LevelSequence源码分析
- 零代码网站开发利器:WordPress
- Golang:go开启web服务
猜你喜欢
Data Analysis 6
nodetype中值1、2、3分别代表什么意思
Vim三种模式
22牛客多校1 J.Serval and Essay (启发式合并)
Chapter 9 of Huawei Deep Learning Course - Convolutional Neural Network and Case Practice
Self-made a remote control software - VeryControl
特殊的日子,值得纪念
Electromagnetic compatibility introductory tutorial (6) test project
Vim扩展内容
22 Grab the Seat 1 C.Grab the Seat (Geometry + Violence)
随机推荐
我说过无数遍了:从来没有一种技术是为灵活组合这个目标而设计的
自制一款远程控制软件——VeryControl
R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图可视化股票月收益率数据、使用百分比显示Y轴坐标数据、使用不同的色彩表征正负收益率
Pytest | skip module interface test automation framework
zip package all files in the directory (including hidden files/folders)
Shell执行SQL发邮件
力扣每日一题-第44天-290. 单词规律
Centos install php7.4, build hyperf, forward RDS
基于百度OCR的网站验证码在线识别
I have three degrees, and I have five faces. I was "confessed" by the interviewer, and I got an offer of 33*15.
app 自动化 通过工具查看app 元素 (三)
套接字选项
特别数的和
rhcsa 第四天
Datagrip error "The specified database userpassword combination is rejected..."Solutions
Upgrade to heavyweight lock, lock reentrancy will lead to lock release?
小程序全面屏手势配置案例
支付宝如何生成及配置公钥证书
return; represents meaning
华为深度学习课程第六、七章