打开的销售订单PDF附件已损坏

2020-08-17 14:16发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我创建了一个自定义程序,该程序创建PDF文档并将其附加到销售订单的附件列表中。

我面临的问题是,该程序在开发系统中运行正常,但是在质量系统中却无法运行。

在质量体系中,该程序仍会将文档附加到销售订单上,但是当我尝试打开它甚至将其保存到PC并打开它时,它会给出PDF损坏的错误消息。

我在此过程中使用的代码可以总结如下:

  1. 获取需要通过FM GUI_UPLOAD从PC编辑和附加的PDF文件
  2. 使用FM SO_CONVERT_CONTENTS_BIN转换为压缩二进制格式
  3. 调用" SO_FOLDER_ROOT_ID_GET"功能获取文件夹ID
  4. 创建SAPoffice对象并使用FM SO_OBJECT_INSERT移至文件夹
  5. 使用FM BINARY_RELATION_CREATE_COMMIT链接对象

质量体系没有变化。 代码也没有区别。

如果有人可以在这里提供建议,那将有很大帮助。

谢谢。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我创建了一个自定义程序,该程序创建PDF文档并将其附加到销售订单的附件列表中。

我面临的问题是,该程序在开发系统中运行正常,但是在质量系统中却无法运行。

在质量体系中,该程序仍会将文档附加到销售订单上,但是当我尝试打开它甚至将其保存到PC并打开它时,它会给出PDF损坏的错误消息。

我在此过程中使用的代码可以总结如下:

  1. 获取需要通过FM GUI_UPLOAD从PC编辑和附加的PDF文件
  2. 使用FM SO_CONVERT_CONTENTS_BIN转换为压缩二进制格式
  3. 调用" SO_FOLDER_ROOT_ID_GET"功能获取文件夹ID
  4. 创建SAPoffice对象并使用FM SO_OBJECT_INSERT移至文件夹
  5. 使用FM BINARY_RELATION_CREATE_COMMIT链接对象

质量体系没有变化。 代码也没有区别。

如果有人可以在这里提供建议,那将有很大帮助。

谢谢。

付费偷看设置
发送
6条回答
梦想连接
1楼-- · 2020-08-17 14:39

你好梅森·麦考米奇

GUI_UPLOAD函数中有一个名为FILELENGTH的EXPORTING参数。

 *"导出
 *" VALUE(FILELENGTH)TYPE I 

我建议您使用此参数来获取文件的长度,并使用它代替计算。

 wl_obj_data-objlen = lines(tl_content)*  cl_255。

亲切的问候,

Mateusz
Bunny_CDM
2楼-- · 2020-08-17 14:35

程序中的经典错误:在将PDF上载到SAP时,您向PDF添加了额外的空字节...如果显示,请显示代码

Alawn_Xu
3楼-- · 2020-08-17 14:40

你好,

我假设您要将PDF附加到GOS? 然后使用

cl_bds_document_set => create_with_table

适应以下代码,我为全局变量添加了一些注释,这些注释未复制到此发布中。 该代码来自传入的邮件界面,该界面将邮件及其中的所有附件附加到任何业务对象

 METHOD ATTACH_BINARY_TO_BUSOBJ。

     数据:lt_components TYPE sbdst_components,
         ls_components与lt_components类似,
         lt_signature TYPE sbdst_signature,
         ls_signature与lt_signature类似,
         lt_content TYPE sbdst_content。

     数据:lv_object_key TYPE bds_typeid。
     数据:lv_text(200)TYPE c,
           lv_numc类型n。
 * -------------------------------------------------  ------------------- *

     移动:g_belnr到lv_object_key。 您的销售订单

     通话功能'SCMS_XSTRING_TO_BINARY'
       出口
         buffer = ip_xstring"导入参数类型xstring,您的PDF
       桌子
         binary_tab = lt_content。

     ls_components-doc_count = ip_doc_index。  "大概1,
     ls_components-comp_id =空间。
     ls_components-mimetype = g_mimetype。  "您的pPDF的模仿类型
     ls_components-comp_size = g_attachement_attributes-docsize。  "来自GUI_PLOAD
     将ls_components附加到lt_components。

     调用方法me-> create_signature"参见下文
       出口
         ip_doc_index = g_doc_index
       输入
         et_signature = lt_signature。

     呼叫方法cl_bds_document_set => create_with_table
       出口
 *逻辑系统=
         classname = g_busobj"业务对象,例如BUS2032
         classtype = co_bustype" BO
 *客户=
         组件= lt_components
         含量= lt_含量
       改变
         object_key = lv_object_key
         签名= lt_signature
       例外情况
         internal_error = 1
         error_kpro = 2
         parameter_error = 3
         not_authorized = 4
         not_allowed = 5
         nothing_found = 6
         其他= 7。
     如果sy-subrc <> 0。
 *在这里实施适当的错误处理
 其他。
 *一些成功消息,烟花,... 
ENDIF。
ENDMETHOD。 方法CREATE_SIGNATURE。 数据:ls_signature TYPE bapisignat, lt_signature_keywords bapisignat的类型表。 数据:lt_string TYPE TABLE OF字符串, lv_string TYPE字符串。 数据:ls_recipients类似于g_recipients_table的行。 * ------------------------------------------------- ------------------- * ls_signature-doc_count = ip_doc_index。 ls_signature-prop_name ='DESCRIPTION'。 ls_signature-prop_value = g_attachement_attributes-文件名。 "您的文件 附加ls_signature到et_signature。 ls_signature-prop_name ='BDS_CONTREP'。 ls_signature-prop_value =''。 附加ls_signature到et_signature。 ls_signature-prop_name ='LANGUAGE'。 ls_signature-prop_value = g_langu。 " 语言 附加ls_signature到et_signature。 *来自收件人的关键字 *您可以选择更多关键字 将g_recipients_table循环到ls_recipients。 用l替换ls_recipients中所有正则表达式'@。*'的出现。 压缩ls_recipients。 ls_signature-prop_name ='BDS_KEYWORD'。 ls_signature-prop_value = ls_recipients。 附加ls_signature到et_signature。 结局。 终结法。
Alawn_Xu
4楼-- · 2020-08-17 14:49

好的。

这是我的代码:

通话功能'GUI_UPLOAD'
         出口
           文件名= l_pcfile
           文件类型= cl_bin
         桌子
           data_tab = me_tl_content
         例外情况
           其他= 1。


 *转换为压缩二进制格式
     通话功能'SO_CONVERT_CONTENTS_BIN'
       出口
         it_contents_bin = me_tl_content []
       输入
         et_contents_bin = me_tl_content []。


 *获取文件夹ID
     cl_region_b TYPE sofd-folrg VALUE'B',

     通话功能'SO_FOLDER_ROOT_ID_GET'
       出口
         区域= cl_region_b'B'
       输入
         folder_id = wl_fol_id
       例外情况
         communication_failure = 1
         owner_not_exist = 2
         system_failure = 3
         x_错误= 4
         其他= 5。

     l_filename = mi_attach_filename。
     将l_filename转换为大写。

 *对象头
     wl_content TYPE SOLI,
     tl_objhead SOLID类型标准表,

     清除wl_content。
     CONCATENATE'&SO_FILENAME ='l_filename INTO wl_content。
     将wl_content附加到tl_objhead。
     清除wl_content。

     wl_object-objkey = mi_docno。
     wl_object-objtype = mi_bor_obj。
     wl_obj_data-objsns = cl_o。  'O'
     wl_obj_data-objla = sy-langu。

     wl_obj_data-objdes = mi_attach_filename。
     将wl_obj_data-objdes转换为大写。

     wl_obj_data-file_ext = p_doctyp。  'pdf'
     将wl_obj_data-file_ext转换为大写。

     wl_obj_data-objlen = lines(tl_content)* cl_255。


 *插入数据
     通话功能'SO_OBJECT_INSERT'
       出口
         folder_id = wl_fol_id
         object_type = cl_objtype
         object_hd_change = wl_obj_data
       输入
         object_id = wl_obj_id
       桌子
         objhead = tl_objhead
         objcont = tl_content
       例外情况
         其他= 1。


       wl_folmem_k-foltp = wl_fol_id-objtp。
       wl_folmem_k-folyr = wl_fol_id-objyr。
       wl_folmem_k-folno = wl_fol_id-objno。

       wl_folmem_k-doctp = wl_obj_id-objtp。
       wl_folmem_k-docyr = wl_obj_id-objyr。
       wl_folmem_k-docno = wl_obj_id-objno。

       l_ep_note = wl_folmem_k。
       wl_note-objtype = cl_message。
       wl_note-objkey = l_ep_note。

 *链接
       通话功能" BINARY_RELATION_CREATE_COMMIT"
         出口
           obj_rolea = wl_object
           obj_roleb = wl_note
           关系类型= cl_atta_type
         例外情况
           其他= 1。
       IF sy-subrc均衡器0。
         提交工作。
         mc_attached = abap_true。
       ENDIF。
SC_Yao
5楼-- · 2020-08-17 14:39

谢谢。 请参阅Mateusz的正确答案。 请注意,也许我的第一个想法并不完全正确,也许您传递的长度实际上太短了……(因为me_tl_content可能定义为255个字符,但是您选择了二进制传输,因此您可能具有Unicode系统,因此每个 行是510字节,而不是255)。 无论如何,最好使用GUI_UPLOAD期间获得的字节数。

大简至美
6楼-- · 2020-08-17 14:58

你好 Mason Mccormic

您是否已上传新文档并对该文档进行了测试?

您可以下载刚刚上传的文档并与原始文档进行比较吗? 它们具有相同的字节数吗? 他们的内容呢? 这些都一样吗?

亲切的问候,
Mateusz

一周热门 更多>