在ABAP(RAP)中调用碎片化Adobe销售重印文档并Base64传输方案咨询
在ABAP RAP中调用销售单据Adobe重印文档并以Base64格式发送的解决方案
核心逻辑说明
销售单据的Adobe重印功能(VA02/VA03中触发)本质是调用SAP Adobe表单生成框架,我们需要在RAP中复用这一逻辑,生成PDF后转Base64,再通过URL传递。以下分两种单据状态给出具体实现。
1. 依赖的标准函数/类
SAP Adobe表单生成依赖以下核心组件,需确保系统已激活Adobe服务:
FP_FUNCTION_MODULE_NAME:获取表单对应的生成函数FP_JOB_OPEN/FP_JOB_CLOSE:管理表单生成作业SCMS_XSTRING_TO_BINARY/SCMS_BINARY_TO_BASE64:二进制与Base64格式转换
2. 分场景实现
场景1:单据状态为已完成
已完成单据数据稳定,直接生成即可:
METHOD get_reprint_base64_finished. DATA(lv_vbeln) = iv_vbeln. " 输入销售订单号 DATA: lv_fm_name TYPE funcname, ls_outputparams TYPE fpoutputparams, ls_docparams TYPE fpdocparams, ls_formoutput TYPE fpformoutput, lv_pdf_xstr TYPE xstring, lv_base64 TYPE string, lt_binary TYPE STANDARD TABLE OF x255, lv_len TYPE i. " 1. 获取表单对应的函数模块(替换为实际重印表单名称) CALL FUNCTION 'FP_FUNCTION_MODULE_NAME' EXPORTING i_name = 'ZSD_SALES_ORDER_REPRINT' IMPORTING e_funcname = lv_fm_name. IF sy-subrc <> 0. RAISE EXCEPTION TYPE zcx_sd_reprint_error EXPORTING textid = zcx_sd_reprint_error=>form_not_found. ENDIF. " 2. 初始化表单输出参数 ls_outputparams-getpdf = abap_true. CALL FUNCTION 'FP_JOB_OPEN' CHANGING ie_outputparams = ls_outputparams EXCEPTIONS cancel = 1 usage_error = 2 system_error = 3 internal_error = 4 OTHERS = 5. IF sy-subrc <> 0. RAISE EXCEPTION TYPE zcx_sd_reprint_error EXPORTING textid = zcx_sd_reprint_error=>job_open_fail. ENDIF. " 3. 调用表单生成函数 ls_docparams-langu = sy-langu. CALL FUNCTION lv_fm_name EXPORTING /1bcdwb/docparams = ls_docparams iv_vbeln = lv_vbeln IMPORTING /1bcdwb/formoutput = ls_formoutput EXCEPTIONS usage_error = 1 system_error = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. CALL FUNCTION 'FP_JOB_CLOSE' EXCEPTIONS OTHERS = 1. RAISE EXCEPTION TYPE zcx_sd_reprint_error EXPORTING textid = zcx_sd_reprint_error=>form_generate_fail. ENDIF. " 4. 关闭表单作业 CALL FUNCTION 'FP_JOB_CLOSE' EXCEPTIONS usage_error = 1 system_error = 2 internal_error = 3 OTHERS = 4. IF sy-subrc <> 0. RAISE EXCEPTION TYPE zcx_sd_reprint_error EXPORTING textid = zcx_sd_reprint_error=>job_close_fail. ENDIF. " 5. 将PDF二进制转Base64 lv_pdf_xstr = ls_formoutput-pdf. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING buffer = lv_pdf_xstr IMPORTING output_length = lv_len TABLES binary_tab = lt_binary. CALL FUNCTION 'SCMS_BINARY_TO_BASE64' EXPORTING input_length = lv_len IMPORTING buffer = lv_base64 TABLES binary_tab = lt_binary. rv_base64 = lv_base64. " 返回Base64字符串 ENDMETHOD.
- 后续将
rv_base64作为URL参数传递时,注意URL长度限制(超过2048字符建议用POST请求体传递)
场景2:单据状态为进行中
进行中单据可能存在锁定或数据未稳定的情况,需额外处理:
METHOD get_reprint_base64_in_progress. DATA(lv_vbeln) = iv_vbeln. DATA: lv_lock_status TYPE char1. " 1. 检查单据是否被锁定 CALL FUNCTION 'ENQUEUE_EVVBAKE' EXPORTING vbeln = lv_vbeln EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. IF sy-subrc = 1. RAISE EXCEPTION TYPE zcx_sd_reprint_error EXPORTING textid = zcx_sd_reprint_error=>order_locked. ENDIF. " 2. 调用已完成场景的生成逻辑(复用上述方法) rv_base64 = get_reprint_base64_finished( lv_vbeln ). " 3. 释放单据锁定 CALL FUNCTION 'DEQUEUE_EVVBAKE' EXPORTING vbeln = lv_vbeln. ENDMETHOD.
- 若单据存在未保存的修改,建议先提示用户保存后再生成,避免数据不一致;也可通过
BAPI_SALESORDER_GETDETAIL获取最新缓冲数据
3. RAP集成方式
在RAP行为定义中添加服务操作:
define behavior for ZSD_SALES_ORDER alias SalesOrder persistent table vbak lock master authorization master ( global ) draft enabled { action GetReprintDocument parameter; }
在行为实现类中绑定上述方法,将Base64字符串作为操作返回值,前端可直接将其嵌入URL或作为请求参数传递。
关键注意事项
- 权限:确保用户拥有
VA03访问权限、Adobe表单生成权限(FP_ADMIN等) - 异常处理:自定义异常类覆盖表单未找到、生成失败、单据锁定等场景
- 性能:大单据生成PDF可能耗时,建议异步处理或添加进度提示
内容的提问来源于stack exchange,提问作者Rkp
相关产品推荐
相关产品推荐

