二维码

[fmalv] 打印带有页码的alv

Twilight发表于 2014-07-30 20:02Twilight 最后回复于 2014-07-30 20:02 [复制链接] 4962 0

ALV report打印时我们期待的样式
Printing ALV 1.gif
Step 1: 在新页中显示新凭证
下面的过程是用来填充REUSE_ALV_GRID_DISPLAY参数IT_SORT 的,当遇到一个新凭证记录时,alv就会自动插入一个page break
  1. CONSTANTS:     
  2. c_spos        TYPE SLIS_SPOS   VALUE '01',     " Column position
  3. c_up          TYPE SLIS_SOUP   VALUE 'X',      " Sorting order
  4. c_table       TYPE tabname     VALUE 'I_FINAL'," Name of o/p table
  5. c_group       TYPE SLIS_CTRLS  VALUE '*',      " Sorting group
  6. c_fld2        TYPE fieldname   VALUE 'IDCNGA04-IDCN037'." Field name(Document no)
  7. * Prepare sort table
  8.   PERFORM prepare_sort_table CHANGING i_sort[].
  9. FORM prepare_sort_table CHANGING pi_sort TYPE slis_t_sortinfo_alv.
  10.   CLEAR st_sort.
  11.   st_sort-spos      = c_spos.     " Sort sequence
  12.   st_sort-fieldname = c_fld2.     " Document no
  13.   st_sort-tabname   = c_table.    " Table name
  14.   st_sort-up        = c_up.       " Ascending
  15.   st_sort-group     = c_group.    " Group
  16. * Populate sort table
  17.   APPEND st_sort TO pi_sort.
  18. ENDFORM.                    "prepare_sort_table
复制代码

Step 2:将每个新凭证的page number重置为1
对于ALV function module,我们不能控制页码,因为当一个新页被打印出来时,计数器就会自动增加页码,所以为了获得这种效果,就不得不在TOP_OF_PAGE过程里在定制化代码。
  1. * Prepare event table
  2.   PERFORM prepare_event_table.

  3. FORM prepare_event_table .
  4. * Populate top-of-page event
  5.   st_event-name = slis_ev_top_of_page.
  6.   st_event-form = slis_ev_top_of_page.
  7.   APPEND st_event TO i_event.
  8.   CLEAR st_event.
  9. ENDFORM.                    " prepare_event_table
复制代码

在我们的例子中,我们使用ALV grid展示报表,所以在报表展示界面是看不见页码的,他仅仅在打印预览或者在打印时可见。
  1. FORM top_of_page.
  2. * Local variable declaration
  3.   STATICS: l_comm  TYPE syucomm.  " Store user command
  4. * Declaration of local variables
  5.   DATA: l_line_size  TYPE sylinsz,           " Line size
  6.         l_line       TYPE slis_listheader,   " Hold list header
  7.         l_currdoc    TYPE idcn037,           " Current doc.
  8.         l_currtabix  TYPE sytabix.           " Current index
  9. * Check for print or print preview
  10.   IF ( sy-ucomm = c_prin OR
  11.   sy-ucomm = c_rnt_prev OR
  12.   sy-ucomm = c_rnt ).
  13.     IF l_comm <> sy-ucomm.
  14.       CLEAR : g_page_cnt.
  15.     ENDIF. " l_comm <> sy-ucomm
  16. *   Store current table index
  17.     l_currtabix  = sy-tabix.
  18.     CLEAR st_final.
  19. *   If current index is 1 then start page numbering from 1
  20.     IF l_currtabix = 1.
  21. *     Read 1st record and store the document no
  22.       READ TABLE i_final INDEX l_currtabix INTO st_final.
  23.       g_prevdoc = st_final-idcnga04-idcn037.
  24. *     Start page numbering from 1
  25.       g_page_cnt =  1.
  26.       g_prevtabix = 1.
  27.     ELSE.
  28. *     Read the table line
  29.       READ TABLE i_final INDEX l_currtabix INTO st_final.
  30. *     Store the current document
  31.       l_currdoc = st_final-idcnga04-idcn037.
  32. *     If the current doc. is same as previou doc.
  33. *     increament the page no, otherwise start it from 1
  34.       IF l_currdoc = g_prevdoc.
  35. *       Increament the page no
  36.         g_page_cnt = g_page_cnt + 1.
  37.       ELSE.
  38. *       Start page from 1
  39.         g_page_cnt =  1.
  40. *       Store current doc. as previous doc.
  41.         g_prevdoc = l_currdoc.
  42.       ENDIF. " l_currdoc = g_prevdoc
  43.     ENDIF. " l_currtabix = 1
  44.   ENDIF. " sy-ucomm = c_prin OR
  45.   IF g_page_cnt = 1.
  46. *   Store the user command
  47.     l_comm = sy-ucomm.
  48.   ENDIF. " g_page_cnt = 1
  49. * Display page no
  50.   IF g_page_cnt > 0 .
  51. *  Store the report width
  52.     l_line_size = sy-linsz.
  53. *  Calculate position
  54.     l_line_size = l_line_size - 10.
  55. *  Display page no
  56.     WRITE AT l_line_size 'Page no:'(021).
  57. *  Calculate position
  58.     l_line_size = l_line_size + 5.
  59.     WRITE AT l_line_size g_page_cnt.
  60.   ENDIF. " g_page_cnt > 0
  61.   REFRESH st_list_top_of_page.
  62. * Populate company name
  63.   CLEAR l_line.
  64.   l_line-typ  = c_typ.
  65.   l_line-info = g_comp_name.
  66.   APPEND l_line TO st_list_top_of_page.
  67. * Populate heading
  68.   CLEAR l_line.
  69.   l_line-typ  = c_typ.
  70.   l_line-info = text-020.
  71.   APPEND l_line TO st_list_top_of_page.
  72. * At the time of printing or print preview display additional info
  73. * on 1st page
  74.   IF g_page_cnt = 1 AND
  75.     ( sy-ucomm = c_prin OR
  76.       sy-ucomm = c_rnt_prev OR
  77.       sy-ucomm = c_rnt ).
  78.     CLEAR l_line.
  79.     l_line-typ  = 'A'.
  80. *   Populate Staff name
  81.     CONCATENATE text-017
  82.                 st_final-idcnga04-idcn053
  83.                 INTO l_line-info
  84.                 SEPARATED BY ':'.
  85.     APPEND l_line TO st_list_top_of_page.
  86.     CLEAR l_line.
  87.     l_line-typ  = 'A'.
  88. *   Populate Accountant
  89.     CONCATENATE text-018
  90.                 '______________________'
  91.                 INTO l_line-info
  92.                 SEPARATED BY ':'.
  93.     APPEND l_line TO st_list_top_of_page.
  94.     CLEAR l_line.
  95.     l_line-typ  = 'A'.
  96. *   Populate Book keeper
  97.     CONCATENATE text-019
  98.                 '______________________'
  99.                 INTO l_line-info
  100.                 SEPARATED BY ':'.
  101.     APPEND l_line TO st_list_top_of_page.
  102.     l_line-typ  = 'A'.
  103.     l_line-info = space.
  104.     APPEND l_line TO st_list_top_of_page.
  105.   ENDIF.
  106. * Display list header
  107.   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
  108.     EXPORTING
  109.       i_logo             = space
  110.       it_list_commentary = st_list_top_of_page.
  111. * No sy-subrc check is required
  112. ENDFORM.                    " top_of_page
复制代码

Step 3: Display report
  1.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  2.     EXPORTING
  3.       i_callback_program      = l_prog         " Call back progrm
  4.       it_fieldcat             = i_fieldcat_msg " Field catalog
  5.       is_layout               = st_layout      " Layout
  6.       it_sort                 = i_sort[]       " Sort table
  7.       i_save                  = c_save         " 'A'
  8.       is_variant              = l_variant      " ALV variant
  9.       it_events               = i_event        " ALV events
  10.       is_print                = st_print       " Print parameters
  11.     TABLES
  12.       t_outtab                = i_final        " Output table
  13.     EXCEPTIONS
  14.       program_error           = 1
  15.       OTHERS                  = 2.
复制代码

效果:
ALV grid展示报表时,没有展示页码,现在点击预览按钮
Printing ALV 2.gif
在打印预览中,显示了页码
Printing ALV 3.jpg
局限性:
1、页码在报表中的位置,我们是依据报表的宽度计算出来的,在该例中我们使用下面的计算公式
Page number position = sy-linsz – 10.
2、在打印预览中,仅第一页的页码对每个凭证来说是可见的。例如,一个凭证被分散在多页面,那么仅仅第一个页码将会可见,你在打印时能看见所有的页码
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表