CRM 价格批导

日了,好多代码。。。。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
原文地址:https://www.cnblogs.com/sapSB/p/6609585.html