Generate PDF from ABAP report

本文介绍了一个简单的ABAP程序,该程序能够从ABAP列表输出生成PDF格式的文件。通过调整打印机设置中的格式X_90_120,可以实现列表到PDF的转换。程序还包含了从MARA、MARC和MAKT表中选择物料数据并显示的功能。
Description: This program will generate the PDF form from ABAP List Output. 
I have used the format X_90_120 for generating PDF form from List Output. 
You can do this setting by changing the properties of printer after 
clicking the PDF generation button in the List output.
* Author: Nagaraj Kalbavi
&---------------------------------------------------------------------
*& Report  Z_CREATE_PDF_ABAPLIST
&---------------------------------------------------------------------
*& Description: Simple Program to generate PDF from ABAP List Output
&---------------------------------------------------------------------
REPORT  Z_CREATE_PDF_ABAPLIST NO STANDARD PAGE HEADING.
    * PF-status containing a PDF button in the report Output to generate
    * PDF form

SET PF-STATUS 'Z_PDF'.
----------------------------------------------------------------------
*Table Declarations
----------------------------------------------------------------------
TABLES: MARA, MARC, MAKT.
---------------------------------------------------------------------
    * Internal Table Declarations
----------------------------------------------------------------------
DATA: BEGIN OF TS_MARA OCCURS 0,
         MATNR LIKE MARA-MATNR,
         MTART LIKE MARA-MTART,
         MATKL LIKE MARA-MATKL,
         LVORM LIKE MARA-LVORM,
         WERKS LIKE MARC-WERKS,
         MAKTX LIKE MAKT-MAKTX,
       END   OF TS_MARA.

----------------------------------------------------------------------
    * Selection Screen Parameters
----------------------------------------------------------------------

SELECTION-SCREEN BEGIN OF BLOCK B1.
  SELECT-OPTIONS: S_MATNR FOR MARA-MATNR OBLIGATORY,
                  S_WERKS FOR MARC-WERKS OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B1.

----------------------------------------------------------------------

TOP-OF-PAGE.

----------------------------------------------------------------------

write: 40 'Generating PDF from List Output' color 1 intensified on.

  skip 1.

  write: /1 'Date        :',  SY-DATUM,

         /1 'User ID     :',  SY-UNAME,

         /1(112) SY-ULINE.

----------------------------------------------------------------------

START-OF-SELECTION.

----------------------------------------------------------------------

    * Perform for Basic Selection

PERFORM GET_MARA.

    * Perform to Display Data

PERFORM DISPLAY_MARA.

----------------------------------------------------------------------------------

AT USER-COMMAND.

----------------------------------------------------------------------------------

    * User Command to generate PDF Form

  AT USER-COMMAND.

  CASE SY-UCOMM.

    WHEN 'PDF'.

    DATA: L_PARAMS TYPE PRI_PARAMS,

            L_VALID TYPE STRING,

            W_SPOOL_NR LIKE TSP01-RQIDENT.

    * TO GET PRINT PARAMETERS

      CALL FUNCTION 'GET_PRINT_PARAMETERS'

        IMPORTING

          OUT_PARAMETERS = L_PARAMS

          VALID          = L_VALID.

      IF SY-SUBRC <> 0.

      ENDIF.

    * Internal table for Selection Screen

DATA: BEGIN OF I_RSPARAMS OCCURS 0.

       INCLUDE STRUCTURE RSPARAMS.

DATA: END OF I_RSPARAMS.

    * Store the current selection screen details

CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'

  EXPORTING

    CURR_REPORT           = SY-REPID

    * IMPORTING

*   SP                    =

  TABLES

    SELECTION_TABLE       = I_RSPARAMS

    * EXCEPTIONS

*   NOT_FOUND             = 1

*   NO_REPORT             = 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.

    * SUBMIT TO GET THE SPOOL NUMBER

SUBMIT Z_CREATE_PDF_ABAPLIST WITH SELECTION-TABLE I_RSPARAMS

                             TO SAP-SPOOL

                             SPOOL PARAMETERS L_PARAMS

                             WITHOUT SPOOL DYNPRO

                             AND RETURN.

    * SELECT THE RECENTLY CREATED SPOOL

      SELECT MAX( RQIDENT ) INTO W_SPOOL_NR FROM TSP01

                                 WHERE RQCLIENT = SY-MANDT

                                 AND   RQOWNER  = SY-UNAME.

*REPORT TO GENERATE SPOOL NUMBER FOR PDF CONVERT

      SUBMIT RSTXPDF5 WITH SPOOLNO  = W_SPOOL_NR

                      WITH DSTDEVIC = 'LOCL' AND RETURN .

      IF SY-SUBRC EQ 0.

        CLEAR W_SPOOL_NR.

    * SELECT THE RECENTLY CREATED SPOOL FOR PDF

        SELECT MAX( RQIDENT ) INTO W_SPOOL_NR FROM TSP01

                                   WHERE RQCLIENT = SY-MANDT

                                   AND   RQOWNER  = SY-UNAME.

*REPORT TO DOWNLOAD PDF SPOOL TO GUI

        SUBMIT RSTXPDFT5 WITH SPOOLID = W_SPOOL_NR

                         AND RETURN.

      ENDIF.

  ENDCASE.
&---------------------------------------------------------------------

*&      Form  GET_MARA

&---------------------------------------------------------------------

*       text

----------------------------------------------------------------------

*  -->  p1        text

*  <--  p2        text

----------------------------------------------------------------------

FORM GET_MARA .

CLEAR  : TS_MARA.

REFRESH: TS_MARA.

    * To select Materials based on Selection Criteria

SELECT A~MATNR A~MTART A~MATKL A~LVORM B~WERKS INTO CORRESPONDING

                           FIELDS OF TABLE TS_MARA FROM MARA AS A

                           INNER JOIN MARC AS B ON A~MATNR EQ B~MATNR

                           WHERE A~MATNR IN S_MATNR

                           AND   B~WERKS IN S_WERKS.

LOOP AT TS_MARA.

   SELECT SINGLE * FROM MAKT WHERE MATNR EQ TS_MARA-MATNR

                             AND   SPRAS EQ SY-LANGU.

   MOVE MAKT-MAKTX TO TS_MARA-MAKTX.

   MODIFY TS_MARA INDEX SY-TABIX.

ENDLOOP.

ENDFORM.                    " GET_MARA

&---------------------------------------------------------------------

*&      Form  DISPLAY_MARA

&---------------------------------------------------------------------

*       text

----------------------------------------------------------------------

*  -->  p1        text

*  <--  p2        text

----------------------------------------------------------------------

FORM DISPLAY_MARA .

CLEAR  : TS_MARA.

WRITE: /1   '|', 2(18)  'Material Number' COLOR 7,

         21  '|', 22(5)  'Plant          ' COLOR 7,

         28  '|', 29(13) 'Material Type  ' COLOR 7,

         42  '|', 43(14) 'Material Group ' COLOR 7,

         57  '|', 58(13) 'Deletion Flag  ' COLOR 7,

         71  '|', 72(40) 'Description    ' COLOR 7,

         112 '|'.

WRITE: /1(112) SY-ULINE.

LOOP AT TS_MARA.

  WRITE: /1   '|', 2(18)   TS_MARA-MATNR,

          21  '|', 22(5)   TS_MARA-WERKS,

          28  '|', 29(13)  TS_MARA-MTART,

          42  '|', 43(14)  TS_MARA-MATKL,

          57  '|', 58(13)  TS_MARA-LVORM,

          71  '|', 72(40)  TS_MARA-MAKTX,

          112 '|'.

WRITE: /1(112) SY-ULINE.

ENDLOOP.

ENDFORM.                    " DISPLAY_MARA
### 问题分析 在调用 `generate_pdf_report` 函数时,`Table` 初始化失败并抛出异常:`ValueError: Table must have at least a row and column`。此错误表明传入 `Table` 构造函数的数据为空或结构不正确。 根据 `reportlab.platypus.Table` 的要求,表格数据必须是一个二维列表(即包含至少一行一列),否则会引发该异常。结合上下文,可以推测 `wrong_answer_data` 变量可能是空列表或未正确构造的二维结构[^1]。 ### 解决方案 为避免此类错误,应在初始化 `Table` 实例前对数据进行有效性检查。例如: ```python if not wrong_answer_data or not any(row for row in wrong_answer_data): raise ValueError("表格数据不能为空") ``` 此外,确保 `wrong_answer_data` 是一个非空的二维列表。例如,如果原始数据是字典或其他结构,应先转换为二维列表格式: ```python wrong_answer_data = [["题目", "答案"]] for item in raw_data: wrong_answer_data.append([item["question"], item["correct_answer"]]) ``` 若 `wrong_answer_data` 来源于外部文件或数据库查询结果,建议加入日志输出或调试断点以确认其内容是否正确加载[^2]。 ### 示例代码 以下是一个完整的示例,展示如何构建一个合法的表格数据并生成 PDF 报告: ```python from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table # 确保表格数据非空且为二维结构 data = [["题目", "答案"]] # 表头 for i in range(3): data.append([f"问题{i+1}", f"答案{i+1}"]) # 创建 PDF 文档 pdf_file = "output.pdf" doc = SimpleDocTemplate(pdf_file, pagesize=letter) table = Table(data) # 构建文档内容 doc.build([table]) ``` ### 相关注意事项 - 若使用动态生成的数据源,建议添加容错机制,防止程序因无效输入而崩溃。 - 对于嵌套结构或从外部文件读取的数据,应确保其解析逻辑无误,并通过单元测试验证其完整性。 - 如果 `wrong_answer_data` 来自数据库查询或 API 调用,需处理可能的网络或响应错误情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值