cancel
Showing results for 
Search instead for 
Did you mean: 

CRM Document Flow

Former Member
0 Kudos

I need to create the document flow in CRM to link leased contracts to its SPM. So far, i tried CRM_ORDER_MAINTAIN and BAPI_ACTIVITYCRM_CHANGEMULTI but i still can't create the document flow. I also tried CRM_CREATE_DOC_FLOW. It creates the doc flow but in the wrong 'Role' field.

Any idea how?

PS: I am very new to CRM. 😛

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

I tried to create the doc flow from contract to proposal using BAPI_ACTIVITYCRM_CHANGEMULTI. It returns me an error:

<b>Referenced object type (DOC_FLOW) not allowed</b>

Any idea why and how to solve it?

Here's my source code

*&---------------------------------------------------------------------*
*& BAPI BAPI_ACTIVITYCRM_CHANGEMULTI
*&---------------------------------------------------------------------*
DATA: lt_doc_flow TYPE STANDARD TABLE OF bapibus20001_doc_flow_ins,
      lw_doc_flow LIKE LINE OF lt_doc_flow,

      lt_obj_save TYPE STANDARD TABLE OF bapibus20001_guid_dis,
      lw_obj_save LIKE LINE OF lt_obj_save,

      lt_ret TYPE STANDARD TABLE OF bapiret2,
      lw_ret LIKE LINE OF lt_ret,

      lt_save_obj TYPE STANDARD TABLE OF bapibus20001_object_id,
      lw_save_obj LIKE LINE OF lt_save_obj,

      lt_input_fields TYPE STANDARD TABLE OF bapibus20001_input_fields,
      lw_input_fields LIKE LINE OF lt_input_fields.

CONSTANTS: gc_guid_con TYPE crmt_object_guid_c VALUE 'AD1273F310374647A58AFCD89D4423A7',"3600000010
           gc_guid_pro TYPE crmt_object_guid_c VALUE '10FF1E11CE542B46A70C5FDF9E61AEF7'."1000000157

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'REF_GUID'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'OBJKEY_A'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'OBJTYPE_A'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'OBJKEY_B'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'OBJTYPE_B'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'VONA_KIND'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'RELTYPE'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'BREL_KIND'.
APPEND lw_input_fields TO lt_input_fields.

lw_input_fields-REF_GUID     = gc_guid_con.
lw_input_fields-objectname   = 'DOC_FLOW'.
lw_input_fields-fieldname    = 'BREL_MODE'.
APPEND lw_input_fields TO lt_input_fields.

lw_doc_flow-ref_guid  = gc_guid_con.
lw_doc_flow-objkey_a  = gc_guid_pro.
lw_doc_flow-objtype_a = 'BUS2000114'.
lw_doc_flow-objkey_b  = gc_guid_con.
lw_doc_flow-objtype_b = 'BUS2000114'.
lw_doc_flow-vona_kind = 'A'.
lw_doc_flow-reltype   = 'VONA'.
lw_doc_flow-brel_kind = 'A'.
lw_doc_flow-brel_mode = gc_mode-create.

APPEND lw_doc_flow TO lt_doc_flow.

CALL FUNCTION 'BAPI_ACTIVITYCRM_CHANGEMULTI'
  TABLES
    input_fields  = lt_input_fields
    document_flow = lt_doc_flow
    return        = lt_ret.

IF sy-subrc EQ 0.
  WRITE: / 'Executed: BAPI_ACTIVITYCRM_CHANGEMULTI'.

  LOOP AT lt_ret INTO lw_ret.
    WRITE: / 'Type   : ', lw_ret-type,
           / 'Message: ', lw_ret-message,
           / 'Number : ', lw_ret-number.
  ENDLOOP.

  ULINE.
ENDIF.

lw_obj_save-guid = gc_guid_con.
lw_obj_save-object_type = 'BUS2000114'.

APPEND lw_obj_save TO lt_obj_save.

CALL FUNCTION 'BAPI_ACTIVITYCRM_SAVE'
  TABLES
    objects_to_save = lt_obj_save
    saved_objects   = lt_save_obj.

IF sy-subrc EQ 0.
  WRITE: / 'Executed: BAPI_ACTIVITYCRM_SAVE'.

  LOOP AT lt_save_obj INTO lw_save_obj.
    WRITE: / 'GUID    : ', lw_save_obj-guid,
           / 'Trans ID: ', lw_save_obj-object_id.
  ENDLOOP.

  ULINE.
ENDIF.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

IF sy-subrc EQ 0.
  WRITE: / 'Executed: BAPI_TRANSACTION_COMMIT'.

  ULINE.
ENDIF.

gregorw
Active Contributor
0 Kudos

Hello,

I've got exactly the same error when I try to create a Document Flow between two activities. Have you solved your problem in the meantime?

Regards

Gregor

Former Member
0 Kudos

Hi Gregor,

I managed to create the doc flow but i am still facing some problem. My current problem is:

If i create doc flow, i can't have any item. If i have item, i can't create the doc flow.

As for how i create the doc flow, i used a function module called CRM_COPY_PROCESS_PREPARE to get the doc flow, then pass it to CRM_ORDER_MAINTAIN to be created.

You can refer to the program CRM_TEST_ORDER_MAINTAIN_LEAS for some example.

gregorw
Active Contributor
0 Kudos

Hello,

I found a solution using the following Code. I've sucessfully created a Document Flow between two Activities:

REPORT  z_gw_create_follow_up_order.

PARAMETERS: lv_id_a TYPE crmt_object_id OBLIGATORY,
            lv_id_b TYPE crmt_object_id OBLIGATORY.

DATA: guids TYPE crmt_object_guid_tab,
      guid_a LIKE LINE OF guids,
      guid_b LIKE LINE OF guids.
*
* Read GUID for Activity A
*
CALL FUNCTION 'CRM_ORDERADM_H_GUID_GET_DB'
  EXPORTING
    iv_object_id           = lv_id_a
  IMPORTING
    et_guid                = guids.

READ TABLE guids INTO guid_a INDEX 1.

REFRESH: guids.
*
* Read GUID for Activity B
*
CALL FUNCTION 'CRM_ORDERADM_H_GUID_GET_DB'
  EXPORTING
    iv_object_id           = lv_id_b
  IMPORTING
    et_guid                = guids.

READ TABLE guids INTO guid_b INDEX 1.

DATA: it_activity_h TYPE crmt_activity_h_wrkt,
      ls_activity_h LIKE LINE OF it_activity_h,
      it_requested_objects TYPE crmt_object_name_tab,
      ls_requested_objects LIKE LINE OF it_requested_objects,
      it_orderadm_h TYPE crmt_orderadm_h_wrkt,
      ls_orderadm_h LIKE LINE OF it_orderadm_h,
      it_doc_flow TYPE crmt_doc_flow_wrkt,
      ls_doc_flow LIKE LINE OF it_doc_flow,
      it_header_guid TYPE crmt_object_guid_tab,
      ls_header_guid LIKE LINE OF it_header_guid.

* Append GUID_A to Header GUID Table
APPEND guid_a TO it_header_guid.
* What should we read
ls_requested_objects = 'ACTIVITY_H'.
APPEND ls_requested_objects TO it_requested_objects.
ls_requested_objects = 'DOC_FLOW'.
APPEND ls_requested_objects TO it_requested_objects.
*
* Read Activity A
*
CALL FUNCTION 'CRM_ORDER_READ'
  EXPORTING
    it_header_guid                = it_header_guid
    it_requested_objects          = it_requested_objects
  IMPORTING
    et_orderadm_h                 = it_orderadm_h
    et_activity_h                 = it_activity_h
    et_doc_flow                   = it_doc_flow.

DATA: it_activity_h_comt TYPE crmt_activity_h_comt,
      ls_activity_h_comt LIKE LINE OF it_activity_h_comt,
      ct_doc_flow TYPE crmt_doc_flow_comt,
      ls_doc_flow_comt LIKE LINE OF ct_doc_flow,
      ref_guid TYPE guid_16,
      lt_doc_link TYPE crmt_doc_flow_extdt,
      ls_doc_link LIKE LINE OF lt_doc_link,
      ct_input_fields TYPE crmt_input_field_tab,
      ls_input_field TYPE crmt_input_field,
      ls_input_field_names TYPE crmt_input_field_names,
      log_handle TYPE balloghndl.

LOOP AT it_activity_h INTO ls_activity_h.
  MOVE-CORRESPONDING ls_activity_h TO ls_activity_h_comt.
  APPEND ls_activity_h_comt TO it_activity_h_comt.
ENDLOOP.

*
* Fill DOC_FLOW Structure
*
ls_doc_link-objkey_a = guid_a.
ls_doc_link-objtype_a  = 'BUS2000126'.
ls_doc_link-objkey_b = guid_b.
ls_doc_link-objtype_b  = 'BUS2000126'.
ls_doc_link-vona_kind = 'A'.
ls_doc_link-reltype = 'VONA'.
ls_doc_link-brel_kind = 'A'.
APPEND ls_doc_link TO lt_doc_link.

CLEAR: ls_doc_flow_comt.

ls_doc_flow_comt-ref_guid = guid_a.
ls_doc_flow_comt-ref_kind = 'A'.
ls_doc_flow_comt-doc_link[] = lt_doc_link.
APPEND ls_doc_flow_comt TO ct_doc_flow.

*
* Fill INPUT_FIELDS which indicate what Values where changed
* and had to be updated
*
ls_input_field_names-fieldname = 'OBJKEY_A'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname  = 'OBJTYPE_A'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname  = 'OBJKEY_B'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname  = 'OBJTYPE_B'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname  = 'VONA_KIND'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname  = 'RELTYPE'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname  = 'BREL_KIND'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'BREL_MODE'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'RELATIONID'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'RELATION_HANDLE'.
INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field-objectname = 'DOC_FLOW'.
ls_input_field-ref_guid = guid_a.
ls_input_field-ref_kind = 'A'.
INSERT ls_input_field INTO TABLE ct_input_fields.
*
* Update Document Flow
*
CALL FUNCTION 'CRM_ORDER_MAINTAIN'
  CHANGING
   ct_input_fields               = ct_input_fields
   cv_log_handle                 = log_handle
    ct_doc_flow                  = ct_doc_flow
 EXCEPTIONS
   error_occurred                = 1
   document_locked               = 2
   no_change_allowed             = 3
   no_authority                  = 4
   OTHERS                        = 5
          .
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

DATA: it_saved_objects TYPE crmt_return_objects.
*
* Save Changes
*
CALL FUNCTION 'CRM_ORDER_SAVE'
  EXPORTING
    it_objects_to_save         = it_header_guid
    IV_UPDATE_TASK_LOCAL       = 'X'
    IV_SAVE_FRAME_LOG          = 'X'
  IMPORTING
    et_saved_objects           = it_saved_objects.

IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


DATA: lt_return TYPE TABLE OF bapiret2,
      ls_return LIKE LINE OF lt_return.
*
* Commit Changes
*
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  EXPORTING
    wait   = 'X'
  IMPORTING
    return = ls_return.

WRITE: / ls_return-message.

*
* Read Error Messages
*
IF NOT log_handle IS INITIAL.
  DATA: is_msg_handle TYPE  balmsghndl,
        es_info TYPE  crmt_msg_info,
        es_msg  TYPE  bal_s_msg,
        ev_ref_object TYPE  crmt_ref_obj_text.

  is_msg_handle-log_handle = log_handle.

  CALL FUNCTION 'CRM_MESSAGES_GET_MSG_INFO'
    EXPORTING
      is_msg_handle                 = is_msg_handle
      iv_get_caller_name            = 'X'
   IMPORTING
     es_info                       = es_info
     es_msg                        = es_msg
     ev_ref_object                 = ev_ref_object.

ENDIF.

Best regards

Gregor

Former Member
0 Kudos

Hi Gregor,

After you created the doc flow, for example: from activity A to activity B. Are you able to create any item in activity B?

Regards,

Tau Ming

gregorw
Active Contributor
0 Kudos

Hello Tau Ming,

if the activity B is a CRM Document this should be possible.

Regards

Gregor

Former Member
0 Kudos

hi gregor wolf ,

i tried the same code but unable to create a link .i used same code as urs but could not suceed can u suggest?

code is as follows.

PARAMETERS: lv_id_a TYPE crmt_object_id OBLIGATORY,

lv_id_b TYPE crmt_object_id OBLIGATORY.

DATA: guids TYPE crmt_object_guid_tab,

guid_a LIKE LINE OF guids,

guid_b LIKE LINE OF guids.

  • * Read GUID for Activity A *

CALL FUNCTION 'CRM_ORDERADM_H_GUID_GET_DB'

EXPORTING

iv_object_id = lv_id_a

IMPORTING

et_guid = guids.

READ TABLE guids INTO guid_a INDEX 1.

REFRESH: guids.

  • * Read GUID for Activity B *

CALL FUNCTION 'CRM_ORDERADM_H_GUID_GET_DB'

EXPORTING

iv_object_id = lv_id_b

IMPORTING

et_guid = guids.

READ TABLE guids INTO guid_b INDEX 1.

DATA: it_activity_h TYPE crmt_activity_h_wrkt,

ls_activity_h LIKE LINE OF it_activity_h,

it_requested_objects TYPE crmt_object_name_tab,

ls_requested_objects LIKE LINE OF it_requested_objects,

it_orderadm_h TYPE crmt_orderadm_h_wrkt,

ls_orderadm_h LIKE LINE OF it_orderadm_h,

it_doc_flow TYPE crmt_doc_flow_wrkt,

ls_doc_flow LIKE LINE OF it_doc_flow,

it_header_guid TYPE crmt_object_guid_tab,

ls_header_guid LIKE LINE OF it_header_guid.

  • Append GUID_A to Header GUID Table

APPEND guid_a TO it_header_guid.

  • What should we read

ls_requested_objects = 'ACTIVITY_H'.

APPEND ls_requested_objects TO it_requested_objects.

ls_requested_objects = 'DOC_FLOW'.

APPEND ls_requested_objects TO it_requested_objects.

  • * Read Activity A *

CALL FUNCTION 'CRM_ORDER_READ'

EXPORTING

it_header_guid = it_header_guid

it_requested_objects = it_requested_objects

IMPORTING

et_orderadm_h = it_orderadm_h

et_activity_h = it_activity_h

et_doc_flow = it_doc_flow.

DATA: it_activity_h_comt TYPE crmt_activity_h_comt,

ls_activity_h_comt LIKE LINE OF it_activity_h_comt,

ct_doc_flow TYPE crmt_doc_flow_comt,

ls_doc_flow_comt LIKE LINE OF ct_doc_flow,

ref_guid TYPE guid_16,

lt_doc_link TYPE crmt_doc_flow_extdt,

ls_doc_link LIKE LINE OF lt_doc_link,

ct_input_fields TYPE crmt_input_field_tab,

ls_input_field TYPE crmt_input_field,

ls_input_field_names TYPE crmt_input_field_names,

log_handle TYPE balloghndl.

LOOP AT it_activity_h INTO ls_activity_h.

MOVE-CORRESPONDING ls_activity_h TO ls_activity_h_comt.

APPEND ls_activity_h_comt TO it_activity_h_comt.

ENDLOOP.

  • * Fill DOC_FLOW Structure *

ls_doc_link-objkey_a = guid_a.

ls_doc_link-objtype_a = 'BUS2000126'.

ls_doc_link-objkey_b = guid_b.

ls_doc_link-objtype_b = 'BUS2000111'.

ls_doc_link-vona_kind = 'A'.

ls_doc_link-reltype = 'VONA'.

ls_doc_link-brel_kind = 'A'.

APPEND ls_doc_link TO lt_doc_link.

CLEAR: ls_doc_flow_comt.

ls_doc_flow_comt-ref_guid = guid_a.

ls_doc_flow_comt-ref_kind = 'A'.

ls_doc_flow_comt-doc_link[] = lt_doc_link.

APPEND ls_doc_flow_comt TO ct_doc_flow.

  • * Fill INPUT_FIELDS which indicate what Values where changed * and had to be updated *

ls_input_field_names-fieldname = 'OBJKEY_A'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'OBJTYPE_A'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'OBJKEY_B'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'OBJTYPE_B'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'VONA_KIND'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'RELTYPE'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'BREL_KIND'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'BREL_MODE'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'RELATIONID'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field_names-fieldname = 'RELATION_HANDLE'.

INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.

ls_input_field-objectname = 'DOC_FLOW'.

ls_input_field-ref_guid = guid_a.

ls_input_field-ref_kind = 'A'.

INSERT ls_input_field INTO TABLE ct_input_fields.

  • * Update Document Flow *

CALL FUNCTION 'CRM_ORDER_MAINTAIN'

CHANGING

ct_input_fields = ct_input_fields

cv_log_handle = log_handle

ct_doc_flow = ct_doc_flow

EXCEPTIONS

error_occurred = 1

document_locked = 2

no_change_allowed = 3

no_authority = 4

OTHERS = 5.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

DATA: it_saved_objects TYPE crmt_return_objects.

  • * Save Changes *

CALL FUNCTION 'CRM_ORDER_SAVE'

EXPORTING

it_objects_to_save = it_header_guid

IV_UPDATE_TASK_LOCAL = 'X'

IV_SAVE_FRAME_LOG = 'X'

IMPORTING

et_saved_objects = it_saved_objects.

IF sy-subrc <> 0.

  • MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF.

DATA: lt_return TYPE TABLE OF bapiret2,

ls_return LIKE LINE OF lt_return.

  • * Commit Changes *

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

EXPORTING

wait = 'X'

IMPORTING

return = ls_return.

WRITE: / ls_return-message.

  • * Read Error Messages *

IF NOT log_handle IS INITIAL.

DATA: is_msg_handle TYPE balmsghndl,

es_info TYPE crmt_msg_info,

es_msg TYPE bal_s_msg,

ev_ref_object TYPE crmt_ref_obj_text.

is_msg_handle-log_handle = log_handle.

CALL FUNCTION 'CRM_MESSAGES_GET_MSG_INFO'

EXPORTING

is_msg_handle = is_msg_handle

iv_get_caller_name = 'X'

IMPORTING

es_info = es_info

es_msg = es_msg

ev_ref_object = ev_ref_object.

ENDIF.

Former Member
0 Kudos

Just want to reformat code from Gregor Wolf. Credit goes to him (part 1)

REPORT z_gw_create_follow_up_order.
PARAMETERS:
lv_id_a TYPE crmt_object_id OBLIGATORY,
lv_id_b TYPE crmt_object_id OBLIGATORY.
DATA: guids TYPE crmt_object_guid_tab,
      guid_a LIKE LINE OF guids, guid_b LIKE LINE OF guids.
* * Read GUID for Activity A *
CALL FUNCTION 'CRM_ORDERADM_H_GUID_GET_DB'
  EXPORTING
    iv_object_id = lv_id_a
  IMPORTING
    et_guid      = guids.
READ TABLE guids INTO guid_a INDEX 1. REFRESH: guids.
* * Read GUID for Activity B *
CALL FUNCTION 'CRM_ORDERADM_H_GUID_GET_DB'
  EXPORTING
    iv_object_id = lv_id_b
  IMPORTING
    et_guid      = guids.
READ TABLE guids INTO guid_b INDEX 1.
DATA: it_activity_h TYPE crmt_activity_h_wrkt,
      ls_activity_h LIKE LINE OF it_activity_h,
      it_requested_objects TYPE crmt_object_name_tab,
      ls_requested_objects LIKE LINE OF it_requested_objects,
      it_orderadm_h TYPE crmt_orderadm_h_wrkt,
      ls_orderadm_h LIKE LINE OF it_orderadm_h,
      it_doc_flow TYPE crmt_doc_flow_wrkt,
      ls_doc_flow LIKE LINE OF it_doc_flow,
      it_header_guid TYPE crmt_object_guid_tab, ls_header_guid LIKE LINE OF it_header_guid.
* Append GUID_A to Header GUID Table
APPEND guid_a TO it_header_guid.
* What should we read
ls_requested_objects = 'ACTIVITY_H'. APPEND ls_requested_objects TO it_requested_objects.
ls_requested_objects = 'DOC_FLOW'. APPEND ls_requested_objects TO it_requested_objects.
* * Read Activity A *
CALL FUNCTION 'CRM_ORDER_READ'
  EXPORTING
    it_header_guid       = it_header_guid
    it_requested_objects = it_requested_objects
  IMPORTING
    et_orderadm_h        = it_orderadm_h
    et_activity_h        = it_activity_h
    et_doc_flow          = it_doc_flow.
DATA: it_activity_h_comt TYPE crmt_activity_h_comt,
      ls_activity_h_comt LIKE LINE OF it_activity_h_comt,
      ct_doc_flow TYPE crmt_doc_flow_comt,
      ls_doc_flow_comt LIKE LINE OF ct_doc_flow,
      ref_guid TYPE guid_16,
      lt_doc_link TYPE crmt_doc_flow_extdt,
      ls_doc_link LIKE LINE OF lt_doc_link,
      ct_input_fields TYPE crmt_input_field_tab,
      ls_input_field TYPE crmt_input_field,
      ls_input_field_names TYPE crmt_input_field_names,
      log_handle TYPE balloghndl.
LOOP AT it_activity_h INTO ls_activity_h.
  MOVE-CORRESPONDING ls_activity_h TO ls_activity_h_comt.
  APPEND ls_activity_h_comt TO it_activity_h_comt.
ENDLOOP.
* * Fill DOC_FLOW Structure *
ls_doc_link-objkey_a = guid_a. ls_doc_link-objtype_a = 'BUS2000126'.
ls_doc_link-objkey_b = guid_b. ls_doc_link-objtype_b = 'BUS2000126'.
ls_doc_link-vona_kind = 'A'. ls_doc_link-reltype = 'VONA'.
ls_doc_link-brel_kind = 'A'.
APPEND ls_doc_link TO lt_doc_link.
CLEAR: ls_doc_flow_comt. ls_doc_flow_comt-ref_guid = guid_a.
ls_doc_flow_comt-ref_kind = 'A'.
ls_doc_flow_comt-doc_link[] = lt_doc_link.
APPEND ls_doc_flow_comt TO ct_doc_flow.
* * Fill INPUT_FIELDS which indicate what Values where changed
* and had to be updated *
ls_input_field_names-fieldname = 'OBJKEY_A'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'OBJTYPE_A'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'OBJKEY_B'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'OBJTYPE_B'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'VONA_KIND'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'RELTYPE'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'BREL_KIND'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'BREL_MODE'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'RELATIONID'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field_names-fieldname = 'RELATION_HANDLE'. INSERT ls_input_field_names INTO TABLE ls_input_field-field_names.
ls_input_field-objectname = 'DOC_FLOW'. ls_input_field-ref_guid = guid_a. ls_input_field-ref_kind = 'A'.
INSERT ls_input_field INTO TABLE ct_input_fields.
* * Update Document Flow *
CALL FUNCTION 'CRM_ORDER_MAINTAIN'
  CHANGING
    ct_input_fields   = ct_input_fields
    cv_log_handle     = log_handle
    ct_doc_flow       = ct_doc_flow
  EXCEPTIONS
    error_occurred    = 1
    document_locked   = 2
    no_change_allowed = 3
    no_authority      = 4
    OTHERS            = 5.
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Edited by: The Agus Santoso on Sep 26, 2011 7:26 AM

Former Member
0 Kudos

Part 2 :


DATA: it_saved_objects TYPE crmt_return_objects.
* * Save Changes *
CALL FUNCTION 'CRM_ORDER_SAVE'
  EXPORTING
    it_objects_to_save   = it_header_guid
    IV_UPDATE_TASK_LOCAL = 'X'
    IV_SAVE_FRAME_LOG    = 'X'
  IMPORTING
    et_saved_objects     = it_saved_objects.
IF sy-subrc NE 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. 
ENDIF.
  DATA: lt_return TYPE TABLE OF bapiret2,
        ls_return LIKE LINE OF lt_return.
* * Commit Changes *
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait   = 'X'
    IMPORTING
      return = ls_return.
  WRITE: / ls_return-message.
* * Read Error Messages *
  IF NOT log_handle IS INITIAL.
    DATA: is_msg_handle TYPE balmsghndl,
          es_info TYPE crmt_msg_info,
          es_msg TYPE bal_s_msg,
          ev_ref_object TYPE crmt_ref_obj_text.
    is_msg_handle-log_handle = log_handle.
    CALL FUNCTION 'CRM_MESSAGES_GET_MSG_INFO'
      EXPORTING
        is_msg_handle      = is_msg_handle
        iv_get_caller_name = 'X'
      IMPORTING
        es_info            = es_info
        es_msg             = es_msg
        ev_ref_object      = ev_ref_object.
  ENDIF.

Edited by: The Agus Santoso on Sep 26, 2011 8:17 AM

Answers (2)

Answers (2)

Former Member
0 Kudos

Hi ASM,

Thanks for your reply. Unfortunately, i am still unable to create the document flow.

My scenario:

I created a proposal and contract beforehand. Now i need to create a document flow to link the contract to the proposal.

Below are my codes using the FM proposed by you, any idea what's wrong with it?:

*&---------------------------------------------------------------------*
*& FM CRMXIF_ORDER_SAVE
*&---------------------------------------------------------------------*

DATA: lt_data             TYPE crmxif_bustrans_t,
      lw_data             LIKE LINE OF lt_data,
      lw_doc_flow         TYPE crmxif_doc_flow_xt,
      lw_doc_flow_data    TYPE crmxif_doc_flow,
      lw_doc_flow_data_if TYPE crmxif_doc_flow_f,
      lw_doc_flow_datax   TYPE crmxif_bt_update,

      lt_ret              TYPE bapiretm,
      lw_ret              LIKE LINE OF lt_ret,
      lt_obj_msg          TYPE bapiretct,
      lw_obj_msg          LIKE LINE OF lt_obj_msg.

lw_doc_flow_data-relation_type      = 'VONA'.
lw_doc_flow_data-relobj_roletype    = 'VORGAENGER'.
lw_doc_flow_data-relobj_objkey      = <Proposal GUID>.
lw_doc_flow_data-relobj_type        = 'BUS2000114'.
lw_doc_flow_data-relobj_object_id   = <Proposal ID>.
lw_doc_flow_data-relation_type_attr = 'A'.
lw_doc_flow_data-object_task        = 'I'.

lw_doc_flow_data_if-relation_type      = 'X'.
lw_doc_flow_data_if-relobj_roletype    = 'X'.
lw_doc_flow_data_if-relobj_objkey      = 'X'.
lw_doc_flow_data_if-relobj_type        = 'X'.
lw_doc_flow_data_if-relobj_object_id   = 'X'.
lw_doc_flow_data_if-relation_type_attr = 'X'.

lw_doc_flow_data-input_fields = lw_doc_flow_data_if.

lw_doc_flow_datax = 'X'.

APPEND lw_doc_flow_data TO lw_doc_flow-data.
lw_doc_flow-datax = lw_doc_flow_datax.
lw_data-doc_flow  = lw_doc_flow.

lw_data-object_guid = <Contract GUID>.
lw_data-object_id   = <Contract ID>.

APPEND lw_data TO lt_data.

CALL FUNCTION 'CRMXIF_ORDER_SAVE'
  EXPORTING
    data   = lt_data
  IMPORTING
    return = lt_ret.

COMMIT WORK.

Former Member
0 Kudos

I did this with de function module CRMXIF_ORDER_SAVE, you have to fill de structure doc_flow :

RELOBJ_OBJKEY = '<guid of the father>'.

RELATION_TYPE = 'VONA'.

RELOBJ_ROLETYPE = 'VORGAENGER'.

RELOBJ_TYPE = '<object_type of the father>'.

RELOBJ_OBJECT_ID = '<object_id of the father>'

RELATION_TYPE_ATTR = 'A'.

OBJECT_TASK = 'I'.

And the structure input_fields putting 'x' in the fields that you fill.