1 工作流中挂附件的原理
1.1 工作流中挂附件原理解析
工作流中挂附件可以通过将附件挂在流程ID上实现,相关函数为SAP_WAPI_ATTACHMENT_ADD
CALL FUNCTION 'SAP_WAPI_ATTACHMENT_ADD'
EXPORTING
workitem_id =
* ATT_HEADER =
* ATT_TXT =
* ATT_BIN =
* DOCUMENT_OWNER = SY-UNAME
* LANGUAGE = SY-LANGU
* DO_COMMIT = 'X'
* IMPORTING
* RETURN_CODE =
* ATT_ID =
* TABLES
* MESSAGE_LINES =
* MESSAGE_STRUCT =
.
其中主要输入参数:
WORKITEM_ID:Workitem ID(工作项ID)
ATT_HEADER:Header Entry For Attachment(附件文件头类型)
ATT_BIN:Binary Content For attachment(附件文件二进制内容)
挂附件的实质实际上是把附件文件转换为对应的二进制文件,然后把附件挂到对应的工作项ID上,实现在流程中的流转。
1.2 获取工作流ID
获取工作流ID的方法有两种:
(1)通过函数取workitme的ID
SAP_WAPI_WORKITEMS_TO_OBJECT
CALL FUNCTION 'SAP_WAPI_WORKITEMS_TO_OBJECT'
* EXPORTING
* OBJECT_POR =
* OBJTYPE =
* OBJKEY =
* TOP_LEVEL_ITEMS = 'X'
* SELECTION_STATUS_VARIANT = 0001
* TIME =
* TEXT = 'X'
* OUTPUT_ONLY_TOP_LEVEL = ' '
* LANGUAGE = SY-LANGU
* DETERMINE_TASK_FILTER = 'X'
* REMOVED_OBJECTS = ' '
* IMPORTING
* RETURN_CODE =
TABLES
* TASK_FILTER =
worklist =
* MESSAGE_LINES =
* MESSAGE_STRUCT =
.
其中主要输入参数:
OBJTYPE:对象类型(对象名称)
OBJKEY:Object Key(objkey)
主要输出参数:
worklist :Workflow inbox(工作项表,参照结构SWR_WIHDR:工作项结构)
SORT worklist BY wi_id DESCENDING.
READ TABLE worklist INDEX 1.
获取最新的worklist-wi_id.
(2)在任务中获取本任务的workitem的ID号
原理是:获取任务的对象“_Workitem”,再获取对象的objkey从而获取到本任务的workitem的ID。
参考代码如下:
DATA: zobject TYPE swc_object.
DATA l_objkey TYPE swo_typeid.
swc_get_element container '_Workitem' zobject.
swc_get_object_key zobject l_objkey.
l_objkey即是本任务workitem的ID.
1.3 文件转换为二进制文件
文件转换为二进制文件可以通过函数实现。
*定义二进制输出内表
data:bin_tab type x occurs 0 with header line.
data:att_bin type xstring,
att_bin_str type string,
l_str type string.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename =
* FILETYPE = 'ASC'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
tables
data_tab = bin_tab
* EXCEPTIONS
* FILE_OPEN_ERROR = 1
* FILE_READ_ERROR = 2
* NO_BATCH = 3
* GUI_REFUSE_FILETRANSFER = 4
* INVALID_TYPE = 5
* NO_AUTHORITY = 6
* UNKNOWN_ERROR = 7
* BAD_DATA_FORMAT = 8
* HEADER_NOT_ALLOWED = 9
* SEPARATOR_NOT_ALLOWED = 10
* HEADER_TOO_LONG = 11
* UNKNOWN_DP_ERROR = 12
* ACCESS_DENIED = 13
* DP_OUT_OF_MEMORY = 14
* DISK_FULL = 15
* DP_TIMEOUT = 16
* OTHERS = 17
.
其中主要输入参数:
filename:Name of file(文件路径)
FILETYPE:File Type (ASC or BIN)(文件类型,这里转换为二进制我们用BIN类型)
主要输出参数:
data_tab :Transfer table for file contents(文件内容表)
loop at bin_tab.
l_str = bin_tab.
concatenate att_bin_str l_str into att_bin_str.
endloop.
1.4 二进制文件的存储
在流程中挂附件有时需要把附件以二进制的形式存储起来,下面介绍如何把二进制文件存储到客制化表中。
如下客制化表:
其中YSTRING用于存放二进制文件的内容。可以把ystring = att_bin_str.然后保存到客制化表中。
2 流程中挂附件
2.1 直接发邮件的流程
有的流程是触发后直接发生邮件且要求邮件中带有附件。邮件中挂附件通常是在发送邮件之前定制一个后台待办,把附件绑定到该待办上通过容器传送到邮件中。
前文已经提到有两种方法都可以获取到当前的后台待办的WorkitemID,假设这里已经获取到该待办的WorkitemID。下面的函数SAP_WAPI_ATTACHMENT_ADD可以实现把附件挂到待办中。示例代码如下:
types:begin of ty_test ,
yfi_no type yfico_no,
ytype type swr_fileext,
yname type swr_filename,
ystring type xstring,
end of ty_test.
data:wa_test type ty_test.
data:it_test type table of ty_test.
data: att_header type swr_att_header.
data: att_bin type xstring.
*-获取文件相关信息
select ytype yname ystring
into corresponding fields of table it_test
from zficow09
where yfi_no = object-key-yfi_no.
att_bin = wa_test-ystring.
att_header-file_type = 'B'.
att_header-file_name = wa_test-yname.
att_header-file_extension = wa_test-ytype.
att_header-language = 1.
*-把附件挂到待办中
CALL FUNCTION 'SAP_WAPI_ATTACHMENT_ADD'
EXPORTING
workitem_id = workitem_id
ATT_HEADER = att_header
* ATT_TXT =
ATT_BIN = att_bin
* DOCUMENT_OWNER = SY-UNAME
* LANGUAGE = SY-LANGU
* DO_COMMIT = 'X'
* IMPORTING
* RETURN_CODE =
* ATT_ID =
* TABLES
* MESSAGE_LINES =
* MESSAGE_STRUCT =
.
然后通过容器传到工作流的attachme中,如图:
然后传到邮件中
2.2 通过前台待办挂邮件附件
有时要求在流程中间挂入附件。通常这种情况是一个前台待办,然后指定需要挂入的附件。这种情况相对来说是比较容易的,只要应用以上的方法把附件转换为二进制文件,然后通过函数挂入到当前的待办WorkitemID上即可。此处不再累述。
3 流程触发时挂附件
流程触发时挂附件有两种方法可以实现
3.1 在流程触发事件中带参数
这种方法即是把文件名,文件类型及文件的二进制内容作为参数传入工作流,然后可以通过后台待办实现附件的添加,不过当附件的二进制文件内容比较大时。这种方法就不可行了。所以,这种方法只是参考方法。
3.2 在流程触发后挂待办
这种情况要求流程中至少有一个前台待办,原因是,当在待办workitemID上挂待办时,前提条件是该工作项没有结束,否则即便是附件已经挂到该待办上,该待办也已结束,无法实现通过该待办把附件传递到流程上。所以,往往该流程要至少有一个前台待办,以方便实现挂附件到该待办上。
这种场景挂待办的原理如下:在流程触发后,把待办挂到流程中最新的workitemID上(该workitemID是一个前台待办的ID),然后通过该待办把附件传入工作流。
4 注意事项
(1) 附件文件名为带后缀的全名,否则附件打开时会报错。
(2) 在待办为report或是function,有区别。待办为Report,不能挂在当前待办的workitem上;function可以挂在当前的workitem上。注意,如果当前待办挂附件,则如果后一个待办的代理人还当前挂附件待办的代理人是同一个人则有可能待办也挂不上,这也许是应为待办界面没有退出,某些对象没有释放导致的。具体原因还有待继续确认。