日了,好多代码。。。。COPY别人的,懒得改了
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF16 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form find_kschl_kotabnr_pdet *&---------------------------------------------------------------------* * Determine the condition type and condition table *----------------------------------------------------------------------* FORM find_kschl_kotabnr_pdet TABLES pi_t_keyfig STRUCTURE crm_mktpl_cond_if_keyfig_pdet pe_t_keyfigx STRUCTURE crm_mktpl_cond_if_keyfigx_pdet USING pi_cgen_type TYPE crm_mktpl_cgen_type pi_application TYPE cgpl_application_type pi_crm_mktpl_guid TYPE crm_mktpl_guid CHANGING pe_subrc TYPE sy-subrc. DATA l_t_pdet TYPE TABLE OF crmc_mktpl_pdet. DATA ls_pdet LIKE LINE OF l_t_pdet. DATA lr_mktproject TYPE REF TO cl_crm_mktpl_ol_mktproject. DATA lv_planning_mode TYPE crm_mktpl_planning_mode. lr_mktproject = cl_crm_mktpl_ol_mktprojects=>get_mktproject( iv_guid = pi_crm_mktpl_guid ). IF lr_mktproject is BOUND. lv_planning_mode = lr_mktproject->get_planning_mode( ). ENDIF. IF lv_planning_mode <> cl_crm_mktgs_constants=>planning_mode_ipp. * ------------------ read customizing settings ------------------------* * read customizing settings for condition type and condition table per * condition generation type cl_crm_mktgs_cond_img_access=>read_price_determination( EXPORTING iv_application = pi_application iv_cgen_type = pi_cgen_type IMPORTING et_price_determination = l_t_pdet ). ELSE. * ------------------ read customizing for in memory -------------------* * Dynamic call to a method created in the Add-On system * TODO_MKT_IMP_EHP2: change dynamic call for a direct call CALL METHOD ('CL_CRM_MKTPL_IMP_IMG_ACCESS')=>('READ_PRICE_DETERMINATION') EXPORTING iv_application = pi_application iv_cgen_type = pi_cgen_type IMPORTING et_price_determination = l_t_pdet. ENDIF. SORT l_t_pdet BY key_figure. * -------------- find condition types and condition tables ------------* LOOP AT pi_t_keyfig. READ TABLE l_t_pdet WITH KEY key_figure = pi_t_keyfig-key_figure INTO ls_pdet BINARY SEARCH. IF sy-subrc EQ 0. * build up PE_T_KEYFIGX pe_t_keyfigx = pi_t_keyfig. pe_t_keyfigx-kappl = ls_pdet-kappl. pe_t_keyfigx-kvewe = ls_pdet-kvewe. pe_t_keyfigx-kschl = ls_pdet-kschl. pe_t_keyfigx-kotabnr = ls_pdet-kotabnr. APPEND pe_t_keyfigx. ENDIF. ENDLOOP. * Check: entries in KEYFIGX? IF pe_t_keyfigx[] IS INITIAL. pe_subrc = 1. " -> nothing to do ENDIF. ENDFORM. " find_kschl_kotabnr_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF17 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form read_cond_records_pdet *&---------------------------------------------------------------------* * Read the condition records for price determination *----------------------------------------------------------------------* FORM read_cond_records_pdet TABLES pi_t_keyfigx STRUCTURE crm_mktpl_cond_if_keyfigx_pdet pi_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pi_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx pe_t_condvalues STRUCTURE crm_mktpl_cond_if_condvalues px_t_return STRUCTURE bapiret2 USING pi_crm_mktpl_guid TYPE crm_mktpl_guid pi_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib pi_application TYPE cgpl_application_type CHANGING pe_subrc TYPE sy-subrc. DATA: l_subrc TYPE sy-subrc, l_hlog TYPE balloghndl, l_t_cond_session TYPE TABLE OF crm_mktpl_cond_if_condsession WITH HEADER LINE, l_t_condvalues TYPE TABLE OF crm_mktpl_cond_if_condvalues. * ---- initialize condition session PERFORM init_cond_mnt_pdet TABLES l_t_cond_session pi_t_keyfigx px_t_return CHANGING l_hlog l_subrc. IF NOT l_subrc IS INITIAL. pe_subrc = l_subrc. EXIT. ENDIF. * ---- read condition records * loop at application LOOP AT l_t_cond_session. * loop at key figure LOOP AT pi_t_keyfigx WHERE kappl = l_t_cond_session-kappl. CLEAR l_t_condvalues. " refresh table * determine the condition value PERFORM determine_cond_values TABLES pi_t_product_datx pi_t_prodcat_datx l_t_condvalues px_t_return USING l_t_cond_session l_hlog pi_t_keyfigx pi_s_mkt_attrib pi_application CHANGING l_subrc. IF l_subrc IS INITIAL. * Call BAdI to adjust the condition values PERFORM call_badi_cond_read_after_get TABLES pi_t_product_datx pi_t_prodcat_datx l_t_condvalues px_t_return USING pi_crm_mktpl_guid l_t_cond_session pi_t_keyfigx pi_s_mkt_attrib pi_application CHANGING l_subrc. IF l_subrc IS INITIAL. APPEND LINES OF l_t_condvalues TO pe_t_condvalues. ENDIF. ENDIF. ENDLOOP. ENDLOOP. * ---- add messages from condition log to return table PERFORM add_cond_messages_to_return TABLES px_t_return USING l_hlog. * ---- close condition session PERFORM close_cond_mnt_pdet TABLES l_t_cond_session px_t_return USING l_hlog CHANGING pe_subrc. ENDFORM. " read_cond_records_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF18 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form init_cond_mnt_pdet *&---------------------------------------------------------------------* * Initialize the condition maintenance for reading conditions * for price determination *----------------------------------------------------------------------* FORM init_cond_mnt_pdet TABLES pe_t_cond_session STRUCTURE crm_mktpl_cond_if_condsession pi_t_keyfigx STRUCTURE crm_mktpl_cond_if_keyfigx_pdet px_t_return STRUCTURE bapiret2 CHANGING pe_hlog TYPE balloghndl pe_subrc TYPE sy-subrc. DATA: ls_bal_log TYPE bal_s_log, l_t_keyfigx TYPE TABLE OF crm_mktpl_cond_if_keyfigx_pdet WITH HEADER LINE, lv_prod_cond_maint_group TYPE /sapcnd/maint_group, l_msgtext(72). * initialize application log CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING i_s_log = ls_bal_log IMPORTING e_log_handle = pe_hlog EXCEPTIONS OTHERS = 1. * find all the different applications l_t_keyfigx[] = pi_t_keyfigx[]. SORT l_t_keyfigx BY kappl. DELETE ADJACENT DUPLICATES FROM l_t_keyfigx COMPARING kappl. * initialize the condition maintenance for all different applications LOOP AT l_t_keyfigx WHERE NOT kappl IS INITIAL. * read the customized condition maintenance group for the product master * (we only need this one to read the conditions of the products and it will * save thousands of lines in table GT_T688C if we only load this one; so for * performance reasons (allocated memory) it is really helpful). SELECT SINGLE cond_group FROM comc_pr_cond_grp INTO lv_prod_cond_maint_group WHERE cond_appl = cl_crm_mktgs_cnd_mnt_constants=>kappl_crm. CALL FUNCTION '/SAPCND/MNT_INIT_OW' EXPORTING i_application = l_t_keyfigx-kappl i_hlog = pe_hlog i_groupname = lv_prod_cond_maint_group IMPORTING e_hsession = pe_t_cond_session-session EXCEPTIONS exc_stop_work = 1 exc_rfc = 2 exc_timezone = 3 exc_t688c_f = 4 exc_creating_debug_trace_log = 5 exc_adding_debug_trace_msg = 6 OTHERS = 7. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_INIT_OW PERFORM append_return TABLES px_t_return. * Send message: System has stopped the processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_INIT_OW' INTO l_msgtext. PERFORM append_return TABLES px_t_return. ELSE. pe_t_cond_session-kappl = l_t_keyfigx-kappl. APPEND pe_t_cond_session. * do not discarde non-processable items CALL FUNCTION '/SAPCND/MNT_SET_PROC_MODE_OW' EXPORTING i_hsession = pe_t_cond_session-session EXCEPTIONS OTHERS = 0. ENDIF. ENDLOOP. ENDFORM. " init_cond_mnt_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF19 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form determine_cond_values *&---------------------------------------------------------------------* * Determine the condition values *----------------------------------------------------------------------* FORM determine_cond_values TABLES pi_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pi_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx pe_t_condvalues STRUCTURE crm_mktpl_cond_if_condvalues px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_hlog TYPE balloghndl pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib pi_application TYPE cgpl_application_type CHANGING pe_subrc TYPE sy-subrc. * By default: everything is o.k. CLEAR pe_subrc. * ------- refresh the condition buffer PERFORM clear_cond_buffer_pdet TABLES px_t_return USING pi_s_cond_session pi_hlog CHANGING pe_subrc. CHECK pe_subrc IS INITIAL. * ------ select condition records from db and fill the condition buffer PERFORM fill_cond_buffer_pdet TABLES pi_t_product_datx pi_t_prodcat_datx px_t_return USING pi_s_cond_session pi_s_keyfigx pi_s_mkt_attrib pi_hlog pi_application CHANGING pe_subrc. CHECK pe_subrc IS INITIAL. * ----- fill condition values PERFORM fill_condvalues TABLES pi_t_product_datx pi_t_prodcat_datx pe_t_condvalues px_t_return USING pi_s_cond_session pi_s_keyfigx pi_hlog pi_application CHANGING pe_subrc. CHECK pe_subrc IS INITIAL. * ----- convert currency of the condition values to promotion currency PERFORM conv_curr_condvalues TABLES pe_t_condvalues USING pi_s_mkt_attrib CHANGING pe_subrc. ENDFORM. " determine_cond_values
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF20 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form fill_cond_buffer_pdet *&---------------------------------------------------------------------* * Reading condition records for price determination: * Select data from the database and fill condition buffer *----------------------------------------------------------------------* FORM fill_cond_buffer_pdet TABLES pi_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pi_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib pi_hlog TYPE balloghndl pi_application TYPE cgpl_application_type CHANGING pe_subrc TYPE sy-subrc. DATA: l_t_attrib_value TYPE /sapcnd/t_attrib_value_int, l_s_attrib_value TYPE /sapcnd/attrib_value_int, l_timestamp_from TYPE timestamp, l_timestamp_to TYPE timestamp, l_timezone TYPE sy-zonlo VALUE 'UTC', l_num_selected_records TYPE i, l_t_t681e_s TYPE /sapcnd/t681e_s_t, l_msgtext(72). * by default: everything is ok: CLEAR pe_subrc. * Build table with attributes and values: * ---------- promotion attributes: * sales area: l_s_attrib_value-fieldname = 'SALES_ORG'. l_s_attrib_value-value = pi_s_mkt_attrib-sales_org. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'DIS_CHANNEL'. l_s_attrib_value-value = pi_s_mkt_attrib-dis_channel. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'DIVISION'. l_s_attrib_value-value = pi_s_mkt_attrib-division. APPEND l_s_attrib_value TO l_t_attrib_value. * currency l_s_attrib_value-fieldname = 'CURRENCY'. l_s_attrib_value-value = pi_s_mkt_attrib-currency. APPEND l_s_attrib_value TO l_t_attrib_value. * planning customer (business partner or wholesaler of indirect promotion) l_s_attrib_value-fieldname = 'PARTNER'. l_s_attrib_value-value = pi_s_mkt_attrib-bp_guid. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'SOLD_TO_PARTY'. l_s_attrib_value-value = pi_s_mkt_attrib-bp_guid. APPEND l_s_attrib_value TO l_t_attrib_value. * planning customer (CRM hierarchy or target group owner) l_s_attrib_value-fieldname = 'HIER_NODE_GUID'. l_s_attrib_value-value = pi_s_mkt_attrib-node_guid. APPEND l_s_attrib_value TO l_t_attrib_value. * planning customer (R/3 hierarchy or target group owner) l_s_attrib_value-fieldname = 'HIER_NO_GUID'. l_s_attrib_value-value = pi_s_mkt_attrib-partner_guid. APPEND l_s_attrib_value TO l_t_attrib_value. IF pi_s_mkt_attrib-bp_guid IS INITIAL. l_s_attrib_value-fieldname = 'PARTNER'. l_s_attrib_value-value = pi_s_mkt_attrib-partner_guid. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'SOLD_TO_PARTY'. l_s_attrib_value-value = pi_s_mkt_attrib-partner_guid. APPEND l_s_attrib_value TO l_t_attrib_value. ENDIF. * ---------- product attributes: LOOP AT pi_t_product_datx. PERFORM build_attrib_value_prod_pdet TABLES l_t_attrib_value USING pi_t_product_datx. ENDLOOP. * ---------- product-category attributes: LOOP AT pi_t_prodcat_datx. PERFORM build_attrib_value_pcat_pdet TABLES l_t_attrib_value USING pi_t_prodcat_datx. ENDLOOP. * ------- Remove attribute values which are not part of the condition * ------- table * Determine the fields of the condition table CALL FUNCTION '/SAPCND/CUS_T681E_SEL' EXPORTING i_application = pi_s_cond_session-kappl i_usage = pi_s_keyfigx-kvewe i_cond_table_id = pi_s_keyfigx-kotabnr IMPORTING et_selected_data = l_t_t681e_s. * Check, if attribute is part of the condition table IF NOT l_t_t681e_s IS INITIAL. LOOP AT l_t_attrib_value INTO l_s_attrib_value. READ TABLE l_t_t681e_s WITH KEY fieldname = l_s_attrib_value-fieldname TRANSPORTING NO FIELDS. IF sy-subrc NE 0. DELETE l_t_attrib_value. ENDIF. ENDLOOP. ENDIF. * ------- fields of condition technique l_s_attrib_value-fieldname = 'KAPPL'. l_s_attrib_value-value = pi_s_cond_session-kappl. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'KVEWE'. l_s_attrib_value-value = pi_s_keyfigx-kvewe. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'KSCHL'. l_s_attrib_value-value = pi_s_keyfigx-kschl. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'KOTABNR'. l_s_attrib_value-value = pi_s_keyfigx-kotabnr. APPEND l_s_attrib_value TO l_t_attrib_value. * Call BAdI to adjust the attribute-value tables PERFORM call_badi_cond_read_before_sel TABLES pi_t_product_datx pi_t_prodcat_datx px_t_return USING pi_s_cond_session pi_s_keyfigx pi_s_mkt_attrib pi_application CHANGING l_t_attrib_value pe_subrc. CHECK pe_subrc IS INITIAL. * Select data into condition buffer CALL FUNCTION '/SAPCND/MNT_SELECT_OW' EXPORTING i_hsession = pi_s_cond_session-session i_hlog = pi_hlog i_selection_mode = 'A' i_maintenance_mode = 'C' * IT_ATTRIB_SELECTION_EXT = it_attrib_value_int = l_t_attrib_value IMPORTING * E_NUM_REMAINING_RECORDS = e_num_selected_records = l_num_selected_records * E_NUM_DELETED_RECORDS = * E_RESULT = EXCEPTIONS exc_stop_work = 1 exc_selecting_records = 2 exc_setting_abap_locks = 3 exc_convert_ranges = 4 exc_rfc = 5 exc_external_only = 6 exc_unknown_selection_mode = 7 exc_creating_object_names = 8 exc_locking_attribute = 9 exc_adding_debug_trace_msg = 10 exc_inner_rel_locks = 11 OTHERS = 12. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_SELECT_OW PERFORM append_return TABLES px_t_return. * Send message: System has stopped the processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_SELECT_OW' INTO l_msgtext. PERFORM append_return TABLES px_t_return. ENDIF. IF l_num_selected_records = 0. pe_subrc = 1. ENDIF. ENDFORM. " fill_cond_buffer_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF21 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form fill_condvalues *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM fill_condvalues TABLES pi_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pi_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx pe_t_condvalues STRUCTURE crm_mktpl_cond_if_condvalues px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_hlog TYPE balloghndl pi_application TYPE cgpl_application_type CHANGING pe_subrc TYPE sy-subrc. DATA: lt_working_set TYPE REF TO data, l_s_attrib_value TYPE /sapcnd/attrib_value_int, l_t_attrib_value TYPE /sapcnd/t_attrib_value_int, l_t_condvalues TYPE TABLE OF crm_mktpl_cond_if_condvalues, l_s_product_datx TYPE crm_mktpl_cond_if_product_datx, l_s_prodcat_datx TYPE crm_mktpl_cond_if_prodcat_datx, l_timestamp_from TYPE timestamp, l_timestamp_to TYPE timestamp, l_timezone TYPE sy-zonlo VALUE 'UTC', l_subrc TYPE sy-subrc, l_msgtext(72). * ------- fields of timestamp: * timestamp from: CONVERT DATE pi_s_keyfigx-end_date TIME '000000' INTO TIME STAMP l_timestamp_from TIME ZONE l_timezone. l_s_attrib_value-fieldname = 'TIMESTAMP_FROM'. l_s_attrib_value-value = l_timestamp_from. SHIFT l_s_attrib_value-value LEFT DELETING LEADING space. l_s_attrib_value-operator = 'LE'. APPEND l_s_attrib_value TO l_t_attrib_value. * timestamp to: CONVERT DATE pi_s_keyfigx-start_date TIME '235959' INTO TIME STAMP l_timestamp_to TIME ZONE l_timezone. l_s_attrib_value-fieldname = 'TIMESTAMP_TO'. l_s_attrib_value-value = l_timestamp_to. SHIFT l_s_attrib_value-value LEFT DELETING LEADING space. l_s_attrib_value-operator = 'GE'. APPEND l_s_attrib_value TO l_t_attrib_value. * for the following: only operator = BLANK is allowed CLEAR l_s_attrib_value-operator. * ------- fields of condition technique l_s_attrib_value-fieldname = 'KVEWE'. l_s_attrib_value-value = pi_s_keyfigx-kvewe. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'KSCHL'. l_s_attrib_value-value = pi_s_keyfigx-kschl. APPEND l_s_attrib_value TO l_t_attrib_value. l_s_attrib_value-fieldname = 'KOTABNR'. l_s_attrib_value-value = pi_s_keyfigx-kotabnr. APPEND l_s_attrib_value TO l_t_attrib_value. * retrieve data from the condition buffer CALL FUNCTION '/SAPCND/MNT_GET_WORKING_SET_OW' EXPORTING i_hsession = pi_s_cond_session-session i_hlog = pi_hlog * I_CALL_FIELD_CHECK = ' ' i_suppress_deleted_records = 'X' * IT_ATTRIB_SELECTION_EXT = it_attrib_value_int = l_t_attrib_value IMPORTING et_working_set_int = lt_working_set * ET_WORKING_SET_EXT = * E_RESULT = EXCEPTIONS exc_stop_work = 1 exc_rfc = 2 * exc_conv_java = 3 exc_attr_conv = 4 exc_field_check = 5 exc_updating_working_set = 6 exc_not_int_and_ext = 7 exc_external_only = 8 exc_convert_ranges = 9 exc_creating_object_names = 10 exc_stop_work_badi = 11 exc_implementation_missing = 12 exc_adding_debug_trace_msg = 13 exc_bal_log = 14 OTHERS = 15. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_GET_WORKING_SET_OW PERFORM append_return TABLES px_t_return. * Send message: System has stopped the processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_GET_WORKING_SET_OW' INTO l_msgtext. PERFORM append_return TABLES px_t_return. EXIT. ENDIF. * get data from the condition buffer * ----- products LOOP AT pi_t_product_datx INTO l_s_product_datx. * build table with attributes and values CLEAR l_t_attrib_value. * fields of product PERFORM build_attrib_value_prod_pdet TABLES l_t_attrib_value USING l_s_product_datx. * fill condition values for this product CLEAR l_t_condvalues. PERFORM fill_condvalues_item TABLES l_t_condvalues px_t_return USING pi_s_cond_session lt_working_set l_t_attrib_value l_s_product_datx l_s_prodcat_datx pi_s_keyfigx pi_hlog pi_application CHANGING l_subrc. CHECK l_subrc IS INITIAL. APPEND LINES OF l_t_condvalues TO pe_t_condvalues. ENDLOOP. CLEAR l_s_product_datx. * ----- product categories LOOP AT pi_t_prodcat_datx INTO l_s_prodcat_datx. * build table with attributes and values CLEAR l_t_attrib_value. * fields of product category PERFORM build_attrib_value_pcat_pdet TABLES l_t_attrib_value USING l_s_prodcat_datx. * fill condition values for this product category CLEAR l_t_condvalues. PERFORM fill_condvalues_item TABLES l_t_condvalues px_t_return USING pi_s_cond_session lt_working_set l_t_attrib_value l_s_product_datx l_s_prodcat_datx pi_s_keyfigx pi_hlog pi_application CHANGING l_subrc. CHECK l_subrc IS INITIAL. APPEND LINES OF l_t_condvalues TO pe_t_condvalues. ENDLOOP. ENDFORM. " fill_condvalues
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF22 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form clear_cond_buffer_pdet *&---------------------------------------------------------------------* * Refresh the condition buffer for this session *----------------------------------------------------------------------* FORM clear_cond_buffer_pdet TABLES px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_hlog TYPE balloghndl CHANGING pe_subrc TYPE sy-subrc. DATA l_msgtext(72). CALL FUNCTION '/SAPCND/MNT_CLEAR_OW' EXPORTING i_hsession = pi_s_cond_session-session i_hlog = pi_hlog * IMPORTING * E_RESULT = EXCEPTIONS exc_stop_work = 1 * exc_rfc = 2 exc_releasing_locks = 3 exc_adding_debug_trace_msg = 4 exc_creating_log_handle = 5 OTHERS = 6. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_CLEAR_OW PERFORM append_return TABLES px_t_return. * Send message: System has stopped the processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_CLEAR_OW' INTO l_msgtext. PERFORM append_return TABLES px_t_return. ENDIF. ENDFORM. " clear_cond_buffer_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF23 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form close_cond_mnt_pdet *&---------------------------------------------------------------------* * Close all open condition sessions *----------------------------------------------------------------------* FORM close_cond_mnt_pdet TABLES pi_t_cond_session STRUCTURE crm_mktpl_cond_if_condsession px_t_return STRUCTURE bapiret2 USING pi_hlog TYPE balloghndl CHANGING pe_subrc TYPE sy-subrc. DATA l_msgtext(72). LOOP AT pi_t_cond_session. CALL FUNCTION '/SAPCND/MNT_CLOSE_OW' EXPORTING i_hsession = pi_t_cond_session-session i_hlog = pi_hlog * IMPORTING * E_RESULT = EXCEPTIONS exc_stop_work = 1 exc_rfc = 2 exc_releasing_locks = 3 exc_adding_debug_trace_msg = 4 exc_creating_log_handle = 5 OTHERS = 6. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_CLOSE_OW PERFORM append_return TABLES px_t_return. * Send message: System has stopped the processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_CLOSE_OW' INTO l_msgtext. PERFORM append_return TABLES px_t_return. ENDIF. ENDLOOP. ENDFORM. " close_cond_mnt_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF39 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form add_cond_messages_to_return *&---------------------------------------------------------------------* * Get messages from condition maintenance and append them * to the return table *----------------------------------------------------------------------* FORM add_cond_messages_to_return TABLES px_t_return STRUCTURE bapiret2 USING pi_hlog TYPE balloghndl. DATA: ls_hlog TYPE bal_s_lfil, " filter for log header lr_log_handle TYPE bal_s_logh, " range for handle lt_msg_handle TYPE bal_t_msgh, ls_msg_handle TYPE balmsghndl, ls_msg TYPE bal_s_msg, ls_return TYPE bapiret2. * filter for log handle lr_log_handle-sign = 'I'. lr_log_handle-option = 'EQ'. lr_log_handle-low = pi_hlog. INSERT lr_log_handle INTO TABLE ls_hlog-log_handle. * search the log for messages CALL FUNCTION 'BAL_GLB_SEARCH_MSG' EXPORTING i_s_log_filter = ls_hlog IMPORTING e_t_msg_handle = lt_msg_handle EXCEPTIONS msg_not_found = 1 OTHERS = 2. IF sy-subrc = 1. * no message found ELSEIF sy-subrc <> 0. PERFORM append_return TABLES px_t_return. ELSE. LOOP AT lt_msg_handle INTO ls_msg_handle. * Retrieve messages from the condition log CALL FUNCTION 'BAL_LOG_MSG_READ' EXPORTING i_s_msg_handle = ls_msg_handle IMPORTING e_s_msg = ls_msg EXCEPTIONS log_not_found = 1 msg_not_found = 2 OTHERS = 3. IF sy-subrc <> 0. PERFORM append_return TABLES px_t_return. ELSE. * Abort messages should not be sent back in the application log * Condition Technique returns A messages for Error messages... * Abort message should really abort and not bring back messages... IF ls_msg-msgty = 'A'. ls_msg-msgty = 'E'. ENDIF. * Add message to the return table ls_return-type = ls_msg-msgty. ls_return-id = ls_msg-msgid. ls_return-number = ls_msg-msgno. ls_return-message_v1 = ls_msg-msgv1. ls_return-message_v2 = ls_msg-msgv2. ls_return-message_v3 = ls_msg-msgv3. ls_return-message_v4 = ls_msg-msgv4. MESSAGE ID ls_msg-msgid TYPE 'I' NUMBER ls_msg-msgno WITH ls_msg-msgv1 ls_msg-msgv1 ls_msg-msgv1 ls_msg-msgv1 INTO ls_return-message. APPEND ls_return TO px_t_return. ENDIF. ENDLOOP. ENDIF. ENDFORM. " add_cond_messages_to_return
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF54 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form get_promotion_data_pdet *&---------------------------------------------------------------------* * Get additional data from the promotion for reading the condition * records *----------------------------------------------------------------------* FORM get_promotion_data_pdet TABLES pi_t_product_data STRUCTURE crm_mktpl_cond_if_product_data pi_t_prodcat_data STRUCTURE crm_mktpl_cond_if_prodcat_data pe_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pe_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx USING pi_crm_mktpl_guid TYPE crm_mktpl_guid pi_application TYPE cgpl_application_type CHANGING pe_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib pe_subrc TYPE sy-subrc. DATA: lr_mkt_appl_base TYPE REF TO cl_crm_mktpl_appl_base, lr_acp_appl_base TYPE REF TO cl_crm_acc_pl_appl_base, ls_mkt_attributes TYPE crm_mktpl_mktelement, ls_acp_attributes TYPE crmt_acc_pl_attributes, l_bps_from_hier TYPE flag, ls_tab_product TYPE crmd_mktpl_prod_d, lt_tab_product TYPE crmd_mktpl_prod_dt, ls_acc_pl_pcat TYPE crmd_acc_pl_pcat_d, lt_acc_pl_pcat TYPE crmd_acc_pl_pcat_dt, lt_product TYPE comt_product_selection_tab, ls_product TYPE comt_product_selection, ls_hierarchy1 TYPE crms_mktpl_prod_hierarchy, ls_hierarchy2 TYPE crms_mktpl_prod_hierarchy, l_object_manager TYPE REF TO cl_cgpl_object_manager, l_projects TYPE REF TO cl_cgpl_projects, l_project TYPE REF TO cl_cgpl_project, l_task TYPE REF TO cl_cgpl_task, l_tree_from_r3 TYPE char1, l_cust_guid_r3 TYPE bu_node_guid. DATA: lt_tg_i TYPE crmt_mkttg_tg_i_tab, ls_tg_i TYPE crmt_mkttg_tg_i. * ------ Attributes of marketing element CASE pi_application. WHEN c_application_mkt. * get attributes of the marketing element lr_mkt_appl_base = cl_crm_mktpl_appl_base=>get_instance( ). CALL METHOD lr_mkt_appl_base->element_read EXPORTING im_mktelement_guid = pi_crm_mktpl_guid IMPORTING ex_attributes = ls_mkt_attributes. * fill attributes MOVE-CORRESPONDING ls_mkt_attributes TO pe_s_mkt_attrib. WHEN c_application_acp. * get attributes of the account plan lr_acp_appl_base = cl_crm_acc_pl_appl_base=>get_acp_appl_instance( ). CALL METHOD lr_acp_appl_base->acc_pl_read EXPORTING im_element_guid = pi_crm_mktpl_guid IMPORTING ex_attributes = ls_acp_attributes EXCEPTIONS not_found = 1 OTHERS = 2. * fill attributes MOVE-CORRESPONDING ls_acp_attributes TO pe_s_mkt_attrib. WHEN OTHERS. pe_subrc = 1. ENDCASE. * ------- Partner GUID of an indirect promotion is the Wholesaler IF ls_mkt_attributes-indirect_ind IS NOT INITIAL. CALL METHOD cl_crm_mktpl_functions=>get_tpm_wholesalers EXPORTING iv_mkt_element = pi_crm_mktpl_guid IMPORTING ev_wholesaler = pe_s_mkt_attrib-partner_guid. * ------- Partner GUID of hierarchy node from R/3 * only if planning customer = hierarchy node or if * planning customer = target group with target group owner ELSEIF pe_s_mkt_attrib-node_guid IS NOT INITIAL OR ls_mkt_attributes-tgrp_owner_guid IS NOT INITIAL. l_projects = cl_cgpl_projects=>get_instance( im_application_type = pi_application ). * get reference to project/task CALL METHOD l_projects->get_object_with_guid EXPORTING im_guid = pi_crm_mktpl_guid IMPORTING ex_project = l_project ex_task = l_task EXCEPTIONS not_found = 1. * for account plan: always use hierarchy (not target groups) IF pi_application = c_application_acp. l_bps_from_hier = 'X'. ENDIF. * get the partner guid of the hierarchy node CALL METHOD cl_crm_mktpl_functions=>get_bps_in_cust_hierarchy EXPORTING im_project = l_project im_task = l_task im_bps_from_hier = l_bps_from_hier IMPORTING ex_tree_from_r3 = l_tree_from_r3 ex_cust_guid_r3 = l_cust_guid_r3. * For R3 hierarchies only, fill the partner guid IF l_tree_from_r3 = 'X'. pe_s_mkt_attrib-partner_guid = l_cust_guid_r3. ENDIF. IF ls_mkt_attributes-tgrp_owner_guid IS NOT INITIAL. pe_s_mkt_attrib-node_guid = ls_mkt_attributes-tgrp_owner_guid. ENDIF. * ------- Partner GUID of target group without target group owner ELSEIF ls_mkt_attributes-targetgrp_guid IS NOT INITIAL. CALL FUNCTION 'CRM_MKTTG_TG_READ' EXPORTING iv_tg_guid = ls_mkt_attributes-targetgrp_guid iv_bp_max = 1 IMPORTING et_tg_i = lt_tg_i EXCEPTIONS parameter_error = 1 OTHERS = 2. * Get an arbitrary BP from the target group IF sy-subrc IS INITIAL AND lt_tg_i IS NOT INITIAL. READ TABLE lt_tg_i INDEX 1 INTO ls_tg_i. pe_s_mkt_attrib-partner_guid = ls_tg_i-bp_guid. ENDIF. ENDIF. * ------- Attributes of products CASE pi_application. WHEN c_application_mkt. * determine from customizing settings, which hierarchy is relevant CALL METHOD cl_crm_mktpl_img_access=>read_product_hierarchies IMPORTING es_prod_hierarchy1 = ls_hierarchy1 es_prod_hierarchy2 = ls_hierarchy2. * get products of the marketing element lr_mkt_appl_base = cl_crm_mktpl_appl_base=>get_instance( ). CALL METHOD lr_mkt_appl_base->prod_assign_read EXPORTING im_mktelement_guid = pi_crm_mktpl_guid IMPORTING ex_products = lt_tab_product EXCEPTIONS not_found = 1 OTHERS = 2. WHEN c_application_acp. * determine from customizing settings, which hierarchy is relevant CALL METHOD cl_crm_acc_pl_img_access=>read_product_hierarchies IMPORTING es_prod_hierarchy1 = ls_hierarchy1 es_prod_hierarchy2 = ls_hierarchy2. * get products of the account plan lr_acp_appl_base = cl_crm_acc_pl_appl_base=>get_acp_appl_instance( ). CALL METHOD lr_acp_appl_base->prod_assign_read EXPORTING im_mktelement_guid = pi_crm_mktpl_guid IMPORTING ex_products = lt_tab_product EXCEPTIONS not_found = 1 OTHERS = 2. * get product categories of the account plan CALL METHOD lr_acp_appl_base->pcat_assign_read EXPORTING im_acc_plan_guid = pi_crm_mktpl_guid IMPORTING ex_categories = lt_acc_pl_pcat. WHEN OTHERS. pe_subrc = 1. ENDCASE. * Fill additional product data LOOP AT pi_t_product_data. pe_t_product_datx-product_guid = pi_t_product_data-product_guid. * Add data from product assignment READ TABLE lt_tab_product INTO ls_tab_product WITH KEY product_guid = pi_t_product_data-product_guid. IF sy-subrc = 0. pe_t_product_datx-product_group = ls_tab_product-product_group. pe_t_product_datx-sales_uom = ls_tab_product-sales_uom. ENDIF. * Product category 1 or 2: * We use that one with the hierarchy marked as 'sales area dependent' IF ls_hierarchy1-sales_area_flag IS NOT INITIAL. pe_t_product_datx-prod_hierarchy = ls_tab_product-product_cat. ENDIF. IF ls_hierarchy2-sales_area_flag IS NOT INITIAL. pe_t_product_datx-prod_hierarchy = ls_tab_product-category2_id. ENDIF. APPEND pe_t_product_datx. ENDLOOP. * Fill additional data for product categories LOOP AT pi_t_prodcat_data. pe_t_prodcat_datx-category_guid = pi_t_prodcat_data-category_guid. * Add data from product category assignment READ TABLE lt_acc_pl_pcat INTO ls_acc_pl_pcat WITH KEY category_guid = pi_t_prodcat_data-category_guid. IF sy-subrc = 0. pe_t_prodcat_datx-prod_hierarchy = ls_acc_pl_pcat-category_id. pe_t_prodcat_datx-sales_uom = ls_acc_pl_pcat-sales_uom. ENDIF. * Determine a product, which represents this product category l_projects = cl_cgpl_projects=>get_instance( im_application_type = pi_application ). * Get reference to project CALL METHOD l_projects->get_object_with_guid EXPORTING im_guid = pi_crm_mktpl_guid IMPORTING ex_project = l_project EXCEPTIONS not_found = 1. * Explode the category into products (method returns only one product) CALL METHOD cl_crm_acc_pl_functions=>explode_category EXPORTING iv_category_guid = pi_t_prodcat_data-category_guid ir_project = l_project iv_only_one_product = 'X' IMPORTING et_products = lt_product. READ TABLE lt_product INTO ls_product INDEX 1. IF sy-subrc = 0. pe_t_prodcat_datx-product_guid = ls_product-product_guid. ENDIF. APPEND pe_t_prodcat_datx. ENDLOOP. * Check, if products or product categories are provided IF pe_t_product_datx[] IS INITIAL AND pe_t_prodcat_datx[] IS INITIAL. pe_subrc = 1. ENDIF. ENDFORM. " get_promotion_data_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF55 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form build_attrib_value_prod_pdet *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM build_attrib_value_prod_pdet TABLES px_t_attrib_value STRUCTURE /sapcnd/attrib_value_int USING pi_s_product_datx TYPE crm_mktpl_cond_if_product_datx. DATA: l_s_attrib_value TYPE /sapcnd/attrib_value_int, l_prod_grp TYPE crm_mktpl_prod_grp, l_prod_hierarchy TYPE crmt_prodh, lt_attr_name_value TYPE prct_attr_name_values_t, ls_attr_name_value TYPE prct_attr_name_value, lt_bapireturn TYPE bapiret2_tab. * product guid l_s_attrib_value-fieldname = 'PRODUCT'. l_s_attrib_value-value = pi_s_product_datx-product_guid. APPEND l_s_attrib_value TO px_t_attrib_value. * product group 1,...5 CALL METHOD cl_crm_mktpl_img_access=>read_product_group_no IMPORTING ex_product_group_no = l_prod_grp. CASE l_prod_grp. WHEN c_prod_grp_1. l_s_attrib_value-fieldname = 'PRC_GROUP1'. WHEN c_prod_grp_2. l_s_attrib_value-fieldname = 'PRC_GROUP2'. WHEN c_prod_grp_3. l_s_attrib_value-fieldname = 'PRC_GROUP3'. WHEN c_prod_grp_4. l_s_attrib_value-fieldname = 'PRC_GROUP4'. WHEN c_prod_grp_5. l_s_attrib_value-fieldname = 'PRC_GROUP5'. ENDCASE. l_s_attrib_value-value = pi_s_product_datx-product_group. APPEND l_s_attrib_value TO px_t_attrib_value. * product hierarchy l_prod_hierarchy = pi_s_product_datx-prod_hierarchy. l_s_attrib_value-fieldname = 'PROD_HIERARCHY'. l_s_attrib_value-value = l_prod_hierarchy. APPEND l_s_attrib_value TO px_t_attrib_value. * get condition fields from customizing CALL FUNCTION 'CRM_PRCAT_PRICING_FILL_PRODH' EXPORTING iv_product_hierarchy = pi_s_product_datx-prod_hierarchy IMPORTING et_prct_attr_name_values = lt_attr_name_value et_bapireturn = lt_bapireturn. IF lt_bapireturn IS INITIAL AND lt_attr_name_value IS NOT INITIAL. * use dynamic field assignment LOOP AT lt_attr_name_value INTO ls_attr_name_value. l_s_attrib_value-fieldname = ls_attr_name_value-attr_name. l_s_attrib_value-value = ls_attr_name_value-attr_value. APPEND l_s_attrib_value TO px_t_attrib_value. ENDLOOP. ELSE. * use fields PRODH# l_s_attrib_value-fieldname = 'PRODH1'. l_s_attrib_value-value = l_prod_hierarchy-prodh1. APPEND l_s_attrib_value TO px_t_attrib_value. l_s_attrib_value-fieldname = 'PRODH2'. l_s_attrib_value-value = l_prod_hierarchy-prodh2. APPEND l_s_attrib_value TO px_t_attrib_value. l_s_attrib_value-fieldname = 'PRODH3'. l_s_attrib_value-value = l_prod_hierarchy-prodh3. APPEND l_s_attrib_value TO px_t_attrib_value. l_s_attrib_value-fieldname = 'PRODH4'. l_s_attrib_value-value = l_prod_hierarchy-prodh4. APPEND l_s_attrib_value TO px_t_attrib_value. ENDIF. * sales unit of measure l_s_attrib_value-fieldname = 'PROCESS_QTY_UNIT'. l_s_attrib_value-value = pi_s_product_datx-sales_uom. APPEND l_s_attrib_value TO px_t_attrib_value. ENDFORM. " build_attrib_value_prod_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF56 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form conv_curr_condvalues *&---------------------------------------------------------------------* * Convert the currency of the condition record into the promotion * currency *----------------------------------------------------------------------* FORM conv_curr_condvalues TABLES px_t_condvalues STRUCTURE crm_mktpl_cond_if_condvalues USING pi_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib CHANGING pe_subrc TYPE sy-subrc. DATA: ls_condvalues TYPE crm_mktpl_cond_if_condvalues, l_local_curr TYPE prct_cond_curr, l_timestamp_from TYPE timestamp, l_cnd_timestamp_from TYPE /sapcnd/timestamp_from. * Check: Promotion currency CHECK pi_s_mkt_attrib-currency IS NOT INITIAL. * Convert condition value into promotion currency LOOP AT px_t_condvalues INTO ls_condvalues WHERE konwa NE pi_s_mkt_attrib-currency AND konwa NE '%'. * determine the local currency from sales org CONVERT DATE ls_condvalues-start_date INTO TIME STAMP l_timestamp_from TIME ZONE sy-zonlo. l_cnd_timestamp_from = l_timestamp_from. CALL FUNCTION 'PRC_MNT_DEF_VALUE_CURRENCY_CRM' EXPORTING i_calc_type = ' ' i_sales_org = pi_s_mkt_attrib-sales_org i_timestamp_from = l_cnd_timestamp_from CHANGING c_currency = l_local_curr EXCEPTIONS exc_no_default = 1 OTHERS = 2. IF sy-subrc <> 0 OR l_local_curr IS INITIAL. * Default is the promotion currency l_local_curr = pi_s_mkt_attrib-currency. ENDIF. * convert via local currency CALL FUNCTION 'CRM_CONVERT_CURRENCY' EXPORTING iv_exch_rate_date = ls_condvalues-start_date iv_source_currency = ls_condvalues-konwa iv_local_currency = l_local_curr iv_target_currency = pi_s_mkt_attrib-currency CHANGING cv_value = ls_condvalues-kbetr EXCEPTIONS conversion_not_possible = 1 OTHERS = 2. IF sy-subrc = 0. ls_condvalues-konwa = pi_s_mkt_attrib-currency. MODIFY px_t_condvalues FROM ls_condvalues. ENDIF. ENDLOOP. ENDFORM. " conv_curr_condvalues
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF62 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form append_return *&---------------------------------------------------------------------* * Append message to the table PX_T_RETURN *----------------------------------------------------------------------* FORM append_return TABLES px_t_return STRUCTURE bapiret2. DATA: l_s_return TYPE bapiret2, lv_msgty TYPE SYMSGTY. * Abort messages should not be sent back in the application log * Condition Technique returns A messages for Error messages... IF sy-msgty = 'A'. lv_msgty = 'E'. ELSE. lv_msgty = sy-msgty. ENDIF. CALL FUNCTION 'BALW_BAPIRETURN_GET2' EXPORTING type = lv_msgty cl = sy-msgid number = sy-msgno par1 = sy-msgv1 par2 = sy-msgv2 par3 = sy-msgv3 par4 = sy-msgv4 IMPORTING return = l_s_return. APPEND l_s_return TO px_t_return. ENDFORM. " append_return
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF75 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form call_badi_cond_read_before_sel *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM call_badi_cond_read_before_sel TABLES pi_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pi_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib pi_application TYPE cgpl_application_type CHANGING px_t_attrib_value TYPE /sapcnd/t_attrib_value_int pe_subrc TYPE sy-subrc. DATA: l_t_return TYPE bapirettab, l_t_product_datx TYPE crm_mktpl_cond_if_t_prod_datx, l_t_prodcat_datx TYPE crm_mktpl_cond_if_t_pcat_datx. * Initialize the BADI instance (if not yet done) IF g_crm_mktpl_cond_if IS INITIAL. CALL METHOD cl_exithandler=>get_instance EXPORTING exit_name = 'CRM_MKTPL_COND_IF' null_instance_accepted = 'X' CHANGING instance = g_crm_mktpl_cond_if. ENDIF. CHECK g_crm_mktpl_cond_if IS NOT INITIAL. * Copy data l_t_product_datx = pi_t_product_datx[]. l_t_prodcat_datx = pi_t_prodcat_datx[]. * Call the BADI method CALL METHOD g_crm_mktpl_cond_if->cond_read_before_select EXPORTING pi_s_cond_session = pi_s_cond_session pi_t_product_datx = l_t_product_datx pi_t_prodcat_datx = l_t_prodcat_datx pi_s_keyfigx = pi_s_keyfigx pi_s_mkt_attrib = pi_s_mkt_attrib pi_application = pi_application IMPORTING pe_t_return = l_t_return pe_subrc = pe_subrc CHANGING px_t_attrib_value = px_t_attrib_value. * Append the messages to the return table APPEND LINES OF l_t_return TO px_t_return. ENDFORM. " call_badi_cond_read_before_sel
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF76 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form call_badi_cond_read_before_get *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM call_badi_cond_read_before_get TABLES px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_s_product_datx TYPE crm_mktpl_cond_if_product_datx pi_s_prodcat_datx TYPE crm_mktpl_cond_if_prodcat_datx pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_application TYPE cgpl_application_type CHANGING px_t_attrib_value TYPE /sapcnd/t_attrib_value_int pe_subrc TYPE sy-subrc. DATA: l_t_return TYPE bapirettab. * Initialize the BADI instance (if not yet done) IF g_crm_mktpl_cond_if IS INITIAL. CALL METHOD cl_exithandler=>get_instance EXPORTING exit_name = 'CRM_MKTPL_COND_IF' null_instance_accepted = 'X' CHANGING instance = g_crm_mktpl_cond_if. ENDIF. CHECK g_crm_mktpl_cond_if IS NOT INITIAL. * Call the BADI method CALL METHOD g_crm_mktpl_cond_if->cond_read_before_get EXPORTING pi_s_cond_session = pi_s_cond_session pi_s_product_datx = pi_s_product_datx pi_s_prodcat_datx = pi_s_prodcat_datx pi_s_keyfigx = pi_s_keyfigx pi_application = pi_application IMPORTING pe_t_return = l_t_return pe_subrc = pe_subrc CHANGING px_t_attrib_value = px_t_attrib_value. * Append the messages to the return table APPEND LINES OF l_t_return TO px_t_return. ENDFORM. " call_badi_cond_read_before_get
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF77 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form call_badi_cond_read_after_get *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM call_badi_cond_read_after_get TABLES pi_t_product_datx STRUCTURE crm_mktpl_cond_if_product_datx pi_t_prodcat_datx STRUCTURE crm_mktpl_cond_if_prodcat_datx px_t_condvalues STRUCTURE crm_mktpl_cond_if_condvalues px_t_return STRUCTURE bapiret2 USING pi_crm_mktpl_guid TYPE crm_mktpl_guid pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_s_mkt_attrib TYPE crm_mktpl_cond_if_mkt_attrib pi_application TYPE cgpl_application_type CHANGING pe_subrc TYPE sy-subrc. DATA: l_t_return TYPE bapirettab, l_t_product_datx TYPE crm_mktpl_cond_if_t_prod_datx, l_t_prodcat_datx TYPE crm_mktpl_cond_if_t_pcat_datx, l_t_condvalues TYPE crm_mktpl_cond_if_t_condvalues, l_s_condvalues TYPE crm_mktpl_cond_if_condvalues. * Initialize the BADI instance (if not yet done) IF g_crm_mktpl_cond_if IS INITIAL. CALL METHOD cl_exithandler=>get_instance EXPORTING exit_name = 'CRM_MKTPL_COND_IF' null_instance_accepted = 'X' CHANGING instance = g_crm_mktpl_cond_if. ENDIF. CHECK g_crm_mktpl_cond_if IS NOT INITIAL. * Copy data l_t_product_datx = pi_t_product_datx[]. l_t_prodcat_datx = pi_t_prodcat_datx[]. l_t_condvalues = px_t_condvalues[]. * Call the BADI method CALL METHOD g_crm_mktpl_cond_if->cond_read_after_get EXPORTING pi_crm_mktpl_guid = pi_crm_mktpl_guid pi_s_cond_session = pi_s_cond_session pi_t_product_datx = l_t_product_datx pi_t_prodcat_datx = l_t_prodcat_datx pi_s_keyfigx = pi_s_keyfigx pi_s_mkt_attrib = pi_s_mkt_attrib pi_application = pi_application IMPORTING pe_t_return = l_t_return pe_subrc = pe_subrc CHANGING px_t_condvalues = l_t_condvalues. * Check: Any changes? IF l_t_condvalues NE px_t_condvalues[]. * Do some minimal checks: LOOP AT l_t_condvalues INTO l_s_condvalues. l_s_condvalues-key_figure = pi_s_keyfigx-key_figure. l_s_condvalues-kappl = pi_s_keyfigx-kappl. l_s_condvalues-kvewe = pi_s_keyfigx-kvewe. l_s_condvalues-kschl = pi_s_keyfigx-kschl. l_s_condvalues-kotabnr = pi_s_keyfigx-kotabnr. * start date: IF l_s_condvalues-start_date LT pi_s_keyfigx-start_date. l_s_condvalues-start_date = pi_s_keyfigx-start_date. ENDIF. * end date: IF l_s_condvalues-end_date GT pi_s_keyfigx-end_date. l_s_condvalues-end_date = pi_s_keyfigx-end_date. ENDIF. MODIFY l_t_condvalues FROM l_s_condvalues. ENDLOOP. ENDIF. * Copy condition values back px_t_condvalues[] = l_t_condvalues. * Append the messages to the return table APPEND LINES OF l_t_return TO px_t_return. ENDFORM. " call_badi_cond_read_after_get
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF81 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form get_working_set_kvewe *&---------------------------------------------------------------------* * Get the entries of the condition buffer for one campaign * for a certain usage *----------------------------------------------------------------------* FORM get_working_set_kvewe TABLES px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_crm_mktpl_guid TYPE crm_mktpl_guid pi_application TYPE cgpl_application_type pi_kvewe TYPE /sapcnd/usage pi_hlog TYPE balloghndl pi_suppr_del_records TYPE /sapcnd/boolean CHANGING pe_t_working_set TYPE REF TO data pe_subrc TYPE sy-subrc. DATA: ls_attrib_value TYPE /sapcnd/attrib_value_int, lt_attrib_value TYPE /sapcnd/t_attrib_value_int, l_result TYPE sy-subrc, ls_ref_guid TYPE LINE OF /sapcnd/ref_guid_t, lt_ref_guid TYPE /sapcnd/ref_guid_t, l_msgtext(72). CLEAR pe_t_working_set. clear pe_subrc. CASE pi_application. WHEN c_application_mkt. * Build range for selection ls_attrib_value-fieldname = 'KAPPL'. ls_attrib_value-value = pi_s_cond_session-kappl. APPEND ls_attrib_value TO lt_attrib_value. ls_attrib_value-fieldname = 'KVEWE'. ls_attrib_value-value = pi_kvewe. APPEND ls_attrib_value TO lt_attrib_value. ls_attrib_value-fieldname = 'CAMPAIGN_GUID'. ls_attrib_value-value = pi_crm_mktpl_guid. APPEND ls_attrib_value TO lt_attrib_value. CALL FUNCTION '/SAPCND/MNT_GET_WORKING_SET_OW' EXPORTING i_hsession = pi_s_cond_session-session i_hlog = pi_hlog * I_CALL_FIELD_CHECK = ' ' i_suppress_deleted_records = pi_suppr_del_records * IT_ATTRIB_SELECTION_EXT = it_attrib_value_int = lt_attrib_value IMPORTING et_working_set_int = pe_t_working_set * ET_WORKING_SET_EXT = e_result = l_result EXCEPTIONS exc_stop_work = 1 exc_rfc = 2 * exc_conv_java = 3 exc_attr_conv = 4 exc_field_check = 5 exc_updating_working_set = 6 exc_not_int_and_ext = 7 exc_external_only = 8 exc_convert_ranges = 9 exc_creating_object_names = 10 exc_stop_work_badi = 11 exc_implementation_missing = 12 exc_adding_debug_trace_msg = 13 exc_bal_log = 14 OTHERS = 15. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_GET_WORKING_SET_OW PERFORM append_return TABLES px_t_return. * Send message: System has stopped processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_GET_WORKING_SET_OW' INTO l_msgtext. PERFORM append_return TABLES px_t_return. ENDIF. WHEN c_application_acp. * account planning: * condition reference ls_ref_guid-ref_guid = pi_crm_mktpl_guid. INSERT ls_ref_guid INTO TABLE lt_ref_guid. ls_attrib_value-fieldname = 'KAPPL'. ls_attrib_value-value = pi_s_cond_session-kappl. APPEND ls_attrib_value TO lt_attrib_value. ls_attrib_value-fieldname = 'KVEWE'. ls_attrib_value-value = pi_kvewe. APPEND ls_attrib_value TO lt_attrib_value. CALL FUNCTION '/SAPCND/MNT_GET_WORKINGSET_REF' EXPORTING i_hsession = pi_s_cond_session-session i_hlog = pi_hlog * I_CALL_FIELD_CHECK = ' ' i_suppress_deleted_records = pi_suppr_del_records i_ref_type = c_ref_type_acp it_ref_guid = lt_ref_guid it_attrib_value_int = lt_attrib_value IMPORTING et_working_set_int = pe_t_working_set * ET_WORKING_SET_EXT = e_result = l_result EXCEPTIONS exc_stop_work = 1 exc_adding_debug_trace_msg = 2 exc_get_varnumhs = 3 exc_get_records = 4 OTHERS = 5. IF sy-subrc <> 0. pe_subrc = sy-subrc. * Collect message from /SAPCND/MNT_GET_WORKINGSET_REF PERFORM append_return TABLES px_t_return. * Send message: System has stopped the processing MESSAGE e025(crm_mktpl_cond_if) WITH '/SAPCND/MNT_GET_WORKINGSET_REF' INTO l_msgtext. PERFORM append_return TABLES px_t_return. ENDIF. WHEN OTHERS. pe_subrc = 1. ENDCASE. endform. " get_working_set_kvewe
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF96 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form build_attrib_value_pcat_pdet *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM build_attrib_value_pcat_pdet TABLES px_t_attrib_value STRUCTURE /sapcnd/attrib_value_int USING pi_s_prodcat_datx TYPE crm_mktpl_cond_if_prodcat_datx. DATA: l_s_attrib_value TYPE /sapcnd/attrib_value_int, l_prod_hierarchy TYPE crmt_prodh, lt_attr_name_value TYPE prct_attr_name_values_t, ls_attr_name_value TYPE prct_attr_name_value, lt_bapireturn TYPE bapiret2_tab. * product guid l_s_attrib_value-fieldname = 'PRODUCT'. l_s_attrib_value-value = pi_s_prodcat_datx-product_guid. APPEND l_s_attrib_value TO px_t_attrib_value. * product hierarchy l_prod_hierarchy = pi_s_prodcat_datx-prod_hierarchy. l_s_attrib_value-fieldname = 'PROD_HIERARCHY'. l_s_attrib_value-value = l_prod_hierarchy. APPEND l_s_attrib_value TO px_t_attrib_value. * get condition fields from customizing CALL FUNCTION 'CRM_PRCAT_PRICING_FILL_PRODH' EXPORTING iv_product_hierarchy = pi_s_prodcat_datx-prod_hierarchy IMPORTING et_prct_attr_name_values = lt_attr_name_value et_bapireturn = lt_bapireturn. IF lt_bapireturn IS INITIAL AND lt_attr_name_value IS NOT INITIAL. * use dynamic field assignment LOOP AT lt_attr_name_value INTO ls_attr_name_value. l_s_attrib_value-fieldname = ls_attr_name_value-attr_name. l_s_attrib_value-value = ls_attr_name_value-attr_value. APPEND l_s_attrib_value TO px_t_attrib_value. ENDLOOP. ELSE. * use fields PRODH# l_s_attrib_value-fieldname = 'PRODH1'. l_s_attrib_value-value = l_prod_hierarchy-prodh1. APPEND l_s_attrib_value TO px_t_attrib_value. l_s_attrib_value-fieldname = 'PRODH2'. l_s_attrib_value-value = l_prod_hierarchy-prodh2. APPEND l_s_attrib_value TO px_t_attrib_value. l_s_attrib_value-fieldname = 'PRODH3'. l_s_attrib_value-value = l_prod_hierarchy-prodh3. APPEND l_s_attrib_value TO px_t_attrib_value. l_s_attrib_value-fieldname = 'PRODH4'. l_s_attrib_value-value = l_prod_hierarchy-prodh4. APPEND l_s_attrib_value TO px_t_attrib_value. ENDIF. * sales unit of measure l_s_attrib_value-fieldname = 'PROCESS_QTY_UNIT'. l_s_attrib_value-value = pi_s_prodcat_datx-sales_uom. APPEND l_s_attrib_value TO px_t_attrib_value. ENDFORM. " build_attrib_value_pcat_pdet
*----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF97 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form fill_condvalues_item *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM fill_condvalues_item TABLES pe_t_condvalues STRUCTURE crm_mktpl_cond_if_condvalues px_t_return STRUCTURE bapiret2 USING pi_s_cond_session TYPE crm_mktpl_cond_if_condsession pi_t_working_set TYPE REF TO data pi_t_attrib_value TYPE /sapcnd/t_attrib_value_int pi_s_product_datx TYPE crm_mktpl_cond_if_product_datx pi_s_prodcat_datx TYPE crm_mktpl_cond_if_prodcat_datx pi_s_keyfigx TYPE crm_mktpl_cond_if_keyfigx_pdet pi_hlog TYPE balloghndl pi_application TYPE cgpl_application_type CHANGING pe_subrc TYPE sy-subrc. FIELD-SYMBOLS: <kbetr> TYPE prct_cond_rate, <konwa> TYPE prct_cond_curr, <kpein> TYPE prct_cond_pricing_unit, <kmein> TYPE prct_prod_uom, <timestamp_from> TYPE /sapcnd/timestamp_from, <timestamp_to> TYPE /sapcnd/timestamp_to, <lt_working_set> TYPE table, <ls_working_set_item> TYPE ANY, <value> TYPE ANY. DATA: l_t_t681e_s TYPE /sapcnd/t681e_s_t, l_param_value TYPE /sapcnd/param_value, l_s_attrib_value TYPE /sapcnd/attrib_value_int, l_t_attrib_value TYPE /sapcnd/t_attrib_value_int, l_not_ok TYPE xfeld. * get a pointer to the data from condition buffer ASSIGN pi_t_working_set->* TO <lt_working_set>. l_t_attrib_value = pi_t_attrib_value. * Remove attribute values which are not part of the condition table * Determine the fields of the condition table CALL FUNCTION '/SAPCND/CUS_T681E_SEL' EXPORTING i_application = pi_s_cond_session-kappl i_usage = pi_s_keyfigx-kvewe i_cond_table_id = pi_s_keyfigx-kotabnr IMPORTING et_selected_data = l_t_t681e_s. * Check, if attribute is part of the condition table IF NOT l_t_t681e_s IS INITIAL. LOOP AT l_t_attrib_value INTO l_s_attrib_value. READ TABLE l_t_t681e_s WITH KEY fieldname = l_s_attrib_value-fieldname TRANSPORTING NO FIELDS. IF sy-subrc NE 0. DELETE l_t_attrib_value. ENDIF. ENDLOOP. ENDIF. * Call BAdI to adjust the attribute-value tables PERFORM call_badi_cond_read_before_get TABLES px_t_return USING pi_s_cond_session pi_s_product_datx pi_s_prodcat_datx pi_s_keyfigx pi_application CHANGING l_t_attrib_value pe_subrc. CHECK pe_subrc IS INITIAL. LOOP AT <lt_working_set> ASSIGNING <ls_working_set_item>. * check working set item * don't continue if the attribute is not part of the working set OK CLEAR l_not_ok. LOOP AT l_t_attrib_value INTO l_s_attrib_value. ASSIGN COMPONENT l_s_attrib_value-fieldname OF STRUCTURE <ls_working_set_item> TO <value>. IF sy-subrc IS INITIAL AND <value> NE l_s_attrib_value-value. l_not_ok = 'X'. EXIT. ENDIF. ENDLOOP. IF l_not_ok = 'X'. CONTINUE. ENDIF. * get pointers to data of the working set ASSIGN COMPONENT 'KBETR' OF STRUCTURE <ls_working_set_item> TO <kbetr>. ASSIGN COMPONENT 'KONWA' OF STRUCTURE <ls_working_set_item> TO <konwa>. ASSIGN COMPONENT 'KPEIN' OF STRUCTURE <ls_working_set_item> TO <kpein>. ASSIGN COMPONENT 'KMEIN' OF STRUCTURE <ls_working_set_item> TO <kmein>. ASSIGN COMPONENT 'TIMESTAMP_FROM' OF STRUCTURE <ls_working_set_item> TO <timestamp_from>. ASSIGN COMPONENT 'TIMESTAMP_TO' OF STRUCTURE <ls_working_set_item> TO <timestamp_to>. * transfer data to the condvalues CLEAR pe_t_condvalues. pe_t_condvalues-key_figure = pi_s_keyfigx-key_figure. pe_t_condvalues-kappl = pi_s_keyfigx-kappl. pe_t_condvalues-kvewe = pi_s_keyfigx-kvewe. pe_t_condvalues-kschl = pi_s_keyfigx-kschl. pe_t_condvalues-kotabnr = pi_s_keyfigx-kotabnr. pe_t_condvalues-product_guid = pi_s_product_datx-product_guid. pe_t_condvalues-category_guid = pi_s_prodcat_datx-category_guid. * condition values: pe_t_condvalues-kbetr = <kbetr>. pe_t_condvalues-konwa = <konwa>. pe_t_condvalues-kpein = <kpein>. pe_t_condvalues-kmein = <kmein>. * start date: pe_t_condvalues-start_date = <timestamp_from>. IF pe_t_condvalues-start_date LT pi_s_keyfigx-start_date. pe_t_condvalues-start_date = pi_s_keyfigx-start_date. ENDIF. * end date: pe_t_condvalues-end_date = <timestamp_to>. IF pe_t_condvalues-end_date GT pi_s_keyfigx-end_date. pe_t_condvalues-end_date = pi_s_keyfigx-end_date. ENDIF. APPEND pe_t_condvalues. ENDLOOP. " at <lt_working_set> ENDFORM. " fill_condvalues_item
主程序
*&---------------------------------------------------------------------* *& Report YCOND_INBOUND *& *&---------------------------------------------------------------------* *&Service Pricing: Org/ZZZMODENO/PRICE_GRP/ZREPCODE/PRODUCT/用户量贩店DIS服务商服务定价批导 *& *&---------------------------------------------------------------------* REPORT ZHSCRM_COND_INBOUND_50 LINE-SIZE 400. DATA GR_SELECTED_ID. * Type pools *----------------------------------------------------------------------* TYPE-POOLS CTMNT. " Condition maintenance TYPE-POOLS CRMKC. " Marketing Planner TYPE-POOLS MKTRE. " CRM Rebates *----------------------------------------------------------------------* * Constants *----------------------------------------------------------------------* CONSTANTS: * Condition technique: applications C_KAPPL_CRM TYPE /SAPCND/APPLICATION VALUE 'CRM', C_KAPPL_BBP TYPE /SAPCND/APPLICATION VALUE 'BBP', * Condition technique: usages C_KVEWE_PR TYPE /SAPCND/USAGE VALUE 'PR', C_KVEWE_FG TYPE /SAPCND/USAGE VALUE 'FG', C_KVEWE_BO TYPE /SAPCND/USAGE VALUE 'BO', C_KVEWE_CD TYPE /SAPCND/USAGE VALUE 'CD', * Condition technique: calculation type C_KRECH_A TYPE PRCT_CALCULATION_TYPE VALUE 'A', C_KRECH_B TYPE PRCT_CALCULATION_TYPE VALUE 'B', C_KRECH_C TYPE PRCT_CALCULATION_TYPE VALUE 'C', * Condition technique: fieldnames C_FNAME_VARNUMH TYPE FIELDNAME VALUE 'VARNUMH', C_FNAME_KAPPL TYPE FIELDNAME VALUE 'KAPPL', C_FNAME_KVEWE TYPE FIELDNAME VALUE 'KVEWE', C_FNAME_KSCHL TYPE FIELDNAME VALUE 'KSCHL', C_FNAME_KOTABNR TYPE FIELDNAME VALUE 'KOTABNR', C_FNAME_PRODUCT TYPE FIELDNAME VALUE 'PRODUCT', C_FNAME_SOLD_TO_PARTY TYPE FIELDNAME VALUE 'SOLD_TO_PARTY', * Condition technique: free goods: C_FGD_INCL_POS TYPE FGD_EXCL_INCL_IND VALUE '1', C_FGD_EXCL TYPE FGD_EXCL_INCL_IND VALUE '2', C_FGD_INCL_NOPOS TYPE FGD_EXCL_INCL_IND VALUE '3', * Rebates: rebate procedure C_BOVER_A TYPE /BON/BOVER VALUE 'A', * Rebates: * strategy for condition records when deleting rebate agreements C_COND_DELETE_A TYPE /BON/AG_COND_DELETE VALUE 'A', C_COND_DELETE_B TYPE /BON/AG_COND_DELETE VALUE 'B', * planning customer C_PLANCUST_TYPE_01 TYPE CRM_MKTPL_PLCUST_TYPE VALUE '01', C_PLANCUST_TYPE_02 TYPE CRM_MKTPL_PLCUST_TYPE VALUE '02', C_PLANCUST_TYPE_03 TYPE CRM_MKTPL_PLCUST_TYPE VALUE '03', * partner function C_PCFT_SOLD_TO_PARTY TYPE CRMT_PARTNER_FCT VALUE '00000001', C_PCFT_SHIP_TO_PARTY TYPE CRMT_PARTNER_FCT VALUE '00000002', C_PCFT_BILL_TO_PARTY TYPE CRMT_PARTNER_FCT VALUE '00000003', C_PCFT_PAYER TYPE CRMT_PARTNER_FCT VALUE '00000004', * product level C_PRODUCT_TYPE_PR TYPE CRM_MKTPL_PRODUCT_TYPE VALUE 'PR', C_PRODUCT_TYPE_PG TYPE CRM_MKTPL_PRODUCT_TYPE VALUE 'PG', C_PRODUCT_TYPE_PH TYPE CRM_MKTPL_PRODUCT_TYPE VALUE 'PH', C_PRODUCT_TYPE_PS TYPE CRM_MKTPL_PRODUCT_TYPE VALUE 'PS', * product group C_PROD_GRP_1 TYPE CRM_MKTPL_PROD_GRP VALUE '1', C_PROD_GRP_2 TYPE CRM_MKTPL_PROD_GRP VALUE '2', C_PROD_GRP_3 TYPE CRM_MKTPL_PROD_GRP VALUE '3', C_PROD_GRP_4 TYPE CRM_MKTPL_PROD_GRP VALUE '4', C_PROD_GRP_5 TYPE CRM_MKTPL_PROD_GRP VALUE '5', * conflict resolution C_CONFL_RES_01 TYPE CRM_MKTPL_CONFL_RES VALUE '01', C_CONFL_RES_02 TYPE CRM_MKTPL_CONFL_RES VALUE '02', C_CONFL_RES_03 TYPE CRM_MKTPL_CONFL_RES VALUE '03', C_CONFL_RES_04 TYPE CRM_MKTPL_CONFL_RES VALUE ' ', * locking message C_LOCK_MSG_NO TYPE MSGNR VALUE '717', C_LOCK_MSG_ID TYPE ARBGB VALUE '/SAPCND/MAINTENANCE', * reset message C_RESET_MSG_NO TYPE MSGNR VALUE '039', C_RESET_MSG_ID TYPE ARBGB VALUE '/SAPCND/MAINTENANCE', * project planning system: object type C_OBTYP_CPG TYPE CGPL_OBJECT_TYPE VALUE 'CPG', C_OBTYP_CPT TYPE CGPL_OBJECT_TYPE VALUE 'CPT', C_OBTYP_MPL TYPE CGPL_OBJECT_TYPE VALUE 'MPL', C_OBTYP_MPT TYPE CGPL_OBJECT_TYPE VALUE 'MPT', C_OBTYP_TPM TYPE CGPL_OBJECT_TYPE VALUE 'TPM', C_OBTYP_TPT TYPE CGPL_OBJECT_TYPE VALUE 'TPT', C_OBTYP_ACP TYPE CGPL_OBJECT_TYPE VALUE 'ACP', * condition reference: reference type C_REF_TYPE_ACP TYPE /SAPCND/REFERENCE_TYPE VALUE 'ACP', * project planning system: application C_APPLICATION_ACP TYPE CGPL_APPLICATION_TYPE VALUE 'ACP', * project planning system: application C_APPLICATION_MKT TYPE CGPL_APPLICATION_TYPE VALUE 'MKT'. *---------------------------------------------------------------------* * Types *---------------------------------------------------------------------* TYPES: BEGIN OF GTY_TGP_DERIVED_BP, BPHN_GUID TYPE BU_NODE_GUID, BP_GUID TYPE BU_PARTNER_GUID, END OF GTY_TGP_DERIVED_BP. *---------------------------------------------------------------------* * Global data *---------------------------------------------------------------------* DATA: * BAdI G_CRM_MKTPL_COND_IF TYPE REF TO IF_EX_CRM_MKTPL_COND_IF, * Data for deriving BP associated to BPHN GT_TGP_DERIVED_BPS TYPE HASHED TABLE OF GTY_TGP_DERIVED_BP WITH UNIQUE KEY BPHN_GUID. *---------------------------------------------------------------------* * Ranges *---------------------------------------------------------------------* RANGES: GR_SELECTED_COTYPE FOR CRM_MKTPL_COND_IF_UI-COST_CATEGORY, GR_SELECTED_COCAT FOR CRM_MKTPL_COND_IF_UI-COST_CATEGORY, GR_SELECTED_SPMETH FOR CRM_MKTPL_COND_IF_UI-SPEND_METHOD, GR_SELECTED_DIMETH FOR CRM_MKTPL_COND_IF_UI-DISC_METHOD. TYPES: BEGIN OF TY_DOC, P_SORG TYPE CRMT_SALES_ORG, P_DISCHL TYPE CRMT_DISTRIBUTION_CHANNEL, P_ZZZMODENO TYPE ZMODENO, P_ZREPCODE TYPE ZRPCODE, P_BP TYPE BU_PARTNER, P_PROD TYPE COMT_PRODUCT_ID, P_PGRP TYPE CRMT_PRICE_GRP, P_KBETR TYPE KBETR, P_KMEIN TYPE KMEIN, P_KPEIN TYPE KPEIN, P_KONWA TYPE KONWA, P_BDATE TYPE D, P_EDATE TYPE D, HIERARCHY_ID TYPE COMT_HIERARCHY_ID, CATEGORY_ID TYPE COMT_CATEGORY_ID, END OF TY_DOC. DATA: WA_DOC TYPE TY_DOC, IT_DOC TYPE STANDARD TABLE OF TY_DOC. CLEAR: WA_DOC, IT_DOC. DATA:TIMESTAMP_TO TYPE /SAPCND/TIMESTAMP_TO, TIMESTAMP_TO_A TYPE TIMESTAMP, TIMESTAMP_TO_B TYPE TIMESTAMP, TO_DAY TYPE D. CLEAR: TIMESTAMP_TO, TO_DAY, TIMESTAMP_TO_A, TIMESTAMP_TO_B. TYPES: BEGIN OF TY_ERR, INX TYPE I, ERR_LOG TYPE STRING, END OF TY_ERR. DATA: IT_ERR TYPE STANDARD TABLE OF TY_ERR, WA_ERR TYPE TY_ERR. CLEAR:IT_ERR, WA_ERR. DATA: TIM TYPE T, TZ TYPE TTZZ-TZONE. TZ = SY-ZONLO. ******************************************************************* * User-defined Include-files (if necessary). * ******************************************************************* INCLUDE LCRM_MKTPL_COND_IFF16. INCLUDE LCRM_MKTPL_COND_IFF17. INCLUDE LCRM_MKTPL_COND_IFF18. INCLUDE LCRM_MKTPL_COND_IFF19. INCLUDE LCRM_MKTPL_COND_IFF20. INCLUDE LCRM_MKTPL_COND_IFF21. INCLUDE LCRM_MKTPL_COND_IFF22. INCLUDE LCRM_MKTPL_COND_IFF23. INCLUDE LCRM_MKTPL_COND_IFF39. INCLUDE LCRM_MKTPL_COND_IFF54. INCLUDE LCRM_MKTPL_COND_IFF55. INCLUDE LCRM_MKTPL_COND_IFF56. INCLUDE LCRM_MKTPL_COND_IFF62. INCLUDE LCRM_MKTPL_COND_IFF75. INCLUDE LCRM_MKTPL_COND_IFF76. INCLUDE LCRM_MKTPL_COND_IFF77. INCLUDE LCRM_MKTPL_COND_IFF81. INCLUDE LCRM_MKTPL_COND_IFF96. INCLUDE LCRM_MKTPL_COND_IFF97. TYPES:BEGIN OF ZCRM_MKTPL_COND_IF_CUST_DATAX, KAPPL TYPE CRM_MKTPL_KAPPL_CDET, KVEWE TYPE CRM_MKTPL_KVEWE_CDET, KSCHL TYPE CRM_MKTPL_KSCHL_CDET, KOTABNR TYPE /SAPCND/COND_TABLE_ID, PRODUCT_GUID TYPE COMT_PRODUCT_GUID, SALES_ORG TYPE CRMT_SALES_ORG, CHANNEL TYPE CRMT_DISTRIBUTION_CHANNEL, ZZZMODENO TYPE ZMODENO, ZREPCODE TYPE ZRPCODE, PARTNER TYPE BU_PARTNER_GUID, BILL_TO_PARTY TYPE CRMT_BILL_TO_PARTY, PRICE_GRP TYPE CRMT_PRICE_GRP, KMEIN TYPE KMEIN, KPEIN TYPE PRCT_COND_PRICING_UNIT, KONWA TYPE KONWA, TIMESTAMP_FROM TYPE TIMESTAMP, TIMESTAMP_TO TYPE TIMESTAMP, KBETR_PRT TYPE KBETR, RELEASE_STATUS TYPE /SAPCND/RELEASE_STATUS, HIERARCHY_GUID TYPE COMT_HIERARCHY_GUID, HIER_CAT_GUID TYPE COMT_CATEGORY_GUID, END OF ZCRM_MKTPL_COND_IF_CUST_DATAX. DATA:ZCRM_MKTPL_COND_IF_CUST_DATAX TYPE ZCRM_MKTPL_COND_IF_CUST_DATAX. DATA: L_T_CUST_DATAX TYPE TABLE OF ZCRM_MKTPL_COND_IF_CUST_DATAX, L_S_CUST_DATAX TYPE ZCRM_MKTPL_COND_IF_CUST_DATAX, L_CUSTOMER TYPE CRM_MKTPL_CUSTOMER, L_CUSTOMERX TYPE CRM_MKTPL_COND_IF_CUSTOMERX, L_S_CDET TYPE CRMC_MKTPL_CDET, L_S_COTAB TYPE CRMC_MKTPL_COTAB, L_START TYPE TIMESTAMP, L_END TYPE TIMESTAMP, L_CGEN_TYPE TYPE CRM_MKTPL_CGEN_TYPE. * PI_CRM_MKTPL_GUID = '12EAA394AF2EB540A4310C4030A1BBDC'. * By default everything is okay * ----- Determine the condition generation type * PERFORM find_cgentype TABLES pe_t_return * USING pi_crm_mktpl_guid * CHANGING l_cgen_type * pe_subrc. * CHECK pe_subrc IS INITIAL. DATA:LS_ORG TYPE CRMT_SALES_ORG. DATA:LS_CHANNEL TYPE CRMT_DISTRIBUTION_CHANNEL. DATA:LS_MKTGUID TYPE BAPI_MARKETINGELEMENT_GUID-MKTELEMENT_GUID. DATA:LS_CAMPAIGN TYPE CRM_MKTPL_CAMPAIGN. DATA:LT_JSTAT_TAB TYPE CGPL_JSTAT_TAB. DATA:LS_JSTAT TYPE JSTAT. DATA:LT_ATTR TYPE /SAPCND/T_ATTRIB_VALUE_INT. DATA:LS_ATTR TYPE /SAPCND/ATTRIB_VALUE_INT. DATA:LS_MKTELEMENT TYPE CRM_MKTPL_MKTELEMENT. DATA:LS_MKTELEMENT_GUID TYPE BAPI_MARKETINGELEMENT_GUID-MKTELEMENT_GUID. DATA:LS_BAPIGUID TYPE BAPI_MARKETINGELEMENT_GUID-MKTELEMENT_GUID. DATA:LV_CRM_MKTPL_ATTR TYPE CRM_MKTPL_MKTELEMENT. DATA:LS_KVEWE TYPE CRM_MKTPL_KVEWE. DATA:LT_RETURN TYPE STANDARD TABLE OF BAPIRET2. DATA:L_T_COND_SESSION TYPE TABLE OF CRM_MKTPL_COND_IF_CONDSESSION. DATA:L_S_COND_SESSION TYPE CRM_MKTPL_COND_IF_CONDSESSION. DATA: LS_BAL_LOG TYPE BAL_S_LOG. DATA:L_HLOG TYPE BALLOGHNDL. DATA:LV_RESULT TYPE SYSUBRC. DATA:LS_T_RETURN TYPE STANDARD TABLE OF BAPIRET2. DATA:PE_SUBRC TYPE SY-SUBRC. DATA:TMP_COND_SESSION TYPE /SAPCND/MAINT_SESSION_ID. PARAMETERS: P_SORG TYPE CRMT_SALES_ORG NO-DISPLAY, P_DISCHL TYPE CRMT_DISTRIBUTION_CHANNEL NO-DISPLAY, P_BP TYPE BU_PARTNER NO-DISPLAY, P_PROD TYPE COMT_PRODUCT_ID NO-DISPLAY, P_PGRP TYPE CRMT_PRICE_GRP NO-DISPLAY, P_KBETR TYPE KBETR NO-DISPLAY, P_KONWA TYPE KONWA DEFAULT 'USD' NO-DISPLAY, P_KMEIN TYPE KMEIN DEFAULT 'PC' NO-DISPLAY, P_BDATE TYPE D NO-DISPLAY, P_EDATE TYPE D NO-DISPLAY. PARAMETERS: P_FILE LIKE RLGRAP-FILENAME. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM SELECT_FILE. START-OF-SELECTION. PERFORM IMPORT_DATA. IF IT_ERR IS INITIAL. CALL FUNCTION 'BAL_LOG_CREATE' EXPORTING I_S_LOG = LS_BAL_LOG IMPORTING E_LOG_HANDLE = L_HLOG EXCEPTIONS OTHERS = 1. * initialize condition session CALL FUNCTION '/SAPCND/MNT_INIT_OW' EXPORTING I_APPLICATION = C_KAPPL_CRM I_HLOG = L_HLOG I_MAINT_CONTEXT = 'GCM' I_GROUPNAME = 'ZHSI001' "/SAPCND/GROUPT_I表里找得 IMPORTING E_HSESSION = TMP_COND_SESSION E_RESULT = LV_RESULT EXCEPTIONS EXC_STOP_WORK = 1 EXC_RFC = 2 OTHERS = 3. L_S_COND_SESSION-SESSION = TMP_COND_SESSION. L_S_COND_SESSION-KAPPL = 'CRM'. L_S_COND_SESSION-GROUP = 'GCM'. APPEND L_S_COND_SESSION TO L_T_COND_SESSION. LOOP AT IT_DOC INTO WA_DOC. CLEAR L_S_CUST_DATAX. L_S_CUST_DATAX-KAPPL = 'CRM'. L_S_CUST_DATAX-KVEWE = 'PR'. L_S_CUST_DATAX-KSCHL = 'ZJP1'."/SAPCND/GROUPT_I表里找得 L_S_CUST_DATAX-SALES_ORG = WA_DOC-P_SORG. L_S_CUST_DATAX-CHANNEL = WA_DOC-P_DISCHL. DATA:LS_PRODGUID TYPE COMT_PRODUCT_GUID. SELECT SINGLE PRODUCT_GUID INTO LS_PRODGUID FROM COMM_PRODUCT WHERE PRODUCT_ID = WA_DOC-P_PROD. L_S_CUST_DATAX-PRODUCT_GUID = LS_PRODGUID. SELECT SINGLE CATEGORY_GUID INTO L_S_CUST_DATAX-HIER_CAT_GUID FROM COMM_CATEGORY WHERE CATEGORY_ID = WA_DOC-CATEGORY_ID. SELECT SINGLE UNIT INTO WA_DOC-P_KMEIN FROM COMM_PR_UNIT WHERE PRODUCT_GUID = LS_PRODGUID AND IS_BASE_UNIT = 'X'. IF SY-SUBRC <> 0. SELECT SINGLE UNIT INTO WA_DOC-P_KMEIN FROM COMM_PR_UNIT WHERE PRODUCT_GUID = LS_PRODGUID AND IS_BASE_UNIT = ''. ENDIF. L_S_CUST_DATAX-PRICE_GRP = WA_DOC-P_PGRP. L_S_CUST_DATAX-KOTABNR = 'CUS00011'. L_S_CUST_DATAX-KPEIN = 1. L_S_CUST_DATAX-KMEIN = WA_DOC-P_KMEIN. L_S_CUST_DATAX-ZZZMODENO = WA_DOC-P_ZZZMODENO. L_S_CUST_DATAX-ZREPCODE = WA_DOC-P_ZREPCODE. L_S_CUST_DATAX-KONWA = WA_DOC-P_KONWA. L_S_CUST_DATAX-KBETR_PRT = WA_DOC-P_KBETR. L_S_CUST_DATAX-RELEASE_STATUS = SPACE. CLEAR TIM. CONVERT DATE WA_DOC-P_BDATE TIME TIM INTO TIME STAMP L_S_CUST_DATAX-TIMESTAMP_FROM TIME ZONE TZ. TIM = '235959'. CONVERT DATE WA_DOC-P_EDATE TIME TIM INTO TIME STAMP L_S_CUST_DATAX-TIMESTAMP_TO TIME ZONE TZ. APPEND L_S_CUST_DATAX TO L_T_CUST_DATAX. CLEAR L_S_CUST_DATAX. ENDLOOP. PERFORM ZMNT_COND_RECORDS_CD TABLES L_T_CUST_DATAX LS_T_RETURN L_T_COND_SESSION USING L_START L_END L_HLOG CHANGING PE_SUBRC. CHECK PE_SUBRC IS INITIAL. DATA:LV_SESSION LIKE LINE OF L_T_COND_SESSION. DATA:I_SESSION TYPE /SAPCND/MAINT_SESSION_ID. READ TABLE L_T_COND_SESSION INTO LV_SESSION INDEX 1. I_SESSION = LV_SESSION-SESSION. * VIII. save the changes CALL FUNCTION '/SAPCND/MNT_SAVE_OW' EXPORTING I_HSESSION = I_SESSION I_HLOG = L_HLOG * i_with_commit = 'X' IMPORTING E_RESULT = LV_RESULT EXCEPTIONS EXC_STOP_WORK = 1 EXC_RFC = 2 EXC_UPDATING_DATABASE = 3 EXC_CREATING_SCALE_FIELDNAME = 4 EXC_UNEXPECTED_ERROR = 5 OTHERS = 6. IF SY-SUBRC <> 0 OR LV_RESULT > 4. ENDIF. COMMIT WORK. PERFORM OUTPUT_RESULT. ELSE. LOOP AT IT_ERR INTO WA_ERR. WRITE :/ '行:', WA_ERR-INX, WA_ERR-ERR_LOG. ENDLOOP. ENDIF. *----------------------------------------------------------------------* ***INCLUDE LCRM_MKTPL_COND_IFF93 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form zmnt_cond_records_cd *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM ZMNT_COND_RECORDS_CD TABLES PI_T_CUST_DATAX STRUCTURE ZCRM_MKTPL_COND_IF_CUST_DATAX PX_T_RETURN STRUCTURE BAPIRET2 L_T_COND_SESSION STRUCTURE CRM_MKTPL_COND_IF_CONDSESSION USING PI_START TYPE TIMESTAMP PI_END TYPE TIMESTAMP L_HLOG TYPE BALLOGHNDL CHANGING PE_SUBRC TYPE SY-SUBRC. DATA: L_SUBRC TYPE SY-SUBRC, L_RESULT TYPE SY-SUBRC, L_OVERLAP TYPE C, L_LOCKING TYPE C, L_T_WORKING_SET TYPE REF TO DATA, L_T_WORKING_SET_OLD TYPE REF TO DATA, L_T_VARNUMH_OVERLAP TYPE TABLE OF CRM_MKTPL_COND_IF_VARNUMH, L_T_RETURN TYPE TABLE OF BAPIRET2. * loop at application LOOP AT L_T_COND_SESSION. * ----- get old data from the condition buffer PERFORM GET_WORKING_SET TABLES PX_T_RETURN USING L_T_COND_SESSION SPACE L_HLOG CHANGING L_T_WORKING_SET_OLD L_SUBRC. CHECK L_SUBRC IS INITIAL. * ----- build working set PERFORM BUILD_WORKING_SET TABLES PI_T_CUST_DATAX USING L_T_COND_SESSION PI_START PI_END L_HLOG L_T_WORKING_SET_OLD CHANGING L_T_WORKING_SET L_SUBRC. CHECK L_SUBRC IS INITIAL. IF NOT L_SUBRC IS INITIAL. PE_SUBRC = 1. EXIT. ENDIF. * ----- pass new working set to the condition buffer PERFORM MAINTAIN_CONDITION_RECORDS TABLES PX_T_RETURN USING L_T_COND_SESSION L_T_WORKING_SET L_HLOG CHANGING L_RESULT L_SUBRC. IF NOT L_SUBRC IS INITIAL. * error in the condition maintenance PE_SUBRC = 1. EXIT. ELSE. IF L_RESULT LE 4. * everything o.k. -> notify changes and continue CONTINUE. " -> next application ENDIF. ENDIF. IF L_RESULT GT 4. * problems have occured, possibly due to overlap conflicts *------ do overlap conflict resolution ENDIF. ENDLOOP. * add messages from condition log to return table PERFORM ADD_COND_MESSAGES_TO_RETURN TABLES PX_T_RETURN USING L_HLOG. ENDFORM. " zmnt_cond_records_cd *&---------------------------------------------------------------------* *& Form get_working_set *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PX_T_RETURN text * -->PI_S_COND_SESSION text * -->PI_INCL_DEL_RECORDS text * -->PI_HLOG text * -->PE_T_WORKING_SET text *----------------------------------------------------------------------* FORM GET_WORKING_SET TABLES PX_T_RETURN STRUCTURE BAPIRET2 USING PI_S_COND_SESSION TYPE CRM_MKTPL_COND_IF_CONDSESSION PI_INCL_DEL_RECORDS TYPE XFELD PI_HLOG TYPE BALLOGHNDL CHANGING PE_T_WORKING_SET TYPE REF TO DATA PE_SUBRC TYPE SY-SUBRC. DATA: LS_ATTRIB_VALUE TYPE /SAPCND/ATTRIB_VALUE_INT, LT_ATTRIB_VALUE TYPE /SAPCND/T_ATTRIB_VALUE_INT, L_RESULT TYPE SY-SUBRC, L_SUPPR_DEL_RECORDS TYPE /SAPCND/BOOLEAN, L_MSGTEXT(72). CLEAR PE_T_WORKING_SET. * Build range for selection LS_ATTRIB_VALUE-FIELDNAME = 'KAPPL'. LS_ATTRIB_VALUE-VALUE = PI_S_COND_SESSION-KAPPL. APPEND LS_ATTRIB_VALUE TO LT_ATTRIB_VALUE. LS_ATTRIB_VALUE-FIELDNAME = 'KVEWE'. LS_ATTRIB_VALUE-VALUE = 'PR'. APPEND LS_ATTRIB_VALUE TO LT_ATTRIB_VALUE. * include/suppress the deleted records IF PI_INCL_DEL_RECORDS IS INITIAL. L_SUPPR_DEL_RECORDS = 'X'. ENDIF. CALL FUNCTION '/SAPCND/MNT_GET_WORKING_SET_OW' EXPORTING I_HSESSION = PI_S_COND_SESSION-SESSION I_HLOG = PI_HLOG * I_CALL_FIELD_CHECK = ' ' I_SUPPRESS_DELETED_RECORDS = L_SUPPR_DEL_RECORDS * IT_ATTRIB_SELECTION_EXT = IT_ATTRIB_VALUE_INT = LT_ATTRIB_VALUE IMPORTING ET_WORKING_SET_INT = PE_T_WORKING_SET * ET_WORKING_SET_EXT = E_RESULT = L_RESULT EXCEPTIONS EXC_STOP_WORK = 1 EXC_RFC = 2 EXC_CONV_JAVA = 3 EXC_ATTR_CONV = 4 EXC_FIELD_CHECK = 5 EXC_UPDATING_WORKING_SET = 6 EXC_NOT_INT_AND_EXT = 7 EXC_EXTERNAL_ONLY = 8 EXC_CONVERT_RANGES = 9 EXC_CREATING_OBJECT_NAMES = 10 EXC_STOP_WORK_BADI = 11 EXC_IMPLEMENTATION_MISSING = 12 EXC_ADDING_DEBUG_TRACE_MSG = 13 EXC_BAL_LOG = 14 OTHERS = 15. IF SY-SUBRC <> 0. PE_SUBRC = SY-SUBRC. * Collect message from /SAPCND/MNT_GET_WORKING_SET_OW PERFORM APPEND_RETURN TABLES PX_T_RETURN. * Send message: System has stopped the processing MESSAGE E025(CRM_MKTPL_COND_IF) WITH '/SAPCND/MNT_GET_WORKING_SET_OW' INTO L_MSGTEXT. PERFORM APPEND_RETURN TABLES PX_T_RETURN. ENDIF. ENDFORM. " get_working_set_cd *&---------------------------------------------------------------------* *& Form build_working_set *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PI_T_CUST_DATAX text * -->PI_S_COND_SESSION text * -->PI_START text * -->PI_END text * -->PI_HLOG text * -->PI_T_WORKING_SET_OLD text * -->PE_T_WORKING_SET text *----------------------------------------------------------------------* FORM BUILD_WORKING_SET TABLES PI_T_CUST_DATAX STRUCTURE ZCRM_MKTPL_COND_IF_CUST_DATAX USING PI_S_COND_SESSION TYPE CRM_MKTPL_COND_IF_CONDSESSION PI_START TYPE TIMESTAMP PI_END TYPE TIMESTAMP PI_HLOG TYPE BALLOGHNDL PI_T_WORKING_SET_OLD TYPE REF TO DATA CHANGING PE_T_WORKING_SET TYPE REF TO DATA PE_SUBRC TYPE SY-SUBRC. DATA: L_WS_NAME_BROAD TYPE /SAPCND/WORKING_SET_NAME. DATA: L_WORKING_SET_ITEM TYPE REF TO DATA, L_WORKING_SET_ITEM_BROAD TYPE REF TO DATA. FIELD-SYMBOLS: <LT_WORKING_SET> TYPE TABLE, <LT_WORKING_SET_OLD> TYPE TABLE, <LS_WORKING_SET_ITEM> TYPE ANY, <LS_WORKING_SET_ITEM_BROAD> TYPE ANY. * get names of working set (broad working set): CALL FUNCTION '/SAPCND/GEN_WORKING_SET_NAME' EXPORTING I_APPLICATION = PI_S_COND_SESSION-KAPPL IMPORTING E_WORKING_SET_NAME_INT = L_WS_NAME_BROAD. * get pointer to the imported working set ASSIGN PI_T_WORKING_SET_OLD->* TO <LT_WORKING_SET_OLD>. * get pointers to the exporting working sets CREATE DATA PE_T_WORKING_SET LIKE <LT_WORKING_SET_OLD>. ASSIGN PE_T_WORKING_SET->* TO <LT_WORKING_SET>. CREATE DATA L_WORKING_SET_ITEM LIKE LINE OF <LT_WORKING_SET_OLD>. ASSIGN L_WORKING_SET_ITEM->* TO <LS_WORKING_SET_ITEM>. CREATE DATA L_WORKING_SET_ITEM_BROAD TYPE (L_WS_NAME_BROAD). * loop at products/sales_org/distribution_channel/partner_function LOOP AT PI_T_CUST_DATAX. * fill working set for one item PERFORM BUILD_WORKING_SET_ITEM USING PI_S_COND_SESSION PI_T_CUST_DATAX PI_START PI_END PI_HLOG L_WS_NAME_BROAD CHANGING L_WORKING_SET_ITEM_BROAD PE_SUBRC. ASSIGN L_WORKING_SET_ITEM_BROAD->* TO <LS_WORKING_SET_ITEM_BROAD>. MOVE-CORRESPONDING <LS_WORKING_SET_ITEM_BROAD> TO <LS_WORKING_SET_ITEM>. APPEND <LS_WORKING_SET_ITEM> TO <LT_WORKING_SET>. ENDLOOP. " at pi_t_cust_datax ENDFORM. " build_working_set_cd *&---------------------------------------------------------------------* *& Form build_working_set_item *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PI_S_COND_SESSION text * -->PI_S_CUST_DATAX text * -->PI_START text * -->PI_END text * -->PI_HLOG text * -->PI_WS_NAME text * -->PE_WORKING_SET_ITEM text *----------------------------------------------------------------------* FORM BUILD_WORKING_SET_ITEM USING PI_S_COND_SESSION TYPE CRM_MKTPL_COND_IF_CONDSESSION PI_S_CUST_DATAX TYPE ZCRM_MKTPL_COND_IF_CUST_DATAX PI_START TYPE TIMESTAMP PI_END TYPE TIMESTAMP PI_HLOG TYPE BALLOGHNDL PI_WS_NAME TYPE /SAPCND/WORKING_SET_NAME CHANGING PE_WORKING_SET_ITEM TYPE REF TO DATA PE_SUBRC TYPE SY-SUBRC. * internal working sets FIELD-SYMBOLS: <LS_WORKING_SET_ITEM> TYPE ANY. * field values (in alphabetic order) FIELD-SYMBOLS: <BILL_TO_PARTY> TYPE CRMT_BILL_TO_PARTY, <CLIENT> TYPE MANDT, <DIS_CHANNEL> TYPE CRMT_DISTRIBUTION_CHANNEL, <DIVISION> TYPE CRMT_DIVISION, <HIER_NO_GUID> TYPE BU_HIERNR_GUID, <HIER_NODE_GUID> TYPE BU_NODE_GUID, <KAPPL> TYPE /SAPCND/APPLICATION, <KOTABNR> TYPE /SAPCND/COND_TABLE_ID, <KSCHL> TYPE /SAPCND/COND_TYPE, <KVEWE> TYPE /SAPCND/USAGE, <PARTNER_GUID> TYPE BU_PARTNER_GUID, <PAYER> TYPE CRMT_PAYER, <ZZZMODENO> TYPE ZMODENO, <ZREPCODE> TYPE ZRPCODE, <KMEIN> TYPE KMEIN, <KPEIN> TYPE KPEIN, <KONWA> TYPE KONWA, <RELEASE_STATUS> TYPE /SAPCND/RELEASE_STATUS, <KBETR_PRT> TYPE PRCT_COND_RATE, <PRICE_GRP> TYPE CRMT_PRICE_GRP, <PRODUCT> TYPE COMT_PRODUCT_GUID, <SALES_ORG> TYPE CRMT_SALES_ORG, <SHIP_TO_PARTY> TYPE CRMT_SHIP_TO_PARTY, <SOLD_TO_PARTY> TYPE CRMT_SOLD_TO_PARTY, <TIMESTAMP_FROM> TYPE /SAPCND/TIMESTAMP_FROM, <TIMESTAMP_TO> TYPE /SAPCND/TIMESTAMP_TO, <HIER_CAT_GUID> TYPE COMT_CATEGORY_GUID, <VARNUMH> TYPE /SAPCND/COND_TABLE_ENTRY_ID. * create internal working sets CREATE DATA PE_WORKING_SET_ITEM TYPE (PI_WS_NAME). ASSIGN PE_WORKING_SET_ITEM->* TO <LS_WORKING_SET_ITEM>. * assignments (in alphabetic order) ASSIGN COMPONENT 'ZZZMODENO' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <ZZZMODENO>. ASSIGN COMPONENT 'CLIENT' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <CLIENT>. ASSIGN COMPONENT 'ZREPCODE' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <ZREPCODE>. ASSIGN COMPONENT 'DIVISION' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <DIVISION>. ASSIGN COMPONENT 'HIER_NO_GUID' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <HIER_NO_GUID>. ASSIGN COMPONENT 'HIER_NODE_GUID' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <HIER_NODE_GUID>. ASSIGN COMPONENT 'KAPPL' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KAPPL>. ASSIGN COMPONENT 'KOTABNR' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KOTABNR>. ASSIGN COMPONENT 'KSCHL' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KSCHL>. ASSIGN COMPONENT 'KVEWE' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KVEWE>. ASSIGN COMPONENT 'PARTNER_GUID' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <PARTNER_GUID>. ASSIGN COMPONENT 'PAYER' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <PAYER>. ASSIGN COMPONENT 'KMEIN' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KMEIN>. ASSIGN COMPONENT 'KPEIN' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KPEIN>. ASSIGN COMPONENT 'KONWA' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KONWA>. ASSIGN COMPONENT 'PRODUCT' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <PRODUCT>. ASSIGN COMPONENT 'SALES_ORG' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <SALES_ORG>. ASSIGN COMPONENT 'SHIP_TO_PARTY' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <SHIP_TO_PARTY>. ASSIGN COMPONENT 'SOLD_TO_PARTY' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <SOLD_TO_PARTY>. ASSIGN COMPONENT 'KBETR' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <KBETR_PRT>. ASSIGN COMPONENT 'PRICE_GRP' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <PRICE_GRP>. ASSIGN COMPONENT 'TIMESTAMP_FROM' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <TIMESTAMP_FROM>. ASSIGN COMPONENT 'TIMESTAMP_TO' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <TIMESTAMP_TO>. ASSIGN COMPONENT 'VARNUMH' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <VARNUMH>. ASSIGN COMPONENT 'RELEASE_STATUS' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <RELEASE_STATUS>. ASSIGN COMPONENT 'HIER_CAT_GUID' OF STRUCTURE <LS_WORKING_SET_ITEM> TO <HIER_CAT_GUID>. * assign condition record fields * create new varnumh CALL FUNCTION 'GUID_CREATE' IMPORTING EV_GUID_16 = <VARNUMH>. * other fields <CLIENT> = SY-MANDT. * <TIMESTAMP_FROM> = PI_START. * <TIMESTAMP_TO> = PI_END. <KAPPL> = PI_S_CUST_DATAX-KAPPL. <KVEWE> = PI_S_CUST_DATAX-KVEWE. <KOTABNR> = PI_S_CUST_DATAX-KOTABNR. <KSCHL> = PI_S_CUST_DATAX-KSCHL. <SALES_ORG> = PI_S_CUST_DATAX-SALES_ORG. * <DIS_CHANNEL> = PI_S_CUST_DATAX-CHANNEL. * <division> = pi_s_cust_datax-division. <PRODUCT> = PI_S_CUST_DATAX-PRODUCT_GUID. <ZZZMODENO> = PI_S_CUST_DATAX-ZZZMODENO. <ZREPCODE> = PI_S_CUST_DATAX-ZREPCODE. * <PARTNER_GUID> = PI_S_CUST_DATAX-PARTNER. * <sold_to_party> = pi_s_cust_datax-sold_to_party. <KMEIN> = PI_S_CUST_DATAX-KMEIN. <KPEIN> = PI_S_CUST_DATAX-KPEIN. <KONWA> = PI_S_CUST_DATAX-KONWA. <PRICE_GRP> = PI_S_CUST_DATAX-PRICE_GRP. <KBETR_PRT> = PI_S_CUST_DATAX-KBETR_PRT. <TIMESTAMP_FROM> = PI_S_CUST_DATAX-TIMESTAMP_FROM. <TIMESTAMP_TO> = PI_S_CUST_DATAX-TIMESTAMP_TO. <RELEASE_STATUS> = PI_S_CUST_DATAX-RELEASE_STATUS. * <HIER_CAT_GUID> = PI_S_CUST_DATAX-HIER_CAT_GUID. * <ship_to_party> = pi_s_cust_datax-ship_to_party. * <BILL_TO_PARTY> = PI_S_CUST_DATAX-BILL_TO_PARTY. * <payer> = pi_s_cust_datax-payer. * customer hierarchy * <HIER_NO_GUID> = PI_S_CUST_DATAX-HIERARCHY_GUID. * <hier_node_guid> = pi_s_cust_datax-HIER_CAT_GUID. ENDFORM. " build_working_set_item_cd *&---------------------------------------------------------------------* *& Form maintain_condition_records *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PX_T_RETURN text * -->PI_S_COND_SESSION text * -->PI_T_WORKING_SET text * -->PE_RESULT text * -->PE_SUBRC text *----------------------------------------------------------------------* FORM MAINTAIN_CONDITION_RECORDS TABLES PX_T_RETURN STRUCTURE BAPIRET2 USING PI_S_COND_SESSION TYPE CRM_MKTPL_COND_IF_CONDSESSION PI_T_WORKING_SET TYPE REF TO DATA PI_HLOG TYPE BALLOGHNDL CHANGING PE_RESULT TYPE SY-SUBRC PE_SUBRC TYPE SY-SUBRC. DATA: L_MSGTEXT(72). * By default: everything is okay CLEAR: PE_RESULT, PE_SUBRC. CALL FUNCTION '/SAPCND/MNT_MAINTAIN_OW' EXPORTING I_HSESSION = PI_S_COND_SESSION-SESSION I_HLOG = PI_HLOG * IT_WORKING_SET_EXT = IT_WORKING_SET_INT = PI_T_WORKING_SET IMPORTING E_RESULT = PE_RESULT EXCEPTIONS EXC_STOP_WORK = 1 EXC_DEFAULT_VALUE = 2 EXC_DEFAULT_CHECK = 3 EXC_CONV_JAVA = 4 EXC_RFC = 5 EXC_UPDATING_WORKING_SET = 6 EXC_STOP_WORK_BADI = 7 EXC_IMPLEMENTATION_MISSING = 8 EXC_DELETING_MSG_LOG = 9 EXC_ADDING_DEBUG_TRACE_MSG = 10 EXC_PUT_CONSTANTS = 11 OTHERS = 12. IF SY-SUBRC <> 0. PE_SUBRC = SY-SUBRC. * Collect message from /SAPCND/MNT_MAINTAIN_OW PERFORM APPEND_RETURN TABLES PX_T_RETURN. * Send message: System has stopped processing MESSAGE E025(CRM_MKTPL_COND_IF) WITH '/SAPCND/MNT_MAINTAIN_OW' INTO L_MSGTEXT. PERFORM APPEND_RETURN TABLES PX_T_RETURN. ENDIF. ENDFORM. " maintain_condition_records *&---------------------------------------------------------------------* *& Form IMPORT_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM IMPORT_DATA . DATA : ITAB_FILE LIKE ZALSMEX_TABLINE OCCURS 100 WITH HEADER LINE. REFRESH ITAB_FILE. DATA: LV_DATFM LIKE USR01-DATFM, LV_YEAR(4) TYPE C, LV_MONTH(2) TYPE C, LV_DAY(2) TYPE C. DATA: ZINX TYPE I. CLEAR ZINX. CALL FUNCTION 'ZEXCEL_UPLOAD' EXPORTING FILENAME = P_FILE I_BEGIN_COL = '1' I_BEGIN_ROW = '1' I_END_COL = '12' I_END_ROW = '5000' TABLES INTERN = ITAB_FILE EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. LOOP AT ITAB_FILE FROM 10. CASE ITAB_FILE-COL. WHEN 1. IF ITAB_FILE-VALUE <> ''. CONDENSE ITAB_FILE-VALUE. SELECT COUNT( * ) FROM COMM_PR_FRG_ROD WHERE SALES_ORG = ITAB_FILE-VALUE. IF SY-SUBRC = 0. WA_DOC-P_SORG = ITAB_FILE-VALUE. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Sales organization not exist !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Sales organization can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 2. IF ITAB_FILE-VALUE <> ''. WA_DOC-P_ZZZMODENO = ITAB_FILE-VALUE. ELSE. CONCATENATE WA_ERR-ERR_LOG 'custom model can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 3."price group IF ITAB_FILE-VALUE <> ''. CONDENSE ITAB_FILE-VALUE. SELECT COUNT( * ) FROM CRMC_PRICEGRP WHERE PRICE_GROUP = ITAB_FILE-VALUE. IF SY-SUBRC = 0. WA_DOC-P_PGRP = ITAB_FILE-VALUE. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Price group not exist !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Price group can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 4."Repair Code IF ITAB_FILE-VALUE <> ''. WA_DOC-P_ZREPCODE = ITAB_FILE-VALUE. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Repair Code can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 5."product id IF ITAB_FILE-VALUE <> ''. CONDENSE ITAB_FILE-VALUE. CALL FUNCTION 'CONVERSION_EXIT_PRID1_INPUT' EXPORTING INPUT = ITAB_FILE-VALUE IMPORTING OUTPUT = WA_DOC-P_PROD EXCEPTIONS LENGHT_ERROR = 1 CUSTOMIZING_ERROR = 2 OTHERS = 3. SELECT COUNT( * ) FROM COMM_PRODUCT WHERE PRODUCT_ID = WA_DOC-P_PROD. IF SY-SUBRC <> 0. CONCATENATE WA_ERR-ERR_LOG 'product not exist !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. ELSE. CONCATENATE WA_ERR-ERR_LOG 'product can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 6. IF ITAB_FILE-VALUE <> '' AND ITAB_FILE-VALUE > '0.00'. CONDENSE ITAB_FILE-VALUE. WA_DOC-P_KBETR = ITAB_FILE-VALUE. * wa_doc-p_KPEIN = itab_file-value. ELSE. CONCATENATE WA_ERR-ERR_LOG 'amount is not valid !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 7. IF ITAB_FILE-VALUE <> ''. CONDENSE ITAB_FILE-VALUE. WA_DOC-P_KONWA = ITAB_FILE-VALUE. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Condition currency can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 8. IF ITAB_FILE-VALUE <> ''. CONDENSE ITAB_FILE-VALUE. IF ITAB_FILE-VALUE CA '-/.'. SEARCH ITAB_FILE-VALUE FOR '-'. IF SY-SUBRC = 0. SPLIT ITAB_FILE-VALUE AT '-' INTO LV_YEAR LV_MONTH LV_DAY. ELSE. SEARCH ITAB_FILE-VALUE FOR '/'. IF SY-SUBRC = 0. SPLIT ITAB_FILE-VALUE AT '-' INTO LV_YEAR LV_MONTH LV_DAY. ELSE. SEARCH ITAB_FILE-VALUE FOR '.'. IF SY-SUBRC = 0. SPLIT ITAB_FILE-VALUE AT '-' INTO LV_YEAR LV_MONTH LV_DAY. ENDIF. ENDIF. ENDIF. IF STRLEN( LV_MONTH ) = 1. CONCATENATE '0' LV_MONTH INTO LV_MONTH. ENDIF. IF STRLEN( LV_DAY ) = 1. CONCATENATE '0' LV_DAY INTO LV_DAY. ENDIF. CONCATENATE LV_YEAR LV_MONTH LV_DAY INTO WA_DOC-P_BDATE. ELSE. WA_DOC-P_BDATE = ITAB_FILE-VALUE. ENDIF. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Valid From can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN 9. IF ITAB_FILE-VALUE <> ''. CONDENSE ITAB_FILE-VALUE. IF ITAB_FILE-VALUE CA '-/.'. SEARCH ITAB_FILE-VALUE FOR '-'. IF SY-SUBRC = 0. SPLIT ITAB_FILE-VALUE AT '-' INTO LV_YEAR LV_MONTH LV_DAY. ELSE. SEARCH ITAB_FILE-VALUE FOR '/'. IF SY-SUBRC = 0. SPLIT ITAB_FILE-VALUE AT '-' INTO LV_YEAR LV_MONTH LV_DAY. ELSE. SEARCH ITAB_FILE-VALUE FOR '.'. IF SY-SUBRC = 0. SPLIT ITAB_FILE-VALUE AT '-' INTO LV_YEAR LV_MONTH LV_DAY. ENDIF. ENDIF. ENDIF. IF STRLEN( LV_MONTH ) = 1. CONCATENATE '0' LV_MONTH INTO LV_MONTH. ENDIF. IF STRLEN( LV_DAY ) = 1. CONCATENATE '0' LV_DAY INTO LV_DAY. ENDIF. CONCATENATE LV_YEAR LV_MONTH LV_DAY INTO WA_DOC-P_EDATE. ELSE. WA_DOC-P_EDATE = ITAB_FILE-VALUE. ENDIF. ELSE. CONCATENATE WA_ERR-ERR_LOG 'Valid To can not be initial !' INTO WA_ERR-ERR_LOG SEPARATED BY ''. ENDIF. WHEN OTHERS. ENDCASE. AT END OF ROW. APPEND WA_DOC TO IT_DOC. CLEAR WA_DOC. ZINX = ZINX + 1. IF WA_ERR-ERR_LOG IS NOT INITIAL. WA_ERR-INX = ZINX. APPEND WA_ERR TO IT_ERR. CLEAR WA_ERR. ENDIF. ENDAT. ENDLOOP. ENDFORM. "IMPORT_DATA *&---------------------------------------------------------------------* *& Form SELECT_FILE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM SELECT_FILE . CALL FUNCTION 'WS_FILENAME_GET' EXPORTING MASK = ',Excel Files,*.xls,All Files,*.*.'(101) TITLE = '####'(100) IMPORTING FILENAME = P_FILE EXCEPTIONS INV_WINSYS = 1 NO_BATCH = 2 SELECTION_CANCEL = 3 SELECTION_ERROR = 4 OTHERS = 5. IF SY-SUBRC <> 0 AND SY-SUBRC <> 3. MESSAGE E100(ZDEV) WITH '#######'(007). ENDIF. ENDFORM. " SELECT_FILE *&---------------------------------------------------------------------* *& Form OUTPUT_RESULT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM OUTPUT_RESULT . LOOP AT IT_DOC INTO WA_DOC. WRITE:/ '販売組織:', WA_DOC-P_SORG NO-GAP, 'お客様モデル:', WA_DOC-P_ZZZMODENO NO-GAP ,'顧客の区分:',WA_DOC-P_PGRP,'保守コード',WA_DOC-P_ZREPCODE NO-GAP, '製品ID', WA_DOC-P_PROD NO-GROUPING, '価格', WA_DOC-P_KBETR, '有効開始日', WA_DOC-P_BDATE, '有効終日', WA_DOC-P_EDATE. ENDLOOP. ENDFORM. " OUTPUT_RESULT