You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:23:13