zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    忘记线上MySQL密码:
    Auth认证
    swoole定时
    hashMap,hashTable,concurrentHashmap的区别
    JSP中URL路径获取问题
    #Spring代理的简单例子#
    #动态代理#
    #类加载机制#
    #算法#二分查找和插入(start end交叉的地方)
    #tomcat#生成的jsp转换问题
  • 原文地址:https://www.cnblogs.com/sapSB/p/6609585.html
Copyright © 2011-2022 走看看