GOS 即 Generic Object Services,GOS是一个工具栏,提供不同的功能,如添加附件、创建文档链接、显示所有附件等,非常实用的附件管理工具。
目前,在系统中GOS工具栏默认情况下仅对某些SAP对象可用,可以使用类CL_GOS_MANAGER激活GOS工具栏。
如下图:(标准采购订单默认激活GOS功能)
GOS常用标准事务信息如下:
事务码 | 描述 | 对象类型 | 增强地点 |
ME21N/ME22N/ME23N | 采购订单 | BUS2012 | ✔ |
VA01 / VA02 / VA03 | 销售订单 | BUS2032 | 用户账号参数设置即可 SD_SWU_ACTIVE = ‘X’ |
VL01N / VL02N / VL03N | 交货单 | LIKP | ✔ |
VF01 / VF02 / VF03 | 销售发票 | VBRK | ✔ |
MIRO | 采购发票 | BUS2081 | ✔ |
FB01 / FB02 / FB03 | 会计凭证 | BUS6035 | ✔ |
QA01 / QA02 / QA03 | 检验批 | BUS2045 | |
CS01 / CS02 / CS03 | 物料BOM | BUS1080 | LCSDIFCD |
VD51 / VD52 / VD53 | 客户 物料信息记录 | BUS3033 | MV10AF0T_TEXT_SAPSC_ZAEHLEN |
QP01 / QP02 / QP03 | 检验计划 | BUS1191 | LCPDIFH1 |
C201 / C202 / C203 | 主配方 | BUS1041 | LCPDIFH1 |
QF11 / QF21 / QF31 | 特性缺陷 | BUS2045 | MQFFEF10 |
另外,还可以查看表:
TOJTB - 事务对象储存处: 基础数据
TOJTT - 对象类型文本表
SRGBTBREL - 查看已上传的附件信息
主要应用场景:
1、扩展不支持的事务码(以 物料BOM CS01/ CS02/ CS03 为例)
在 LCSDIFCD 最后新增隐式增强,完成增强后前端自动显示按钮
ENHANCEMENT 1 ZPP_BOM_ENH_GOS. "active version
*&GOS Enhancement for Material BOM (CS01\CS92\CS03) 20220419 Begin
*Refer to: blogs.sap.com/2012/11/21/activating-generic-object-services-toolbar-in-sap-objects/
DATA: LR_GOS_MANAGER TYPE REF TO CL_GOS_MANAGER,
LS_BORIDENT TYPE BORIDENT.
CLEAR:LS_BORIDENT.
LS_BORIDENT-OBJTYPE = 'BUS1080'.
IF RC29N-MATNR is NOT INITIAL.
LS_BORIDENT-OBJKEY = |{ RC29N-MATNR }{ RC29N-WERKS }{ RC29N-STLAN }|.
CREATE OBJECT LR_GOS_MANAGER
EXPORTING
IS_OBJECT = LS_BORIDENT
IP_NO_COMMIT = ''
EXCEPTIONS
OBJECT_INVALID = 1.
ENDIF.
**&GOS Enhancement for Material BOM (CS01\CS92\CS03) 20220419 End
ENDENHANCEMENT.
注意:OBJKEY 主要是执行事务码所必须的字段组合。
也可以通过一下方法检查:
a. 事务码 SWO1 - 业务对象构建器
b.显示对应对象,并检查对应关键字段信息
2、GOS 上传(程序)
(以采购订单 - BUS2012 为例)
PERFORM gos_upload USING 'BUS2012' "对象 '4100001735' "Key 'C:\Users\XXXX\Desktop\XXXX.txt'."文件路径
*&---------------------------------------------------------------------*
*& Form GOS_UPLOAD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0007 text
* -->P_0008 text
* -->P_0009 text
* <--P_SY_SUBRC text
*----------------------------------------------------------------------*
FORM gos_upload USING p_objtype
p_objkey
p_filestr.
DATA : obj_roleb TYPE borident,
obj_rolea TYPE borident,
document LIKE sood4,
folder_id LIKE soodk,
header_data LIKE sood2,
folmem_data LIKE sofm2,
receive_data LIKE soos6.
DATA : BEGIN OF lt_files OCCURS 0,
filename(128),
END OF lt_files.
*** 获取文件夹根ID
CALL FUNCTION 'SO_FOLDER_ROOT_ID_GET'
EXPORTING
owner = ' '
region = 'B'
IMPORTING
folder_id = folder_id
EXCEPTIONS
communication_failure = 1
owner_not_exist = 2
system_failure = 3
x_error = 4.
CLEAR lt_files[].
APPEND p_filestr TO lt_files.
*** 取上传文件的标题作为附件的剪短描述
CALL FUNCTION 'J_3RVATD_SPLIT_FILENAME'
EXPORTING
iv_long_filename = p_filestr
IMPORTING
ev_pure_filename = header_data-objdes
* EV_PURE_EXTENSION =
.
*** 对象文件夹:来自 ID 的对象类型
document-foltp = folder_id-objtp.
*** 对象文件夹:来自 ID 的年
document-folyr = folder_id-objyr.
*** 对象文件夹:来自 ID 的编号
document-folno = folder_id-objno.
*** 内容的简短描述
document-objdes = header_data-objdes.
*** 文档,文件夹或分配清单的名称
document-objnam = header_data-objdes.
CALL FUNCTION 'SO_DOCUMENT_REPOSITORY_MANAGER'
EXPORTING
method = 'IMPORTFROMPC'
* OFFICE_USER =
* REF_DOCUMENT =
* NEW_PARENT =
* IMPORTING
* AUTHORITY =
* RCODE =
TABLES
* OBJCONT =
* OBJHEAD =
* OBJPARA =
* OBJPARB =
* RECIPIENTS =
* ATTACHMENTS =
* REFERENCES =
files = lt_files[]
CHANGING
document = document
header_data = header_data
folmem_data = folmem_data
receive_data = receive_data.
IF document-okcode = 'CREA' OR document-okcode = 'CHNG'.
*** 对象关键字
obj_rolea-objkey = p_objkey.
*** 对象类型
obj_rolea-objtype = p_objtype.
*** 对象类型
obj_roleb-objtype = 'MESSAGE'.
*** 对象关键字
obj_roleb-objkey = document(34).
CALL FUNCTION 'BINARY_RELATION_CREATE_COMMIT'
EXPORTING
obj_rolea = obj_rolea
obj_roleb = obj_roleb
relationtype = 'ATTA'
* IMPORTING
* BINREL =
* TABLES
* BINREL_ATTRIB =
EXCEPTIONS
no_model = 1
internal_error = 2
unknown = 3.
IF sy-subrc = 0.
WRITE : 'Upload success.'.
ELSE.
WRITE : 'Upload fail.'.
ENDIF.
ELSE.
WRITE : 'Create fail.'.
ENDIF.
ENDFORM. " GOS_UPLOAD
3、GOS 下载(程序)
(以 采购订单 - BUS2012 为例)
PERFORM gos_download USING 'BUS2012' "对象 '4100001735' "key 'C:\Users\XXXX\Desktop\XXXX.txt'."文件路径
*&---------------------------------------------------------------------*
*& Form GOS_DOWNLOAD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0007 text
* -->P_0008 text
* -->P_0009 text
*----------------------------------------------------------------------*
FORM gos_download USING p_classname
p_ebeln
p_filestr.
DATA : BEGIN OF itab_srgb OCCURS 0.
INCLUDE STRUCTURE srgbtbrel.
DATA : filename(200),
END OF itab_srgb.
DATA : objcont TYPE TABLE OF soli,
folder_id LIKE soodk,
object_id LIKE soodk,
loio_object LIKE sdokobject,
context LIKE sdokpropty OCCURS 0 WITH HEADER LINE,
phio_object LIKE sdokobject,
file_access_info LIKE sdokfilaci OCCURS 0 WITH HEADER LINE,
file_content_ascii LIKE sdokcntasc OCCURS 0 WITH HEADER LINE,
cont_bin LIKE sdokcntbin OCCURS 0 WITH HEADER LINE.
SELECT * FROM srgbtbrel
INTO TABLE itab_srgb
WHERE instid_a = p_ebeln
AND typeid_a = p_classname
AND catid_a = 'BO'
AND reltype = 'ATTA'
AND logsys_a = ''.
READ TABLE itab_srgb INDEX 1.
folder_id = itab_srgb-instid_b+0(17).
object_id = itab_srgb-instid_b+17(17).
CALL FUNCTION 'SO_OBJECT_READ'
EXPORTING
folder_id = folder_id
object_id = object_id
TABLES
objcont = objcont
EXCEPTIONS
active_user_not_exist = 1
communication_failure = 2
component_not_available = 3
folder_not_exist = 4
folder_no_authorization = 5
object_not_exist = 6
object_no_authorization = 7
operation_no_authorization = 8
owner_not_exist = 9
parameter_error = 10
substitute_not_active = 11
substitute_not_defined = 12
system_failure = 13
x_error = 14.
IF sy-subrc <> 0.
EXIT.
ENDIF.
CALL FUNCTION 'SO_KPRO_DATA_FROM_OBJCONT_GET'
IMPORTING
loio_object = loio_object
TABLES
objcont = objcont
context = context
EXCEPTIONS
missing_kpro_data = 1.
IF sy-subrc = 0 .
CALL FUNCTION 'SO_LOIO_PHIO_GET'
EXPORTING
loio_object = loio_object
IMPORTING
phio_object = phio_object
TABLES
context = context
EXCEPTIONS
kpro_inconsistency = 1
x_error = 2.
CALL FUNCTION 'SDOK_PHIO_LOAD_CONTENT'
EXPORTING
object_id = phio_object
text_as_stream = 'X'
TABLES
file_access_info = file_access_info
file_content_ascii = file_content_ascii
file_content_binary = cont_bin
EXCEPTIONS
not_existing = 1
not_authorized = 2
no_content = 3
bad_storage_type = 4.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = p_filestr
filetype = 'BIN'
TABLES
data_tab = cont_bin
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21.
ELSE.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = p_filestr
filetype = 'ASC'
TABLES
data_tab = objcont
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21.
ENDIF.
IF sy-subrc = 0 .
WRITE : 'Download success.'.
ELSE.
WRITE : 'Download fail.'.
ENDIF.
ENDFORM. " GOS_DOWNLOAD
4、GOS 附件读取
(以采购订单为例)
PARAMETERS:p_ebeln TYPE ekko-ebeln.
DATA:lv_logical_system LIKE bapibds01-log_system,
classname LIKE bapibds01-classname,
gos_objkey LIKE swotobjid-objkey,
lt_gos_connections LIKE bdn_con OCCURS 1 WITH HEADER LINE.
DATA:lv_id TYPE sofolenti1-doc_id,
ls_doc_data TYPE sofolenti1,
lt_object_header TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
lt_object_content TYPE STANDARD TABLE OF solisti1 WITH HEADER LINE,
lt_hex TYPE STANDARD TABLE OF solix WITH HEADER LINE.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = lv_logical_system
EXCEPTIONS
own_lv_logical_system_not_defined = 1
OTHERS = 2.
.
gos_objkey = p_ebeln. "采购订单
CALL FUNCTION 'BDS_GOS_CONNECTIONS_GET'
EXPORTING
logical_system = lv_logical_system
classname = 'BUS2012' "用来标识采购订单
objkey = gos_objkey
client = sy-mandt
TABLES
gos_connections = lt_gos_connections
EXCEPTIONS
no_objects_found = 1
internal_error = 2
internal_gos_error = 3
OTHERS = 4.
LOOP AT lt_gos_connections.
lv_id = lt_gos_connections-loio_id.
CALL FUNCTION 'SO_DOCUMENT_READ_API1'
EXPORTING
document_id = lv_id
IMPORTING
document_data = ls_doc_data
TABLES
object_header = lt_object_header
object_content = lt_object_content
contents_hex = lt_hex
EXCEPTIONS
document_id_not_exist = 1
operation_no_authorization = 2
x_error = 3
OTHERS = 4.
BREAK-POINT.
ENDLOOP.
5、GOS 列表展示
DATA:is_object TYPE sibflporb,
ip_mode TYPE char1.
is_object-instid = '4100001735'."实例标识
is_object-typeid = 'BUS2012'."对象类型
is_object-catid = 'BO'. "默认
ip_mode = 'D'.
"D仅显示
*E可更改但不提交数据库更新
*C可更改并提交数据库更新
CALL FUNCTION 'GOS_ATTACHMENT_LIST_POPUP'
EXPORTING
is_object = is_object
ip_check_arl = 'X'
ip_check_bds = 'X'
ip_notes = 'X'
ip_attachments = 'X'
ip_urls = 'X'
ip_mode = ip_mode.
* IMPORTING
* EP_SAVE_REQUEST =
* TABLES
* IT_OBJECTS =
参考文章:
【ABAP】 运用GOS技术将报文中的附件(PDF.TXT等) 存至系统附件内